@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,989 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ /**
|
|
18
|
+
* Static plugin-bundle checks (AGL-426) — Strapi `strapi-plugin verify`
|
|
19
|
+
* parity, but ALSO enforced server-side: the publish API runs the same
|
|
20
|
+
* checks, so a bundle that fails locally fails there identically.
|
|
21
|
+
*
|
|
22
|
+
* The bundle is PARSED and the tree analysed (AGL-964). The checks used to
|
|
23
|
+
* match source text with regexes, which meant they could not see computed
|
|
24
|
+
* member access, could not follow a value into a call, and could not tell
|
|
25
|
+
* code from a comment — `g['ev'+'al'](…)` passed while the words `eval(`
|
|
26
|
+
* inside a comment failed. On a minified bundle, which every published
|
|
27
|
+
* artifact is, that is close to no signal at all.
|
|
28
|
+
*
|
|
29
|
+
* These are still cheap heuristics, NOT a sandbox: they catch honest build
|
|
30
|
+
* mistakes (leftover imports, missing entry exports, oversized bundles),
|
|
31
|
+
* flag the APIs the platform never wants in marketplace code, and surface
|
|
32
|
+
* the questions a reviewer should ask. A determined author can still hide
|
|
33
|
+
* intent from any static pass. The real security boundary stays the trust
|
|
34
|
+
* chain (sandbox iframe + per-manifest CSP / staff review + realm signing /
|
|
35
|
+
* sha pinning / the kill switch).
|
|
36
|
+
*/ import { parse } from "acorn";
|
|
37
|
+
const CHECK_LABELS = {
|
|
38
|
+
parse: 'Parses as an ES module',
|
|
39
|
+
entry: 'Exports an entry point',
|
|
40
|
+
'self-contained': 'Self-contained (no static imports)',
|
|
41
|
+
size: 'Within the size limit',
|
|
42
|
+
'code-execution': 'No eval / Function constructor',
|
|
43
|
+
globals: 'No computed access on a global',
|
|
44
|
+
storage: 'No direct storage or cookie access',
|
|
45
|
+
'dynamic-import': 'No dynamic import of unknown code',
|
|
46
|
+
network: 'Network calls match the manifest',
|
|
47
|
+
obfuscation: 'No obfuscation shapes',
|
|
48
|
+
contributions: 'Registrations match the declared contributions'
|
|
49
|
+
};
|
|
50
|
+
/** Check order as displayed — findings first would reorder on every bundle. */ const CHECK_ORDER = [
|
|
51
|
+
'parse',
|
|
52
|
+
'entry',
|
|
53
|
+
'self-contained',
|
|
54
|
+
'size',
|
|
55
|
+
'code-execution',
|
|
56
|
+
'globals',
|
|
57
|
+
'storage',
|
|
58
|
+
'dynamic-import',
|
|
59
|
+
'network',
|
|
60
|
+
'obfuscation',
|
|
61
|
+
'contributions'
|
|
62
|
+
];
|
|
63
|
+
export const MAX_PLUGIN_BUNDLE_BYTES = 1000000;
|
|
64
|
+
/**
|
|
65
|
+
* Stamped onto a cached verdict (AGL-962) so a stored result outlives only
|
|
66
|
+
* the checker that produced it.
|
|
67
|
+
*
|
|
68
|
+
* `checkPluginBundle` is pure over immutable, content-addressed bytes, so a
|
|
69
|
+
* verdict for a given sha256 never changes — but the CHECKS do. **Bump this
|
|
70
|
+
* whenever a rule is added, removed or loosened**, and every stored verdict
|
|
71
|
+
* from the old checker is ignored and recomputed on next read. Forgetting to
|
|
72
|
+
* bump means a reviewer sees a verdict from a checker that no longer exists,
|
|
73
|
+
* which is the failure mode re-running the verifier was meant to prevent.
|
|
74
|
+
*
|
|
75
|
+
* 2 — AST analysis replaces the regex scan (AGL-964).
|
|
76
|
+
* 3 — per-check summary added to the verdict (AGL-1087).
|
|
77
|
+
* 4 — calls through an alias are resolved (AGL-1090).
|
|
78
|
+
* 5 — URLs held in a constant are resolved (AGL-1093).
|
|
79
|
+
* 6 — registrations are compared with the declared contributions (AGL-3116).
|
|
80
|
+
*/ export const PLUGIN_VERIFIER_VERSION = 6;
|
|
81
|
+
/**
|
|
82
|
+
* Whether a stored verdict may be served instead of re-running the checks.
|
|
83
|
+
*
|
|
84
|
+
* Fails closed on every mismatch: no verdict, a verdict for different bytes
|
|
85
|
+
* (a republished version keeps its version string but changes sha), or a
|
|
86
|
+
* verdict from a checker that has since changed. Any of those means
|
|
87
|
+
* download-and-recompute, which costs one page view rather than showing a
|
|
88
|
+
* reviewer a verdict that was never true of the bundle in front of them.
|
|
89
|
+
*/ export function isStoredVerdictCurrent(stored, sha256) {
|
|
90
|
+
if (!stored || !sha256) return false;
|
|
91
|
+
return stored.sha256 === sha256 && Number(stored.verifierVersion) === PLUGIN_VERIFIER_VERSION;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Globals whose properties are the platform's business. Computed access on
|
|
95
|
+
* one of these is flagged as computed access rather than by trying to
|
|
96
|
+
* enumerate the property names an author might reach — `g[k]` hides its
|
|
97
|
+
* property from any static pass, so the ACCESS is the finding.
|
|
98
|
+
*/ const GLOBAL_ROOTS = new Set([
|
|
99
|
+
'globalThis',
|
|
100
|
+
'window',
|
|
101
|
+
'self',
|
|
102
|
+
'top',
|
|
103
|
+
'parent',
|
|
104
|
+
'frames',
|
|
105
|
+
'document'
|
|
106
|
+
]);
|
|
107
|
+
/** Storage the platform never wants reached directly (use host-mediated data). */ const STORAGE_NAMES = new Set([
|
|
108
|
+
'localStorage',
|
|
109
|
+
'sessionStorage',
|
|
110
|
+
'indexedDB'
|
|
111
|
+
]);
|
|
112
|
+
/** Network entry points, by the name they are called/constructed under. */ const NETWORK_CALLS = new Set([
|
|
113
|
+
'fetch',
|
|
114
|
+
'sendBeacon'
|
|
115
|
+
]);
|
|
116
|
+
const NETWORK_CONSTRUCTORS = new Set([
|
|
117
|
+
'XMLHttpRequest',
|
|
118
|
+
'WebSocket',
|
|
119
|
+
'EventSource'
|
|
120
|
+
]);
|
|
121
|
+
/**
|
|
122
|
+
* Names worth following through an alias (AGL-1090).
|
|
123
|
+
*
|
|
124
|
+
* `const f = fetch; f(url)` used to pass every check, and the network row
|
|
125
|
+
* rendered a green "no network calls" rather than going quiet — a two-line
|
|
126
|
+
* indirection defeating the signal this whole verifier exists to produce.
|
|
127
|
+
* Aliasing a VALUE was the exact gap the project was created to close, and
|
|
128
|
+
* resolving global objects (`const g = globalThis`) never covered it.
|
|
129
|
+
*
|
|
130
|
+
* Reassignment, `arr[0]`, an object property and passing the function as an
|
|
131
|
+
* argument all stay out of reach. The bar is that the cheap form is not free.
|
|
132
|
+
*/ const ALIASABLE_CALLABLES = new Set([
|
|
133
|
+
'eval',
|
|
134
|
+
'Function',
|
|
135
|
+
'fetch',
|
|
136
|
+
'sendBeacon',
|
|
137
|
+
'XMLHttpRequest',
|
|
138
|
+
'WebSocket',
|
|
139
|
+
'EventSource'
|
|
140
|
+
]);
|
|
141
|
+
/**
|
|
142
|
+
* Callees that legitimately take an absolute URL and reach nothing — so a URL
|
|
143
|
+
* literal passed to them is not a call the network check failed to follow.
|
|
144
|
+
* `createElementNS` matters most: an SVG namespace argument appears in a large
|
|
145
|
+
* share of real bundles.
|
|
146
|
+
*/ const URL_TAKING_NON_CALLS = new Set([
|
|
147
|
+
'URL',
|
|
148
|
+
'URLSearchParams',
|
|
149
|
+
'createElementNS',
|
|
150
|
+
'createDocument'
|
|
151
|
+
]);
|
|
152
|
+
/** Beyond this, a single line is not source a reviewer can read. */ const MAX_READABLE_LINE = 100000;
|
|
153
|
+
/** A base64 blob at least this long is worth decoding before approving. */ const MIN_SUSPICIOUS_BASE64 = 1024;
|
|
154
|
+
/** How many `_0x…` names before the bundle counts as machine-obfuscated. */ const MIN_OBFUSCATED_NAMES = 5;
|
|
155
|
+
/** Verdicts are stored on a version doc; keep them bounded. */ const MAX_PROBLEMS = 40;
|
|
156
|
+
const OBFUSCATED_NAME = /^_0x[0-9a-f]{4,}$/i;
|
|
157
|
+
const BASE64_BLOB = /^[A-Za-z0-9+/\r\n]+={0,2}$/;
|
|
158
|
+
/**
|
|
159
|
+
* Child keys that are NOT expressions in the surrounding scope — a
|
|
160
|
+
* non-computed `.property`, an object literal key, a label. Walking into
|
|
161
|
+
* them would read `x.localStorage` on an unrelated object as a global
|
|
162
|
+
* storage access.
|
|
163
|
+
*/ const skippedChild = (node, key)=>{
|
|
164
|
+
switch(node.type){
|
|
165
|
+
case 'MemberExpression':
|
|
166
|
+
return key === 'property' && !node['computed'];
|
|
167
|
+
case 'Property':
|
|
168
|
+
case 'PropertyDefinition':
|
|
169
|
+
case 'MethodDefinition':
|
|
170
|
+
return key === 'key' && !node['computed'];
|
|
171
|
+
case 'LabeledStatement':
|
|
172
|
+
case 'BreakStatement':
|
|
173
|
+
case 'ContinueStatement':
|
|
174
|
+
return key === 'label';
|
|
175
|
+
case 'ImportSpecifier':
|
|
176
|
+
case 'ExportSpecifier':
|
|
177
|
+
return true;
|
|
178
|
+
default:
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
/** Depth-first walk over every expression-position node in the tree. */ function walk(root, visit) {
|
|
183
|
+
const stack = [
|
|
184
|
+
root
|
|
185
|
+
];
|
|
186
|
+
while(stack.length){
|
|
187
|
+
const node = stack.pop();
|
|
188
|
+
if (!node) continue;
|
|
189
|
+
visit(node);
|
|
190
|
+
for (const key of Object.keys(node)){
|
|
191
|
+
if (key === 'type' || key === 'start' || key === 'end') continue;
|
|
192
|
+
if (skippedChild(node, key)) continue;
|
|
193
|
+
const value = node[key];
|
|
194
|
+
if (Array.isArray(value)) {
|
|
195
|
+
for (const item of value){
|
|
196
|
+
if (item && typeof item === 'object' && typeof item.type === 'string') stack.push(item);
|
|
197
|
+
}
|
|
198
|
+
} else if (value && typeof value === 'object' && typeof value.type === 'string') {
|
|
199
|
+
stack.push(value);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* The string a node evaluates to, when that is knowable without running it.
|
|
206
|
+
* Covers the shapes used to hide a property name from a text scan: a
|
|
207
|
+
* string literal, a template with no interpolation, and literals added
|
|
208
|
+
* together (`'ev' + 'al'`).
|
|
209
|
+
*/ function staticString(node, constants) {
|
|
210
|
+
var _constants_get;
|
|
211
|
+
if (!node) return null;
|
|
212
|
+
if (node.type === 'Literal') return typeof node['value'] === 'string' ? node['value'] : null;
|
|
213
|
+
// A name bound once to a constant string (AGL-1093). `const ENDPOINT =
|
|
214
|
+
// 'https://…'; fetch(ENDPOINT)` is the idiomatic way to write a request,
|
|
215
|
+
// and refusing to read it meant the network diff quietly did not run for
|
|
216
|
+
// the bundles most likely to be honest.
|
|
217
|
+
if (node.type === 'Identifier' && constants) return (_constants_get = constants.get(node['name'])) != null ? _constants_get : null;
|
|
218
|
+
if (node.type === 'TemplateLiteral') {
|
|
219
|
+
var _node_expressions, _node_quasis;
|
|
220
|
+
const expressions = (_node_expressions = node['expressions']) != null ? _node_expressions : [];
|
|
221
|
+
const quasis = (_node_quasis = node['quasis']) != null ? _node_quasis : [];
|
|
222
|
+
if (!expressions.length) {
|
|
223
|
+
var _ref;
|
|
224
|
+
var _quasis__value, _quasis_;
|
|
225
|
+
return quasis.length === 1 ? (_ref = (_quasis_ = quasis[0]) == null ? void 0 : (_quasis__value = _quasis_.value) == null ? void 0 : _quasis__value.cooked) != null ? _ref : null : null;
|
|
226
|
+
}
|
|
227
|
+
// `${BASE}/zen` — resolvable exactly when every hole is.
|
|
228
|
+
let out = '';
|
|
229
|
+
for(let index = 0; index < quasis.length; index += 1){
|
|
230
|
+
var _ref1;
|
|
231
|
+
var _quasis_index_value, _quasis_index;
|
|
232
|
+
out += (_ref1 = (_quasis_index = quasis[index]) == null ? void 0 : (_quasis_index_value = _quasis_index.value) == null ? void 0 : _quasis_index_value.cooked) != null ? _ref1 : '';
|
|
233
|
+
if (index < expressions.length) {
|
|
234
|
+
const filled = staticString(expressions[index], constants);
|
|
235
|
+
if (filled === null) return null;
|
|
236
|
+
out += filled;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return out;
|
|
240
|
+
}
|
|
241
|
+
if (node.type === 'BinaryExpression' && node['operator'] === '+') {
|
|
242
|
+
const left = staticString(node['left'], constants);
|
|
243
|
+
const right = staticString(node['right'], constants);
|
|
244
|
+
return left !== null && right !== null ? left + right : null;
|
|
245
|
+
}
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
/** The property name a member expression reads, computed or not. */ function propertyName(node, constants) {
|
|
249
|
+
const property = node['property'];
|
|
250
|
+
if (!node['computed']) return (property == null ? void 0 : property.type) === 'Identifier' ? property['name'] : null;
|
|
251
|
+
return staticString(property, constants);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* The origin of a URL argument, when it is a knowable http(s) URL.
|
|
255
|
+
*
|
|
256
|
+
* Scheme-checked HERE, once (AGL-1094). An opaque origin — every `data:`,
|
|
257
|
+
* `blob:` and `javascript:` URL — makes `new URL(x).origin` the STRING
|
|
258
|
+
* `"null"`, and a caller that then re-parsed that string threw `Invalid URL`
|
|
259
|
+
* and took the whole checker down with it. Nothing downstream should have to
|
|
260
|
+
* know that, so nothing downstream gets the chance.
|
|
261
|
+
*/ function literalOrigin(node, constants) {
|
|
262
|
+
const value = staticString(node, constants);
|
|
263
|
+
if (!value) return null;
|
|
264
|
+
try {
|
|
265
|
+
const url = new URL(value);
|
|
266
|
+
return /^https?:$/.test(url.protocol) ? url.origin : null;
|
|
267
|
+
} catch (unused) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/** The detection result of a bundle no pass could read. */ const NOTHING_DETECTED = {
|
|
272
|
+
contributes: {},
|
|
273
|
+
unresolved: []
|
|
274
|
+
};
|
|
275
|
+
/**
|
|
276
|
+
* Registration calls whose argument says what a bundle contributes, by the
|
|
277
|
+
* name they are reached through: `h.aglyn.registerConsoleExtension(...)`,
|
|
278
|
+
* `registerConsoleExtension(...)` after the realm template's host mapping,
|
|
279
|
+
* `aglyn.components.registerComponent(...)`.
|
|
280
|
+
*/ const REGISTRATION_CALLS = new Set([
|
|
281
|
+
'registerConsoleExtension',
|
|
282
|
+
'registerSiteRuntime',
|
|
283
|
+
'registerComponent',
|
|
284
|
+
'addDependency',
|
|
285
|
+
'defineUiFeatureBundle'
|
|
286
|
+
]);
|
|
287
|
+
/**
|
|
288
|
+
* Console extension fields the shell draws on every screen of a workspace:
|
|
289
|
+
* nav tabs, organization tabs, providers, staff pages and the dashboard and
|
|
290
|
+
* settings entries. A plugin registering any of them loads with the shell.
|
|
291
|
+
*/ const SHELL_EXTENSION_FIELDS = [
|
|
292
|
+
'navItems',
|
|
293
|
+
'orgNavItems',
|
|
294
|
+
'providers',
|
|
295
|
+
'staffPages',
|
|
296
|
+
'dashboardCards',
|
|
297
|
+
'settingsSections'
|
|
298
|
+
];
|
|
299
|
+
/**
|
|
300
|
+
* What `register()` visibly registers (AGL-3116), read from the tree.
|
|
301
|
+
*
|
|
302
|
+
* A heuristic like every check here: it reads registration calls whose
|
|
303
|
+
* arguments are written out — an object literal, a string or a named slot —
|
|
304
|
+
* and reports every call it cannot read as `unresolved` rather than guessing.
|
|
305
|
+
* The declaration stays the contract; this is how a publisher learns theirs
|
|
306
|
+
* is incomplete before a published page fails to load the plugin.
|
|
307
|
+
*/ function detectRegistrations(program, constants) {
|
|
308
|
+
const slots = new Set();
|
|
309
|
+
const routes = new Set();
|
|
310
|
+
const orgRoutes = new Set();
|
|
311
|
+
const components = new Set();
|
|
312
|
+
const features = new Set();
|
|
313
|
+
const unresolved = new Set();
|
|
314
|
+
let shell = false;
|
|
315
|
+
const objectProperty = (object, name)=>{
|
|
316
|
+
var _object_properties;
|
|
317
|
+
if ((object == null ? void 0 : object.type) !== 'ObjectExpression') return undefined;
|
|
318
|
+
for (const property of (_object_properties = object['properties']) != null ? _object_properties : []){
|
|
319
|
+
if (property.type !== 'Property') continue;
|
|
320
|
+
const key = property['key'];
|
|
321
|
+
const keyName = !property['computed'] && (key == null ? void 0 : key.type) === 'Identifier' ? key['name'] : staticString(key, constants);
|
|
322
|
+
if (keyName === name) return property['value'];
|
|
323
|
+
}
|
|
324
|
+
return undefined;
|
|
325
|
+
};
|
|
326
|
+
const listOf = (node)=>{
|
|
327
|
+
var _node_elements;
|
|
328
|
+
return (node == null ? void 0 : node.type) === 'ArrayExpression' ? (_node_elements = node['elements']) != null ? _node_elements : [] : null;
|
|
329
|
+
};
|
|
330
|
+
// A slot as a widget names it: a string, or a catalog entry
|
|
331
|
+
// (`CONSOLE_WIDGET_SLOTS.hostActivity`), whose property IS the slot id.
|
|
332
|
+
const slotName = (node)=>{
|
|
333
|
+
const literal = staticString(node, constants);
|
|
334
|
+
if (literal !== null) return literal;
|
|
335
|
+
return (node == null ? void 0 : node.type) === 'MemberExpression' ? propertyName(node, constants) : null;
|
|
336
|
+
};
|
|
337
|
+
walk(program, (node)=>{
|
|
338
|
+
var _node_arguments;
|
|
339
|
+
if (node.type !== 'CallExpression') return;
|
|
340
|
+
const callee = node['callee'];
|
|
341
|
+
const name = (callee == null ? void 0 : callee.type) === 'Identifier' ? callee['name'] : (callee == null ? void 0 : callee.type) === 'MemberExpression' ? propertyName(callee, constants) : null;
|
|
342
|
+
if (!name || !REGISTRATION_CALLS.has(name)) return;
|
|
343
|
+
const args = (_node_arguments = node['arguments']) != null ? _node_arguments : [];
|
|
344
|
+
if (name === 'registerConsoleExtension') {
|
|
345
|
+
const extension = args[0];
|
|
346
|
+
if ((extension == null ? void 0 : extension.type) !== 'ObjectExpression') {
|
|
347
|
+
unresolved.add('a console extension built at runtime');
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
const widgets = objectProperty(extension, 'widgets');
|
|
351
|
+
if (widgets) {
|
|
352
|
+
const list = listOf(widgets);
|
|
353
|
+
if (!list) unresolved.add('a console widget list built at runtime');
|
|
354
|
+
for (const widget of list != null ? list : []){
|
|
355
|
+
const slot = slotName(objectProperty(widget, 'slot'));
|
|
356
|
+
if (slot) slots.add(slot);
|
|
357
|
+
else unresolved.add('a console widget whose slot is built at runtime');
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
for (const field of SHELL_EXTENSION_FIELDS){
|
|
361
|
+
const value = objectProperty(extension, field);
|
|
362
|
+
if (!value) continue;
|
|
363
|
+
shell = true;
|
|
364
|
+
if (field !== 'navItems' && field !== 'orgNavItems') continue;
|
|
365
|
+
const into = field === 'navItems' ? routes : orgRoutes;
|
|
366
|
+
const list = listOf(value);
|
|
367
|
+
if (!list) unresolved.add(`console ${field} built at runtime`);
|
|
368
|
+
for (const item of list != null ? list : []){
|
|
369
|
+
const href = staticString(objectProperty(item, 'href'), constants);
|
|
370
|
+
if (href) into.add(href);
|
|
371
|
+
else unresolved.add(`a console ${field} entry whose href is built at runtime`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
if (name === 'registerSiteRuntime') {
|
|
377
|
+
const id = staticString(objectProperty(args[0], 'runtimeId'), constants);
|
|
378
|
+
if (id) features.add(id);
|
|
379
|
+
else unresolved.add('a site runtime whose runtimeId is built at runtime');
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
if (name === 'registerComponent') {
|
|
383
|
+
const id = staticString(objectProperty(args[1], '$id'), constants);
|
|
384
|
+
if (id) components.add(id);
|
|
385
|
+
else unresolved.add('a canvas component whose $id is built at runtime');
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
// `addDependency` / `defineUiFeatureBundle`: a component bundle whose
|
|
389
|
+
// entries register later, from a list this pass does not follow.
|
|
390
|
+
unresolved.add('a canvas component bundle');
|
|
391
|
+
});
|
|
392
|
+
const contributes = {};
|
|
393
|
+
if (components.size || features.size) {
|
|
394
|
+
contributes.site = _extends({}, components.size ? {
|
|
395
|
+
components: [
|
|
396
|
+
...components
|
|
397
|
+
].sort()
|
|
398
|
+
} : {}, features.size ? {
|
|
399
|
+
features: [
|
|
400
|
+
...features
|
|
401
|
+
].sort()
|
|
402
|
+
} : {});
|
|
403
|
+
}
|
|
404
|
+
if (slots.size || routes.size || orgRoutes.size || shell) {
|
|
405
|
+
contributes.console = _extends({}, slots.size ? {
|
|
406
|
+
slots: [
|
|
407
|
+
...slots
|
|
408
|
+
].sort()
|
|
409
|
+
} : {}, routes.size ? {
|
|
410
|
+
routes: [
|
|
411
|
+
...routes
|
|
412
|
+
].sort()
|
|
413
|
+
} : {}, orgRoutes.size ? {
|
|
414
|
+
orgRoutes: [
|
|
415
|
+
...orgRoutes
|
|
416
|
+
].sort()
|
|
417
|
+
} : {}, shell ? {
|
|
418
|
+
shell: true
|
|
419
|
+
} : {});
|
|
420
|
+
}
|
|
421
|
+
return {
|
|
422
|
+
contributes,
|
|
423
|
+
unresolved: [
|
|
424
|
+
...unresolved
|
|
425
|
+
].sort()
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
/** A declaration in the words a reviewer reads: `console slots hostActivity`. */ function describeContributions(contributes) {
|
|
429
|
+
var _contributes_site, _contributes_console;
|
|
430
|
+
var _site_components, _site_features, _shell_slots, _shell_routes, _shell_orgRoutes;
|
|
431
|
+
const parts = [];
|
|
432
|
+
const site = (_contributes_site = contributes.site) != null ? _contributes_site : {};
|
|
433
|
+
const shell = (_contributes_console = contributes.console) != null ? _contributes_console : {};
|
|
434
|
+
if ((_site_components = site.components) == null ? void 0 : _site_components.length) parts.push(`site components ${site.components.join(', ')}`);
|
|
435
|
+
if ((_site_features = site.features) == null ? void 0 : _site_features.length) parts.push(`site features ${site.features.join(', ')}`);
|
|
436
|
+
if ((_shell_slots = shell.slots) == null ? void 0 : _shell_slots.length) parts.push(`console slots ${shell.slots.join(', ')}`);
|
|
437
|
+
if ((_shell_routes = shell.routes) == null ? void 0 : _shell_routes.length) parts.push(`console routes ${shell.routes.join(', ')}`);
|
|
438
|
+
if ((_shell_orgRoutes = shell.orgRoutes) == null ? void 0 : _shell_orgRoutes.length) {
|
|
439
|
+
parts.push(`console organization routes ${shell.orgRoutes.join(', ')}`);
|
|
440
|
+
}
|
|
441
|
+
if (shell.shell) parts.push('the console shell');
|
|
442
|
+
return parts.join(' · ') || 'nothing';
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* The `contributions` area (AGL-3116): what the bundle registers against what
|
|
446
|
+
* its manifest declares.
|
|
447
|
+
*
|
|
448
|
+
* Every registration the tree shows must be declared, because the loaders
|
|
449
|
+
* read ONLY the declaration: a slot the manifest omits is a slot whose
|
|
450
|
+
* screens never load the plugin, and a component it omits is an element that
|
|
451
|
+
* renders empty on every published page that places it. A declared entry the
|
|
452
|
+
* bundle never registers is a warning — the plugin loads there for nothing.
|
|
453
|
+
*/ function compareContributions(detected, options, add, details, markUnknown) {
|
|
454
|
+
var _found_site, _declared_site, _found_site1, _declared_site1, _found_console, _declared_console, _found_console1, _declared_console1, _found_console2, _declared_console2, _found_console3, _declared_console3, _declared_site2, _found_site2, _declared_site3, _found_site3, _declared_console4, _found_console4;
|
|
455
|
+
const found = detected.contributes;
|
|
456
|
+
const registers = describeContributions(found);
|
|
457
|
+
const registersSomething = Boolean(found.site || found.console) || detected.unresolved.length > 0;
|
|
458
|
+
const unreadable = detected.unresolved.length ? ` It also makes registrations the checker could not read: ${detected.unresolved.join('; ')}.` : '';
|
|
459
|
+
const declared = options == null ? void 0 : options.declaredContributions;
|
|
460
|
+
if (declared === undefined) {
|
|
461
|
+
// Nothing to compare against is `unknown`, never a pass — the same
|
|
462
|
+
// reading the network row gives a bundle checked without its manifest.
|
|
463
|
+
if (!registersSomething) {
|
|
464
|
+
details.set('contributions', 'registers nothing');
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
markUnknown('contributions');
|
|
468
|
+
details.set('contributions', `registers ${registers} — no manifest was supplied, so nothing was compared`);
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
if (declared === null) {
|
|
472
|
+
details.set('contributions', registersSomething ? `undeclared · registers ${registers}` : 'declares and registers nothing');
|
|
473
|
+
if (!registersSomething) return;
|
|
474
|
+
add((options == null ? void 0 : options.requireContributions) ? 'error' : 'warning', 'contributions', `the manifest declares no "contributes", and register() registers ` + `${registers}.${unreadable} Declare it — ` + `"contributes": ${JSON.stringify(found)} — because the loaders place ` + 'a plugin by its declaration alone. Undeclared, a published page ' + 'loads it only where its element is placed and the console loads it ' + 'with the shell.');
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
details.set('contributions', `declares ${describeContributions(declared)}`);
|
|
478
|
+
const missing = (label, registered, listed, consequence)=>{
|
|
479
|
+
for (const id of registered != null ? registered : []){
|
|
480
|
+
if ((listed != null ? listed : []).includes(id)) continue;
|
|
481
|
+
add('error', 'contributions', `register() registers ${label} "${id}", which the manifest does not ` + `declare — ${consequence}`);
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
missing('the site component', (_found_site = found.site) == null ? void 0 : _found_site.components, (_declared_site = declared.site) == null ? void 0 : _declared_site.components, 'a published page that places it would never load the plugin');
|
|
485
|
+
missing('the site feature', (_found_site1 = found.site) == null ? void 0 : _found_site1.features, (_declared_site1 = declared.site) == null ? void 0 : _declared_site1.features, 'no published page would ever load the plugin to run it');
|
|
486
|
+
missing('a widget in the console slot', (_found_console = found.console) == null ? void 0 : _found_console.slots, (_declared_console = declared.console) == null ? void 0 : _declared_console.slots, 'a screen that renders the slot would never load the plugin');
|
|
487
|
+
missing('the console route', (_found_console1 = found.console) == null ? void 0 : _found_console1.routes, (_declared_console1 = declared.console) == null ? void 0 : _declared_console1.routes, 'the route would not find the plugin that serves it');
|
|
488
|
+
missing('the console organization route', (_found_console2 = found.console) == null ? void 0 : _found_console2.orgRoutes, (_declared_console2 = declared.console) == null ? void 0 : _declared_console2.orgRoutes, 'the route would not find the plugin that serves it');
|
|
489
|
+
if (((_found_console3 = found.console) == null ? void 0 : _found_console3.shell) && !((_declared_console3 = declared.console) == null ? void 0 : _declared_console3.shell)) {
|
|
490
|
+
add('error', 'contributions', 'register() adds a nav tab, a provider or another entry the console ' + 'shell draws on every screen, and the manifest does not declare ' + '"console": { "shell": true } — the shell would draw it only on ' + 'screens that happened to load the plugin for something else');
|
|
491
|
+
}
|
|
492
|
+
if (detected.unresolved.length) {
|
|
493
|
+
add('warning', 'contributions', `the checker could not read ${detected.unresolved.join('; ')} — ` + 'confirm the declaration covers what it registers');
|
|
494
|
+
}
|
|
495
|
+
const unused = (label, listed, registered)=>{
|
|
496
|
+
// Only when every registration of that kind was readable: an unreadable
|
|
497
|
+
// one may be exactly the entry that is declared.
|
|
498
|
+
if (detected.unresolved.length) return;
|
|
499
|
+
for (const id of listed != null ? listed : []){
|
|
500
|
+
if ((registered != null ? registered : []).includes(id)) continue;
|
|
501
|
+
add('warning', 'contributions', `the manifest declares ${label} "${id}", and register() never ` + 'registers it — the plugin would load there for nothing');
|
|
502
|
+
}
|
|
503
|
+
};
|
|
504
|
+
unused('the site component', (_declared_site2 = declared.site) == null ? void 0 : _declared_site2.components, (_found_site2 = found.site) == null ? void 0 : _found_site2.components);
|
|
505
|
+
unused('the site feature', (_declared_site3 = declared.site) == null ? void 0 : _declared_site3.features, (_found_site3 = found.site) == null ? void 0 : _found_site3.features);
|
|
506
|
+
unused('the console slot', (_declared_console4 = declared.console) == null ? void 0 : _declared_console4.slots, (_found_console4 = found.console) == null ? void 0 : _found_console4.slots);
|
|
507
|
+
}
|
|
508
|
+
function analyseBundle(source, options) {
|
|
509
|
+
var _ref;
|
|
510
|
+
const problems = [];
|
|
511
|
+
const seen = new Set();
|
|
512
|
+
// Every area starts as "ran, found nothing" and is downgraded by its own
|
|
513
|
+
// findings, so the summary cannot drift from the problem list (AGL-1087).
|
|
514
|
+
const status = new Map(CHECK_ORDER.map((id)=>[
|
|
515
|
+
id,
|
|
516
|
+
'pass'
|
|
517
|
+
]));
|
|
518
|
+
const details = new Map();
|
|
519
|
+
const add = (level, check, message)=>{
|
|
520
|
+
if (level === 'error') status.set(check, 'fail');
|
|
521
|
+
else if (status.get(check) === 'pass') status.set(check, 'question');
|
|
522
|
+
if (seen.has(message) || seen.size >= MAX_PROBLEMS) return;
|
|
523
|
+
seen.add(message);
|
|
524
|
+
problems.push({
|
|
525
|
+
level,
|
|
526
|
+
message,
|
|
527
|
+
check
|
|
528
|
+
});
|
|
529
|
+
};
|
|
530
|
+
/** Mark the areas that never ran, so they cannot read as clean. */ const unknownFrom = (...ids)=>{
|
|
531
|
+
for (const id of ids)status.set(id, 'unknown');
|
|
532
|
+
};
|
|
533
|
+
const summarise = ()=>CHECK_ORDER.map((id)=>{
|
|
534
|
+
var _status_get;
|
|
535
|
+
return _extends({
|
|
536
|
+
id,
|
|
537
|
+
label: CHECK_LABELS[id],
|
|
538
|
+
status: (_status_get = status.get(id)) != null ? _status_get : 'unknown'
|
|
539
|
+
}, details.has(id) ? {
|
|
540
|
+
detail: details.get(id)
|
|
541
|
+
} : {});
|
|
542
|
+
});
|
|
543
|
+
const maxBytes = (_ref = options == null ? void 0 : options.maxBytes) != null ? _ref : MAX_PLUGIN_BUNDLE_BYTES;
|
|
544
|
+
const bytes = new TextEncoder().encode(source).byteLength;
|
|
545
|
+
details.set('size', `${bytes.toLocaleString('en-US')} bytes of ${maxBytes.toLocaleString('en-US')}`);
|
|
546
|
+
if (bytes === 0) {
|
|
547
|
+
add('error', 'size', 'bundle is empty');
|
|
548
|
+
unknownFrom('parse', 'entry', 'self-contained', 'code-execution', 'globals', 'storage', 'dynamic-import', 'network', 'obfuscation', 'contributions');
|
|
549
|
+
return {
|
|
550
|
+
ok: false,
|
|
551
|
+
problems,
|
|
552
|
+
checks: summarise(),
|
|
553
|
+
exports: {
|
|
554
|
+
register: false,
|
|
555
|
+
registerApi: false
|
|
556
|
+
},
|
|
557
|
+
contributions: NOTHING_DETECTED
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
if (bytes > maxBytes) {
|
|
561
|
+
add('error', 'size', `bundle is ${bytes} bytes (limit ${maxBytes})`);
|
|
562
|
+
}
|
|
563
|
+
const parseOptions = {
|
|
564
|
+
ecmaVersion: 'latest',
|
|
565
|
+
sourceType: 'module',
|
|
566
|
+
allowHashBang: true,
|
|
567
|
+
allowAwaitOutsideFunction: true
|
|
568
|
+
};
|
|
569
|
+
let program;
|
|
570
|
+
try {
|
|
571
|
+
program = parse(source, parseOptions);
|
|
572
|
+
} catch (error) {
|
|
573
|
+
// Unparseable means unanalysable, and the loader would fail on it too.
|
|
574
|
+
// Nothing else ran, and saying so is the whole point of `unknown`: a
|
|
575
|
+
// bundle nobody could read must not show nine green rows.
|
|
576
|
+
add('error', 'parse', `bundle does not parse as an ES module: ${error instanceof Error ? error.message : String(error)}`);
|
|
577
|
+
unknownFrom('entry', 'self-contained', 'code-execution', 'globals', 'storage', 'dynamic-import', 'network', 'obfuscation', 'contributions');
|
|
578
|
+
return {
|
|
579
|
+
ok: false,
|
|
580
|
+
problems,
|
|
581
|
+
checks: summarise(),
|
|
582
|
+
exports: {
|
|
583
|
+
register: false,
|
|
584
|
+
registerApi: false
|
|
585
|
+
},
|
|
586
|
+
contributions: NOTHING_DETECTED
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
// Names bound to a global, so `const g = globalThis; g['ev'+'al']` reads
|
|
590
|
+
// as access on a global rather than on some object we know nothing about.
|
|
591
|
+
const aliases = new Set();
|
|
592
|
+
const noteAlias = (name, init)=>{
|
|
593
|
+
if (typeof name !== 'string' || !init) return;
|
|
594
|
+
const roots = init.type === 'LogicalExpression' ? [
|
|
595
|
+
init['left'],
|
|
596
|
+
init['right']
|
|
597
|
+
] : [
|
|
598
|
+
init
|
|
599
|
+
];
|
|
600
|
+
for (const root of roots){
|
|
601
|
+
if ((root == null ? void 0 : root.type) === 'Identifier' && GLOBAL_ROOTS.has(root['name'])) {
|
|
602
|
+
aliases.add(name);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
};
|
|
606
|
+
// Local name -> the constant string it holds (AGL-1093).
|
|
607
|
+
//
|
|
608
|
+
// A binding is only usable when the whole tree agrees on it: declared once,
|
|
609
|
+
// never assigned again, and never a parameter or another binder anywhere.
|
|
610
|
+
// Any of those means the value at a given call site is a GUESS, and a guess
|
|
611
|
+
// is how a checker starts making claims about code it did not read.
|
|
612
|
+
const constants = new Map();
|
|
613
|
+
{
|
|
614
|
+
const bound = new Map();
|
|
615
|
+
const poisoned = new Set();
|
|
616
|
+
const declared = new Set();
|
|
617
|
+
const poison = (name)=>{
|
|
618
|
+
if (typeof name === 'string') poisoned.add(name);
|
|
619
|
+
};
|
|
620
|
+
/** Every name a pattern binds — a parameter shadowing a constant is a
|
|
621
|
+
* different variable, and resolving it to the outer value would be a
|
|
622
|
+
* fabrication. */ const poisonPattern = (node)=>{
|
|
623
|
+
if (!node) return;
|
|
624
|
+
if (node.type === 'Identifier') return poison(node['name']);
|
|
625
|
+
for (const key of [
|
|
626
|
+
'left',
|
|
627
|
+
'argument',
|
|
628
|
+
'properties',
|
|
629
|
+
'elements',
|
|
630
|
+
'value'
|
|
631
|
+
]){
|
|
632
|
+
const value = node[key];
|
|
633
|
+
if (Array.isArray(value)) value.forEach((item)=>poisonPattern(item));
|
|
634
|
+
else if (value) poisonPattern(value);
|
|
635
|
+
}
|
|
636
|
+
};
|
|
637
|
+
walk(program, (node)=>{
|
|
638
|
+
if (node.type === 'VariableDeclarator') {
|
|
639
|
+
const id = node['id'];
|
|
640
|
+
if ((id == null ? void 0 : id.type) === 'Identifier') {
|
|
641
|
+
const name = id['name'];
|
|
642
|
+
if (declared.has(name)) poison(name);
|
|
643
|
+
declared.add(name);
|
|
644
|
+
bound.set(name, node['init']);
|
|
645
|
+
} else {
|
|
646
|
+
poisonPattern(id);
|
|
647
|
+
}
|
|
648
|
+
} else if (node.type === 'AssignmentExpression') {
|
|
649
|
+
poisonPattern(node['left']);
|
|
650
|
+
} else if (node.type === 'UpdateExpression') {
|
|
651
|
+
poisonPattern(node['argument']);
|
|
652
|
+
} else if (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression') {
|
|
653
|
+
var _node_params;
|
|
654
|
+
var _node_id;
|
|
655
|
+
;
|
|
656
|
+
((_node_params = node['params']) != null ? _node_params : []).forEach(poisonPattern);
|
|
657
|
+
if (((_node_id = node['id']) == null ? void 0 : _node_id.type) === 'Identifier') poison(node['id']['name']);
|
|
658
|
+
} else if (node.type === 'CatchClause') {
|
|
659
|
+
poisonPattern(node['param']);
|
|
660
|
+
} else if (node.type === 'ClassDeclaration' || node.type === 'ClassExpression') {
|
|
661
|
+
var _node_id1;
|
|
662
|
+
if (((_node_id1 = node['id']) == null ? void 0 : _node_id1.type) === 'Identifier') poison(node['id']['name']);
|
|
663
|
+
}
|
|
664
|
+
});
|
|
665
|
+
// Two passes, so `const BASE = 'https://x'` then `BASE + '/y'` resolves.
|
|
666
|
+
// A third buys almost nothing and each is a full re-read of the bindings.
|
|
667
|
+
for(let pass = 0; pass < 2; pass += 1){
|
|
668
|
+
for (const [name, init] of bound){
|
|
669
|
+
if (poisoned.has(name) || constants.has(name)) continue;
|
|
670
|
+
const value = staticString(init, constants);
|
|
671
|
+
if (value !== null) constants.set(name, value);
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
// Local name -> the callable it stands for (AGL-1090). `const f = fetch`,
|
|
676
|
+
// `const d = globalThis.fetch`, `const {fetch: h} = globalThis`.
|
|
677
|
+
const callableAliases = new Map();
|
|
678
|
+
/** The aliasable callable an initializer denotes, if any. */ const callableFrom = (init)=>{
|
|
679
|
+
if (!init) return null;
|
|
680
|
+
if (init.type === 'Identifier' && ALIASABLE_CALLABLES.has(init['name'])) {
|
|
681
|
+
return init['name'];
|
|
682
|
+
}
|
|
683
|
+
// `globalThis.fetch` / `window['fe' + 'tch']` — the property is what the
|
|
684
|
+
// name will stand for, and only when the object is a global (an unknown
|
|
685
|
+
// object's `.fetch` is somebody else's method).
|
|
686
|
+
if (init.type === 'MemberExpression') {
|
|
687
|
+
const property = propertyName(init);
|
|
688
|
+
const object = init['object'];
|
|
689
|
+
if (property && ALIASABLE_CALLABLES.has(property) && (object == null ? void 0 : object.type) === 'Identifier' && (GLOBAL_ROOTS.has(object['name']) || aliases.has(object['name']))) {
|
|
690
|
+
return property;
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
return null;
|
|
694
|
+
};
|
|
695
|
+
const noteCallableAlias = (id, init)=>{
|
|
696
|
+
if (!id) return;
|
|
697
|
+
if (id.type === 'Identifier') {
|
|
698
|
+
const callable = callableFrom(init);
|
|
699
|
+
if (callable) callableAliases.set(id['name'], callable);
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
702
|
+
// `const { fetch } = globalThis` and `const { fetch: h } = globalThis`.
|
|
703
|
+
if (id.type === 'ObjectPattern' && init) {
|
|
704
|
+
var _id_properties;
|
|
705
|
+
const fromGlobal = init.type === 'Identifier' && (GLOBAL_ROOTS.has(init['name']) || aliases.has(init['name']));
|
|
706
|
+
if (!fromGlobal) return;
|
|
707
|
+
for (const property of (_id_properties = id['properties']) != null ? _id_properties : []){
|
|
708
|
+
const key = property['key'];
|
|
709
|
+
const value = property['value'];
|
|
710
|
+
const name = (key == null ? void 0 : key.type) === 'Identifier' ? key['name'] : staticString(key);
|
|
711
|
+
if (name && ALIASABLE_CALLABLES.has(name) && (value == null ? void 0 : value.type) === 'Identifier') {
|
|
712
|
+
callableAliases.set(value['name'], name);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
// Global-object aliases first, as a complete pass: the callable pass below
|
|
718
|
+
// resolves `g.fetch` against them, and walk order is not source order.
|
|
719
|
+
walk(program, (node)=>{
|
|
720
|
+
if (node.type === 'VariableDeclarator') {
|
|
721
|
+
const id = node['id'];
|
|
722
|
+
if ((id == null ? void 0 : id.type) === 'Identifier') noteAlias(id['name'], node['init']);
|
|
723
|
+
} else if (node.type === 'AssignmentExpression' && node['operator'] === '=') {
|
|
724
|
+
const left = node['left'];
|
|
725
|
+
if ((left == null ? void 0 : left.type) === 'Identifier') noteAlias(left['name'], node['right']);
|
|
726
|
+
}
|
|
727
|
+
});
|
|
728
|
+
walk(program, (node)=>{
|
|
729
|
+
if (node.type === 'VariableDeclarator') {
|
|
730
|
+
noteCallableAlias(node['id'], node['init']);
|
|
731
|
+
} else if (node.type === 'AssignmentExpression' && node['operator'] === '=') {
|
|
732
|
+
noteCallableAlias(node['left'], node['right']);
|
|
733
|
+
}
|
|
734
|
+
});
|
|
735
|
+
const isGlobalRef = (node)=>!!node && node.type === 'Identifier' && (GLOBAL_ROOTS.has(node['name']) || aliases.has(node['name']));
|
|
736
|
+
const declared = options == null ? void 0 : options.declaredNetwork;
|
|
737
|
+
const allowlist = new Set((declared != null ? declared : []).map((origin)=>{
|
|
738
|
+
try {
|
|
739
|
+
return new URL(origin).origin;
|
|
740
|
+
} catch (unused) {
|
|
741
|
+
return origin;
|
|
742
|
+
}
|
|
743
|
+
}));
|
|
744
|
+
/** Level for a network finding: a claim only when we know what was declared. */ const networkLevel = declared ? 'error' : 'warning';
|
|
745
|
+
// What the bundle reaches for, so the summary row can SAY it (AGL-1087) —
|
|
746
|
+
// "calls https://api.stripe.com, declared" is the line a reviewer would
|
|
747
|
+
// otherwise open the bundle to get.
|
|
748
|
+
const networkApis = new Set();
|
|
749
|
+
const networkOrigins = new Set();
|
|
750
|
+
let runtimeUrls = 0;
|
|
751
|
+
/** Origins handed to a callee the checker could not resolve (AGL-1090). */ const unresolvedOrigins = new Set();
|
|
752
|
+
const noteNetwork = (api, urlArg)=>{
|
|
753
|
+
const origin = literalOrigin(urlArg, constants);
|
|
754
|
+
networkApis.add(api);
|
|
755
|
+
if (origin) networkOrigins.add(origin);
|
|
756
|
+
else runtimeUrls += 1;
|
|
757
|
+
if (!declared) {
|
|
758
|
+
add('warning', 'network', `bundle makes network calls (${api}) — check them against the ` + "manifest's declared network capability");
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
761
|
+
if (!allowlist.size) {
|
|
762
|
+
add(networkLevel, 'network', `bundle calls ${api} but the manifest declares no network ` + 'capability — declare every origin under capabilities.network ' + '(the CSP blocks the rest at runtime)');
|
|
763
|
+
return;
|
|
764
|
+
}
|
|
765
|
+
if (!origin) {
|
|
766
|
+
add('warning', 'network', `${api} is called with a URL that is only known at runtime — it ` + 'cannot be checked against the declared origins');
|
|
767
|
+
return;
|
|
768
|
+
}
|
|
769
|
+
if (!allowlist.has(origin)) {
|
|
770
|
+
add(networkLevel, 'network', `${api} calls ${origin}, which the manifest does not declare ` + `(declared: ${[
|
|
771
|
+
...allowlist
|
|
772
|
+
].join(', ')})`);
|
|
773
|
+
}
|
|
774
|
+
};
|
|
775
|
+
/**
|
|
776
|
+
* A call the checker could not resolve, given an absolute URL.
|
|
777
|
+
*
|
|
778
|
+
* Reported as a QUESTION, never a refusal: most of these are helpers, and
|
|
779
|
+
* refusing every unrecognised call that mentions a URL would make the
|
|
780
|
+
* verifier useless. But leaving them silent is what let the network row
|
|
781
|
+
* claim "no network calls" over a bundle whose calls it simply could not
|
|
782
|
+
* follow — and a URL to an origin the manifest never declared is exactly
|
|
783
|
+
* what a reviewer should be pointed at.
|
|
784
|
+
*/ const noteUnresolvedUrl = (name, urlArg)=>{
|
|
785
|
+
if (name && URL_TAKING_NON_CALLS.has(name)) return;
|
|
786
|
+
const origin = literalOrigin(urlArg, constants);
|
|
787
|
+
if (!origin) return;
|
|
788
|
+
// A declared origin is consistent with the manifest and permitted by the
|
|
789
|
+
// CSP, so there is no question to raise about it.
|
|
790
|
+
if (allowlist.has(origin)) return;
|
|
791
|
+
unresolvedOrigins.add(origin);
|
|
792
|
+
add('warning', 'network', `${name ? `${name}()` : 'a call'} is passed ${origin}, which the ` + 'manifest does not declare — the checker could not tell whether it ' + 'reaches the network, so read this call');
|
|
793
|
+
};
|
|
794
|
+
let exportsRegister = false;
|
|
795
|
+
let exportsRegisterApi = false;
|
|
796
|
+
const noteExport = (name)=>{
|
|
797
|
+
if (name === 'register') exportsRegister = true;
|
|
798
|
+
else if (name === 'registerApi') exportsRegisterApi = true;
|
|
799
|
+
};
|
|
800
|
+
let obfuscatedNames = 0;
|
|
801
|
+
walk(program, (node)=>{
|
|
802
|
+
switch(node.type){
|
|
803
|
+
// ---- entry exports + self-containment ----
|
|
804
|
+
case 'ImportDeclaration':
|
|
805
|
+
add('error', 'self-contained', 'bundle has static imports — realm bundles must be self-contained ' + '(react/@aglyn/aglyn come from the host ABI; see the realm rollup ' + 'template)');
|
|
806
|
+
break;
|
|
807
|
+
case 'ExportAllDeclaration':
|
|
808
|
+
case 'ExportNamedDeclaration':
|
|
809
|
+
{
|
|
810
|
+
var _node_specifiers;
|
|
811
|
+
if (node['source']) {
|
|
812
|
+
add('error', 'self-contained', 'bundle re-exports from another module — realm bundles must be ' + 'self-contained (see the realm rollup template)');
|
|
813
|
+
}
|
|
814
|
+
const declaration = node['declaration'];
|
|
815
|
+
if (declaration) {
|
|
816
|
+
var _declaration_declarations;
|
|
817
|
+
if (declaration['id']) noteExport(declaration['id']['name']);
|
|
818
|
+
for (const declarator of (_declaration_declarations = declaration['declarations']) != null ? _declaration_declarations : []){
|
|
819
|
+
const id = declarator['id'];
|
|
820
|
+
if ((id == null ? void 0 : id.type) === 'Identifier') noteExport(id['name']);
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
for (const specifier of (_node_specifiers = node['specifiers']) != null ? _node_specifiers : []){
|
|
824
|
+
const exported = specifier['exported'];
|
|
825
|
+
noteExport((exported == null ? void 0 : exported.type) === 'Identifier' ? exported['name'] : staticString(exported));
|
|
826
|
+
}
|
|
827
|
+
break;
|
|
828
|
+
}
|
|
829
|
+
// ---- dynamic import ----
|
|
830
|
+
case 'ImportExpression':
|
|
831
|
+
{
|
|
832
|
+
const specifier = staticString(node['source'], constants);
|
|
833
|
+
if (specifier === null) {
|
|
834
|
+
add('error', 'dynamic-import', 'dynamic import with a specifier computed at runtime is not ' + 'allowed — the loader cannot know what would be fetched');
|
|
835
|
+
} else if (/^https?:/i.test(specifier)) {
|
|
836
|
+
add('error', 'dynamic-import', 'dynamic import of remote URLs is not allowed');
|
|
837
|
+
}
|
|
838
|
+
break;
|
|
839
|
+
}
|
|
840
|
+
// ---- calls ----
|
|
841
|
+
case 'CallExpression':
|
|
842
|
+
case 'NewExpression':
|
|
843
|
+
{
|
|
844
|
+
var _node_arguments, _ref, _ref1;
|
|
845
|
+
const callee = node['callee'];
|
|
846
|
+
const args = (_node_arguments = node['arguments']) != null ? _node_arguments : [];
|
|
847
|
+
const written = (callee == null ? void 0 : callee.type) === 'Identifier' ? callee['name'] : (callee == null ? void 0 : callee.type) === 'MemberExpression' ? propertyName(callee, constants) : null;
|
|
848
|
+
// An alias resolves to what it stands for (AGL-1090), so `f(url)`
|
|
849
|
+
// after `const f = fetch` is a fetch call.
|
|
850
|
+
const name = (_ref = (_ref1 = written && callableAliases.get(written)) != null ? _ref1 : written) != null ? _ref : null;
|
|
851
|
+
if (name === 'eval') add('error', 'code-execution', 'eval() is not allowed');
|
|
852
|
+
if (name === 'Function') add('error', 'code-execution', 'the Function constructor is not allowed');
|
|
853
|
+
// `(()=>{}).constructor('return 1')()` — the Function constructor
|
|
854
|
+
// reached through any function value, which is why the CALL is the
|
|
855
|
+
// finding rather than the name `Function`.
|
|
856
|
+
if (name === 'constructor' && (callee == null ? void 0 : callee.type) === 'MemberExpression') add('error', 'code-execution', 'calling .constructor() is not allowed — it reaches the ' + 'Function constructor from any function value');
|
|
857
|
+
if (name && NETWORK_CALLS.has(name)) noteNetwork(name, args[0]);
|
|
858
|
+
else if (name && NETWORK_CONSTRUCTORS.has(name)) noteNetwork(name, node.type === 'NewExpression' ? args[0] : args[1]);
|
|
859
|
+
else noteUnresolvedUrl(name, args[0]);
|
|
860
|
+
break;
|
|
861
|
+
}
|
|
862
|
+
// ---- member access ----
|
|
863
|
+
case 'MemberExpression':
|
|
864
|
+
{
|
|
865
|
+
const object = node['object'];
|
|
866
|
+
const name = propertyName(node, constants);
|
|
867
|
+
if (isGlobalRef(object) && name === null) {
|
|
868
|
+
add('error', 'globals', `computed property access on ${object['name'] || 'a global'} is not allowed — a property chosen at runtime cannot be ` + 'reviewed');
|
|
869
|
+
break;
|
|
870
|
+
}
|
|
871
|
+
// Property names only mean anything on a global: `response.cookie`
|
|
872
|
+
// and `state.localStorage` are somebody else's object.
|
|
873
|
+
if (name === 'cookie' && isGlobalRef(object)) add('error', 'storage', 'document.cookie access is not allowed');
|
|
874
|
+
if (name && STORAGE_NAMES.has(name) && isGlobalRef(object)) add('error', 'storage', 'browser storage access is not allowed (use host-mediated data)');
|
|
875
|
+
if (name === 'eval' && isGlobalRef(object)) add('error', 'code-execution', 'eval() is not allowed');
|
|
876
|
+
break;
|
|
877
|
+
}
|
|
878
|
+
// ---- bare references ----
|
|
879
|
+
case 'Identifier':
|
|
880
|
+
{
|
|
881
|
+
const name = node['name'];
|
|
882
|
+
if (STORAGE_NAMES.has(name)) add('error', 'storage', 'browser storage access is not allowed (use host-mediated data)');
|
|
883
|
+
if (OBFUSCATED_NAME.test(name)) obfuscatedNames += 1;
|
|
884
|
+
break;
|
|
885
|
+
}
|
|
886
|
+
// ---- obfuscation ----
|
|
887
|
+
case 'Literal':
|
|
888
|
+
{
|
|
889
|
+
const value = node['value'];
|
|
890
|
+
if (typeof value === 'string' && value.length >= MIN_SUSPICIOUS_BASE64 && BASE64_BLOB.test(value)) {
|
|
891
|
+
add('warning', 'obfuscation', `bundle embeds a ${value.length}-character base64 literal — ` + 'decode it before approving');
|
|
892
|
+
}
|
|
893
|
+
break;
|
|
894
|
+
}
|
|
895
|
+
default:
|
|
896
|
+
break;
|
|
897
|
+
}
|
|
898
|
+
});
|
|
899
|
+
if (!exportsRegister && !exportsRegisterApi) {
|
|
900
|
+
add('error', 'entry', 'bundle exports neither register(host) nor registerApi() — ' + 'nothing for the loader to call');
|
|
901
|
+
}
|
|
902
|
+
if (obfuscatedNames >= MIN_OBFUSCATED_NAMES) {
|
|
903
|
+
add('warning', 'obfuscation', `bundle uses ${obfuscatedNames} machine-obfuscated identifiers ` + '(_0x… naming) — minifiers do not produce these');
|
|
904
|
+
}
|
|
905
|
+
const longestLine = source.split('\n').reduce((longest, line)=>Math.max(longest, line.length), 0);
|
|
906
|
+
if (longestLine > MAX_READABLE_LINE) {
|
|
907
|
+
add('warning', 'obfuscation', `bundle has a single ${longestLine}-character line — nothing on it ` + 'can be read in review; ask for a readable build or a source map');
|
|
908
|
+
}
|
|
909
|
+
details.set('entry', [
|
|
910
|
+
exportsRegister ? 'register(host)' : null,
|
|
911
|
+
exportsRegisterApi ? 'registerApi()' : null
|
|
912
|
+
].filter(Boolean).join(', ') || 'none');
|
|
913
|
+
// What the network check actually saw. Without the manifest it saw the
|
|
914
|
+
// calls but could not judge them, and that is `unknown`, not a pass — the
|
|
915
|
+
// row a reviewer must not read as "checked and fine".
|
|
916
|
+
if (!declared) {
|
|
917
|
+
if (networkApis.size) {
|
|
918
|
+
status.set('network', 'unknown');
|
|
919
|
+
details.set('network', `calls ${[
|
|
920
|
+
...networkApis
|
|
921
|
+
].join(', ')} — no declared origins were ` + 'supplied, so nothing was compared');
|
|
922
|
+
} else {
|
|
923
|
+
details.set('network', 'no network calls');
|
|
924
|
+
}
|
|
925
|
+
} else if (!networkApis.size) {
|
|
926
|
+
details.set('network', unresolvedOrigins.size ? `no resolved network calls, but ${[
|
|
927
|
+
...unresolvedOrigins
|
|
928
|
+
].join(', ')} ` + 'is passed to a call the checker could not follow' : 'no network calls');
|
|
929
|
+
} else {
|
|
930
|
+
const origins = networkOrigins.size ? [
|
|
931
|
+
...networkOrigins
|
|
932
|
+
].map((origin)=>allowlist.has(origin) ? `${origin} (declared)` : `${origin} (NOT declared)`).join(', ') : '';
|
|
933
|
+
details.set('network', [
|
|
934
|
+
`calls ${[
|
|
935
|
+
...networkApis
|
|
936
|
+
].join(', ')}`,
|
|
937
|
+
origins,
|
|
938
|
+
runtimeUrls ? `${runtimeUrls} call(s) with a URL only known at runtime` : ''
|
|
939
|
+
].filter(Boolean).join(' · '));
|
|
940
|
+
}
|
|
941
|
+
const detected = detectRegistrations(program, constants);
|
|
942
|
+
compareContributions(detected, options, add, details, (check)=>status.set(check, 'unknown'));
|
|
943
|
+
return {
|
|
944
|
+
ok: !problems.some((problem)=>problem.level === 'error'),
|
|
945
|
+
problems,
|
|
946
|
+
checks: summarise(),
|
|
947
|
+
exports: {
|
|
948
|
+
register: exportsRegister,
|
|
949
|
+
registerApi: exportsRegisterApi
|
|
950
|
+
},
|
|
951
|
+
contributions: detected
|
|
952
|
+
};
|
|
953
|
+
}
|
|
954
|
+
/**
|
|
955
|
+
* Run the checks over a bundle. NEVER throws (AGL-1094).
|
|
956
|
+
*
|
|
957
|
+
* The publish route calls this directly, so an unexpected failure in here
|
|
958
|
+
* used to mean a 500 and no explanation for the publisher — and in the review
|
|
959
|
+
* sweep it looked exactly like a missing artifact, which sent the
|
|
960
|
+
* investigation to the storage bucket instead of to this file. A checker that
|
|
961
|
+
* cannot analyse a bundle has an answer: say so, in the verdict, as an error.
|
|
962
|
+
*/ export function checkPluginBundle(source, options) {
|
|
963
|
+
try {
|
|
964
|
+
return analyseBundle(source, options);
|
|
965
|
+
} catch (error) {
|
|
966
|
+
return {
|
|
967
|
+
ok: false,
|
|
968
|
+
problems: [
|
|
969
|
+
{
|
|
970
|
+
level: 'error',
|
|
971
|
+
check: 'parse',
|
|
972
|
+
message: 'the verifier failed on this bundle — treat it as unchecked and ' + `report it: ${error instanceof Error ? error.message : String(error)}`
|
|
973
|
+
}
|
|
974
|
+
],
|
|
975
|
+
checks: CHECK_ORDER.map((id)=>({
|
|
976
|
+
id,
|
|
977
|
+
label: CHECK_LABELS[id],
|
|
978
|
+
status: id === 'parse' ? 'fail' : 'unknown'
|
|
979
|
+
})),
|
|
980
|
+
exports: {
|
|
981
|
+
register: false,
|
|
982
|
+
registerApi: false
|
|
983
|
+
},
|
|
984
|
+
contributions: NOTHING_DETECTED
|
|
985
|
+
};
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
//# sourceMappingURL=plugin-bundle-checks.js.map
|