@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/dataset-csv.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 * Dataset CSV/JSON serialization (AGL-182). The predictable inverse of\n * `coerceDocumentValues`: ISO dates, `lat, lon` coordinates, comma-joined\n * lists, JSON maps, reference ids — so an export re-imports losslessly\n * through the same coercion.\n *\n * **Why this lives in core rather than in `@aglyn/plugins-data`** (AGL-2335).\n * AGL-413 moved dataset io out to the plugin, and the dataset-shaped half of\n * the import machinery — column mapping against a `DatasetModel` — is still\n * there, correctly: nothing outside that plugin maps a file onto a dataset.\n *\n * Writing one is different now. `/api/orgs/datasets/export` streams a\n * dataset from the server, and `scope:app` may not import a lib tagged\n * `aglyn:addons` — apps reach plugins only through the generated loader\n * manifests (AGL-417/419). The choice was a second copy of the escaper in\n * the console or one copy somewhere both may reach. There are already five\n * divergent hand-rolled CSV escapers in this repo; this is not becoming the\n * sixth. `dataset-io.ts` re-exports every name below, so the plugin's own\n * imports are unchanged.\n *\n * READING one is shared for the same reason. The email list importer parses\n * a merchant's contact file, and it lives in `@aglyn/plugins-email`, which\n * may not import `@aglyn/plugins-data` either. So {@link parseCsv} sits here\n * beside the escaper that is its inverse, and `dataset-io.ts` re-exports it\n * exactly as it re-exports the writing half.\n */\n\nimport type { DatasetFieldDefinition, DatasetModel } from './dataset-models'\n\n\n/** Storage value → portable string (CSV cell / JSON value). */\nexport function serializeDatasetValue(\n field: DatasetFieldDefinition,\n value: unknown,\n): string {\n if (value == null) return ''\n switch (field.type) {\n case 'timestamp':\n return typeof value === 'number' && Number.isFinite(value)\n ? new Date(value).toISOString()\n : String(value)\n case 'coordinates': {\n const coordinates = value as { latitude?: number; longitude?: number }\n return coordinates &&\n typeof coordinates.latitude === 'number' &&\n typeof coordinates.longitude === 'number'\n ? `${coordinates.latitude}, ${coordinates.longitude}`\n : String(value)\n }\n case 'sorted':\n case 'reference':\n return Array.isArray(value) ? value.join(', ') : String(value)\n case 'map':\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n default:\n return String(value)\n }\n}\n\nconst csvEscape = (cell: string): string =>\n /[\",\\r\\n]/.test(cell) ? `\"${cell.replace(/\"/g, '\"\"')}\"` : cell\n\n/**\n * The header line — field ids, in model order (AGL-2335).\n *\n * Split out of {@link datasetRecordsToCsv} so a server export can emit the\n * file a page at a time. The whole point of that export is that it is not\n * bounded by what one process can hold in memory, and a helper that only\n * takes a complete `rows` array cannot serve it. Everything below shares\n * one escaper: there are already five divergent hand-rolled CSV escapers in\n * this repo and this is not becoming the sixth.\n */\nexport function datasetCsvHeader(model: DatasetModel): string {\n return model.order.map(csvEscape).join(',')\n}\n\n/** One record's values (storage form) → one CSV line, no terminator. */\nexport function datasetCsvRow(\n model: DatasetModel,\n row: Record<string, unknown>,\n): string {\n return model.order\n .map((fieldId) => {\n const field = model.fields[fieldId]\n return csvEscape(field ? serializeDatasetValue(field, row[fieldId]) : '')\n })\n .join(',')\n}\n\n/** One record's values → the portable JSON object the JSON export emits. */\nexport function datasetRecordToJson(\n model: DatasetModel,\n row: Record<string, unknown>,\n): Record<string, string> {\n return Object.fromEntries(\n model.order.map((fieldId) => {\n const field = model.fields[fieldId]\n return [fieldId, field ? serializeDatasetValue(field, row[fieldId]) : '']\n }),\n )\n}\n\n/**\n * Data rows in a CSV document — the header excluded, quoted newlines not\n * counted as row breaks (AGL-2335).\n *\n * This exists so a download can be CHECKED against the row count the server\n * promised, rather than trusted. A truncated export is the defect this whole\n * area is about, and a stream that dies halfway produces a perfectly\n * well-formed shorter file: nothing about the bytes says they are short.\n *\n * Single pass, no array building — {@link parseCsv} answers the same\n * question but materializes every cell, which is the wrong trade when the\n * file may be hundreds of thousands of rows and the only thing wanted is\n * how many there are.\n */\nexport function countCsvDataRows(text: string): number {\n const source = String(text ?? '')\n if (!source) return 0\n let rows = 0\n let quoted = false\n let cellsSeen = false\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index]\n if (quoted) {\n if (char === '\"') {\n if (source[index + 1] === '\"') index += 1\n else quoted = false\n }\n cellsSeen = true\n continue\n }\n if (char === '\"') {\n quoted = true\n cellsSeen = true\n continue\n }\n if (char === '\\n') {\n rows += 1\n cellsSeen = false\n continue\n }\n if (char !== '\\r') cellsSeen = true\n }\n // A file that does not end in a newline still has a final row.\n if (cellsSeen) rows += 1\n // The header is not data.\n return Math.max(0, rows - 1)\n}\n\n/**\n * Did a downloaded export arrive whole? (AGL-2335)\n *\n * The server streams and reports its `count()` aggregate in a header, so the\n * client can CHECK rather than trust. This is the check, kept here as a pure\n * function because a guard living inline in a component is a guard nobody\n * can force red — and this one exists precisely to catch a silent shortfall.\n *\n * `short` is only true when the count is both KNOWN and lower. A missing or\n * unparseable header is not evidence of truncation, and refusing a download\n * on the strength of a header that never arrived would fail the user for the\n * server's bookkeeping. More rows than promised is not short either — the\n * count is a snapshot taken before the first page, so a concurrent insert\n * can legitimately overtake it.\n */\nexport function exportShortfall(\n promisedHeader: string | null | undefined,\n body: string,\n format: 'csv' | 'json',\n): { promised: number; received: number; short: boolean } {\n const promised = Number(promisedHeader)\n let received: number\n if (format === 'csv') {\n received = countCsvDataRows(body)\n } else {\n try {\n const parsed = JSON.parse(body) as unknown\n received = Array.isArray(parsed) ? parsed.length : 0\n } catch {\n // A body that is not JSON at all did not arrive whole.\n return { promised, received: 0, short: true }\n }\n }\n return {\n promised,\n received,\n short: Number.isFinite(promised) && promisedHeader != null && received < promised,\n }\n}\n\n/** Rows (storage-form value maps) → CSV with a fieldId header row. */\nexport function datasetRecordsToCsv(\n model: DatasetModel,\n rows: Array<Record<string, unknown>>,\n): string {\n return [\n datasetCsvHeader(model),\n ...rows.map((row) => datasetCsvRow(model, row)),\n ].join('\\n')\n}\n\n/**\n * Minimal RFC-4180 CSV parser (quoted fields, escaped quotes, CRLF).\n *\n * The inverse of the escaper above, and the one parser in the repo — see the\n * module note for why the email list importer reaches this rather than\n * writing its own.\n *\n * A wholly blank row is dropped. Every spreadsheet writes a trailing newline\n * and a row of empty cells is not a record; carrying it through would give\n * every caller the same off-by-one to remember.\n */\nexport function parseCsv(text: string): string[][] {\n const rows: string[][] = []\n let row: string[] = []\n let cell = ''\n let quoted = false\n const source = String(text ?? '')\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index]\n if (quoted) {\n if (char === '\"') {\n if (source[index + 1] === '\"') {\n cell += '\"'\n index += 1\n } else {\n quoted = false\n }\n } else {\n cell += char\n }\n continue\n }\n if (char === '\"') {\n quoted = true\n } else if (char === ',') {\n row.push(cell)\n cell = ''\n } else if (char === '\\n' || char === '\\r') {\n if (char === '\\r' && source[index + 1] === '\\n') index += 1\n row.push(cell)\n cell = ''\n rows.push(row)\n row = []\n } else {\n cell += char\n }\n }\n if (cell !== '' || row.length) {\n row.push(cell)\n rows.push(row)\n }\n return rows.filter((cells) => cells.some((value) => value.trim() !== ''))\n}\n\n"],"names":["serializeDatasetValue","field","value","type","Number","isFinite","Date","toISOString","String","coordinates","latitude","longitude","Array","isArray","join","JSON","stringify","csvEscape","cell","test","replace","datasetCsvHeader","model","order","map","datasetCsvRow","row","fieldId","fields","datasetRecordToJson","Object","fromEntries","countCsvDataRows","text","source","rows","quoted","cellsSeen","index","length","char","Math","max","exportShortfall","promisedHeader","body","format","promised","received","parsed","parse","short","datasetRecordsToCsv","parseCsv","push","filter","cells","some","trim"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;CAyBC,GAKD,6DAA6D,GAC7D,OAAO,SAASA,sBACdC,KAA6B,EAC7BC,KAAc;IAEd,IAAIA,SAAS,MAAM,OAAO;IAC1B,OAAQD,MAAME,IAAI;QAChB,KAAK;YACH,OAAO,OAAOD,UAAU,YAAYE,OAAOC,QAAQ,CAACH,SAChD,IAAII,KAAKJ,OAAOK,WAAW,KAC3BC,OAAON;QACb,KAAK;YAAe;gBAClB,MAAMO,cAAcP;gBACpB,OAAOO,eACL,OAAOA,YAAYC,QAAQ,KAAK,YAChC,OAAOD,YAAYE,SAAS,KAAK,WAC/B,GAAGF,YAAYC,QAAQ,CAAC,EAAE,EAAED,YAAYE,SAAS,EAAE,GACnDH,OAAON;YACb;QACA,KAAK;QACL,KAAK;YACH,OAAOU,MAAMC,OAAO,CAACX,SAASA,MAAMY,IAAI,CAAC,QAAQN,OAAON;QAC1D,KAAK;YACH,IAAI;gBACF,OAAOa,KAAKC,SAAS,CAACd;YACxB,EAAE,eAAM;gBACN,OAAOM,OAAON;YAChB;QACF;YACE,OAAOM,OAAON;IAClB;AACF;AAEA,MAAMe,YAAY,CAACC,OACjB,WAAWC,IAAI,CAACD,QAAQ,CAAC,CAAC,EAAEA,KAAKE,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC,GAAGF;AAE5D;;;;;;;;;CASC,GACD,OAAO,SAASG,iBAAiBC,KAAmB;IAClD,OAAOA,MAAMC,KAAK,CAACC,GAAG,CAACP,WAAWH,IAAI,CAAC;AACzC;AAEA,sEAAsE,GACtE,OAAO,SAASW,cACdH,KAAmB,EACnBI,GAA4B;IAE5B,OAAOJ,MAAMC,KAAK,CACfC,GAAG,CAAC,CAACG;QACJ,MAAM1B,QAAQqB,MAAMM,MAAM,CAACD,QAAQ;QACnC,OAAOV,UAAUhB,QAAQD,sBAAsBC,OAAOyB,GAAG,CAACC,QAAQ,IAAI;IACxE,GACCb,IAAI,CAAC;AACV;AAEA,0EAA0E,GAC1E,OAAO,SAASe,oBACdP,KAAmB,EACnBI,GAA4B;IAE5B,OAAOI,OAAOC,WAAW,CACvBT,MAAMC,KAAK,CAACC,GAAG,CAAC,CAACG;QACf,MAAM1B,QAAQqB,MAAMM,MAAM,CAACD,QAAQ;QACnC,OAAO;YAACA;YAAS1B,QAAQD,sBAAsBC,OAAOyB,GAAG,CAACC,QAAQ,IAAI;SAAG;IAC3E;AAEJ;AAEA;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASK,iBAAiBC,IAAY;IAC3C,MAAMC,SAAS1B,OAAOyB,eAAAA,OAAQ;IAC9B,IAAI,CAACC,QAAQ,OAAO;IACpB,IAAIC,OAAO;IACX,IAAIC,SAAS;IACb,IAAIC,YAAY;IAChB,IAAK,IAAIC,QAAQ,GAAGA,QAAQJ,OAAOK,MAAM,EAAED,SAAS,EAAG;QACrD,MAAME,OAAON,MAAM,CAACI,MAAM;QAC1B,IAAIF,QAAQ;YACV,IAAII,SAAS,KAAK;gBAChB,IAAIN,MAAM,CAACI,QAAQ,EAAE,KAAK,KAAKA,SAAS;qBACnCF,SAAS;YAChB;YACAC,YAAY;YACZ;QACF;QACA,IAAIG,SAAS,KAAK;YAChBJ,SAAS;YACTC,YAAY;YACZ;QACF;QACA,IAAIG,SAAS,MAAM;YACjBL,QAAQ;YACRE,YAAY;YACZ;QACF;QACA,IAAIG,SAAS,MAAMH,YAAY;IACjC;IACA,+DAA+D;IAC/D,IAAIA,WAAWF,QAAQ;IACvB,0BAA0B;IAC1B,OAAOM,KAAKC,GAAG,CAAC,GAAGP,OAAO;AAC5B;AAEA;;;;;;;;;;;;;;CAcC,GACD,OAAO,SAASQ,gBACdC,cAAyC,EACzCC,IAAY,EACZC,MAAsB;IAEtB,MAAMC,WAAW3C,OAAOwC;IACxB,IAAII;IACJ,IAAIF,WAAW,OAAO;QACpBE,WAAWhB,iBAAiBa;IAC9B,OAAO;QACL,IAAI;YACF,MAAMI,SAASlC,KAAKmC,KAAK,CAACL;YAC1BG,WAAWpC,MAAMC,OAAO,CAACoC,UAAUA,OAAOV,MAAM,GAAG;QACrD,EAAE,eAAM;YACN,uDAAuD;YACvD,OAAO;gBAAEQ;gBAAUC,UAAU;gBAAGG,OAAO;YAAK;QAC9C;IACF;IACA,OAAO;QACLJ;QACAC;QACAG,OAAO/C,OAAOC,QAAQ,CAAC0C,aAAaH,kBAAkB,QAAQI,WAAWD;IAC3E;AACF;AAEA,oEAAoE,GACpE,OAAO,SAASK,oBACd9B,KAAmB,EACnBa,IAAoC;IAEpC,OAAO;QACLd,iBAAiBC;WACda,KAAKX,GAAG,CAAC,CAACE,MAAQD,cAAcH,OAAOI;KAC3C,CAACZ,IAAI,CAAC;AACT;AAEA;;;;;;;;;;CAUC,GACD,OAAO,SAASuC,SAASpB,IAAY;IACnC,MAAME,OAAmB,EAAE;IAC3B,IAAIT,MAAgB,EAAE;IACtB,IAAIR,OAAO;IACX,IAAIkB,SAAS;IACb,MAAMF,SAAS1B,OAAOyB,eAAAA,OAAQ;IAC9B,IAAK,IAAIK,QAAQ,GAAGA,QAAQJ,OAAOK,MAAM,EAAED,SAAS,EAAG;QACrD,MAAME,OAAON,MAAM,CAACI,MAAM;QAC1B,IAAIF,QAAQ;YACV,IAAII,SAAS,KAAK;gBAChB,IAAIN,MAAM,CAACI,QAAQ,EAAE,KAAK,KAAK;oBAC7BpB,QAAQ;oBACRoB,SAAS;gBACX,OAAO;oBACLF,SAAS;gBACX;YACF,OAAO;gBACLlB,QAAQsB;YACV;YACA;QACF;QACA,IAAIA,SAAS,KAAK;YAChBJ,SAAS;QACX,OAAO,IAAII,SAAS,KAAK;YACvBd,IAAI4B,IAAI,CAACpC;YACTA,OAAO;QACT,OAAO,IAAIsB,SAAS,QAAQA,SAAS,MAAM;YACzC,IAAIA,SAAS,QAAQN,MAAM,CAACI,QAAQ,EAAE,KAAK,MAAMA,SAAS;YAC1DZ,IAAI4B,IAAI,CAACpC;YACTA,OAAO;YACPiB,KAAKmB,IAAI,CAAC5B;YACVA,MAAM,EAAE;QACV,OAAO;YACLR,QAAQsB;QACV;IACF;IACA,IAAItB,SAAS,MAAMQ,IAAIa,MAAM,EAAE;QAC7Bb,IAAI4B,IAAI,CAACpC;QACTiB,KAAKmB,IAAI,CAAC5B;IACZ;IACA,OAAOS,KAAKoB,MAAM,CAAC,CAACC,QAAUA,MAAMC,IAAI,CAAC,CAACvD,QAAUA,MAAMwD,IAAI,OAAO;AACvE"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { type DatasetFieldEntry } from './datasets';
|
|
18
|
+
/**
|
|
19
|
+
* Dataset models (AGL-177): the runtime promotion of the type-level
|
|
20
|
+
* blueprint in `libs/shared/data/types/src/lib/dod.ts` (kept as the
|
|
21
|
+
* referenced design doc — this module is the single runtime source of
|
|
22
|
+
* truth). A model lives on the dataset doc
|
|
23
|
+
* (`orgs/{orgId}/datasets/{id}.model`) and drives the typed editor, import
|
|
24
|
+
* and site-restore validation, and the console and `/v1` record writes
|
|
25
|
+
* through the shared `validateDocument`/`coerceDocumentValues` pair so they
|
|
26
|
+
* can't disagree. Form submissions and automation steps write through
|
|
27
|
+
* `buildDatasetRecordValues` instead, which stores each value as text and
|
|
28
|
+
* validates nothing.
|
|
29
|
+
*
|
|
30
|
+
* Storage conventions (Firestore-safe): timestamps as epoch millis
|
|
31
|
+
* numbers, coordinates as `{ latitude, longitude }`, `sorted` as arrays,
|
|
32
|
+
* `map` as plain objects, references as target-document id strings.
|
|
33
|
+
*/
|
|
34
|
+
/** dod.ts `FT.Tag` vocabulary plus `reference` (AGL-180 builds on it). */
|
|
35
|
+
export type DatasetFieldType = 'bool' | 'bytes' | 'timestamp' | 'float' | 'int32' | 'int64' | 'nil' | 'text' | 'coordinates' | 'map' | 'sorted' | 'reference';
|
|
36
|
+
export declare const DATASET_FIELD_TYPES: DatasetFieldType[];
|
|
37
|
+
/** Display names, mirroring dod.ts `lbl`. */
|
|
38
|
+
export declare const DATASET_FIELD_TYPE_LABELS: Record<DatasetFieldType, string>;
|
|
39
|
+
/**
|
|
40
|
+
* Plain-JSON validation vocabulary (the dod.ts `Eval` shape, extended
|
|
41
|
+
* with min/max and options, serialized flat instead of enum-keyed).
|
|
42
|
+
*/
|
|
43
|
+
export interface DatasetFieldValidation {
|
|
44
|
+
required?: boolean;
|
|
45
|
+
/** Source of a RegExp applied to text values. */
|
|
46
|
+
regex?: string;
|
|
47
|
+
/** Numbers/timestamps: value bound. Text: length bound. */
|
|
48
|
+
min?: number;
|
|
49
|
+
max?: number;
|
|
50
|
+
/** Enum: value must be one of these (text fields). */
|
|
51
|
+
options?: string[];
|
|
52
|
+
}
|
|
53
|
+
export interface DatasetFieldDefinition {
|
|
54
|
+
/**
|
|
55
|
+
* Human-facing display label only. The stable reference id is the KEY in
|
|
56
|
+
* `DatasetModel.fields` (and `order`), NOT this name — bindings resolve
|
|
57
|
+
* `{{item.<fieldId>}}` against that key. The default id is derived from
|
|
58
|
+
* this name once at creation but is user-overridable (AGL-578); renaming
|
|
59
|
+
* the label afterwards never changes the id.
|
|
60
|
+
*/
|
|
61
|
+
name: string;
|
|
62
|
+
type: DatasetFieldType;
|
|
63
|
+
/**
|
|
64
|
+
* Plugin-declared custom type riding this base type (AGL-434) — see
|
|
65
|
+
* plugin-manager/custom-fields. Unknown names degrade to the base type.
|
|
66
|
+
*/
|
|
67
|
+
customType?: string;
|
|
68
|
+
description?: string;
|
|
69
|
+
required?: boolean;
|
|
70
|
+
/** Default applied by editors when creating documents; never coerced. */
|
|
71
|
+
default?: unknown;
|
|
72
|
+
validation?: DatasetFieldValidation;
|
|
73
|
+
/**
|
|
74
|
+
* Reference fields (AGL-180): target collection + display field id.
|
|
75
|
+
* `multiple` stores a `sorted` array of FKeys (small-cardinality
|
|
76
|
+
* many-to-many per the dod.ts guidance); `onDelete` is the referenced-
|
|
77
|
+
* document delete policy (default `setNull` — never cascade in v2).
|
|
78
|
+
*/
|
|
79
|
+
reference?: {
|
|
80
|
+
datasetId: string;
|
|
81
|
+
displayFieldId?: string;
|
|
82
|
+
multiple?: boolean;
|
|
83
|
+
onDelete?: 'restrict' | 'setNull';
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export interface DatasetModel {
|
|
87
|
+
fields: Record<string, DatasetFieldDefinition>;
|
|
88
|
+
/** Field ids in display order. */
|
|
89
|
+
order: string[];
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Migration shim (v1 → v2): datasets created before models carry flat
|
|
93
|
+
* `fields: string[]` — derive a model where every column is an optional
|
|
94
|
+
* text field whose id is the column name, so the editor and AGL-103
|
|
95
|
+
* bindings keep working on unmigrated docs during rollout.
|
|
96
|
+
*/
|
|
97
|
+
export declare function deriveModelFromFields(fields: string[]): DatasetModel;
|
|
98
|
+
/**
|
|
99
|
+
* Model from quick-creator entries (AGL-558): stable slug ids with the
|
|
100
|
+
* human display names preserved — "Roast preference" → id
|
|
101
|
+
* `roast_preference`, name "Roast preference".
|
|
102
|
+
*/
|
|
103
|
+
export declare function modelFromFieldEntries(entries: readonly DatasetFieldEntry[]): DatasetModel;
|
|
104
|
+
/** The dataset's model, deriving one from v1 `fields` when absent. */
|
|
105
|
+
export declare function effectiveDatasetModel(dataset: {
|
|
106
|
+
model?: DatasetModel;
|
|
107
|
+
fields?: string[];
|
|
108
|
+
}): DatasetModel;
|
|
109
|
+
/**
|
|
110
|
+
* Validates a document's values against a model, returning fieldId →
|
|
111
|
+
* human-readable error (empty object = valid). Values are expected in
|
|
112
|
+
* storage form (see the module doc); use `coerceDocumentValues` first
|
|
113
|
+
* when starting from user input strings.
|
|
114
|
+
*/
|
|
115
|
+
export declare function validateDocument(model: DatasetModel, values: Record<string, unknown>): Record<string, string>;
|
|
116
|
+
/** Storage value → grid display string (AGL-179). */
|
|
117
|
+
export declare function formatDatasetValue(field: DatasetFieldDefinition, value: unknown): string;
|
|
118
|
+
/**
|
|
119
|
+
* Storage value → form-input string (AGL-179): the inverse of
|
|
120
|
+
* `coerceDocumentValues` for populating type-appropriate inputs
|
|
121
|
+
* (timestamps as `datetime-local` values, coordinates as "lat, lon").
|
|
122
|
+
*/
|
|
123
|
+
export declare function datasetValueToInput(field: DatasetFieldDefinition, value: unknown): string;
|
|
124
|
+
/**
|
|
125
|
+
* Coerces user-input strings (form fields, CSV cells) into storage form
|
|
126
|
+
* per the field type. Unparseable input is passed through untouched so
|
|
127
|
+
* `validateDocument` reports it instead of silently mangling it.
|
|
128
|
+
*/
|
|
129
|
+
export declare function coerceDocumentValues(model: DatasetModel, input: Record<string, unknown>): Record<string, unknown>;
|
|
130
|
+
/**
|
|
131
|
+
* Every reference id a record holds, flattened out of its `reference` fields
|
|
132
|
+
* into one de-duplicated list.
|
|
133
|
+
*
|
|
134
|
+
* A reference field stores either a single target id or — when
|
|
135
|
+
* `reference.multiple` is set — an array of them, and a model may declare
|
|
136
|
+
* several. Both shapes flatten into the same list because the question asked
|
|
137
|
+
* of it is never "which field", it is "does this record still point at that
|
|
138
|
+
* document".
|
|
139
|
+
*
|
|
140
|
+
* Fields are read from `order` UNIONED with the keys of `fields`. Every other
|
|
141
|
+
* pass over a model walks `order` alone, which is right for anything the user
|
|
142
|
+
* sees — but a reference declared without a display slot still holds a real
|
|
143
|
+
* FKey, and an integrity index that skipped it would under-report.
|
|
144
|
+
*/
|
|
145
|
+
export declare function datasetReferencedIds(model: DatasetModel, values: Record<string, unknown> | undefined): string[];
|
|
146
|
+
/**
|
|
147
|
+
* The integrity index a record write carries, so referential integrity can be
|
|
148
|
+
* decided by a QUERY rather than by the rows a listener happened to fetch.
|
|
149
|
+
*
|
|
150
|
+
* Deleting a record has to answer "is anything still pointing at this?", and
|
|
151
|
+
* `restrict` refuses the delete on a yes while `setNull` strips the FKey. That
|
|
152
|
+
* question cannot be asked where the answer is stored: dataset fields are
|
|
153
|
+
* user-defined, so `records.values` carries a deliberate index exemption in
|
|
154
|
+
* `cloud/firebase-firestore.indexes.json` — auto-indexing an unbounded map
|
|
155
|
+
* blows Firestore's per-document index-entry limit — and
|
|
156
|
+
* `where('values.<fieldId>', '==', id)` is therefore FAILED_PRECONDITION.
|
|
157
|
+
* Reading a page of records and filtering them in the browser answers only for
|
|
158
|
+
* the rows in that page, which is a browse window standing in for a
|
|
159
|
+
* correctness check: a reference held outside it reads as no reference at all,
|
|
160
|
+
* the delete proceeds, and `restrict` silently fails to restrict.
|
|
161
|
+
*
|
|
162
|
+
* `referencedIds` is that same reference, denormalized to a top-level array
|
|
163
|
+
* Firestore will index, so one `array-contains` reaches every record.
|
|
164
|
+
*
|
|
165
|
+
* ⚠️ OMITTED when a record references nothing, rather than written as `[]`.
|
|
166
|
+
* `isNotEmpty` is served as `!= null` and an empty array is not null, so a
|
|
167
|
+
* record stamped `[]` answers "holds a reference" for a dataset that holds
|
|
168
|
+
* none.
|
|
169
|
+
*
|
|
170
|
+
* ⚠️ Spread this at EVERY write that sets a record's `values`. A write that
|
|
171
|
+
* sets values without it leaves the index describing the PREVIOUS values, and
|
|
172
|
+
* a stale integrity index is the exact failure it exists to prevent — with the
|
|
173
|
+
* UI reporting the record as safe to delete. On a merging write use
|
|
174
|
+
* `datasetIntegrityUpdate` instead: omission leaves a stale array in place
|
|
175
|
+
* where clearing the last reference has to remove the field.
|
|
176
|
+
*/
|
|
177
|
+
export declare function datasetIntegrityFields(model: DatasetModel, values: Record<string, unknown> | undefined): {
|
|
178
|
+
referencedIds?: string[];
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* `datasetIntegrityFields` for a MERGING write (`update`, `set` with `merge`
|
|
182
|
+
* or `mergeFields`), where leaving the field out preserves what is stored
|
|
183
|
+
* rather than clearing it.
|
|
184
|
+
*
|
|
185
|
+
* A record whose last reference is cleared has to have the field REMOVED, or
|
|
186
|
+
* it goes on answering the `array-contains` for a document it no longer points
|
|
187
|
+
* at — a `restrict` that refuses a delete nothing is holding. `clear` is the
|
|
188
|
+
* caller's delete sentinel: `deleteField()` in the web SDK,
|
|
189
|
+
* `FieldValue.delete()` in the Admin SDK. It is passed in rather than imported
|
|
190
|
+
* because this module is shared by both and must stay SDK-free.
|
|
191
|
+
*/
|
|
192
|
+
export declare function datasetIntegrityUpdate<TClear>(model: DatasetModel, values: Record<string, unknown> | undefined, clear: TClear): {
|
|
193
|
+
referencedIds: string[] | TClear;
|
|
194
|
+
};
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ import { validateCustomFieldValue } from "../plugin-manager/custom-fields.js";
|
|
17
|
+
import { humanizeDatasetFieldId } from "./datasets.js";
|
|
18
|
+
export const DATASET_FIELD_TYPES = [
|
|
19
|
+
'text',
|
|
20
|
+
'bool',
|
|
21
|
+
'int32',
|
|
22
|
+
'int64',
|
|
23
|
+
'float',
|
|
24
|
+
'timestamp',
|
|
25
|
+
'coordinates',
|
|
26
|
+
'map',
|
|
27
|
+
'sorted',
|
|
28
|
+
'bytes',
|
|
29
|
+
'nil',
|
|
30
|
+
'reference'
|
|
31
|
+
];
|
|
32
|
+
/** Display names, mirroring dod.ts `lbl`. */ export const DATASET_FIELD_TYPE_LABELS = {
|
|
33
|
+
text: 'Text',
|
|
34
|
+
bool: 'Boolean',
|
|
35
|
+
int32: 'Integer',
|
|
36
|
+
int64: 'Big integer',
|
|
37
|
+
float: 'Number',
|
|
38
|
+
timestamp: 'Date & time',
|
|
39
|
+
coordinates: 'Coordinates',
|
|
40
|
+
map: 'Map',
|
|
41
|
+
sorted: 'List',
|
|
42
|
+
bytes: 'Bytes',
|
|
43
|
+
nil: 'Null',
|
|
44
|
+
reference: 'Reference'
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Migration shim (v1 → v2): datasets created before models carry flat
|
|
48
|
+
* `fields: string[]` — derive a model where every column is an optional
|
|
49
|
+
* text field whose id is the column name, so the editor and AGL-103
|
|
50
|
+
* bindings keep working on unmigrated docs during rollout.
|
|
51
|
+
*/ export function deriveModelFromFields(fields) {
|
|
52
|
+
const model = {
|
|
53
|
+
fields: {},
|
|
54
|
+
order: []
|
|
55
|
+
};
|
|
56
|
+
for (const name of fields){
|
|
57
|
+
// Raw snake_case ids read as titles in table headers and pickers;
|
|
58
|
+
// the id stays the stable key (AGL-558).
|
|
59
|
+
model.fields[name] = {
|
|
60
|
+
name: humanizeDatasetFieldId(name),
|
|
61
|
+
type: 'text'
|
|
62
|
+
};
|
|
63
|
+
model.order.push(name);
|
|
64
|
+
}
|
|
65
|
+
return model;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Model from quick-creator entries (AGL-558): stable slug ids with the
|
|
69
|
+
* human display names preserved — "Roast preference" → id
|
|
70
|
+
* `roast_preference`, name "Roast preference".
|
|
71
|
+
*/ export function modelFromFieldEntries(entries) {
|
|
72
|
+
const model = {
|
|
73
|
+
fields: {},
|
|
74
|
+
order: []
|
|
75
|
+
};
|
|
76
|
+
for (const entry of entries){
|
|
77
|
+
model.fields[entry.id] = {
|
|
78
|
+
name: entry.name,
|
|
79
|
+
type: 'text'
|
|
80
|
+
};
|
|
81
|
+
model.order.push(entry.id);
|
|
82
|
+
}
|
|
83
|
+
return model;
|
|
84
|
+
}
|
|
85
|
+
/** The dataset's model, deriving one from v1 `fields` when absent. */ export function effectiveDatasetModel(dataset) {
|
|
86
|
+
var _dataset_fields;
|
|
87
|
+
var _dataset_model, _dataset_model_order;
|
|
88
|
+
if (((_dataset_model = dataset.model) == null ? void 0 : _dataset_model.fields) && ((_dataset_model_order = dataset.model.order) == null ? void 0 : _dataset_model_order.length)) {
|
|
89
|
+
return dataset.model;
|
|
90
|
+
}
|
|
91
|
+
return deriveModelFromFields((_dataset_fields = dataset.fields) != null ? _dataset_fields : []);
|
|
92
|
+
}
|
|
93
|
+
const isFiniteNumber = (value)=>typeof value === 'number' && Number.isFinite(value);
|
|
94
|
+
/**
|
|
95
|
+
* Validates a document's values against a model, returning fieldId →
|
|
96
|
+
* human-readable error (empty object = valid). Values are expected in
|
|
97
|
+
* storage form (see the module doc); use `coerceDocumentValues` first
|
|
98
|
+
* when starting from user input strings.
|
|
99
|
+
*/ export function validateDocument(model, values) {
|
|
100
|
+
const errors = {};
|
|
101
|
+
for (const fieldId of model.order){
|
|
102
|
+
var _field_validation;
|
|
103
|
+
var _field_validation1;
|
|
104
|
+
const field = model.fields[fieldId];
|
|
105
|
+
if (!field) continue;
|
|
106
|
+
const value = values[fieldId];
|
|
107
|
+
const required = field.required || ((_field_validation1 = field.validation) == null ? void 0 : _field_validation1.required);
|
|
108
|
+
if (value == null || value === '') {
|
|
109
|
+
if (required) errors[fieldId] = `${field.name} is required`;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const rules = (_field_validation = field.validation) != null ? _field_validation : {};
|
|
113
|
+
switch(field.type){
|
|
114
|
+
case 'text':
|
|
115
|
+
{
|
|
116
|
+
var _rules_options;
|
|
117
|
+
if (typeof value !== 'string') {
|
|
118
|
+
errors[fieldId] = `${field.name} must be text`;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
if (rules.min != null && value.length < rules.min) {
|
|
122
|
+
errors[fieldId] = `${field.name} must be at least ${rules.min} characters`;
|
|
123
|
+
} else if (rules.max != null && value.length > rules.max) {
|
|
124
|
+
errors[fieldId] = `${field.name} must be at most ${rules.max} characters`;
|
|
125
|
+
} else if (rules.regex) {
|
|
126
|
+
try {
|
|
127
|
+
if (!new RegExp(rules.regex).test(value)) {
|
|
128
|
+
errors[fieldId] = `${field.name} has an invalid format`;
|
|
129
|
+
}
|
|
130
|
+
} catch (unused) {
|
|
131
|
+
// Broken pattern in the model never blocks writes.
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (!errors[fieldId] && ((_rules_options = rules.options) == null ? void 0 : _rules_options.length) && !rules.options.includes(value)) {
|
|
135
|
+
errors[fieldId] = `${field.name} must be one of: ${rules.options.join(', ')}`;
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case 'bool':
|
|
140
|
+
if (typeof value !== 'boolean') {
|
|
141
|
+
errors[fieldId] = `${field.name} must be true or false`;
|
|
142
|
+
}
|
|
143
|
+
break;
|
|
144
|
+
case 'int32':
|
|
145
|
+
case 'int64':
|
|
146
|
+
if (!isFiniteNumber(value) || !Number.isInteger(value)) {
|
|
147
|
+
errors[fieldId] = `${field.name} must be a whole number`;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
if (rules.min != null && value < rules.min) {
|
|
151
|
+
errors[fieldId] = `${field.name} must be ≥ ${rules.min}`;
|
|
152
|
+
} else if (rules.max != null && value > rules.max) {
|
|
153
|
+
errors[fieldId] = `${field.name} must be ≤ ${rules.max}`;
|
|
154
|
+
}
|
|
155
|
+
break;
|
|
156
|
+
case 'float':
|
|
157
|
+
case 'timestamp':
|
|
158
|
+
if (!isFiniteNumber(value)) {
|
|
159
|
+
errors[fieldId] = field.type === 'timestamp' ? `${field.name} must be a date` : `${field.name} must be a number`;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
if (rules.min != null && value < rules.min) {
|
|
163
|
+
errors[fieldId] = `${field.name} must be ≥ ${rules.min}`;
|
|
164
|
+
} else if (rules.max != null && value > rules.max) {
|
|
165
|
+
errors[fieldId] = `${field.name} must be ≤ ${rules.max}`;
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
case 'coordinates':
|
|
169
|
+
{
|
|
170
|
+
const coordinates = value;
|
|
171
|
+
if (!isFiniteNumber(coordinates == null ? void 0 : coordinates.latitude) || !isFiniteNumber(coordinates == null ? void 0 : coordinates.longitude) || Math.abs(coordinates.latitude) > 90 || Math.abs(coordinates.longitude) > 180) {
|
|
172
|
+
errors[fieldId] = `${field.name} must be valid coordinates`;
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
case 'sorted':
|
|
177
|
+
if (!Array.isArray(value)) {
|
|
178
|
+
errors[fieldId] = `${field.name} must be a list`;
|
|
179
|
+
}
|
|
180
|
+
break;
|
|
181
|
+
case 'map':
|
|
182
|
+
if (typeof value !== 'object' || Array.isArray(value)) {
|
|
183
|
+
errors[fieldId] = `${field.name} must be a map`;
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
case 'reference':
|
|
187
|
+
var _field_reference;
|
|
188
|
+
if ((_field_reference = field.reference) == null ? void 0 : _field_reference.multiple) {
|
|
189
|
+
if (!Array.isArray(value) || value.some((entry)=>typeof entry !== 'string' || !entry)) {
|
|
190
|
+
errors[fieldId] = `${field.name} must reference documents`;
|
|
191
|
+
}
|
|
192
|
+
} else if (typeof value !== 'string' || !value) {
|
|
193
|
+
errors[fieldId] = `${field.name} must reference a document`;
|
|
194
|
+
}
|
|
195
|
+
break;
|
|
196
|
+
case 'bytes':
|
|
197
|
+
case 'nil':
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Custom field types (AGL-434): plugin validators run after the base
|
|
202
|
+
// checks, only on fields that passed them.
|
|
203
|
+
for (const fieldId of model.order){
|
|
204
|
+
const field = model.fields[fieldId];
|
|
205
|
+
if (!(field == null ? void 0 : field.customType) || errors[fieldId]) continue;
|
|
206
|
+
const customError = validateCustomFieldValue(field.customType, values[fieldId]);
|
|
207
|
+
if (customError) errors[fieldId] = `${field.name}: ${customError}`;
|
|
208
|
+
}
|
|
209
|
+
return errors;
|
|
210
|
+
}
|
|
211
|
+
/** Storage value → grid display string (AGL-179). */ export function formatDatasetValue(field, value) {
|
|
212
|
+
if (value == null || value === '') return '';
|
|
213
|
+
switch(field.type){
|
|
214
|
+
case 'bool':
|
|
215
|
+
return value === true ? '✓' : value === false ? '—' : String(value);
|
|
216
|
+
case 'timestamp':
|
|
217
|
+
return isFiniteNumber(value) ? new Date(value).toISOString().slice(0, 16).replace('T', ' ') : String(value);
|
|
218
|
+
case 'coordinates':
|
|
219
|
+
{
|
|
220
|
+
const coordinates = value;
|
|
221
|
+
return isFiniteNumber(coordinates == null ? void 0 : coordinates.latitude) && isFiniteNumber(coordinates == null ? void 0 : coordinates.longitude) ? `${coordinates.latitude}, ${coordinates.longitude}` : String(value);
|
|
222
|
+
}
|
|
223
|
+
case 'sorted':
|
|
224
|
+
return Array.isArray(value) ? value.join(', ') : String(value);
|
|
225
|
+
case 'map':
|
|
226
|
+
try {
|
|
227
|
+
return JSON.stringify(value);
|
|
228
|
+
} catch (unused) {
|
|
229
|
+
return String(value);
|
|
230
|
+
}
|
|
231
|
+
default:
|
|
232
|
+
return String(value);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Storage value → form-input string (AGL-179): the inverse of
|
|
237
|
+
* `coerceDocumentValues` for populating type-appropriate inputs
|
|
238
|
+
* (timestamps as `datetime-local` values, coordinates as "lat, lon").
|
|
239
|
+
*/ export function datasetValueToInput(field, value) {
|
|
240
|
+
if (value == null) return '';
|
|
241
|
+
if (field.type === 'timestamp' && isFiniteNumber(value)) {
|
|
242
|
+
return new Date(value).toISOString().slice(0, 16);
|
|
243
|
+
}
|
|
244
|
+
if (field.type === 'bool') {
|
|
245
|
+
return value === true ? 'true' : value === false ? 'false' : String(value);
|
|
246
|
+
}
|
|
247
|
+
if (field.type === 'coordinates' || field.type === 'sorted') {
|
|
248
|
+
return formatDatasetValue(field, value);
|
|
249
|
+
}
|
|
250
|
+
if (field.type === 'map') return formatDatasetValue(field, value);
|
|
251
|
+
return String(value);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Coerces user-input strings (form fields, CSV cells) into storage form
|
|
255
|
+
* per the field type. Unparseable input is passed through untouched so
|
|
256
|
+
* `validateDocument` reports it instead of silently mangling it.
|
|
257
|
+
*/ export function coerceDocumentValues(model, input) {
|
|
258
|
+
const values = {};
|
|
259
|
+
for (const fieldId of model.order){
|
|
260
|
+
const field = model.fields[fieldId];
|
|
261
|
+
const raw = input[fieldId];
|
|
262
|
+
if (!field || raw == null || raw === '') continue;
|
|
263
|
+
if (typeof raw !== 'string') {
|
|
264
|
+
values[fieldId] = raw;
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
switch(field.type){
|
|
268
|
+
case 'bool':
|
|
269
|
+
values[fieldId] = raw === 'true' ? true : raw === 'false' ? false : raw;
|
|
270
|
+
break;
|
|
271
|
+
case 'int32':
|
|
272
|
+
case 'int64':
|
|
273
|
+
{
|
|
274
|
+
const parsed = Number(raw);
|
|
275
|
+
values[fieldId] = Number.isInteger(parsed) ? parsed : raw;
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
case 'float':
|
|
279
|
+
{
|
|
280
|
+
const parsed = Number(raw);
|
|
281
|
+
values[fieldId] = Number.isFinite(parsed) ? parsed : raw;
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
case 'timestamp':
|
|
285
|
+
{
|
|
286
|
+
const millis = Date.parse(raw);
|
|
287
|
+
values[fieldId] = Number.isFinite(millis) ? millis : raw;
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
case 'coordinates':
|
|
291
|
+
{
|
|
292
|
+
const [latitude, longitude] = raw.split(',').map((part)=>Number(part.trim()));
|
|
293
|
+
values[fieldId] = Number.isFinite(latitude) && Number.isFinite(longitude) ? {
|
|
294
|
+
latitude,
|
|
295
|
+
longitude
|
|
296
|
+
} : raw;
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
case 'sorted':
|
|
300
|
+
values[fieldId] = raw.split(',').map((part)=>part.trim()).filter(Boolean);
|
|
301
|
+
break;
|
|
302
|
+
case 'map':
|
|
303
|
+
try {
|
|
304
|
+
values[fieldId] = JSON.parse(raw);
|
|
305
|
+
} catch (unused) {
|
|
306
|
+
values[fieldId] = raw;
|
|
307
|
+
}
|
|
308
|
+
break;
|
|
309
|
+
case 'reference':
|
|
310
|
+
var _field_reference;
|
|
311
|
+
values[fieldId] = ((_field_reference = field.reference) == null ? void 0 : _field_reference.multiple) ? raw.split(',').map((part)=>part.trim()).filter(Boolean) : raw;
|
|
312
|
+
break;
|
|
313
|
+
default:
|
|
314
|
+
values[fieldId] = raw;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return values;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Every reference id a record holds, flattened out of its `reference` fields
|
|
321
|
+
* into one de-duplicated list.
|
|
322
|
+
*
|
|
323
|
+
* A reference field stores either a single target id or — when
|
|
324
|
+
* `reference.multiple` is set — an array of them, and a model may declare
|
|
325
|
+
* several. Both shapes flatten into the same list because the question asked
|
|
326
|
+
* of it is never "which field", it is "does this record still point at that
|
|
327
|
+
* document".
|
|
328
|
+
*
|
|
329
|
+
* Fields are read from `order` UNIONED with the keys of `fields`. Every other
|
|
330
|
+
* pass over a model walks `order` alone, which is right for anything the user
|
|
331
|
+
* sees — but a reference declared without a display slot still holds a real
|
|
332
|
+
* FKey, and an integrity index that skipped it would under-report.
|
|
333
|
+
*/ export function datasetReferencedIds(model, values) {
|
|
334
|
+
var _model_order, _model_fields;
|
|
335
|
+
const ids = new Set();
|
|
336
|
+
const fieldIds = new Set([
|
|
337
|
+
...(_model_order = model.order) != null ? _model_order : [],
|
|
338
|
+
...Object.keys((_model_fields = model.fields) != null ? _model_fields : {})
|
|
339
|
+
]);
|
|
340
|
+
for (const fieldId of fieldIds){
|
|
341
|
+
var _model_fields_fieldId, _model_fields1;
|
|
342
|
+
if (((_model_fields1 = model.fields) == null ? void 0 : (_model_fields_fieldId = _model_fields1[fieldId]) == null ? void 0 : _model_fields_fieldId.type) !== 'reference') continue;
|
|
343
|
+
const stored = values == null ? void 0 : values[fieldId];
|
|
344
|
+
for (const entry of Array.isArray(stored) ? stored : [
|
|
345
|
+
stored
|
|
346
|
+
]){
|
|
347
|
+
const id = typeof entry === 'string' ? entry.trim() : '';
|
|
348
|
+
if (id) ids.add(id);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return [
|
|
352
|
+
...ids
|
|
353
|
+
];
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* The integrity index a record write carries, so referential integrity can be
|
|
357
|
+
* decided by a QUERY rather than by the rows a listener happened to fetch.
|
|
358
|
+
*
|
|
359
|
+
* Deleting a record has to answer "is anything still pointing at this?", and
|
|
360
|
+
* `restrict` refuses the delete on a yes while `setNull` strips the FKey. That
|
|
361
|
+
* question cannot be asked where the answer is stored: dataset fields are
|
|
362
|
+
* user-defined, so `records.values` carries a deliberate index exemption in
|
|
363
|
+
* `cloud/firebase-firestore.indexes.json` — auto-indexing an unbounded map
|
|
364
|
+
* blows Firestore's per-document index-entry limit — and
|
|
365
|
+
* `where('values.<fieldId>', '==', id)` is therefore FAILED_PRECONDITION.
|
|
366
|
+
* Reading a page of records and filtering them in the browser answers only for
|
|
367
|
+
* the rows in that page, which is a browse window standing in for a
|
|
368
|
+
* correctness check: a reference held outside it reads as no reference at all,
|
|
369
|
+
* the delete proceeds, and `restrict` silently fails to restrict.
|
|
370
|
+
*
|
|
371
|
+
* `referencedIds` is that same reference, denormalized to a top-level array
|
|
372
|
+
* Firestore will index, so one `array-contains` reaches every record.
|
|
373
|
+
*
|
|
374
|
+
* ⚠️ OMITTED when a record references nothing, rather than written as `[]`.
|
|
375
|
+
* `isNotEmpty` is served as `!= null` and an empty array is not null, so a
|
|
376
|
+
* record stamped `[]` answers "holds a reference" for a dataset that holds
|
|
377
|
+
* none.
|
|
378
|
+
*
|
|
379
|
+
* ⚠️ Spread this at EVERY write that sets a record's `values`. A write that
|
|
380
|
+
* sets values without it leaves the index describing the PREVIOUS values, and
|
|
381
|
+
* a stale integrity index is the exact failure it exists to prevent — with the
|
|
382
|
+
* UI reporting the record as safe to delete. On a merging write use
|
|
383
|
+
* `datasetIntegrityUpdate` instead: omission leaves a stale array in place
|
|
384
|
+
* where clearing the last reference has to remove the field.
|
|
385
|
+
*/ export function datasetIntegrityFields(model, values) {
|
|
386
|
+
const referencedIds = datasetReferencedIds(model, values);
|
|
387
|
+
return referencedIds.length ? {
|
|
388
|
+
referencedIds
|
|
389
|
+
} : {};
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* `datasetIntegrityFields` for a MERGING write (`update`, `set` with `merge`
|
|
393
|
+
* or `mergeFields`), where leaving the field out preserves what is stored
|
|
394
|
+
* rather than clearing it.
|
|
395
|
+
*
|
|
396
|
+
* A record whose last reference is cleared has to have the field REMOVED, or
|
|
397
|
+
* it goes on answering the `array-contains` for a document it no longer points
|
|
398
|
+
* at — a `restrict` that refuses a delete nothing is holding. `clear` is the
|
|
399
|
+
* caller's delete sentinel: `deleteField()` in the web SDK,
|
|
400
|
+
* `FieldValue.delete()` in the Admin SDK. It is passed in rather than imported
|
|
401
|
+
* because this module is shared by both and must stay SDK-free.
|
|
402
|
+
*/ export function datasetIntegrityUpdate(model, values, clear) {
|
|
403
|
+
const referencedIds = datasetReferencedIds(model, values);
|
|
404
|
+
return {
|
|
405
|
+
referencedIds: referencedIds.length ? referencedIds : clear
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
//# sourceMappingURL=dataset-models.js.map
|