@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,279 @@
|
|
|
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
|
+
* READING A SPREADSHEET INTO A CRM COLLECTION — the part that does not care
|
|
19
|
+
* which collection (AGL-2621).
|
|
20
|
+
*
|
|
21
|
+
* The contact import (AGL-2602) settled how a file becomes records: a
|
|
22
|
+
* header row is matched against an alias table to PROPOSE a column → field
|
|
23
|
+
* mapping, the operator corrects it, one line is mapped to a raw row of
|
|
24
|
+
* verbatim strings, and the server judges each row and tallies what it did.
|
|
25
|
+
* A companies file goes through the same three stages with a different
|
|
26
|
+
* field list, so the stages live here, parametric over the field union, and
|
|
27
|
+
* the CRM plugin's contact and company importers each supply their vocabulary
|
|
28
|
+
* — the fields, their aliases, their labels — and nothing else.
|
|
29
|
+
*
|
|
30
|
+
* ## A custom target is `custom:<key>`
|
|
31
|
+
*
|
|
32
|
+
* A column may also map to a custom field the merchant defined, which has
|
|
33
|
+
* no standard name. The target is one string rather than a discriminated
|
|
34
|
+
* object because it is the VALUE of a select control and travels through a
|
|
35
|
+
* form; the prefix is what tells the two apart on the way back.
|
|
36
|
+
*
|
|
37
|
+
* ## The ceilings are shared numbers
|
|
38
|
+
*
|
|
39
|
+
* One file, one request and one preview are bounded the same way for every
|
|
40
|
+
* collection, because the bounds are about the browser's memory and a
|
|
41
|
+
* console request's budget, not about what the rows hold.
|
|
42
|
+
*/ /**
|
|
43
|
+
* The most rows one uploaded file may carry.
|
|
44
|
+
*
|
|
45
|
+
* A bound on the work one import represents and on the memory the browser
|
|
46
|
+
* holds while mapping it — five thousand rows of a wide export is already
|
|
47
|
+
* several megabytes of cells in a tab. A larger list is split and imported
|
|
48
|
+
* in pieces; the drawer says so on the file, before a single row is sent.
|
|
49
|
+
*/ export const CSV_IMPORT_MAX_ROWS = 5000;
|
|
50
|
+
/**
|
|
51
|
+
* Rows per request.
|
|
52
|
+
*
|
|
53
|
+
* Each row costs the server a lookup and a write, plus whatever a name it
|
|
54
|
+
* has not seen in this request costs to resolve; two hundred of those sit
|
|
55
|
+
* comfortably inside a console request's budget and give the progress bar
|
|
56
|
+
* twenty-five steps on the largest file the drawer accepts.
|
|
57
|
+
*/ export const CSV_IMPORT_CHUNK_SIZE = 200;
|
|
58
|
+
/**
|
|
59
|
+
* The most bytes one request may carry, checked before the body is judged.
|
|
60
|
+
*
|
|
61
|
+
* Two hundred rows of a wide export with long values is well under a
|
|
62
|
+
* megabyte; two megabytes is the line past which a request is not a chunk
|
|
63
|
+
* of a file but something else being pushed through this door.
|
|
64
|
+
*/ export const CSV_IMPORT_MAX_BODY_BYTES = 2000000;
|
|
65
|
+
/** How many mapped rows the drawer shows before the operator commits. */ export const CSV_IMPORT_PREVIEW_ROWS = 10;
|
|
66
|
+
/** The prefix a custom-field target id carries. */ const CUSTOM_TARGET_PREFIX = 'custom:';
|
|
67
|
+
/** The custom-field target id for a definition key. */ export function customImportTarget(key) {
|
|
68
|
+
return `${CUSTOM_TARGET_PREFIX}${key}`;
|
|
69
|
+
}
|
|
70
|
+
/** The definition key a custom target names, or `null` for a standard field. */ export function customImportTargetKey(target) {
|
|
71
|
+
return target.startsWith(CUSTOM_TARGET_PREFIX) ? target.slice(CUSTOM_TARGET_PREFIX.length) : null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Normalizes a header cell for alias matching.
|
|
75
|
+
*
|
|
76
|
+
* Underscores, dots and hyphens all become one space, so `e-mail`,
|
|
77
|
+
* `email_address` and `Email Address` compare as the words they are. The
|
|
78
|
+
* alias tables are written in the human spelling and pass through the same
|
|
79
|
+
* function, so a table stays readable and the comparison stays exact.
|
|
80
|
+
*/ export function importHeaderKey(value) {
|
|
81
|
+
return String(value != null ? value : '').trim().toLowerCase().replace(/[_.\-/]+/g, ' ').replace(/\s+/g, ' ').trim();
|
|
82
|
+
}
|
|
83
|
+
/** An alias table, normalized once through {@link importHeaderKey}. */ export function importAliasKeys(fields, aliases) {
|
|
84
|
+
const keys = {};
|
|
85
|
+
for (const field of fields){
|
|
86
|
+
keys[field] = new Set(aliases[field].map(importHeaderKey));
|
|
87
|
+
}
|
|
88
|
+
return keys;
|
|
89
|
+
}
|
|
90
|
+
export function guessImportMapping(columns, fields, aliasKeys, customFields = []) {
|
|
91
|
+
const mapping = {};
|
|
92
|
+
const taken = new Set();
|
|
93
|
+
const customByHeader = new Map();
|
|
94
|
+
for (const field of customFields){
|
|
95
|
+
customByHeader.set(importHeaderKey(field.label), field.key);
|
|
96
|
+
customByHeader.set(importHeaderKey(field.key), field.key);
|
|
97
|
+
}
|
|
98
|
+
columns.forEach((column, index)=>{
|
|
99
|
+
const key = importHeaderKey(column);
|
|
100
|
+
if (!key) return;
|
|
101
|
+
const customKey = customByHeader.get(key);
|
|
102
|
+
if (customKey) {
|
|
103
|
+
const target = customImportTarget(customKey);
|
|
104
|
+
if (!taken.has(target)) {
|
|
105
|
+
mapping[index] = target;
|
|
106
|
+
taken.add(target);
|
|
107
|
+
}
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
for (const field of fields){
|
|
111
|
+
if (taken.has(field)) continue;
|
|
112
|
+
if (aliasKeys[field].has(key)) {
|
|
113
|
+
mapping[index] = field;
|
|
114
|
+
taken.add(field);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return mapping;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* One parsed line under a mapping: the cells the mapping selected, under the
|
|
123
|
+
* field they were mapped to, verbatim, with custom values gathered under
|
|
124
|
+
* `custom` by definition key. Empty cells are left absent.
|
|
125
|
+
*/ export function mapImportRow(cells, mapping) {
|
|
126
|
+
const standard = {};
|
|
127
|
+
const custom = {};
|
|
128
|
+
for (const [indexText, target] of Object.entries(mapping)){
|
|
129
|
+
var _cells_Number;
|
|
130
|
+
const value = String((_cells_Number = cells[Number(indexText)]) != null ? _cells_Number : '');
|
|
131
|
+
if (!value.trim()) continue;
|
|
132
|
+
const customKey = customImportTargetKey(target);
|
|
133
|
+
if (customKey) {
|
|
134
|
+
custom[customKey] = value;
|
|
135
|
+
} else {
|
|
136
|
+
standard[target] = value;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return Object.keys(custom).length ? _extends({}, standard, {
|
|
140
|
+
custom
|
|
141
|
+
}) : standard;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* A tag cell as the tags it names.
|
|
145
|
+
*
|
|
146
|
+
* `|` or `,` separated — the CSV export writes `|`, most other products
|
|
147
|
+
* write `,` — lowercased and trimmed like a record's own tag field, so an
|
|
148
|
+
* imported `VIP` and a typed `vip` are one tag and not two.
|
|
149
|
+
*/ export function parseImportTags(value, max) {
|
|
150
|
+
const parts = Array.isArray(value) ? value.map((entry)=>String(entry != null ? entry : '')) : String(value != null ? value : '').split(/[|,]/);
|
|
151
|
+
return [
|
|
152
|
+
...new Set(parts.map((tag)=>tag.trim().toLowerCase()).filter(Boolean))
|
|
153
|
+
].slice(0, max);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* A yes/no cell as a boolean, or `null` when it is neither.
|
|
157
|
+
*
|
|
158
|
+
* The affirmatives are the ones consent and checkbox columns actually
|
|
159
|
+
* carry; the negatives are listed so that an explicit `no` is a `false`
|
|
160
|
+
* rather than an unreadable value that gets reported as dropped.
|
|
161
|
+
*/ export function parseImportFlag(value) {
|
|
162
|
+
if (typeof value === 'boolean') return value;
|
|
163
|
+
if (typeof value === 'number') return value === 1 ? true : value === 0 ? false : null;
|
|
164
|
+
const text = String(value != null ? value : '').trim().toLowerCase();
|
|
165
|
+
if ([
|
|
166
|
+
'yes',
|
|
167
|
+
'y',
|
|
168
|
+
'true',
|
|
169
|
+
'1',
|
|
170
|
+
'on',
|
|
171
|
+
'subscribed',
|
|
172
|
+
'opted in',
|
|
173
|
+
'opted-in'
|
|
174
|
+
].includes(text)) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
if ([
|
|
178
|
+
'no',
|
|
179
|
+
'n',
|
|
180
|
+
'false',
|
|
181
|
+
'0',
|
|
182
|
+
'off',
|
|
183
|
+
'unsubscribed',
|
|
184
|
+
''
|
|
185
|
+
].includes(text)) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
/** A cell as trimmed text capped at `max`, or `undefined` when blank. */ export function importTextValue(value, max) {
|
|
191
|
+
const text = String(value != null ? value : '').trim().slice(0, max);
|
|
192
|
+
return text || undefined;
|
|
193
|
+
}
|
|
194
|
+
/** A CSV cell, quoted only when it has to be. */ export function csvCell(value) {
|
|
195
|
+
const text = String(value != null ? value : '');
|
|
196
|
+
return /[",\r\n]/.test(text) ? `"${text.replace(/"/g, '""')}"` : text;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* A whole CSV — the header, then one line per row — through {@link csvCell}.
|
|
200
|
+
*
|
|
201
|
+
* The one serializer for every CSV the console writes: each CRM section's
|
|
202
|
+
* export, the skipped-rows file an import hands back and each report
|
|
203
|
+
* table's export.
|
|
204
|
+
* Quoting is decided in {@link csvCell} and nowhere else — a cell holding a
|
|
205
|
+
* comma, a quote or a line break is wrapped in quotes with its quotes
|
|
206
|
+
* doubled, no other cell is touched, and a `null` or `undefined` cell is
|
|
207
|
+
* empty rather than the word — so that a report's file and a contacts file
|
|
208
|
+
* open the same way in a spreadsheet.
|
|
209
|
+
*/ export function csvDocument(header, rows) {
|
|
210
|
+
return [
|
|
211
|
+
header,
|
|
212
|
+
...rows
|
|
213
|
+
].map((line)=>line.map(csvCell).join(',')).join('\n');
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* The skipped rows as a file the operator can fix and re-import.
|
|
217
|
+
*
|
|
218
|
+
* The original columns verbatim plus a trailing `Skipped because` column,
|
|
219
|
+
* so the file round-trips: correct the cell, delete the last column or
|
|
220
|
+
* leave it unmapped, and import it again.
|
|
221
|
+
*/ export function importSkippedCsv(columns, entries, labels) {
|
|
222
|
+
return csvDocument([
|
|
223
|
+
...columns,
|
|
224
|
+
'Skipped because'
|
|
225
|
+
], entries.map((entry)=>{
|
|
226
|
+
var _labels_entry_reason;
|
|
227
|
+
return [
|
|
228
|
+
...columns.map((_column, index)=>{
|
|
229
|
+
var _entry_cells_index;
|
|
230
|
+
return (_entry_cells_index = entry.cells[index]) != null ? _entry_cells_index : '';
|
|
231
|
+
}),
|
|
232
|
+
(_labels_entry_reason = labels[entry.reason]) != null ? _labels_entry_reason : entry.reason
|
|
233
|
+
];
|
|
234
|
+
}));
|
|
235
|
+
}
|
|
236
|
+
/** An empty tally, for the drawer to fold chunk results into. */ export function emptyImportResult() {
|
|
237
|
+
return {
|
|
238
|
+
received: 0,
|
|
239
|
+
created: 0,
|
|
240
|
+
merged: 0,
|
|
241
|
+
skipped: [],
|
|
242
|
+
dropped: {},
|
|
243
|
+
ownersUnresolved: []
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Two results as one.
|
|
248
|
+
*
|
|
249
|
+
* `offset` is where the chunk started in the file, so a skipped row's index
|
|
250
|
+
* comes back as its position in the FILE rather than in the request — which
|
|
251
|
+
* is what the download of skipped rows has to look up.
|
|
252
|
+
*/ export function mergeImportResults(total, chunk, offset = 0) {
|
|
253
|
+
var _chunk_dropped, _chunk_received, _chunk_created, _chunk_merged, _chunk_skipped, _chunk_ownersUnresolved;
|
|
254
|
+
const dropped = _extends({}, total.dropped);
|
|
255
|
+
for (const [field, count] of Object.entries((_chunk_dropped = chunk.dropped) != null ? _chunk_dropped : {})){
|
|
256
|
+
var _dropped_field;
|
|
257
|
+
dropped[field] = ((_dropped_field = dropped[field]) != null ? _dropped_field : 0) + Number(count != null ? count : 0);
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
received: total.received + Number((_chunk_received = chunk.received) != null ? _chunk_received : 0),
|
|
261
|
+
created: total.created + Number((_chunk_created = chunk.created) != null ? _chunk_created : 0),
|
|
262
|
+
merged: total.merged + Number((_chunk_merged = chunk.merged) != null ? _chunk_merged : 0),
|
|
263
|
+
skipped: [
|
|
264
|
+
...total.skipped,
|
|
265
|
+
...((_chunk_skipped = chunk.skipped) != null ? _chunk_skipped : []).map((entry)=>_extends({}, entry, {
|
|
266
|
+
index: Number(entry.index) + offset
|
|
267
|
+
}))
|
|
268
|
+
],
|
|
269
|
+
dropped,
|
|
270
|
+
ownersUnresolved: [
|
|
271
|
+
...new Set([
|
|
272
|
+
...total.ownersUnresolved,
|
|
273
|
+
...(_chunk_ownersUnresolved = chunk.ownersUnresolved) != null ? _chunk_ownersUnresolved : []
|
|
274
|
+
])
|
|
275
|
+
]
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
//# sourceMappingURL=csv-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/csv-import.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * READING A SPREADSHEET INTO A CRM COLLECTION — the part that does not care\n * which collection (AGL-2621).\n *\n * The contact import (AGL-2602) settled how a file becomes records: a\n * header row is matched against an alias table to PROPOSE a column → field\n * mapping, the operator corrects it, one line is mapped to a raw row of\n * verbatim strings, and the server judges each row and tallies what it did.\n * A companies file goes through the same three stages with a different\n * field list, so the stages live here, parametric over the field union, and\n * the CRM plugin's contact and company importers each supply their vocabulary\n * — the fields, their aliases, their labels — and nothing else.\n *\n * ## A custom target is `custom:<key>`\n *\n * A column may also map to a custom field the merchant defined, which has\n * no standard name. The target is one string rather than a discriminated\n * object because it is the VALUE of a select control and travels through a\n * form; the prefix is what tells the two apart on the way back.\n *\n * ## The ceilings are shared numbers\n *\n * One file, one request and one preview are bounded the same way for every\n * collection, because the bounds are about the browser's memory and a\n * console request's budget, not about what the rows hold.\n */\n\n/**\n * The most rows one uploaded file may carry.\n *\n * A bound on the work one import represents and on the memory the browser\n * holds while mapping it — five thousand rows of a wide export is already\n * several megabytes of cells in a tab. A larger list is split and imported\n * in pieces; the drawer says so on the file, before a single row is sent.\n */\nexport const CSV_IMPORT_MAX_ROWS = 5_000\n\n/**\n * Rows per request.\n *\n * Each row costs the server a lookup and a write, plus whatever a name it\n * has not seen in this request costs to resolve; two hundred of those sit\n * comfortably inside a console request's budget and give the progress bar\n * twenty-five steps on the largest file the drawer accepts.\n */\nexport const CSV_IMPORT_CHUNK_SIZE = 200\n\n/**\n * The most bytes one request may carry, checked before the body is judged.\n *\n * Two hundred rows of a wide export with long values is well under a\n * megabyte; two megabytes is the line past which a request is not a chunk\n * of a file but something else being pushed through this door.\n */\nexport const CSV_IMPORT_MAX_BODY_BYTES = 2_000_000\n\n/** How many mapped rows the drawer shows before the operator commits. */\nexport const CSV_IMPORT_PREVIEW_ROWS = 10\n\n/** The prefix a custom-field target id carries. */\nconst CUSTOM_TARGET_PREFIX = 'custom:'\n\n/** The custom-field target id for a definition key. */\nexport function customImportTarget(key: string): `custom:${string}` {\n return `${CUSTOM_TARGET_PREFIX}${key}`\n}\n\n/** The definition key a custom target names, or `null` for a standard field. */\nexport function customImportTargetKey(target: string): string | null {\n return target.startsWith(CUSTOM_TARGET_PREFIX)\n ? target.slice(CUSTOM_TARGET_PREFIX.length)\n : null\n}\n\n/**\n * Normalizes a header cell for alias matching.\n *\n * Underscores, dots and hyphens all become one space, so `e-mail`,\n * `email_address` and `Email Address` compare as the words they are. The\n * alias tables are written in the human spelling and pass through the same\n * function, so a table stays readable and the comparison stays exact.\n */\nexport function importHeaderKey(value: unknown): string {\n return String(value ?? '')\n .trim()\n .toLowerCase()\n .replace(/[_.\\-/]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n}\n\n/** An alias table, normalized once through {@link importHeaderKey}. */\nexport function importAliasKeys<F extends string>(\n fields: readonly F[],\n aliases: Record<F, readonly string[]>,\n): Record<F, ReadonlySet<string>> {\n const keys = {} as Record<F, ReadonlySet<string>>\n for (const field of fields) {\n keys[field] = new Set(aliases[field].map(importHeaderKey))\n }\n return keys\n}\n\n/**\n * A proposed mapping from a file's header row.\n *\n * Custom fields win over standard aliases when a header matches a\n * definition's label or key exactly — a merchant who defined a field called\n * \"Status\" meant THEIR status, not our lifecycle stage. Each target is\n * taken at most once, by the first column that claims it, so a file with two\n * columns named \"Email\" maps the first and leaves the second for the\n * operator to decide.\n */\nexport function guessImportMapping<F extends string>(\n columns: readonly string[],\n fields: readonly F[],\n aliasKeys: Record<F, ReadonlySet<string>>,\n): Record<number, F>\nexport function guessImportMapping<F extends string>(\n columns: readonly string[],\n fields: readonly F[],\n aliasKeys: Record<F, ReadonlySet<string>>,\n customFields: readonly { key: string; label: string }[],\n): Record<number, F | `custom:${string}`>\nexport function guessImportMapping<F extends string>(\n columns: readonly string[],\n fields: readonly F[],\n aliasKeys: Record<F, ReadonlySet<string>>,\n customFields: readonly { key: string; label: string }[] = [],\n): Record<number, F | `custom:${string}`> {\n const mapping: Record<number, F | `custom:${string}`> = {}\n const taken = new Set<string>()\n const customByHeader = new Map<string, string>()\n for (const field of customFields) {\n customByHeader.set(importHeaderKey(field.label), field.key)\n customByHeader.set(importHeaderKey(field.key), field.key)\n }\n columns.forEach((column, index) => {\n const key = importHeaderKey(column)\n if (!key) return\n const customKey = customByHeader.get(key)\n if (customKey) {\n const target = customImportTarget(customKey)\n if (!taken.has(target)) {\n mapping[index] = target\n taken.add(target)\n }\n return\n }\n for (const field of fields) {\n if (taken.has(field)) continue\n if (aliasKeys[field].has(key)) {\n mapping[index] = field\n taken.add(field)\n return\n }\n }\n })\n return mapping\n}\n\n/**\n * One parsed line under a mapping: the cells the mapping selected, under the\n * field they were mapped to, verbatim, with custom values gathered under\n * `custom` by definition key. Empty cells are left absent.\n */\nexport function mapImportRow<F extends string>(\n cells: readonly string[],\n mapping: Record<number, F | `custom:${string}`>,\n): Partial<Record<F, string>> & { custom?: Record<string, string> } {\n const standard: Partial<Record<F, string>> = {}\n const custom: Record<string, string> = {}\n for (const [indexText, target] of Object.entries(mapping)) {\n const value = String(cells[Number(indexText)] ?? '')\n if (!value.trim()) continue\n const customKey = customImportTargetKey(target)\n if (customKey) {\n custom[customKey] = value\n } else {\n standard[target as F] = value\n }\n }\n return Object.keys(custom).length ? { ...standard, custom } : standard\n}\n\n/**\n * A tag cell as the tags it names.\n *\n * `|` or `,` separated — the CSV export writes `|`, most other products\n * write `,` — lowercased and trimmed like a record's own tag field, so an\n * imported `VIP` and a typed `vip` are one tag and not two.\n */\nexport function parseImportTags(value: unknown, max: number): string[] {\n const parts = Array.isArray(value)\n ? value.map((entry) => String(entry ?? ''))\n : String(value ?? '').split(/[|,]/)\n return [\n ...new Set(parts.map((tag) => tag.trim().toLowerCase()).filter(Boolean)),\n ].slice(0, max)\n}\n\n/**\n * A yes/no cell as a boolean, or `null` when it is neither.\n *\n * The affirmatives are the ones consent and checkbox columns actually\n * carry; the negatives are listed so that an explicit `no` is a `false`\n * rather than an unreadable value that gets reported as dropped.\n */\nexport function parseImportFlag(value: unknown): boolean | null {\n if (typeof value === 'boolean') return value\n if (typeof value === 'number') return value === 1 ? true : value === 0 ? false : null\n const text = String(value ?? '')\n .trim()\n .toLowerCase()\n if (['yes', 'y', 'true', '1', 'on', 'subscribed', 'opted in', 'opted-in'].includes(text)) {\n return true\n }\n if (['no', 'n', 'false', '0', 'off', 'unsubscribed', ''].includes(text)) {\n return false\n }\n return null\n}\n\n/** A cell as trimmed text capped at `max`, or `undefined` when blank. */\nexport function importTextValue(value: unknown, max: number): string | undefined {\n const text = String(value ?? '')\n .trim()\n .slice(0, max)\n return text || undefined\n}\n\n/** A cell the file carried that could not be read as the field it was mapped to. */\nexport interface ImportDroppedValue {\n /** The standard field name, or `custom:<key>`. */\n field: string\n value: string\n}\n\n/** A CSV cell, quoted only when it has to be. */\nexport function csvCell(value: unknown): string {\n const text = String(value ?? '')\n return /[\",\\r\\n]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text\n}\n\n/**\n * A whole CSV — the header, then one line per row — through {@link csvCell}.\n *\n * The one serializer for every CSV the console writes: each CRM section's\n * export, the skipped-rows file an import hands back and each report\n * table's export.\n * Quoting is decided in {@link csvCell} and nowhere else — a cell holding a\n * comma, a quote or a line break is wrapped in quotes with its quotes\n * doubled, no other cell is touched, and a `null` or `undefined` cell is\n * empty rather than the word — so that a report's file and a contacts file\n * open the same way in a spreadsheet.\n */\nexport function csvDocument(\n header: readonly unknown[],\n rows: readonly (readonly unknown[])[],\n): string {\n return [header, ...rows]\n .map((line) => line.map(csvCell).join(','))\n .join('\\n')\n}\n\n/**\n * The skipped rows as a file the operator can fix and re-import.\n *\n * The original columns verbatim plus a trailing `Skipped because` column,\n * so the file round-trips: correct the cell, delete the last column or\n * leave it unmapped, and import it again.\n */\nexport function importSkippedCsv<R extends string>(\n columns: readonly string[],\n entries: readonly { cells: readonly string[]; reason: R }[],\n labels: Record<R, string>,\n): string {\n return csvDocument(\n [...columns, 'Skipped because'],\n entries.map((entry) => [\n ...columns.map((_column, index) => entry.cells[index] ?? ''),\n labels[entry.reason] ?? entry.reason,\n ]),\n )\n}\n\n/**\n * One row the server did not store, by its index in the request. Each\n * collection names the row back to the operator in its own field — an\n * address, a company name — beside these two.\n */\nexport interface ImportSkippedRow<R extends string> {\n index: number\n reason: R\n}\n\n/**\n * What one request did, in the shape every collection's import reports.\n * The drawer sums these across a file; a collection with more to say\n * extends the shape and folds its own field beside {@link mergeImportResults}.\n */\nexport interface ImportChunkResult<S extends ImportSkippedRow<string>> {\n received: number\n created: number\n merged: number\n skipped: S[]\n /** Unreadable cells, tallied by field. */\n dropped: Record<string, number>\n /** Owner addresses that matched no member of the organization. */\n ownersUnresolved: string[]\n}\n\n/** An empty tally, for the drawer to fold chunk results into. */\nexport function emptyImportResult<\n S extends ImportSkippedRow<string>,\n>(): ImportChunkResult<S> {\n return {\n received: 0,\n created: 0,\n merged: 0,\n skipped: [],\n dropped: {},\n ownersUnresolved: [],\n }\n}\n\n/**\n * Two results as one.\n *\n * `offset` is where the chunk started in the file, so a skipped row's index\n * comes back as its position in the FILE rather than in the request — which\n * is what the download of skipped rows has to look up.\n */\nexport function mergeImportResults<S extends ImportSkippedRow<string>>(\n total: ImportChunkResult<S>,\n chunk: Partial<ImportChunkResult<S>>,\n offset = 0,\n): ImportChunkResult<S> {\n const dropped = { ...total.dropped }\n for (const [field, count] of Object.entries(chunk.dropped ?? {})) {\n dropped[field] = (dropped[field] ?? 0) + Number(count ?? 0)\n }\n return {\n received: total.received + Number(chunk.received ?? 0),\n created: total.created + Number(chunk.created ?? 0),\n merged: total.merged + Number(chunk.merged ?? 0),\n skipped: [\n ...total.skipped,\n ...(chunk.skipped ?? []).map((entry) => ({\n ...entry,\n index: Number(entry.index) + offset,\n })),\n ],\n dropped,\n ownersUnresolved: [\n ...new Set([...total.ownersUnresolved, ...(chunk.ownersUnresolved ?? [])]),\n ],\n }\n}\n"],"names":["CSV_IMPORT_MAX_ROWS","CSV_IMPORT_CHUNK_SIZE","CSV_IMPORT_MAX_BODY_BYTES","CSV_IMPORT_PREVIEW_ROWS","CUSTOM_TARGET_PREFIX","customImportTarget","key","customImportTargetKey","target","startsWith","slice","length","importHeaderKey","value","String","trim","toLowerCase","replace","importAliasKeys","fields","aliases","keys","field","Set","map","guessImportMapping","columns","aliasKeys","customFields","mapping","taken","customByHeader","Map","set","label","forEach","column","index","customKey","get","has","add","mapImportRow","cells","standard","custom","indexText","Object","entries","Number","parseImportTags","max","parts","Array","isArray","entry","split","tag","filter","Boolean","parseImportFlag","text","includes","importTextValue","undefined","csvCell","test","csvDocument","header","rows","line","join","importSkippedCsv","labels","_column","reason","emptyImportResult","received","created","merged","skipped","dropped","ownersUnresolved","mergeImportResults","total","chunk","offset","count"],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Dataset CSV/JSON serialization (AGL-182). The predictable inverse of
|
|
19
|
+
* `coerceDocumentValues`: ISO dates, `lat, lon` coordinates, comma-joined
|
|
20
|
+
* lists, JSON maps, reference ids — so an export re-imports losslessly
|
|
21
|
+
* through the same coercion.
|
|
22
|
+
*
|
|
23
|
+
* **Why this lives in core rather than in `@aglyn/plugins-data`** (AGL-2335).
|
|
24
|
+
* AGL-413 moved dataset io out to the plugin, and the dataset-shaped half of
|
|
25
|
+
* the import machinery — column mapping against a `DatasetModel` — is still
|
|
26
|
+
* there, correctly: nothing outside that plugin maps a file onto a dataset.
|
|
27
|
+
*
|
|
28
|
+
* Writing one is different now. `/api/orgs/datasets/export` streams a
|
|
29
|
+
* dataset from the server, and `scope:app` may not import a lib tagged
|
|
30
|
+
* `aglyn:addons` — apps reach plugins only through the generated loader
|
|
31
|
+
* manifests (AGL-417/419). The choice was a second copy of the escaper in
|
|
32
|
+
* the console or one copy somewhere both may reach. There are already five
|
|
33
|
+
* divergent hand-rolled CSV escapers in this repo; this is not becoming the
|
|
34
|
+
* sixth. `dataset-io.ts` re-exports every name below, so the plugin's own
|
|
35
|
+
* imports are unchanged.
|
|
36
|
+
*
|
|
37
|
+
* READING one is shared for the same reason. The email list importer parses
|
|
38
|
+
* a merchant's contact file, and it lives in `@aglyn/plugins-email`, which
|
|
39
|
+
* may not import `@aglyn/plugins-data` either. So {@link parseCsv} sits here
|
|
40
|
+
* beside the escaper that is its inverse, and `dataset-io.ts` re-exports it
|
|
41
|
+
* exactly as it re-exports the writing half.
|
|
42
|
+
*/
|
|
43
|
+
import type { DatasetFieldDefinition, DatasetModel } from './dataset-models';
|
|
44
|
+
/** Storage value → portable string (CSV cell / JSON value). */
|
|
45
|
+
export declare function serializeDatasetValue(field: DatasetFieldDefinition, value: unknown): string;
|
|
46
|
+
/**
|
|
47
|
+
* The header line — field ids, in model order (AGL-2335).
|
|
48
|
+
*
|
|
49
|
+
* Split out of {@link datasetRecordsToCsv} so a server export can emit the
|
|
50
|
+
* file a page at a time. The whole point of that export is that it is not
|
|
51
|
+
* bounded by what one process can hold in memory, and a helper that only
|
|
52
|
+
* takes a complete `rows` array cannot serve it. Everything below shares
|
|
53
|
+
* one escaper: there are already five divergent hand-rolled CSV escapers in
|
|
54
|
+
* this repo and this is not becoming the sixth.
|
|
55
|
+
*/
|
|
56
|
+
export declare function datasetCsvHeader(model: DatasetModel): string;
|
|
57
|
+
/** One record's values (storage form) → one CSV line, no terminator. */
|
|
58
|
+
export declare function datasetCsvRow(model: DatasetModel, row: Record<string, unknown>): string;
|
|
59
|
+
/** One record's values → the portable JSON object the JSON export emits. */
|
|
60
|
+
export declare function datasetRecordToJson(model: DatasetModel, row: Record<string, unknown>): Record<string, string>;
|
|
61
|
+
/**
|
|
62
|
+
* Data rows in a CSV document — the header excluded, quoted newlines not
|
|
63
|
+
* counted as row breaks (AGL-2335).
|
|
64
|
+
*
|
|
65
|
+
* This exists so a download can be CHECKED against the row count the server
|
|
66
|
+
* promised, rather than trusted. A truncated export is the defect this whole
|
|
67
|
+
* area is about, and a stream that dies halfway produces a perfectly
|
|
68
|
+
* well-formed shorter file: nothing about the bytes says they are short.
|
|
69
|
+
*
|
|
70
|
+
* Single pass, no array building — {@link parseCsv} answers the same
|
|
71
|
+
* question but materializes every cell, which is the wrong trade when the
|
|
72
|
+
* file may be hundreds of thousands of rows and the only thing wanted is
|
|
73
|
+
* how many there are.
|
|
74
|
+
*/
|
|
75
|
+
export declare function countCsvDataRows(text: string): number;
|
|
76
|
+
/**
|
|
77
|
+
* Did a downloaded export arrive whole? (AGL-2335)
|
|
78
|
+
*
|
|
79
|
+
* The server streams and reports its `count()` aggregate in a header, so the
|
|
80
|
+
* client can CHECK rather than trust. This is the check, kept here as a pure
|
|
81
|
+
* function because a guard living inline in a component is a guard nobody
|
|
82
|
+
* can force red — and this one exists precisely to catch a silent shortfall.
|
|
83
|
+
*
|
|
84
|
+
* `short` is only true when the count is both KNOWN and lower. A missing or
|
|
85
|
+
* unparseable header is not evidence of truncation, and refusing a download
|
|
86
|
+
* on the strength of a header that never arrived would fail the user for the
|
|
87
|
+
* server's bookkeeping. More rows than promised is not short either — the
|
|
88
|
+
* count is a snapshot taken before the first page, so a concurrent insert
|
|
89
|
+
* can legitimately overtake it.
|
|
90
|
+
*/
|
|
91
|
+
export declare function exportShortfall(promisedHeader: string | null | undefined, body: string, format: 'csv' | 'json'): {
|
|
92
|
+
promised: number;
|
|
93
|
+
received: number;
|
|
94
|
+
short: boolean;
|
|
95
|
+
};
|
|
96
|
+
/** Rows (storage-form value maps) → CSV with a fieldId header row. */
|
|
97
|
+
export declare function datasetRecordsToCsv(model: DatasetModel, rows: Array<Record<string, unknown>>): string;
|
|
98
|
+
/**
|
|
99
|
+
* Minimal RFC-4180 CSV parser (quoted fields, escaped quotes, CRLF).
|
|
100
|
+
*
|
|
101
|
+
* The inverse of the escaper above, and the one parser in the repo — see the
|
|
102
|
+
* module note for why the email list importer reaches this rather than
|
|
103
|
+
* writing its own.
|
|
104
|
+
*
|
|
105
|
+
* A wholly blank row is dropped. Every spreadsheet writes a trailing newline
|
|
106
|
+
* and a row of empty cells is not a record; carrying it through would give
|
|
107
|
+
* every caller the same off-by-one to remember.
|
|
108
|
+
*/
|
|
109
|
+
export declare function parseCsv(text: string): string[][];
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ /**
|
|
17
|
+
* Dataset CSV/JSON serialization (AGL-182). The predictable inverse of
|
|
18
|
+
* `coerceDocumentValues`: ISO dates, `lat, lon` coordinates, comma-joined
|
|
19
|
+
* lists, JSON maps, reference ids — so an export re-imports losslessly
|
|
20
|
+
* through the same coercion.
|
|
21
|
+
*
|
|
22
|
+
* **Why this lives in core rather than in `@aglyn/plugins-data`** (AGL-2335).
|
|
23
|
+
* AGL-413 moved dataset io out to the plugin, and the dataset-shaped half of
|
|
24
|
+
* the import machinery — column mapping against a `DatasetModel` — is still
|
|
25
|
+
* there, correctly: nothing outside that plugin maps a file onto a dataset.
|
|
26
|
+
*
|
|
27
|
+
* Writing one is different now. `/api/orgs/datasets/export` streams a
|
|
28
|
+
* dataset from the server, and `scope:app` may not import a lib tagged
|
|
29
|
+
* `aglyn:addons` — apps reach plugins only through the generated loader
|
|
30
|
+
* manifests (AGL-417/419). The choice was a second copy of the escaper in
|
|
31
|
+
* the console or one copy somewhere both may reach. There are already five
|
|
32
|
+
* divergent hand-rolled CSV escapers in this repo; this is not becoming the
|
|
33
|
+
* sixth. `dataset-io.ts` re-exports every name below, so the plugin's own
|
|
34
|
+
* imports are unchanged.
|
|
35
|
+
*
|
|
36
|
+
* READING one is shared for the same reason. The email list importer parses
|
|
37
|
+
* a merchant's contact file, and it lives in `@aglyn/plugins-email`, which
|
|
38
|
+
* may not import `@aglyn/plugins-data` either. So {@link parseCsv} sits here
|
|
39
|
+
* beside the escaper that is its inverse, and `dataset-io.ts` re-exports it
|
|
40
|
+
* exactly as it re-exports the writing half.
|
|
41
|
+
*/ /** Storage value → portable string (CSV cell / JSON value). */ export function serializeDatasetValue(field, value) {
|
|
42
|
+
if (value == null) return '';
|
|
43
|
+
switch(field.type){
|
|
44
|
+
case 'timestamp':
|
|
45
|
+
return typeof value === 'number' && Number.isFinite(value) ? new Date(value).toISOString() : String(value);
|
|
46
|
+
case 'coordinates':
|
|
47
|
+
{
|
|
48
|
+
const coordinates = value;
|
|
49
|
+
return coordinates && typeof coordinates.latitude === 'number' && typeof coordinates.longitude === 'number' ? `${coordinates.latitude}, ${coordinates.longitude}` : String(value);
|
|
50
|
+
}
|
|
51
|
+
case 'sorted':
|
|
52
|
+
case 'reference':
|
|
53
|
+
return Array.isArray(value) ? value.join(', ') : String(value);
|
|
54
|
+
case 'map':
|
|
55
|
+
try {
|
|
56
|
+
return JSON.stringify(value);
|
|
57
|
+
} catch (unused) {
|
|
58
|
+
return String(value);
|
|
59
|
+
}
|
|
60
|
+
default:
|
|
61
|
+
return String(value);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const csvEscape = (cell)=>/[",\r\n]/.test(cell) ? `"${cell.replace(/"/g, '""')}"` : cell;
|
|
65
|
+
/**
|
|
66
|
+
* The header line — field ids, in model order (AGL-2335).
|
|
67
|
+
*
|
|
68
|
+
* Split out of {@link datasetRecordsToCsv} so a server export can emit the
|
|
69
|
+
* file a page at a time. The whole point of that export is that it is not
|
|
70
|
+
* bounded by what one process can hold in memory, and a helper that only
|
|
71
|
+
* takes a complete `rows` array cannot serve it. Everything below shares
|
|
72
|
+
* one escaper: there are already five divergent hand-rolled CSV escapers in
|
|
73
|
+
* this repo and this is not becoming the sixth.
|
|
74
|
+
*/ export function datasetCsvHeader(model) {
|
|
75
|
+
return model.order.map(csvEscape).join(',');
|
|
76
|
+
}
|
|
77
|
+
/** One record's values (storage form) → one CSV line, no terminator. */ export function datasetCsvRow(model, row) {
|
|
78
|
+
return model.order.map((fieldId)=>{
|
|
79
|
+
const field = model.fields[fieldId];
|
|
80
|
+
return csvEscape(field ? serializeDatasetValue(field, row[fieldId]) : '');
|
|
81
|
+
}).join(',');
|
|
82
|
+
}
|
|
83
|
+
/** One record's values → the portable JSON object the JSON export emits. */ export function datasetRecordToJson(model, row) {
|
|
84
|
+
return Object.fromEntries(model.order.map((fieldId)=>{
|
|
85
|
+
const field = model.fields[fieldId];
|
|
86
|
+
return [
|
|
87
|
+
fieldId,
|
|
88
|
+
field ? serializeDatasetValue(field, row[fieldId]) : ''
|
|
89
|
+
];
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Data rows in a CSV document — the header excluded, quoted newlines not
|
|
94
|
+
* counted as row breaks (AGL-2335).
|
|
95
|
+
*
|
|
96
|
+
* This exists so a download can be CHECKED against the row count the server
|
|
97
|
+
* promised, rather than trusted. A truncated export is the defect this whole
|
|
98
|
+
* area is about, and a stream that dies halfway produces a perfectly
|
|
99
|
+
* well-formed shorter file: nothing about the bytes says they are short.
|
|
100
|
+
*
|
|
101
|
+
* Single pass, no array building — {@link parseCsv} answers the same
|
|
102
|
+
* question but materializes every cell, which is the wrong trade when the
|
|
103
|
+
* file may be hundreds of thousands of rows and the only thing wanted is
|
|
104
|
+
* how many there are.
|
|
105
|
+
*/ export function countCsvDataRows(text) {
|
|
106
|
+
const source = String(text != null ? text : '');
|
|
107
|
+
if (!source) return 0;
|
|
108
|
+
let rows = 0;
|
|
109
|
+
let quoted = false;
|
|
110
|
+
let cellsSeen = false;
|
|
111
|
+
for(let index = 0; index < source.length; index += 1){
|
|
112
|
+
const char = source[index];
|
|
113
|
+
if (quoted) {
|
|
114
|
+
if (char === '"') {
|
|
115
|
+
if (source[index + 1] === '"') index += 1;
|
|
116
|
+
else quoted = false;
|
|
117
|
+
}
|
|
118
|
+
cellsSeen = true;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (char === '"') {
|
|
122
|
+
quoted = true;
|
|
123
|
+
cellsSeen = true;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (char === '\n') {
|
|
127
|
+
rows += 1;
|
|
128
|
+
cellsSeen = false;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (char !== '\r') cellsSeen = true;
|
|
132
|
+
}
|
|
133
|
+
// A file that does not end in a newline still has a final row.
|
|
134
|
+
if (cellsSeen) rows += 1;
|
|
135
|
+
// The header is not data.
|
|
136
|
+
return Math.max(0, rows - 1);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Did a downloaded export arrive whole? (AGL-2335)
|
|
140
|
+
*
|
|
141
|
+
* The server streams and reports its `count()` aggregate in a header, so the
|
|
142
|
+
* client can CHECK rather than trust. This is the check, kept here as a pure
|
|
143
|
+
* function because a guard living inline in a component is a guard nobody
|
|
144
|
+
* can force red — and this one exists precisely to catch a silent shortfall.
|
|
145
|
+
*
|
|
146
|
+
* `short` is only true when the count is both KNOWN and lower. A missing or
|
|
147
|
+
* unparseable header is not evidence of truncation, and refusing a download
|
|
148
|
+
* on the strength of a header that never arrived would fail the user for the
|
|
149
|
+
* server's bookkeeping. More rows than promised is not short either — the
|
|
150
|
+
* count is a snapshot taken before the first page, so a concurrent insert
|
|
151
|
+
* can legitimately overtake it.
|
|
152
|
+
*/ export function exportShortfall(promisedHeader, body, format) {
|
|
153
|
+
const promised = Number(promisedHeader);
|
|
154
|
+
let received;
|
|
155
|
+
if (format === 'csv') {
|
|
156
|
+
received = countCsvDataRows(body);
|
|
157
|
+
} else {
|
|
158
|
+
try {
|
|
159
|
+
const parsed = JSON.parse(body);
|
|
160
|
+
received = Array.isArray(parsed) ? parsed.length : 0;
|
|
161
|
+
} catch (unused) {
|
|
162
|
+
// A body that is not JSON at all did not arrive whole.
|
|
163
|
+
return {
|
|
164
|
+
promised,
|
|
165
|
+
received: 0,
|
|
166
|
+
short: true
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
promised,
|
|
172
|
+
received,
|
|
173
|
+
short: Number.isFinite(promised) && promisedHeader != null && received < promised
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/** Rows (storage-form value maps) → CSV with a fieldId header row. */ export function datasetRecordsToCsv(model, rows) {
|
|
177
|
+
return [
|
|
178
|
+
datasetCsvHeader(model),
|
|
179
|
+
...rows.map((row)=>datasetCsvRow(model, row))
|
|
180
|
+
].join('\n');
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Minimal RFC-4180 CSV parser (quoted fields, escaped quotes, CRLF).
|
|
184
|
+
*
|
|
185
|
+
* The inverse of the escaper above, and the one parser in the repo — see the
|
|
186
|
+
* module note for why the email list importer reaches this rather than
|
|
187
|
+
* writing its own.
|
|
188
|
+
*
|
|
189
|
+
* A wholly blank row is dropped. Every spreadsheet writes a trailing newline
|
|
190
|
+
* and a row of empty cells is not a record; carrying it through would give
|
|
191
|
+
* every caller the same off-by-one to remember.
|
|
192
|
+
*/ export function parseCsv(text) {
|
|
193
|
+
const rows = [];
|
|
194
|
+
let row = [];
|
|
195
|
+
let cell = '';
|
|
196
|
+
let quoted = false;
|
|
197
|
+
const source = String(text != null ? text : '');
|
|
198
|
+
for(let index = 0; index < source.length; index += 1){
|
|
199
|
+
const char = source[index];
|
|
200
|
+
if (quoted) {
|
|
201
|
+
if (char === '"') {
|
|
202
|
+
if (source[index + 1] === '"') {
|
|
203
|
+
cell += '"';
|
|
204
|
+
index += 1;
|
|
205
|
+
} else {
|
|
206
|
+
quoted = false;
|
|
207
|
+
}
|
|
208
|
+
} else {
|
|
209
|
+
cell += char;
|
|
210
|
+
}
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
if (char === '"') {
|
|
214
|
+
quoted = true;
|
|
215
|
+
} else if (char === ',') {
|
|
216
|
+
row.push(cell);
|
|
217
|
+
cell = '';
|
|
218
|
+
} else if (char === '\n' || char === '\r') {
|
|
219
|
+
if (char === '\r' && source[index + 1] === '\n') index += 1;
|
|
220
|
+
row.push(cell);
|
|
221
|
+
cell = '';
|
|
222
|
+
rows.push(row);
|
|
223
|
+
row = [];
|
|
224
|
+
} else {
|
|
225
|
+
cell += char;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (cell !== '' || row.length) {
|
|
229
|
+
row.push(cell);
|
|
230
|
+
rows.push(row);
|
|
231
|
+
}
|
|
232
|
+
return rows.filter((cells)=>cells.some((value)=>value.trim() !== ''));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
//# sourceMappingURL=dataset-csv.js.map
|