@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,499 @@
|
|
|
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
|
+
* Shared parsing for the write-deny coverage guards (AGL-1355, AGL-1361).
|
|
18
|
+
*
|
|
19
|
+
* Extracted from `org-write-deny-coverage.spec.ts` when the same property was
|
|
20
|
+
* extended to `hosts/{hostId}` and `marketplaceListings/{listingId}`. Three
|
|
21
|
+
* documents, three different rule shapes, one parser — a second copy of this
|
|
22
|
+
* would be a second thing to keep true, which is the disease these guards
|
|
23
|
+
* exist to treat.
|
|
24
|
+
*
|
|
25
|
+
* Deliberately PURE: every function takes source text and returns data, with
|
|
26
|
+
* no file I/O and no imports. That keeps the module free of `node:fs` (this
|
|
27
|
+
* lib is bundled for the browser) and makes each helper testable on a string
|
|
28
|
+
* literal. The specs own the reading.
|
|
29
|
+
*
|
|
30
|
+
* Not exported from the foundation barrel — nothing at runtime should reach
|
|
31
|
+
* for it.
|
|
32
|
+
*/ /**
|
|
33
|
+
* Comments are stripped from every source before parsing. Prose in this repo
|
|
34
|
+
* quotes rules fragments and field names constantly — the org block's own
|
|
35
|
+
* comment names all four AGL-1354 keys, and the listing block's names half its
|
|
36
|
+
* deny-list — so parsing with comments in place would read the explanation of
|
|
37
|
+
* a hole as the fix for it.
|
|
38
|
+
*
|
|
39
|
+
* A single left-to-right scan, NOT two regex passes, and that distinction is
|
|
40
|
+
* load-bearing (AGL-2004). The previous version removed block comments first
|
|
41
|
+
* and line comments second, so a line comment that merely QUOTED a path opened
|
|
42
|
+
* a block comment that was never meant to exist:
|
|
43
|
+
*
|
|
44
|
+
* // the name, so `hosts/<hostId>/datasets/*` stayed a client-writable
|
|
45
|
+
*
|
|
46
|
+
* The `/` before `*` reads as an opening delimiter, and the strip then ran to
|
|
47
|
+
* the next closing delimiter 571 lines away, swallowing real rule text — and
|
|
48
|
+
* with it two closing braces, which left the block walker unable to find the
|
|
49
|
+
* end of the root `match` and threw `never closes`. Every deny-coverage guard
|
|
50
|
+
* in this directory failed to RUN, which is the worst way for a guard to fail:
|
|
51
|
+
* the suite is red, so nobody reads it as coverage, but the thing it protects
|
|
52
|
+
* (the AGL-1775 `registers` deny-list) is unwatched until someone does.
|
|
53
|
+
*
|
|
54
|
+
* Scanning once fixes it in both directions: whichever delimiter appears first
|
|
55
|
+
* wins, so `/*` inside a line comment is just text, and `//` inside a block
|
|
56
|
+
* comment cannot eat the block's own terminator.
|
|
57
|
+
*/ export function stripComments(source) {
|
|
58
|
+
let out = '';
|
|
59
|
+
let index = 0;
|
|
60
|
+
while(index < source.length){
|
|
61
|
+
const pair = source.slice(index, index + 2);
|
|
62
|
+
if (pair === '/*') {
|
|
63
|
+
const end = source.indexOf('*/', index + 2);
|
|
64
|
+
index = end < 0 ? source.length : end + 2;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (pair === '//') {
|
|
68
|
+
const end = source.indexOf('\n', index + 2);
|
|
69
|
+
if (end < 0) break;
|
|
70
|
+
// Keep the newline: line numbers and statement separation survive.
|
|
71
|
+
out += '\n';
|
|
72
|
+
index = end + 1;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
out += source[index];
|
|
76
|
+
index += 1;
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Quoted strings, blanked. `org-permissions.ts` declares permission KEYS
|
|
82
|
+
* spelled `'org.settings'` and `'org.auditLog'`, which read exactly like a
|
|
83
|
+
* field access — the first run of the org guard demanded the rules deny two
|
|
84
|
+
* fields that do not exist. Template literals are left alone: a real read can
|
|
85
|
+
* legitimately live inside `${…}`.
|
|
86
|
+
*/ export function stripQuotedStrings(source) {
|
|
87
|
+
return source.replace(/'(?:\\.|[^'\\\n])*'/g, "''").replace(/"(?:\\.|[^"\\\n])*"/g, '""');
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Firestore path variables (`{orgId}`, `{document=**}`) carry braces that a
|
|
91
|
+
* block-depth walker reads as nesting. Rewriting them to angle brackets makes
|
|
92
|
+
* the rules parseable by brace counting without losing the path text — which
|
|
93
|
+
* matters, because `{document=**}` IS the wildcard these guards have to see.
|
|
94
|
+
*/ export function normalizePathVariables(rules) {
|
|
95
|
+
return rules.replace(/\{([A-Za-z_][A-Za-z0-9_]*(?:=\*\*)?)\}/g, '<$1>');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The text of a `{ … }` block, keeping only what sits at the block's own
|
|
99
|
+
* depth. Nested blocks — sub-`match` rules, inline object types — are dropped,
|
|
100
|
+
* so a nested `allow` or a nested property can never be mistaken for one
|
|
101
|
+
* belonging to the block asked for.
|
|
102
|
+
*
|
|
103
|
+
* `header` must end with the opening brace.
|
|
104
|
+
*/ export function topLevelBody(source, header) {
|
|
105
|
+
const at = source.indexOf(header);
|
|
106
|
+
if (at < 0) throw new Error(`Guard cannot parse: no \`${header}\` found.`);
|
|
107
|
+
let depth = 1;
|
|
108
|
+
let out = '';
|
|
109
|
+
for(let index = at + header.length; index < source.length; index += 1){
|
|
110
|
+
const character = source[index];
|
|
111
|
+
if (character === '{') {
|
|
112
|
+
depth += 1;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (character === '}') {
|
|
116
|
+
depth -= 1;
|
|
117
|
+
if (depth === 0) return out;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (depth === 1) out += character;
|
|
121
|
+
}
|
|
122
|
+
throw new Error(`Guard cannot parse: \`${header}\` never closes.`);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The FULL text of a `{ … }` block, nested blocks INCLUDED.
|
|
126
|
+
*
|
|
127
|
+
* The opposite of `topLevelBody`, and needed for the opposite question. That
|
|
128
|
+
* one answers "what does THIS block say", so it drops nested bodies — which is
|
|
129
|
+
* exactly right for a deny-list on one document, and exactly wrong for
|
|
130
|
+
* `hosts/{hostId}`, whose subcollection rules all live in nested `match`
|
|
131
|
+
* blocks. AGL-1367 lived in one of them.
|
|
132
|
+
*
|
|
133
|
+
* `header` must end with the opening brace.
|
|
134
|
+
*/ export function rawBlockBody(source, header) {
|
|
135
|
+
const at = source.indexOf(header);
|
|
136
|
+
if (at < 0) throw new Error(`Guard cannot parse: no \`${header}\` found.`);
|
|
137
|
+
let depth = 1;
|
|
138
|
+
let out = '';
|
|
139
|
+
for(let index = at + header.length; index < source.length; index += 1){
|
|
140
|
+
const character = source[index];
|
|
141
|
+
if (character === '{') depth += 1;
|
|
142
|
+
else if (character === '}') {
|
|
143
|
+
depth -= 1;
|
|
144
|
+
if (depth === 0) return out;
|
|
145
|
+
}
|
|
146
|
+
out += character;
|
|
147
|
+
}
|
|
148
|
+
throw new Error(`Guard cannot parse: \`${header}\` never closes.`);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Parse the host catch-all's three exclusion lists (AGL-1367).
|
|
152
|
+
*
|
|
153
|
+
* Membership in ONE list is not denial and never was — `variables` is
|
|
154
|
+
* create-excluded and freely updatable, `webhooks` is create-excluded and
|
|
155
|
+
* freely updatable on purpose (the soft delete is how a capped site frees a
|
|
156
|
+
* slot). And a dedicated `match` block RE-GRANTS, because Firestore ORs its
|
|
157
|
+
* allows and the LOOSER one wins: `screens`, `layouts` and `collections` all
|
|
158
|
+
* sit in three lists and stay editor-writable through the blocks above.
|
|
159
|
+
*
|
|
160
|
+
* So "denied outright" is the intersection of the three lists MINUS everything
|
|
161
|
+
* with a block of its own. That subtraction is the reason a dedicated
|
|
162
|
+
* `allow write: if false` block would not have closed AGL-1367 — a deny can
|
|
163
|
+
* never win an OR.
|
|
164
|
+
*/ export function parseHostSubcollectionRules(rulesSource) {
|
|
165
|
+
const rules = normalizePathVariables(stripComments(rulesSource));
|
|
166
|
+
const host = rawBlockBody(rules, 'match /hosts/<hostId> {');
|
|
167
|
+
const catchAllHeader = 'match /<subcollection>/<document=**> {';
|
|
168
|
+
const occurrences = host.split(catchAllHeader).length - 1;
|
|
169
|
+
if (occurrences !== 1) {
|
|
170
|
+
throw new Error(`Expected exactly one \`${catchAllHeader}\` under match /hosts/{hostId}, ` + `found ${occurrences}. A second one would OR another set of allows ` + `onto every subcollection, so these lists would be half the answer.`);
|
|
171
|
+
}
|
|
172
|
+
const catchAll = rawBlockBody(host, catchAllHeader);
|
|
173
|
+
const listFor = (operation)=>{
|
|
174
|
+
const statement = catchAll.split(';').find((entry)=>new RegExp(`\\ballow\\b[^:]*\\b${operation}\\b`).test(entry));
|
|
175
|
+
if (!statement) {
|
|
176
|
+
throw new Error(`No \`allow … ${operation}\` in the host catch-all. The block has been ` + `restructured; re-read it before trusting this guard.`);
|
|
177
|
+
}
|
|
178
|
+
const list = statement.match(/subcollection\s+in\s+\[([^\]]*)\]/);
|
|
179
|
+
if (!list) {
|
|
180
|
+
throw new Error(`The host catch-all's \`allow ${operation}\` has no ` + `\`subcollection in […]\` exclusion list. Every server-owned host ` + `subcollection is denied by NAME in that list and nowhere else, so ` + `this guard cannot see what is protected any more.`);
|
|
181
|
+
}
|
|
182
|
+
return [
|
|
183
|
+
...list[1].matchAll(/'([^']+)'/g)
|
|
184
|
+
].map((entry)=>entry[1]);
|
|
185
|
+
};
|
|
186
|
+
const excluded = {
|
|
187
|
+
create: listFor('create'),
|
|
188
|
+
update: listFor('update'),
|
|
189
|
+
delete: listFor('delete')
|
|
190
|
+
};
|
|
191
|
+
// Named `match` blocks only. After `normalizePathVariables` a wildcard
|
|
192
|
+
// segment starts with `<`, so a leading letter is what distinguishes a
|
|
193
|
+
// collection block from `match /<subcollection>/…` or the nested
|
|
194
|
+
// `match /<sub>/…` inside the screens/layouts/components blocks.
|
|
195
|
+
const dedicated = [
|
|
196
|
+
...new Set([
|
|
197
|
+
...host.matchAll(/match\s+\/([A-Za-z][A-Za-z0-9]*)\//g)
|
|
198
|
+
].map((entry)=>entry[1]))
|
|
199
|
+
];
|
|
200
|
+
const serverOnly = excluded.create.filter((name)=>excluded.update.includes(name) && excluded.delete.includes(name) && !dedicated.includes(name));
|
|
201
|
+
return {
|
|
202
|
+
excluded,
|
|
203
|
+
dedicated,
|
|
204
|
+
serverOnly
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Split an expression on `||` at parenthesis depth 0 only.
|
|
209
|
+
*
|
|
210
|
+
* A naive `split('||')` tears a branch apart at any nested alternation, and
|
|
211
|
+
* both of the documents AGL-1361 added have one. The host rule's client branch
|
|
212
|
+
* is `(… && !hasAny(L1) && (role == 'admin' || !hasAny(L2)))` — its deny-list
|
|
213
|
+
* is TIERED, six keys no site member may touch plus `disabledPlugins` which
|
|
214
|
+
* only a site admin may — and a naive split drops L2 into a branch of its own
|
|
215
|
+
* where nothing looks for it. The listing block's `function listingManager()`
|
|
216
|
+
* produces the mirror problem, matching two branches instead of one.
|
|
217
|
+
*/ export function splitTopLevelOr(expression) {
|
|
218
|
+
const parts = [];
|
|
219
|
+
let depth = 0;
|
|
220
|
+
let current = '';
|
|
221
|
+
for(let index = 0; index < expression.length; index += 1){
|
|
222
|
+
const character = expression[index];
|
|
223
|
+
if (character === '(') depth += 1;
|
|
224
|
+
if (character === ')') depth -= 1;
|
|
225
|
+
if (depth === 0 && character === '|' && expression[index + 1] === '|') {
|
|
226
|
+
parts.push(current);
|
|
227
|
+
current = '';
|
|
228
|
+
index += 1;
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
current += character;
|
|
232
|
+
}
|
|
233
|
+
parts.push(current);
|
|
234
|
+
return parts.map((part)=>part.trim()).filter(Boolean);
|
|
235
|
+
}
|
|
236
|
+
/** The keys of the FIRST `hasAny([...])` literal in a rules branch. */ export function hasAnyKeys(branch) {
|
|
237
|
+
const list = branch.match(/hasAny\(\s*\[([^\]]*)\]/);
|
|
238
|
+
if (!list) return [];
|
|
239
|
+
return [
|
|
240
|
+
...list[1].matchAll(/'([^']+)'/g)
|
|
241
|
+
].map((entry)=>entry[1]);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* The keys of EVERY `hasAny([...])` literal in a branch, flattened.
|
|
245
|
+
*
|
|
246
|
+
* The org rule has one list per branch; the host rule has two in a single
|
|
247
|
+
* branch, because its deny-list is TIERED — six keys no site member may
|
|
248
|
+
* touch, and `disabledPlugins` which only a site admin may. `hasAnyKeys`
|
|
249
|
+
* returns the first list alone, so a host guard built on it would have
|
|
250
|
+
* silently believed `disabledPlugins` was unprotected.
|
|
251
|
+
*/ export function allHasAnyKeys(branch) {
|
|
252
|
+
return [
|
|
253
|
+
...branch.matchAll(/hasAny\(\s*\[([^\]]*)\]/g)
|
|
254
|
+
].flatMap((list)=>[
|
|
255
|
+
...list[1].matchAll(/'([^']+)'/g)
|
|
256
|
+
].map((entry)=>entry[1]));
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Top-level property names declared on an interface.
|
|
260
|
+
*
|
|
261
|
+
* `header` is the full declaration line up to and including the brace, because
|
|
262
|
+
* the three documents do not share a shape: `AglynOrgBilling` and `AglynHost`
|
|
263
|
+
* both `extends AglynDocument`, while `MarketplaceListing` extends nothing.
|
|
264
|
+
*/ export function declaredFields(source, header) {
|
|
265
|
+
const body = topLevelBody(stripComments(source), header);
|
|
266
|
+
return [
|
|
267
|
+
...body.matchAll(/(?:^|\n)\s*(\$?[A-Za-z_][A-Za-z0-9_$]*)\s*\??\s*:/g)
|
|
268
|
+
].map((entry)=>entry[1]);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Parse the single `allow update` of one top-level document block.
|
|
272
|
+
*
|
|
273
|
+
* `matchHeader` is post-`normalizePathVariables`, e.g.
|
|
274
|
+
* `match /hosts/<hostId> {`. `clientPredicate` names the branch that a CLIENT
|
|
275
|
+
* reaches — `canManageOrg()`, `canWriteHostContent(hostId)`, `listingManager()`
|
|
276
|
+
* — as opposed to the staff branches, which are trusted by design.
|
|
277
|
+
*/ export function parseUpdateRule(rulesSource, matchHeader, clientPredicate) {
|
|
278
|
+
const rules = normalizePathVariables(stripComments(rulesSource));
|
|
279
|
+
const root = topLevelBody(rules, 'match /databases/<database>/documents {');
|
|
280
|
+
const topLevelMatches = [
|
|
281
|
+
...root.matchAll(/match\s+(\/\S*)/g)
|
|
282
|
+
].map((entry)=>entry[1]);
|
|
283
|
+
const block = topLevelBody(rules, matchHeader);
|
|
284
|
+
const statements = block.split(';').map((statement)=>statement.trim()).filter(Boolean);
|
|
285
|
+
// ONE `allow` statement may mention `update`. Firestore ORs every allow
|
|
286
|
+
// across sibling statements AND sibling match blocks, and the LOOSER one
|
|
287
|
+
// wins — so a second statement would mean this guard is reasoning about a
|
|
288
|
+
// deny-list that some other statement quietly overrides.
|
|
289
|
+
const updates = statements.filter((statement)=>/\ballow\b[^:]*\bupdate\b/.test(statement));
|
|
290
|
+
if (updates.length !== 1) {
|
|
291
|
+
throw new Error(`Expected exactly one \`allow … update\` statement under ` + `${matchHeader}, found ${updates.length}. Firestore ORs them and the ` + `LOOSER wins, so the deny-list this guard reads would no longer be ` + `the whole answer. Fold the branches back into one statement, or ` + `teach this guard how they combine.`);
|
|
292
|
+
}
|
|
293
|
+
// Start at the `allow` keyword. `topLevelBody` drops a nested block's BODY
|
|
294
|
+
// but leaves its header text at depth 1, so the listing block's
|
|
295
|
+
// `function listingManager()` declaration survives as an orphan with no
|
|
296
|
+
// semicolon of its own — it merges into the following statement and makes
|
|
297
|
+
// `listingManager()` appear in two branches instead of one. Slicing to
|
|
298
|
+
// `allow` removes the remnant without pretending the function is not there.
|
|
299
|
+
const statement = updates[0].slice(updates[0].indexOf('allow'));
|
|
300
|
+
const branches = splitTopLevelOr(statement);
|
|
301
|
+
const found = branches.filter((branch)=>branch.includes(clientPredicate));
|
|
302
|
+
if (found.length !== 1) {
|
|
303
|
+
throw new Error(`Expected exactly one \`allow update\` branch guarded by ` + `${clientPredicate} under ${matchHeader}, found ${found.length}. The ` + `rule has been restructured; re-read it before trusting this guard.`);
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
denied: allHasAnyKeys(found[0]),
|
|
307
|
+
branches,
|
|
308
|
+
statements,
|
|
309
|
+
topLevelMatches
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Field names in an object literal a document is seeded with.
|
|
314
|
+
*
|
|
315
|
+
* `anchor` is a regex source locating the write; the literal's own braces are
|
|
316
|
+
* matched by depth rather than `[^}]*`, because a seed can legitimately carry
|
|
317
|
+
* a nested object (the host seed writes `screens: {}`) and a lazy class would
|
|
318
|
+
* truncate the field list at the first inner brace — silently shrinking one of
|
|
319
|
+
* the guard's sources rather than failing.
|
|
320
|
+
*/ export function seedFields(source, anchor) {
|
|
321
|
+
const at = stripComments(source).search(anchor);
|
|
322
|
+
if (at < 0) return null;
|
|
323
|
+
const text = stripComments(source);
|
|
324
|
+
const open = text.indexOf('{', at);
|
|
325
|
+
if (open < 0) return null;
|
|
326
|
+
let depth = 1;
|
|
327
|
+
let body = '';
|
|
328
|
+
for(let index = open + 1; index < text.length; index += 1){
|
|
329
|
+
const character = text[index];
|
|
330
|
+
if (character === '{') depth += 1;
|
|
331
|
+
else if (character === '}') {
|
|
332
|
+
depth -= 1;
|
|
333
|
+
if (depth === 0) break;
|
|
334
|
+
}
|
|
335
|
+
if (depth === 1) body += character;
|
|
336
|
+
}
|
|
337
|
+
return [
|
|
338
|
+
...body.matchAll(/(?:^|,|\n)\s*([A-Za-z_$][A-Za-z0-9_$]*)\s*[,:]/g)
|
|
339
|
+
].map((entry)=>entry[1]);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Field names a document of `collection` is seeded with, in either shape a
|
|
343
|
+
* seed write takes in this codebase (AGL-2100).
|
|
344
|
+
*
|
|
345
|
+
* The original parser understood only the CHAINED form —
|
|
346
|
+
* `collection('hosts').doc(id).set({ … })` — because that is what every seed
|
|
347
|
+
* route looked like when it was written. AGL-2063 rewrote the host create into
|
|
348
|
+
* a transactional claim, which necessarily splits the chain: the ref has to be
|
|
349
|
+
* built BEFORE `runTransaction` opens so the transaction body can both read
|
|
350
|
+
* and write it, leaving `const hostRef = …doc(hostId)` in one statement and
|
|
351
|
+
* `tx.set(hostRef, { … })` in another. The chained anchor then matched
|
|
352
|
+
* nothing, `seedFields` returned null, and the guard threw — asserting nothing
|
|
353
|
+
* about any of the four sources of the host field set until it was fixed.
|
|
354
|
+
*
|
|
355
|
+
* So resolve the REF BINDING rather than teaching the guard one more literal
|
|
356
|
+
* spelling. Any `set`/`create` whose first argument is a ref bound to this
|
|
357
|
+
* collection is a seed write, which covers `tx.`, `batch.` and a bare
|
|
358
|
+
* `ref.set()` alike, and does not care what wraps them.
|
|
359
|
+
*
|
|
360
|
+
* Anchoring on the WRITE and not on the binding matters: the binding is
|
|
361
|
+
* followed by the transaction callback's own `{`, so a binding-anchored parse
|
|
362
|
+
* would happily return the arrow body's contents as the field list — a
|
|
363
|
+
* silently wrong answer, which is worse than the throw.
|
|
364
|
+
*
|
|
365
|
+
* Returns null when neither shape is present, so the caller still throws.
|
|
366
|
+
*/ export function seedFieldsOfCollection(source, collection) {
|
|
367
|
+
const name = collection.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
368
|
+
const chained = seedFields(source, new RegExp(`collection\\('${name}'\\)\\s*\\.doc\\([^)]*\\)\\s*\\.\\s*(?:set|create)\\s*\\(`));
|
|
369
|
+
if (chained) return chained;
|
|
370
|
+
const text = stripComments(source);
|
|
371
|
+
const bindings = [
|
|
372
|
+
...text.matchAll(new RegExp(`(?:const|let|var)\\s+([A-Za-z_$][A-Za-z0-9_$]*)\\s*=\\s*[^;\\n]*collection\\('${name}'\\)\\s*\\.doc\\(`, 'g'))
|
|
373
|
+
].map((entry)=>entry[1]);
|
|
374
|
+
for (const binding of bindings){
|
|
375
|
+
const fields = seedFields(source, new RegExp(`\\b(?:set|create)\\s*\\(\\s*${binding}\\s*,\\s*\\{`));
|
|
376
|
+
if (fields) return fields;
|
|
377
|
+
}
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Whether the property access ending at `index` is being CALLED (AGL-1719).
|
|
382
|
+
*
|
|
383
|
+
* The guard reads `hosts/{hostId}` fields by scanning for `host.<name>` across
|
|
384
|
+
* a whole directory, which means it matches on the identifier NAME and cannot
|
|
385
|
+
* see the type. `media-ref.ts` has `isFirstPartyHost(host: string)` whose body
|
|
386
|
+
* is `host.toLowerCase()` — a hostname string, not the host document — so
|
|
387
|
+
* `toLowerCase` entered the field universe and the guard demanded that a
|
|
388
|
+
* `String.prototype` method be classified as server-owned or client-writable.
|
|
389
|
+
*
|
|
390
|
+
* Dropping method calls removes that whole class rather than that one name,
|
|
391
|
+
* and it is sound in the only direction that matters. Firestore document data
|
|
392
|
+
* is JSON: string, number, boolean, null, array, map, timestamp, geopoint,
|
|
393
|
+
* reference. **No field of a document can be callable**, so `binding.X(` is
|
|
394
|
+
* provably never a field read and this can never introduce a false negative —
|
|
395
|
+
* which is the single failure mode a coverage guard has (AGL-1420).
|
|
396
|
+
*
|
|
397
|
+
* A chained read is untouched: in `host.disabledPlugins.includes(x)` the
|
|
398
|
+
* character after the captured name is `.`, so `disabledPlugins` is still
|
|
399
|
+
* collected and only `includes` is dropped. Optional calls (`host.foo?.()`)
|
|
400
|
+
* and generic ones (`host.foo<T>()`) are calls too.
|
|
401
|
+
*
|
|
402
|
+
* An exclusion list of known method names was rejected: it would silence the
|
|
403
|
+
* symptom, need tending forever, and still say nothing about the next method
|
|
404
|
+
* on the next same-named local.
|
|
405
|
+
*/ function isMethodCallAt(source, index) {
|
|
406
|
+
const rest = source.slice(index);
|
|
407
|
+
return /^\s*(?:\?\.)?\s*(?:<[^<>()]*>\s*)?\(/.test(rest);
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Top-level fields of `binding` that the modules in `sources` read.
|
|
411
|
+
*
|
|
412
|
+
* Directory-wide on purpose. A per-file list would be one more thing to keep
|
|
413
|
+
* up to date, and a NEW resolver reading a NEW field is covered the moment it
|
|
414
|
+
* is written — the only way this stays true without anyone tending it.
|
|
415
|
+
*
|
|
416
|
+
* The document is identified by IDENTIFIER NAME, not by type — this is a text
|
|
417
|
+
* scan, and it has no way to know what a local called `host` actually holds.
|
|
418
|
+
* So an unrelated binding of the same name contributes its property reads too.
|
|
419
|
+
* That direction is safe (a spurious field fails loudly and gets classified by
|
|
420
|
+
* a human, and can never HIDE a real one), and it is deliberately left alone,
|
|
421
|
+
* because the filter that would suppress it is the filter that could suppress
|
|
422
|
+
* a real read. See {@link isMethodCallAt} for the one case that is not safe to
|
|
423
|
+
* leave — it produced a name no human could classify.
|
|
424
|
+
*/ export function readFieldsOf(sources, binding) {
|
|
425
|
+
const found = new Set();
|
|
426
|
+
for (const raw of sources){
|
|
427
|
+
const source = stripQuotedStrings(stripComments(raw));
|
|
428
|
+
// `host?.field` / `host.field` — the ordinary read.
|
|
429
|
+
for (const hit of source.matchAll(new RegExp(`\\b${binding}\\s*\\??\\.\\s*([A-Za-z_$][A-Za-z0-9_$]*)`, 'g'))){
|
|
430
|
+
// `host.toLowerCase()` is a method INVOCATION, not a field (AGL-1719).
|
|
431
|
+
if (isMethodCallAt(source, hit.index + hit[0].length)) continue;
|
|
432
|
+
// A lone `$` is the head of a `${…}` interpolation, not a field: it
|
|
433
|
+
// comes from token-name construction like `` `{{host.${key}}}` ``.
|
|
434
|
+
// Template literals are left unstripped on purpose — a real read can
|
|
435
|
+
// live inside one — so this is the price, and a field named `$` cannot
|
|
436
|
+
// exist. Anything else, including `$id`, is kept and must be classified.
|
|
437
|
+
if (hit[1] !== '$') found.add(hit[1]);
|
|
438
|
+
}
|
|
439
|
+
// `(host as { cname?: unknown })?.cname` — the cast a field that is real
|
|
440
|
+
// but was undeclared gets read through.
|
|
441
|
+
for (const hit of source.matchAll(new RegExp(`\\b${binding}\\s+as\\s*\\{\\s*([A-Za-z_$][A-Za-z0-9_$]*)\\s*\\??\\s*:`, 'g'))){
|
|
442
|
+
found.add(hit[1]);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
return [
|
|
446
|
+
...found
|
|
447
|
+
].sort();
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Comments stripped from a TYPESCRIPT source, with string literals respected.
|
|
451
|
+
*
|
|
452
|
+
* `stripComments` above scans rules files, where no string ever contains a
|
|
453
|
+
* comment delimiter. TypeScript sources are not that: `apps/console/app/api/
|
|
454
|
+
* media/upload-url/route.ts` builds a download URL from a template literal
|
|
455
|
+
* containing `https://`, and a scan that does not know it is inside a string
|
|
456
|
+
* reads that `//` as a line comment and deletes the rest of the line. On a
|
|
457
|
+
* guard that parses an object literal out of a route, that is not a crash —
|
|
458
|
+
* it is a SHORTER field list, silently, which is the failure mode AGL-2004
|
|
459
|
+
* described one level down.
|
|
460
|
+
*
|
|
461
|
+
* A separate function rather than a widened `stripComments`, because the two
|
|
462
|
+
* inputs have genuinely different grammars and three shipped guards depend on
|
|
463
|
+
* the rules-file behaviour exactly as it is. Same single left-to-right scan,
|
|
464
|
+
* with quotes as a third state.
|
|
465
|
+
*/ export function stripTypeScriptComments(source) {
|
|
466
|
+
let out = '';
|
|
467
|
+
let index = 0;
|
|
468
|
+
while(index < source.length){
|
|
469
|
+
const pair = source.slice(index, index + 2);
|
|
470
|
+
if (pair === '/*') {
|
|
471
|
+
const end = source.indexOf('*/', index + 2);
|
|
472
|
+
index = end < 0 ? source.length : end + 2;
|
|
473
|
+
continue;
|
|
474
|
+
}
|
|
475
|
+
if (pair === '//') {
|
|
476
|
+
const end = source.indexOf('\n', index + 2);
|
|
477
|
+
if (end < 0) break;
|
|
478
|
+
// Keep the newline so line-oriented reasoning downstream survives.
|
|
479
|
+
out += '\n';
|
|
480
|
+
index = end + 1;
|
|
481
|
+
continue;
|
|
482
|
+
}
|
|
483
|
+
const character = source[index];
|
|
484
|
+
if (character === "'" || character === '"' || character === '`') {
|
|
485
|
+
let cursor = index + 1;
|
|
486
|
+
while(cursor < source.length && source[cursor] !== character){
|
|
487
|
+
cursor += source[cursor] === '\\' ? 2 : 1;
|
|
488
|
+
}
|
|
489
|
+
out += source.slice(index, Math.min(cursor + 1, source.length));
|
|
490
|
+
index = cursor + 1;
|
|
491
|
+
continue;
|
|
492
|
+
}
|
|
493
|
+
out += character;
|
|
494
|
+
index += 1;
|
|
495
|
+
}
|
|
496
|
+
return out;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
//# sourceMappingURL=write-deny-coverage.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/aglyn/src/lib/foundation/definitions/write-deny-coverage.util.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 * Shared parsing for the write-deny coverage guards (AGL-1355, AGL-1361).\n *\n * Extracted from `org-write-deny-coverage.spec.ts` when the same property was\n * extended to `hosts/{hostId}` and `marketplaceListings/{listingId}`. Three\n * documents, three different rule shapes, one parser — a second copy of this\n * would be a second thing to keep true, which is the disease these guards\n * exist to treat.\n *\n * Deliberately PURE: every function takes source text and returns data, with\n * no file I/O and no imports. That keeps the module free of `node:fs` (this\n * lib is bundled for the browser) and makes each helper testable on a string\n * literal. The specs own the reading.\n *\n * Not exported from the foundation barrel — nothing at runtime should reach\n * for it.\n */\n\n/**\n * Comments are stripped from every source before parsing. Prose in this repo\n * quotes rules fragments and field names constantly — the org block's own\n * comment names all four AGL-1354 keys, and the listing block's names half its\n * deny-list — so parsing with comments in place would read the explanation of\n * a hole as the fix for it.\n *\n * A single left-to-right scan, NOT two regex passes, and that distinction is\n * load-bearing (AGL-2004). The previous version removed block comments first\n * and line comments second, so a line comment that merely QUOTED a path opened\n * a block comment that was never meant to exist:\n *\n * // the name, so `hosts/<hostId>/datasets/*` stayed a client-writable\n *\n * The `/` before `*` reads as an opening delimiter, and the strip then ran to\n * the next closing delimiter 571 lines away, swallowing real rule text — and\n * with it two closing braces, which left the block walker unable to find the\n * end of the root `match` and threw `never closes`. Every deny-coverage guard\n * in this directory failed to RUN, which is the worst way for a guard to fail:\n * the suite is red, so nobody reads it as coverage, but the thing it protects\n * (the AGL-1775 `registers` deny-list) is unwatched until someone does.\n *\n * Scanning once fixes it in both directions: whichever delimiter appears first\n * wins, so `/*` inside a line comment is just text, and `//` inside a block\n * comment cannot eat the block's own terminator.\n */\nexport function stripComments(source: string): string {\n let out = ''\n let index = 0\n while (index < source.length) {\n const pair = source.slice(index, index + 2)\n if (pair === '/*') {\n const end = source.indexOf('*/', index + 2)\n index = end < 0 ? source.length : end + 2\n continue\n }\n if (pair === '//') {\n const end = source.indexOf('\\n', index + 2)\n if (end < 0) break\n // Keep the newline: line numbers and statement separation survive.\n out += '\\n'\n index = end + 1\n continue\n }\n out += source[index]\n index += 1\n }\n return out\n}\n\n/**\n * Quoted strings, blanked. `org-permissions.ts` declares permission KEYS\n * spelled `'org.settings'` and `'org.auditLog'`, which read exactly like a\n * field access — the first run of the org guard demanded the rules deny two\n * fields that do not exist. Template literals are left alone: a real read can\n * legitimately live inside `${…}`.\n */\nexport function stripQuotedStrings(source: string): string {\n return source\n .replace(/'(?:\\\\.|[^'\\\\\\n])*'/g, \"''\")\n .replace(/\"(?:\\\\.|[^\"\\\\\\n])*\"/g, '\"\"')\n}\n\n/**\n * Firestore path variables (`{orgId}`, `{document=**}`) carry braces that a\n * block-depth walker reads as nesting. Rewriting them to angle brackets makes\n * the rules parseable by brace counting without losing the path text — which\n * matters, because `{document=**}` IS the wildcard these guards have to see.\n */\nexport function normalizePathVariables(rules: string): string {\n return rules.replace(/\\{([A-Za-z_][A-Za-z0-9_]*(?:=\\*\\*)?)\\}/g, '<$1>')\n}\n\n/**\n * The text of a `{ … }` block, keeping only what sits at the block's own\n * depth. Nested blocks — sub-`match` rules, inline object types — are dropped,\n * so a nested `allow` or a nested property can never be mistaken for one\n * belonging to the block asked for.\n *\n * `header` must end with the opening brace.\n */\nexport function topLevelBody(source: string, header: string): string {\n const at = source.indexOf(header)\n if (at < 0) throw new Error(`Guard cannot parse: no \\`${header}\\` found.`)\n let depth = 1\n let out = ''\n for (let index = at + header.length; index < source.length; index += 1) {\n const character = source[index]\n if (character === '{') {\n depth += 1\n continue\n }\n if (character === '}') {\n depth -= 1\n if (depth === 0) return out\n continue\n }\n if (depth === 1) out += character\n }\n throw new Error(`Guard cannot parse: \\`${header}\\` never closes.`)\n}\n\n/**\n * The FULL text of a `{ … }` block, nested blocks INCLUDED.\n *\n * The opposite of `topLevelBody`, and needed for the opposite question. That\n * one answers \"what does THIS block say\", so it drops nested bodies — which is\n * exactly right for a deny-list on one document, and exactly wrong for\n * `hosts/{hostId}`, whose subcollection rules all live in nested `match`\n * blocks. AGL-1367 lived in one of them.\n *\n * `header` must end with the opening brace.\n */\nexport function rawBlockBody(source: string, header: string): string {\n const at = source.indexOf(header)\n if (at < 0) throw new Error(`Guard cannot parse: no \\`${header}\\` found.`)\n let depth = 1\n let out = ''\n for (let index = at + header.length; index < source.length; index += 1) {\n const character = source[index]\n if (character === '{') depth += 1\n else if (character === '}') {\n depth -= 1\n if (depth === 0) return out\n }\n out += character\n }\n throw new Error(`Guard cannot parse: \\`${header}\\` never closes.`)\n}\n\n/** The subcollection write rules of `hosts/{hostId}`, as the rules state them. */\nexport interface ParsedSubcollectionRules {\n /** The `subcollection in […]` exclusion list of each catch-all allow. */\n excluded: { create: string[]; update: string[]; delete: string[] }\n /** Collections with a dedicated `match` block, which can RE-GRANT. */\n dedicated: string[]\n /** Excluded from all three AND re-granted by nothing: denied outright. */\n serverOnly: string[]\n}\n\n/**\n * Parse the host catch-all's three exclusion lists (AGL-1367).\n *\n * Membership in ONE list is not denial and never was — `variables` is\n * create-excluded and freely updatable, `webhooks` is create-excluded and\n * freely updatable on purpose (the soft delete is how a capped site frees a\n * slot). And a dedicated `match` block RE-GRANTS, because Firestore ORs its\n * allows and the LOOSER one wins: `screens`, `layouts` and `collections` all\n * sit in three lists and stay editor-writable through the blocks above.\n *\n * So \"denied outright\" is the intersection of the three lists MINUS everything\n * with a block of its own. That subtraction is the reason a dedicated\n * `allow write: if false` block would not have closed AGL-1367 — a deny can\n * never win an OR.\n */\nexport function parseHostSubcollectionRules(\n rulesSource: string,\n): ParsedSubcollectionRules {\n const rules = normalizePathVariables(stripComments(rulesSource))\n const host = rawBlockBody(rules, 'match /hosts/<hostId> {')\n\n const catchAllHeader = 'match /<subcollection>/<document=**> {'\n const occurrences = host.split(catchAllHeader).length - 1\n if (occurrences !== 1) {\n throw new Error(\n `Expected exactly one \\`${catchAllHeader}\\` under match /hosts/{hostId}, ` +\n `found ${occurrences}. A second one would OR another set of allows ` +\n `onto every subcollection, so these lists would be half the answer.`,\n )\n }\n const catchAll = rawBlockBody(host, catchAllHeader)\n\n const listFor = (operation: 'create' | 'update' | 'delete'): string[] => {\n const statement = catchAll\n .split(';')\n .find((entry) =>\n new RegExp(`\\\\ballow\\\\b[^:]*\\\\b${operation}\\\\b`).test(entry),\n )\n if (!statement) {\n throw new Error(\n `No \\`allow … ${operation}\\` in the host catch-all. The block has been ` +\n `restructured; re-read it before trusting this guard.`,\n )\n }\n const list = statement.match(/subcollection\\s+in\\s+\\[([^\\]]*)\\]/)\n if (!list) {\n throw new Error(\n `The host catch-all's \\`allow ${operation}\\` has no ` +\n `\\`subcollection in […]\\` exclusion list. Every server-owned host ` +\n `subcollection is denied by NAME in that list and nowhere else, so ` +\n `this guard cannot see what is protected any more.`,\n )\n }\n return [...list[1].matchAll(/'([^']+)'/g)].map((entry) => entry[1])\n }\n\n const excluded = {\n create: listFor('create'),\n update: listFor('update'),\n delete: listFor('delete'),\n }\n // Named `match` blocks only. After `normalizePathVariables` a wildcard\n // segment starts with `<`, so a leading letter is what distinguishes a\n // collection block from `match /<subcollection>/…` or the nested\n // `match /<sub>/…` inside the screens/layouts/components blocks.\n const dedicated = [\n ...new Set(\n [...host.matchAll(/match\\s+\\/([A-Za-z][A-Za-z0-9]*)\\//g)].map(\n (entry) => entry[1],\n ),\n ),\n ]\n const serverOnly = excluded.create.filter(\n (name) =>\n excluded.update.includes(name) &&\n excluded.delete.includes(name) &&\n !dedicated.includes(name),\n )\n return { excluded, dedicated, serverOnly }\n}\n\n/**\n * Split an expression on `||` at parenthesis depth 0 only.\n *\n * A naive `split('||')` tears a branch apart at any nested alternation, and\n * both of the documents AGL-1361 added have one. The host rule's client branch\n * is `(… && !hasAny(L1) && (role == 'admin' || !hasAny(L2)))` — its deny-list\n * is TIERED, six keys no site member may touch plus `disabledPlugins` which\n * only a site admin may — and a naive split drops L2 into a branch of its own\n * where nothing looks for it. The listing block's `function listingManager()`\n * produces the mirror problem, matching two branches instead of one.\n */\nexport function splitTopLevelOr(expression: string): string[] {\n const parts: string[] = []\n let depth = 0\n let current = ''\n for (let index = 0; index < expression.length; index += 1) {\n const character = expression[index]\n if (character === '(') depth += 1\n if (character === ')') depth -= 1\n if (depth === 0 && character === '|' && expression[index + 1] === '|') {\n parts.push(current)\n current = ''\n index += 1\n continue\n }\n current += character\n }\n parts.push(current)\n return parts.map((part) => part.trim()).filter(Boolean)\n}\n\n/** The keys of the FIRST `hasAny([...])` literal in a rules branch. */\nexport function hasAnyKeys(branch: string): string[] {\n const list = branch.match(/hasAny\\(\\s*\\[([^\\]]*)\\]/)\n if (!list) return []\n return [...list[1].matchAll(/'([^']+)'/g)].map((entry) => entry[1])\n}\n\n/**\n * The keys of EVERY `hasAny([...])` literal in a branch, flattened.\n *\n * The org rule has one list per branch; the host rule has two in a single\n * branch, because its deny-list is TIERED — six keys no site member may\n * touch, and `disabledPlugins` which only a site admin may. `hasAnyKeys`\n * returns the first list alone, so a host guard built on it would have\n * silently believed `disabledPlugins` was unprotected.\n */\nexport function allHasAnyKeys(branch: string): string[] {\n return [...branch.matchAll(/hasAny\\(\\s*\\[([^\\]]*)\\]/g)].flatMap((list) =>\n [...list[1].matchAll(/'([^']+)'/g)].map((entry) => entry[1]),\n )\n}\n\n/**\n * Top-level property names declared on an interface.\n *\n * `header` is the full declaration line up to and including the brace, because\n * the three documents do not share a shape: `AglynOrgBilling` and `AglynHost`\n * both `extends AglynDocument`, while `MarketplaceListing` extends nothing.\n */\nexport function declaredFields(source: string, header: string): string[] {\n const body = topLevelBody(stripComments(source), header)\n return [\n ...body.matchAll(/(?:^|\\n)\\s*(\\$?[A-Za-z_][A-Za-z0-9_$]*)\\s*\\??\\s*:/g),\n ].map((entry) => entry[1])\n}\n\n/** A parsed `allow update` rule for one document. */\nexport interface ParsedUpdateRule {\n /** Every key denied to the client branch, across all its `hasAny` lists. */\n denied: string[]\n /** Every OR'd branch of the single `allow update` statement. */\n branches: string[]\n /** Depth-0 statements of the document's `match` block. */\n statements: string[]\n /** Depth-0 `match` headers under `/databases/{database}/documents`. */\n topLevelMatches: string[]\n}\n\n/**\n * Parse the single `allow update` of one top-level document block.\n *\n * `matchHeader` is post-`normalizePathVariables`, e.g.\n * `match /hosts/<hostId> {`. `clientPredicate` names the branch that a CLIENT\n * reaches — `canManageOrg()`, `canWriteHostContent(hostId)`, `listingManager()`\n * — as opposed to the staff branches, which are trusted by design.\n */\nexport function parseUpdateRule(\n rulesSource: string,\n matchHeader: string,\n clientPredicate: string,\n): ParsedUpdateRule {\n const rules = normalizePathVariables(stripComments(rulesSource))\n const root = topLevelBody(rules, 'match /databases/<database>/documents {')\n const topLevelMatches = [...root.matchAll(/match\\s+(\\/\\S*)/g)].map(\n (entry) => entry[1],\n )\n\n const block = topLevelBody(rules, matchHeader)\n const statements = block\n .split(';')\n .map((statement) => statement.trim())\n .filter(Boolean)\n\n // ONE `allow` statement may mention `update`. Firestore ORs every allow\n // across sibling statements AND sibling match blocks, and the LOOSER one\n // wins — so a second statement would mean this guard is reasoning about a\n // deny-list that some other statement quietly overrides.\n const updates = statements.filter((statement) =>\n /\\ballow\\b[^:]*\\bupdate\\b/.test(statement),\n )\n if (updates.length !== 1) {\n throw new Error(\n `Expected exactly one \\`allow … update\\` statement under ` +\n `${matchHeader}, found ${updates.length}. Firestore ORs them and the ` +\n `LOOSER wins, so the deny-list this guard reads would no longer be ` +\n `the whole answer. Fold the branches back into one statement, or ` +\n `teach this guard how they combine.`,\n )\n }\n\n // Start at the `allow` keyword. `topLevelBody` drops a nested block's BODY\n // but leaves its header text at depth 1, so the listing block's\n // `function listingManager()` declaration survives as an orphan with no\n // semicolon of its own — it merges into the following statement and makes\n // `listingManager()` appear in two branches instead of one. Slicing to\n // `allow` removes the remnant without pretending the function is not there.\n const statement = updates[0].slice(updates[0].indexOf('allow'))\n const branches = splitTopLevelOr(statement)\n const found = branches.filter((branch) => branch.includes(clientPredicate))\n if (found.length !== 1) {\n throw new Error(\n `Expected exactly one \\`allow update\\` branch guarded by ` +\n `${clientPredicate} under ${matchHeader}, found ${found.length}. The ` +\n `rule has been restructured; re-read it before trusting this guard.`,\n )\n }\n\n return {\n denied: allHasAnyKeys(found[0]),\n branches,\n statements,\n topLevelMatches,\n }\n}\n\n/**\n * Field names in an object literal a document is seeded with.\n *\n * `anchor` is a regex source locating the write; the literal's own braces are\n * matched by depth rather than `[^}]*`, because a seed can legitimately carry\n * a nested object (the host seed writes `screens: {}`) and a lazy class would\n * truncate the field list at the first inner brace — silently shrinking one of\n * the guard's sources rather than failing.\n */\nexport function seedFields(source: string, anchor: RegExp): string[] | null {\n const at = stripComments(source).search(anchor)\n if (at < 0) return null\n const text = stripComments(source)\n const open = text.indexOf('{', at)\n if (open < 0) return null\n let depth = 1\n let body = ''\n for (let index = open + 1; index < text.length; index += 1) {\n const character = text[index]\n if (character === '{') depth += 1\n else if (character === '}') {\n depth -= 1\n if (depth === 0) break\n }\n if (depth === 1) body += character\n }\n return [\n ...body.matchAll(/(?:^|,|\\n)\\s*([A-Za-z_$][A-Za-z0-9_$]*)\\s*[,:]/g),\n ].map((entry) => entry[1])\n}\n\n/**\n * Field names a document of `collection` is seeded with, in either shape a\n * seed write takes in this codebase (AGL-2100).\n *\n * The original parser understood only the CHAINED form —\n * `collection('hosts').doc(id).set({ … })` — because that is what every seed\n * route looked like when it was written. AGL-2063 rewrote the host create into\n * a transactional claim, which necessarily splits the chain: the ref has to be\n * built BEFORE `runTransaction` opens so the transaction body can both read\n * and write it, leaving `const hostRef = …doc(hostId)` in one statement and\n * `tx.set(hostRef, { … })` in another. The chained anchor then matched\n * nothing, `seedFields` returned null, and the guard threw — asserting nothing\n * about any of the four sources of the host field set until it was fixed.\n *\n * So resolve the REF BINDING rather than teaching the guard one more literal\n * spelling. Any `set`/`create` whose first argument is a ref bound to this\n * collection is a seed write, which covers `tx.`, `batch.` and a bare\n * `ref.set()` alike, and does not care what wraps them.\n *\n * Anchoring on the WRITE and not on the binding matters: the binding is\n * followed by the transaction callback's own `{`, so a binding-anchored parse\n * would happily return the arrow body's contents as the field list — a\n * silently wrong answer, which is worse than the throw.\n *\n * Returns null when neither shape is present, so the caller still throws.\n */\nexport function seedFieldsOfCollection(\n source: string,\n collection: string,\n): string[] | null {\n const name = collection.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const chained = seedFields(\n source,\n new RegExp(\n `collection\\\\('${name}'\\\\)\\\\s*\\\\.doc\\\\([^)]*\\\\)\\\\s*\\\\.\\\\s*(?:set|create)\\\\s*\\\\(`,\n ),\n )\n if (chained) return chained\n\n const text = stripComments(source)\n const bindings = [\n ...text.matchAll(\n new RegExp(\n `(?:const|let|var)\\\\s+([A-Za-z_$][A-Za-z0-9_$]*)\\\\s*=\\\\s*[^;\\\\n]*collection\\\\('${name}'\\\\)\\\\s*\\\\.doc\\\\(`,\n 'g',\n ),\n ),\n ].map((entry) => entry[1])\n\n for (const binding of bindings) {\n const fields = seedFields(\n source,\n new RegExp(\n `\\\\b(?:set|create)\\\\s*\\\\(\\\\s*${binding}\\\\s*,\\\\s*\\\\{`,\n ),\n )\n if (fields) return fields\n }\n return null\n}\n\n/**\n * Whether the property access ending at `index` is being CALLED (AGL-1719).\n *\n * The guard reads `hosts/{hostId}` fields by scanning for `host.<name>` across\n * a whole directory, which means it matches on the identifier NAME and cannot\n * see the type. `media-ref.ts` has `isFirstPartyHost(host: string)` whose body\n * is `host.toLowerCase()` — a hostname string, not the host document — so\n * `toLowerCase` entered the field universe and the guard demanded that a\n * `String.prototype` method be classified as server-owned or client-writable.\n *\n * Dropping method calls removes that whole class rather than that one name,\n * and it is sound in the only direction that matters. Firestore document data\n * is JSON: string, number, boolean, null, array, map, timestamp, geopoint,\n * reference. **No field of a document can be callable**, so `binding.X(` is\n * provably never a field read and this can never introduce a false negative —\n * which is the single failure mode a coverage guard has (AGL-1420).\n *\n * A chained read is untouched: in `host.disabledPlugins.includes(x)` the\n * character after the captured name is `.`, so `disabledPlugins` is still\n * collected and only `includes` is dropped. Optional calls (`host.foo?.()`)\n * and generic ones (`host.foo<T>()`) are calls too.\n *\n * An exclusion list of known method names was rejected: it would silence the\n * symptom, need tending forever, and still say nothing about the next method\n * on the next same-named local.\n */\nfunction isMethodCallAt(source: string, index: number): boolean {\n const rest = source.slice(index)\n return /^\\s*(?:\\?\\.)?\\s*(?:<[^<>()]*>\\s*)?\\(/.test(rest)\n}\n\n/**\n * Top-level fields of `binding` that the modules in `sources` read.\n *\n * Directory-wide on purpose. A per-file list would be one more thing to keep\n * up to date, and a NEW resolver reading a NEW field is covered the moment it\n * is written — the only way this stays true without anyone tending it.\n *\n * The document is identified by IDENTIFIER NAME, not by type — this is a text\n * scan, and it has no way to know what a local called `host` actually holds.\n * So an unrelated binding of the same name contributes its property reads too.\n * That direction is safe (a spurious field fails loudly and gets classified by\n * a human, and can never HIDE a real one), and it is deliberately left alone,\n * because the filter that would suppress it is the filter that could suppress\n * a real read. See {@link isMethodCallAt} for the one case that is not safe to\n * leave — it produced a name no human could classify.\n */\nexport function readFieldsOf(\n sources: Array<string>,\n binding: string,\n): string[] {\n const found = new Set<string>()\n for (const raw of sources) {\n const source = stripQuotedStrings(stripComments(raw))\n // `host?.field` / `host.field` — the ordinary read.\n for (const hit of source.matchAll(\n new RegExp(`\\\\b${binding}\\\\s*\\\\??\\\\.\\\\s*([A-Za-z_$][A-Za-z0-9_$]*)`, 'g'),\n )) {\n // `host.toLowerCase()` is a method INVOCATION, not a field (AGL-1719).\n if (isMethodCallAt(source, hit.index + hit[0].length)) continue\n // A lone `$` is the head of a `${…}` interpolation, not a field: it\n // comes from token-name construction like `` `{{host.${key}}}` ``.\n // Template literals are left unstripped on purpose — a real read can\n // live inside one — so this is the price, and a field named `$` cannot\n // exist. Anything else, including `$id`, is kept and must be classified.\n if (hit[1] !== '$') found.add(hit[1])\n }\n // `(host as { cname?: unknown })?.cname` — the cast a field that is real\n // but was undeclared gets read through.\n for (const hit of source.matchAll(\n new RegExp(\n `\\\\b${binding}\\\\s+as\\\\s*\\\\{\\\\s*([A-Za-z_$][A-Za-z0-9_$]*)\\\\s*\\\\??\\\\s*:`,\n 'g',\n ),\n )) {\n found.add(hit[1])\n }\n }\n return [...found].sort()\n}\n\n/**\n * Comments stripped from a TYPESCRIPT source, with string literals respected.\n *\n * `stripComments` above scans rules files, where no string ever contains a\n * comment delimiter. TypeScript sources are not that: `apps/console/app/api/\n * media/upload-url/route.ts` builds a download URL from a template literal\n * containing `https://`, and a scan that does not know it is inside a string\n * reads that `//` as a line comment and deletes the rest of the line. On a\n * guard that parses an object literal out of a route, that is not a crash —\n * it is a SHORTER field list, silently, which is the failure mode AGL-2004\n * described one level down.\n *\n * A separate function rather than a widened `stripComments`, because the two\n * inputs have genuinely different grammars and three shipped guards depend on\n * the rules-file behaviour exactly as it is. Same single left-to-right scan,\n * with quotes as a third state.\n */\nexport function stripTypeScriptComments(source: string): string {\n let out = ''\n let index = 0\n while (index < source.length) {\n const pair = source.slice(index, index + 2)\n if (pair === '/*') {\n const end = source.indexOf('*/', index + 2)\n index = end < 0 ? source.length : end + 2\n continue\n }\n if (pair === '//') {\n const end = source.indexOf('\\n', index + 2)\n if (end < 0) break\n // Keep the newline so line-oriented reasoning downstream survives.\n out += '\\n'\n index = end + 1\n continue\n }\n const character = source[index]\n if (character === \"'\" || character === '\"' || character === '`') {\n let cursor = index + 1\n while (cursor < source.length && source[cursor] !== character) {\n cursor += source[cursor] === '\\\\' ? 2 : 1\n }\n out += source.slice(index, Math.min(cursor + 1, source.length))\n index = cursor + 1\n continue\n }\n out += character\n index += 1\n }\n return out\n}\n"],"names":["stripComments","source","out","index","length","pair","slice","end","indexOf","stripQuotedStrings","replace","normalizePathVariables","rules","topLevelBody","header","at","Error","depth","character","rawBlockBody","parseHostSubcollectionRules","rulesSource","host","catchAllHeader","occurrences","split","catchAll","listFor","operation","statement","find","entry","RegExp","test","list","match","matchAll","map","excluded","create","update","delete","dedicated","Set","serverOnly","filter","name","includes","splitTopLevelOr","expression","parts","current","push","part","trim","Boolean","hasAnyKeys","branch","allHasAnyKeys","flatMap","declaredFields","body","parseUpdateRule","matchHeader","clientPredicate","root","topLevelMatches","block","statements","updates","branches","found","denied","seedFields","anchor","search","text","open","seedFieldsOfCollection","collection","chained","bindings","binding","fields","isMethodCallAt","rest","readFieldsOf","sources","raw","hit","add","sort","stripTypeScriptComments","cursor","Math","min"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022 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
|
+
export * from './definitions/components.types';
|
|
18
|
+
export * from './definitions/contact.types';
|
|
19
|
+
export * from './definitions/host-content-collections';
|
|
20
|
+
export * from './definitions/organization.types';
|
|
21
|
+
export * from './definitions/property-kinds';
|
|
22
|
+
export * from './definitions/shared';
|
|
23
|
+
export { HOST_ERROR_SCREEN_SLOTS, HOST_UNPERSISTED_FIELDS, HostEntityType, HostRedirectParams, HostScreenStatus, HostScreenVisibility, HostViewFormat, HostViewType, } from './definitions/platform.types';
|
|
24
|
+
export { ORG_CLIENT_WRITABLE_FIELDS, ORG_UNPERSISTED_FIELDS, } from './definitions/org-billing.types';
|
|
25
|
+
export type { AglynOrgBilling, CoreOrgEntitlements, CoreOrgFeatureFlags, OrgBandwidthCap, OrgBrandingProfile, OrgCrmAssignmentRule, OrgCrmHostSettings, OrgCrmInbound, OrgCrmRoundRobin, OrgCrmSettings, OrgDiscount, OrgEntitlements, OrgFeatureFlags, OrgPlan, OrgPlanComp, OrgSeatAddons, OrgSubscription, OrgUid, } from './definitions/org-billing.types';
|
|
26
|
+
export type { AglynDocument, AglynHost, AglynHostComponent, AglynHostComponentVersion, AglynHostMedia, AglynHostMediaFolder, AglynHostTheme, AglynLayout, AglynRedirect, AglynScreen, AglynTemplate, AglynUser, ComponentDefUid, HostAnnouncementBar, HostErrorScreens, HostErrorScreenSlot, HostPopup, HostMediaUid, HostPath, HostUid, LayoutUid, LegacyNamedFieldKind, NonValueFieldKind, ProjectNumber, ProjectUid, PublishSchedule, RedirectUid, ReusableComponentIcon, ReusableComponentProp, ReusableComponentPropCondition, ReusableComponentPropOption, ReusableComponentPropRule, ReusableComponentPropType, ReusableComponentPropValue, ScopeToken, ScreenSlug, ScreenUid, TemplateKind, TemplatePlaceholder, TemplateSource, TemplateUid, UserUid, VersionUid, } from './definitions/platform.types';
|
|
27
|
+
export * from './constants/_internal';
|
|
28
|
+
export * from './constants/app';
|
|
29
|
+
export * from './constants/canvas';
|
|
30
|
+
export * from './constants/components';
|
|
31
|
+
export * from './constants/shared';
|
|
32
|
+
export * from './constants/symbol';
|