@svgrid/enterprise 2.5.2 → 2.6.0
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/dist/SvAlertRuleEditor.svelte.d.ts +13 -0
- package/dist/SvAlertsManager.svelte.d.ts +14 -0
- package/dist/SvAlertsPanel.svelte.d.ts +9 -0
- package/dist/SvAuthGate.svelte.d.ts +22 -0
- package/dist/SvBoard.svelte.d.ts +35 -0
- package/dist/SvExportMenu.svelte.d.ts +61 -0
- package/dist/SvExpressionEditor.svelte.d.ts +12 -0
- package/dist/SvFileInput.svelte.d.ts +20 -0
- package/dist/SvGridAlerts.svelte.d.ts +77 -0
- package/dist/SvGridBoard.svelte.d.ts +30 -0
- package/dist/SvGridEditPanel.svelte.d.ts +73 -0
- package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
- package/dist/SvGridScheduler.svelte.d.ts +30 -0
- package/dist/SvImportDialog.svelte.d.ts +88 -0
- package/dist/SvLookupInput.svelte.d.ts +21 -0
- package/dist/SvPivotDesigner.svelte.d.ts +176 -0
- package/dist/SvRecordDetail.svelte.d.ts +58 -0
- package/dist/SvSchedule.svelte.d.ts +29 -0
- package/dist/SvSchemaChart.svelte.d.ts +61 -0
- package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
- package/dist/alerts/alert-engine-attach.d.ts +79 -0
- package/dist/alerts/alert-engine-attach.js +106 -0
- package/dist/alerts/alert-engine.d.ts +42 -0
- package/dist/alerts/alert-engine.js +196 -0
- package/dist/alerts/alert-formats.d.ts +26 -0
- package/dist/alerts/alert-formats.js +58 -0
- package/dist/alerts/alert-observer.d.ts +54 -0
- package/dist/alerts/alert-observer.js +156 -0
- package/dist/alerts/alert-scheduler.d.ts +30 -0
- package/dist/alerts/alert-scheduler.js +54 -0
- package/dist/alerts/alert-storage.d.ts +31 -0
- package/dist/alerts/alert-storage.js +92 -0
- package/dist/alerts/alert-store.svelte.d.ts +24 -0
- package/dist/alerts/alert-store.svelte.js +69 -0
- package/dist/alerts/alert-types.d.ts +86 -0
- package/dist/alerts/alert-types.js +1 -0
- package/dist/alerts.d.ts +2 -0
- package/{src/alerts.ts → dist/alerts.js} +9 -9
- package/dist/board.d.ts +7 -0
- package/{src/board.ts → dist/board.js} +13 -14
- package/dist/cdn/svgrid-enterprise.svelte-external.js +2987 -2981
- package/dist/designer/assets/{index-CM5xvaOy.js → index-BF0UH638.js} +3 -3
- package/dist/designer/assets/{src-D-ET9Mmo.js → src-BPJruwB9.js} +184 -184
- package/dist/designer/index.html +2 -2
- package/dist/edit-panel.d.ts +105 -0
- package/dist/edit-panel.js +350 -0
- package/dist/export-conditional.d.ts +31 -0
- package/dist/export-conditional.js +65 -0
- package/dist/export-ooxml.d.ts +93 -0
- package/dist/export-ooxml.js +385 -0
- package/dist/export-pdf.d.ts +107 -0
- package/dist/export-pdf.js +144 -0
- package/dist/export-print.d.ts +55 -0
- package/dist/export-print.js +91 -0
- package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
- package/dist/export-serialize.js +11 -0
- package/dist/export-xls.d.ts +26 -0
- package/dist/export-xls.js +157 -0
- package/dist/export.d.ts +323 -0
- package/dist/export.js +1021 -0
- package/dist/expressions/evaluate.d.ts +17 -0
- package/dist/expressions/evaluate.js +214 -0
- package/dist/expressions/expression-columns.d.ts +61 -0
- package/dist/expressions/expression-columns.js +72 -0
- package/dist/expressions/expression-types.d.ts +125 -0
- package/dist/expressions/expression-types.js +1 -0
- package/dist/expressions/parse.d.ts +25 -0
- package/dist/expressions/parse.js +537 -0
- package/dist/import.d.ts +232 -0
- package/dist/import.js +846 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.js +91 -0
- package/dist/install.d.ts +70 -0
- package/dist/install.js +61 -0
- package/dist/license-core.d.ts +37 -0
- package/dist/license-core.js +81 -0
- package/dist/license.d.ts +30 -0
- package/dist/license.js +139 -0
- package/dist/master-detail.d.ts +23 -0
- package/dist/master-detail.js +35 -0
- package/dist/node/studio.js +1 -1
- package/dist/pivot-chart.d.ts +28 -0
- package/dist/pivot-chart.js +71 -0
- package/dist/pivot-designer.d.ts +69 -0
- package/dist/pivot-designer.js +38 -0
- package/dist/pivot-enable.d.ts +6 -0
- package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
- package/dist/pivot.d.ts +111 -0
- package/dist/pivot.js +353 -0
- package/dist/print.d.ts +33 -0
- package/dist/print.js +61 -0
- package/dist/revoked.d.ts +1 -0
- package/{src/revoked.ts → dist/revoked.js} +5 -6
- package/dist/scheduler-assignments.d.ts +64 -0
- package/dist/scheduler-assignments.js +92 -0
- package/dist/scheduler-axis.d.ts +81 -0
- package/dist/scheduler-axis.js +180 -0
- package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
- package/dist/scheduler-booking.js +50 -0
- package/dist/scheduler-config.d.ts +177 -0
- package/dist/scheduler-config.js +1 -0
- package/dist/scheduler-dependencies.d.ts +89 -0
- package/dist/scheduler-dependencies.js +179 -0
- package/dist/scheduler-freebusy.d.ts +19 -0
- package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
- package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
- package/dist/scheduler-heatmap.js +41 -0
- package/dist/scheduler-resource-tree.d.ts +48 -0
- package/dist/scheduler-resource-tree.js +78 -0
- package/dist/scheduler-slots.d.ts +37 -0
- package/dist/scheduler-slots.js +80 -0
- package/dist/scheduler-summary.d.ts +41 -0
- package/dist/scheduler-summary.js +54 -0
- package/dist/scheduler.d.ts +7 -0
- package/{src/scheduler.ts → dist/scheduler.js} +13 -14
- package/dist/scheduling.d.ts +132 -0
- package/dist/scheduling.js +228 -0
- package/dist/schema-designer.d.ts +42 -0
- package/dist/schema-designer.js +117 -0
- package/dist/schema.d.ts +369 -0
- package/dist/schema.js +216 -0
- package/dist/smart-shim.d.ts +62 -0
- package/dist/smart-shim.js +34 -0
- package/dist/sources/aggregate.d.ts +43 -0
- package/dist/sources/aggregate.js +60 -0
- package/dist/sources/auth-supabase.d.ts +69 -0
- package/dist/sources/auth-supabase.js +39 -0
- package/dist/sources/dashboard.d.ts +65 -0
- package/dist/sources/dashboard.js +95 -0
- package/dist/sources/field-inference.d.ts +23 -0
- package/dist/sources/field-inference.js +52 -0
- package/dist/sources/filters.d.ts +35 -0
- package/dist/sources/filters.js +52 -0
- package/dist/sources/index.d.ts +18 -0
- package/dist/sources/index.js +18 -0
- package/dist/sources/introspect-supabase.d.ts +30 -0
- package/dist/sources/introspect-supabase.js +134 -0
- package/dist/sources/realtime-supabase.d.ts +37 -0
- package/dist/sources/realtime-supabase.js +52 -0
- package/dist/sources/relation-lookup.d.ts +50 -0
- package/dist/sources/relation-lookup.js +77 -0
- package/dist/sources/rest-adapters.d.ts +48 -0
- package/dist/sources/rest-adapters.js +85 -0
- package/dist/sources/rest.d.ts +38 -0
- package/dist/sources/rest.js +86 -0
- package/dist/sources/schema-from-columns.d.ts +37 -0
- package/dist/sources/schema-from-columns.js +48 -0
- package/dist/sources/supabase.d.ts +33 -0
- package/dist/sources/supabase.js +74 -0
- package/dist/sources/with-entity-rules.d.ts +25 -0
- package/dist/sources/with-entity-rules.js +47 -0
- package/dist/sources/with-relation-labels.d.ts +26 -0
- package/dist/sources/with-relation-labels.js +38 -0
- package/dist/staged-editing.d.ts +85 -0
- package/dist/staged-editing.js +0 -0
- package/dist/studio/bug-report.d.ts +61 -0
- package/dist/studio/bug-report.js +126 -0
- package/dist/studio/cli.d.ts +56 -0
- package/dist/studio/cli.js +70 -0
- package/dist/studio/copilot-core.d.ts +22 -0
- package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
- package/dist/studio/csv.d.ts +36 -0
- package/dist/studio/csv.js +173 -0
- package/dist/studio/db-connect-string.d.ts +45 -0
- package/dist/studio/db-connect-string.js +113 -0
- package/dist/studio/deploy-cli.d.ts +35 -0
- package/dist/studio/deploy-cli.js +81 -0
- package/dist/studio/emit-project.d.ts +77 -0
- package/dist/studio/emit-project.js +5389 -0
- package/dist/studio/emit-schema.d.ts +110 -0
- package/dist/studio/emit-schema.js +1128 -0
- package/dist/studio/index.d.ts +35 -0
- package/dist/studio/index.js +38 -0
- package/dist/studio/init-flow.d.ts +58 -0
- package/dist/studio/init-flow.js +451 -0
- package/dist/studio/introspect-db.d.ts +47 -0
- package/dist/studio/introspect-db.js +255 -0
- package/dist/studio/introspect-openapi.d.ts +19 -0
- package/dist/studio/introspect-openapi.js +244 -0
- package/dist/studio/introspect-prisma.d.ts +25 -0
- package/dist/studio/introspect-prisma.js +164 -0
- package/dist/studio/introspect.d.ts +35 -0
- package/dist/studio/introspect.js +306 -0
- package/dist/studio/project.d.ts +1327 -0
- package/dist/studio/project.js +1798 -0
- package/dist/studio/sample-data.d.ts +19 -0
- package/dist/studio/sample-data.js +207 -0
- package/dist/studio/samples/ats.d.ts +2 -0
- package/dist/studio/samples/ats.js +194 -0
- package/dist/studio/samples/clinic.d.ts +2 -0
- package/dist/studio/samples/clinic.js +171 -0
- package/dist/studio/samples/crm.d.ts +2 -0
- package/dist/studio/samples/crm.js +280 -0
- package/dist/studio/samples/datasets.d.ts +38 -0
- package/dist/studio/samples/datasets.js +296 -0
- package/dist/studio/samples/ecommerce.d.ts +2 -0
- package/dist/studio/samples/ecommerce.js +178 -0
- package/dist/studio/samples/events.d.ts +2 -0
- package/dist/studio/samples/events.js +192 -0
- package/dist/studio/samples/fleet.d.ts +2 -0
- package/dist/studio/samples/fleet.js +203 -0
- package/dist/studio/samples/gym.d.ts +2 -0
- package/dist/studio/samples/gym.js +205 -0
- package/dist/studio/samples/hr.d.ts +2 -0
- package/dist/studio/samples/hr.js +186 -0
- package/dist/studio/samples/index.d.ts +13 -0
- package/dist/studio/samples/index.js +44 -0
- package/dist/studio/samples/insurance.d.ts +2 -0
- package/dist/studio/samples/insurance.js +220 -0
- package/dist/studio/samples/inventory.d.ts +2 -0
- package/dist/studio/samples/inventory.js +204 -0
- package/dist/studio/samples/invoicing.d.ts +2 -0
- package/dist/studio/samples/invoicing.js +154 -0
- package/dist/studio/samples/library.d.ts +2 -0
- package/dist/studio/samples/library.js +171 -0
- package/dist/studio/samples/live-data.d.ts +5 -0
- package/dist/studio/samples/live-data.js +261 -0
- package/dist/studio/samples/projects.d.ts +2 -0
- package/dist/studio/samples/projects.js +203 -0
- package/dist/studio/samples/realestate.d.ts +2 -0
- package/dist/studio/samples/realestate.js +187 -0
- package/dist/studio/samples/restaurant.d.ts +2 -0
- package/dist/studio/samples/restaurant.js +180 -0
- package/dist/studio/samples/school.d.ts +2 -0
- package/dist/studio/samples/school.js +188 -0
- package/dist/studio/samples/shared.d.ts +142 -0
- package/dist/studio/samples/shared.js +164 -0
- package/dist/studio/samples/starter.d.ts +4 -0
- package/dist/studio/samples/starter.js +237 -0
- package/dist/studio/samples/subscriptions.d.ts +2 -0
- package/dist/studio/samples/subscriptions.js +175 -0
- package/dist/studio/samples/support.d.ts +2 -0
- package/dist/studio/samples/support.js +209 -0
- package/dist/studio/scaffold-app.d.ts +22 -0
- package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
- package/dist/studio/scaffold.d.ts +63 -0
- package/dist/studio/scaffold.js +346 -0
- package/dist/studio/screen-suites.d.ts +193 -0
- package/dist/studio/screen-suites.js +297 -0
- package/dist/studio/themes.d.ts +34 -0
- package/dist/studio/themes.js +41 -0
- package/dist/studio/ui-components.d.ts +89 -0
- package/dist/studio/ui-components.generated.d.ts +29 -0
- package/dist/studio/ui-components.generated.js +7139 -0
- package/dist/studio/ui-components.js +673 -0
- package/dist/studio/user-error.d.ts +23 -0
- package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
- package/dist/studio/verify.d.ts +34 -0
- package/dist/studio/verify.js +47 -0
- package/dist/sveltekit/in-memory.d.ts +14 -0
- package/dist/sveltekit/in-memory.js +113 -0
- package/dist/sveltekit/index.d.ts +6 -0
- package/dist/sveltekit/index.js +5 -0
- package/dist/sveltekit/query-plan.d.ts +44 -0
- package/dist/sveltekit/query-plan.js +76 -0
- package/dist/sveltekit/sql-source.d.ts +47 -0
- package/dist/sveltekit/sql-source.js +106 -0
- package/dist/sveltekit/sql.d.ts +48 -0
- package/dist/sveltekit/sql.js +73 -0
- package/dist/sveltekit/transport.d.ts +209 -0
- package/dist/sveltekit/transport.js +219 -0
- package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
- package/dist/sveltekit/types.js +1 -0
- package/dist/upgrade-prompt.d.ts +16 -0
- package/dist/upgrade-prompt.js +141 -0
- package/dist/version.d.ts +13 -0
- package/{src/version.ts → dist/version.js} +1 -1
- package/dist/watermark.d.ts +2 -0
- package/dist/watermark.js +146 -0
- package/package.json +26 -24
- package/src/SvBoard.dom.test.ts +0 -67
- package/src/SvGridAlerts.dom.test.ts +0 -113
- package/src/SvGridEditPanel.dom.test.ts +0 -320
- package/src/SvRecordDetail.dom.test.ts +0 -137
- package/src/SvSchedule.dom.test.ts +0 -57
- package/src/ai-export-pdf.dom.test.ts +0 -77
- package/src/ai-export-xlsx.dom.test.ts +0 -90
- package/src/ai-export.dom.test.ts +0 -114
- package/src/alerts/alert-engine-attach.ts +0 -165
- package/src/alerts/alert-engine.test.ts +0 -135
- package/src/alerts/alert-engine.ts +0 -260
- package/src/alerts/alert-formats.test.ts +0 -87
- package/src/alerts/alert-formats.ts +0 -77
- package/src/alerts/alert-observer.test.ts +0 -189
- package/src/alerts/alert-observer.ts +0 -208
- package/src/alerts/alert-scheduler.ts +0 -96
- package/src/alerts/alert-storage.test.ts +0 -54
- package/src/alerts/alert-storage.ts +0 -116
- package/src/alerts/alert-store.svelte.ts +0 -80
- package/src/alerts/alert-types.ts +0 -94
- package/src/board.dom.test.ts +0 -941
- package/src/edit-panel.test.ts +0 -322
- package/src/edit-panel.ts +0 -379
- package/src/export-conditional.test.ts +0 -60
- package/src/export-conditional.ts +0 -94
- package/src/export-ooxml.test.ts +0 -152
- package/src/export-ooxml.ts +0 -489
- package/src/export-pdf.test.ts +0 -138
- package/src/export-pdf.ts +0 -245
- package/src/export-print.test.ts +0 -66
- package/src/export-print.ts +0 -132
- package/src/export-serialize.test.ts +0 -56
- package/src/export-xls.ts +0 -199
- package/src/export-xlsx-roundtrip.test.ts +0 -120
- package/src/export-xlsx.test.ts +0 -150
- package/src/export.test.ts +0 -349
- package/src/export.ts +0 -1464
- package/src/expressions/evaluate.test.ts +0 -111
- package/src/expressions/evaluate.ts +0 -237
- package/src/expressions/expression-columns.ts +0 -133
- package/src/expressions/expression-types.ts +0 -84
- package/src/expressions/parse.test.ts +0 -106
- package/src/expressions/parse.ts +0 -610
- package/src/import-automap.test.ts +0 -131
- package/src/import-hardening.test.ts +0 -158
- package/src/import.test.ts +0 -415
- package/src/import.ts +0 -1044
- package/src/index.ts +0 -569
- package/src/install.ts +0 -154
- package/src/license-core.test.ts +0 -23
- package/src/license-core.ts +0 -107
- package/src/license-expiry.test.ts +0 -127
- package/src/license.ts +0 -137
- package/src/master-detail.test.ts +0 -61
- package/src/master-detail.ts +0 -42
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
- package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
- package/src/pivot-chart.test.ts +0 -86
- package/src/pivot-chart.ts +0 -112
- package/src/pivot-designer.ts +0 -101
- package/src/pivot.test.ts +0 -335
- package/src/pivot.ts +0 -578
- package/src/print.ts +0 -107
- package/src/scheduler-assignments.test.ts +0 -97
- package/src/scheduler-assignments.ts +0 -134
- package/src/scheduler-axis.test.ts +0 -108
- package/src/scheduler-axis.ts +0 -238
- package/src/scheduler-booking.test.ts +0 -57
- package/src/scheduler-config.ts +0 -179
- package/src/scheduler-dependencies.test.ts +0 -155
- package/src/scheduler-dependencies.ts +0 -223
- package/src/scheduler-freebusy.test.ts +0 -41
- package/src/scheduler-heatmap.test.ts +0 -39
- package/src/scheduler-resource-tree.test.ts +0 -84
- package/src/scheduler-resource-tree.ts +0 -107
- package/src/scheduler-slots.test.ts +0 -53
- package/src/scheduler-slots.ts +0 -94
- package/src/scheduler-summary.test.ts +0 -47
- package/src/scheduler-summary.ts +0 -81
- package/src/scheduling.test.ts +0 -194
- package/src/scheduling.ts +0 -293
- package/src/schema-designer.test.ts +0 -121
- package/src/schema-designer.ts +0 -142
- package/src/schema.test.ts +0 -268
- package/src/schema.ts +0 -562
- package/src/smart-shim.ts +0 -107
- package/src/sources/aggregate.test.ts +0 -79
- package/src/sources/aggregate.ts +0 -102
- package/src/sources/auth-supabase.test.ts +0 -80
- package/src/sources/auth-supabase.ts +0 -87
- package/src/sources/dashboard.kpi.test.ts +0 -50
- package/src/sources/dashboard.test.ts +0 -61
- package/src/sources/dashboard.ts +0 -136
- package/src/sources/field-inference.test.ts +0 -60
- package/src/sources/field-inference.ts +0 -63
- package/src/sources/filters.test.ts +0 -58
- package/src/sources/filters.ts +0 -70
- package/src/sources/index.ts +0 -67
- package/src/sources/introspect-supabase.test.ts +0 -112
- package/src/sources/introspect-supabase.ts +0 -139
- package/src/sources/realtime-supabase.test.ts +0 -93
- package/src/sources/realtime-supabase.ts +0 -99
- package/src/sources/relation-lookup.test.ts +0 -99
- package/src/sources/relation-lookup.ts +0 -128
- package/src/sources/rest-adapters.test.ts +0 -95
- package/src/sources/rest-adapters.ts +0 -120
- package/src/sources/rest.test.ts +0 -104
- package/src/sources/rest.ts +0 -129
- package/src/sources/schema-from-columns.test.ts +0 -106
- package/src/sources/schema-from-columns.ts +0 -88
- package/src/sources/supabase.test.ts +0 -110
- package/src/sources/supabase.ts +0 -99
- package/src/sources/with-entity-rules.test.ts +0 -104
- package/src/sources/with-entity-rules.ts +0 -78
- package/src/sources/with-relation-labels.test.ts +0 -75
- package/src/sources/with-relation-labels.ts +0 -73
- package/src/staged-editing.ts +0 -0
- package/src/studio/bug-report.test.ts +0 -101
- package/src/studio/bug-report.ts +0 -165
- package/src/studio/cli.test.ts +0 -187
- package/src/studio/cli.ts +0 -117
- package/src/studio/copilot-core.test.ts +0 -45
- package/src/studio/csv.test.ts +0 -90
- package/src/studio/csv.ts +0 -165
- package/src/studio/db-connect-string.test.ts +0 -94
- package/src/studio/db-connect-string.ts +0 -128
- package/src/studio/deploy-cli.test.ts +0 -56
- package/src/studio/deploy-cli.ts +0 -100
- package/src/studio/emit-project.test.ts +0 -3324
- package/src/studio/emit-project.ts +0 -5377
- package/src/studio/emit-schema.test.ts +0 -111
- package/src/studio/emit-schema.ts +0 -1181
- package/src/studio/index.ts +0 -380
- package/src/studio/init-flow.test.ts +0 -514
- package/src/studio/init-flow.ts +0 -556
- package/src/studio/introspect-db.test.ts +0 -186
- package/src/studio/introspect-db.ts +0 -312
- package/src/studio/introspect-openapi.test.ts +0 -84
- package/src/studio/introspect-openapi.ts +0 -252
- package/src/studio/introspect-prisma.test.ts +0 -99
- package/src/studio/introspect-prisma.ts +0 -175
- package/src/studio/introspect.test.ts +0 -172
- package/src/studio/introspect.ts +0 -310
- package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
- package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
- package/src/studio/pipeline.test.ts +0 -42
- package/src/studio/project-robust.test.ts +0 -157
- package/src/studio/project.test.ts +0 -929
- package/src/studio/project.ts +0 -2394
- package/src/studio/sample-data.test.ts +0 -58
- package/src/studio/sample-data.ts +0 -203
- package/src/studio/samples/ats.ts +0 -202
- package/src/studio/samples/clinic.ts +0 -179
- package/src/studio/samples/crm.ts +0 -291
- package/src/studio/samples/datasets.test.ts +0 -84
- package/src/studio/samples/datasets.ts +0 -340
- package/src/studio/samples/ecommerce.ts +0 -187
- package/src/studio/samples/events.ts +0 -201
- package/src/studio/samples/fleet.ts +0 -213
- package/src/studio/samples/gym.ts +0 -215
- package/src/studio/samples/hr.ts +0 -195
- package/src/studio/samples/index.ts +0 -55
- package/src/studio/samples/insurance.ts +0 -229
- package/src/studio/samples/inventory.ts +0 -213
- package/src/studio/samples/invoicing.ts +0 -162
- package/src/studio/samples/library.ts +0 -180
- package/src/studio/samples/live-data.test.ts +0 -99
- package/src/studio/samples/live-data.ts +0 -306
- package/src/studio/samples/projects.ts +0 -212
- package/src/studio/samples/realestate.ts +0 -196
- package/src/studio/samples/restaurant.ts +0 -189
- package/src/studio/samples/samples.test.ts +0 -304
- package/src/studio/samples/school.ts +0 -197
- package/src/studio/samples/seed-floor.test.ts +0 -25
- package/src/studio/samples/shared.ts +0 -237
- package/src/studio/samples/starter.ts +0 -251
- package/src/studio/samples/subscriptions.ts +0 -183
- package/src/studio/samples/support.ts +0 -216
- package/src/studio/scaffold-app.test.ts +0 -91
- package/src/studio/scaffold.test.ts +0 -192
- package/src/studio/scaffold.ts +0 -390
- package/src/studio/screen-suites.test.ts +0 -269
- package/src/studio/screen-suites.ts +0 -448
- package/src/studio/themes.ts +0 -62
- package/src/studio/ui-components-surface.test.ts +0 -185
- package/src/studio/ui-components.generated.ts +0 -7154
- package/src/studio/ui-components.ts +0 -742
- package/src/studio/verify.test.ts +0 -47
- package/src/studio/verify.ts +0 -79
- package/src/sveltekit/in-memory.test.ts +0 -104
- package/src/sveltekit/in-memory.ts +0 -129
- package/src/sveltekit/index.ts +0 -24
- package/src/sveltekit/query-plan.test.ts +0 -109
- package/src/sveltekit/query-plan.ts +0 -125
- package/src/sveltekit/sql-source.test.ts +0 -198
- package/src/sveltekit/sql-source.ts +0 -171
- package/src/sveltekit/sql.test.ts +0 -80
- package/src/sveltekit/sql.ts +0 -131
- package/src/sveltekit/transport-scope.test.ts +0 -125
- package/src/sveltekit/transport.test.ts +0 -201
- package/src/sveltekit/transport.ts +0 -373
- package/src/upgrade-prompt.test.ts +0 -71
- package/src/upgrade-prompt.ts +0 -162
- package/src/version.test.ts +0 -17
- package/src/watermark.test.ts +0 -97
- package/src/watermark.ts +0 -156
- /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
- /package/{src → dist}/SvAlertsManager.svelte +0 -0
- /package/{src → dist}/SvAlertsPanel.svelte +0 -0
- /package/{src → dist}/SvAuthGate.svelte +0 -0
- /package/{src → dist}/SvBoard.svelte +0 -0
- /package/{src → dist}/SvExportMenu.svelte +0 -0
- /package/{src → dist}/SvExpressionEditor.svelte +0 -0
- /package/{src → dist}/SvFileInput.svelte +0 -0
- /package/{src → dist}/SvGridAlerts.svelte +0 -0
- /package/{src → dist}/SvGridBoard.svelte +0 -0
- /package/{src → dist}/SvGridEditPanel.svelte +0 -0
- /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
- /package/{src → dist}/SvGridScheduler.svelte +0 -0
- /package/{src → dist}/SvImportDialog.svelte +0 -0
- /package/{src → dist}/SvLookupInput.svelte +0 -0
- /package/{src → dist}/SvPivotDesigner.svelte +0 -0
- /package/{src → dist}/SvRecordDetail.svelte +0 -0
- /package/{src → dist}/SvSchedule.svelte +0 -0
- /package/{src → dist}/SvSchemaChart.svelte +0 -0
- /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
- /package/{src → dist}/pdfmake-shims.d.ts +0 -0
- /package/{src → dist}/smart.export.d.ts +0 -0
- /package/{src → dist}/smart.export.js +0 -0
- /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
- /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
- /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
- /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ChangeExpr, EvalContext, ExprRow, PredicateExpr, ScalarExpr } from './expression-types.js';
|
|
2
|
+
type Scalar = number | string | boolean | null;
|
|
3
|
+
/** Names of the built-in scalar functions (for editor validation/autocomplete). */
|
|
4
|
+
export declare const BUILTIN_FUNCTION_NAMES: ReadonlyArray<string>;
|
|
5
|
+
/** Whether `name` (any case) is a known built-in scalar function. */
|
|
6
|
+
export declare function isBuiltinFunction(name: string): boolean;
|
|
7
|
+
/** Evaluate a scalar expression to a single value. */
|
|
8
|
+
export declare function evaluateScalar<TData = ExprRow>(expr: ScalarExpr, ctx: EvalContext<TData>): Scalar;
|
|
9
|
+
/** Evaluate a predicate expression to a boolean for the context's row. */
|
|
10
|
+
export declare function evaluatePredicate<TData = ExprRow>(expr: PredicateExpr, ctx: EvalContext<TData>): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Evaluate a change expression - true when the value moved between `ctx.prev`
|
|
13
|
+
* and `ctx.row` in the way the expression describes. Returns false when there
|
|
14
|
+
* is no prior snapshot (nothing has changed yet).
|
|
15
|
+
*/
|
|
16
|
+
export declare function evaluateChange<TData = ExprRow>(expr: ChangeExpr, ctx: EvalContext<TData>): boolean;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expression evaluators - pure functions, no DOM. Predicate leaves delegate to
|
|
3
|
+
* the grid's `applyExcelFilter` so operator semantics match the filter row
|
|
4
|
+
* exactly; scalar maths and change detection are handled here.
|
|
5
|
+
*/
|
|
6
|
+
import { applyExcelFilter } from '@svgrid/grid/filtering';
|
|
7
|
+
function readValue(ctx, row, columnId) {
|
|
8
|
+
if (ctx.getValue)
|
|
9
|
+
return ctx.getValue(row, columnId);
|
|
10
|
+
return row?.[columnId];
|
|
11
|
+
}
|
|
12
|
+
/** Number coercion that returns NaN for blanks/non-numerics (never 0). */
|
|
13
|
+
function num(v) {
|
|
14
|
+
if (v == null || v === '')
|
|
15
|
+
return NaN;
|
|
16
|
+
if (typeof v === 'boolean')
|
|
17
|
+
return v ? 1 : 0;
|
|
18
|
+
return Number(v);
|
|
19
|
+
}
|
|
20
|
+
/** Loose value equality used by `changed` and `=` on non-numeric operands. */
|
|
21
|
+
function looseEqual(a, b) {
|
|
22
|
+
if (a == null && b == null)
|
|
23
|
+
return true;
|
|
24
|
+
const na = num(a);
|
|
25
|
+
const nb = num(b);
|
|
26
|
+
if (Number.isFinite(na) && Number.isFinite(nb))
|
|
27
|
+
return na === nb;
|
|
28
|
+
return String(a ?? '') === String(b ?? '');
|
|
29
|
+
}
|
|
30
|
+
const BUILTINS = {
|
|
31
|
+
ABS: (a) => Math.abs(num(a[0])),
|
|
32
|
+
ROUND: (a) => {
|
|
33
|
+
const n = num(a[0]);
|
|
34
|
+
const d = a.length > 1 ? num(a[1]) : 0;
|
|
35
|
+
const f = 10 ** (Number.isFinite(d) ? d : 0);
|
|
36
|
+
return Math.round(n * f) / f;
|
|
37
|
+
},
|
|
38
|
+
FLOOR: (a) => Math.floor(num(a[0])),
|
|
39
|
+
CEIL: (a) => Math.ceil(num(a[0])),
|
|
40
|
+
MIN: (a) => Math.min(...a.map(num)),
|
|
41
|
+
MAX: (a) => Math.max(...a.map(num)),
|
|
42
|
+
IF: (a) => (truthy(a[0] ?? null) ? (a[1] ?? null) : (a[2] ?? null)),
|
|
43
|
+
COALESCE: (a) => a.find((v) => v != null && v !== '') ?? null,
|
|
44
|
+
CONCAT: (a) => a.map((v) => (v == null ? '' : String(v))).join(''),
|
|
45
|
+
LOWER: (a) => String(a[0] ?? '').toLowerCase(),
|
|
46
|
+
UPPER: (a) => String(a[0] ?? '').toUpperCase(),
|
|
47
|
+
LEN: (a) => String(a[0] ?? '').length,
|
|
48
|
+
};
|
|
49
|
+
/** Names of the built-in scalar functions (for editor validation/autocomplete). */
|
|
50
|
+
export const BUILTIN_FUNCTION_NAMES = Object.keys(BUILTINS);
|
|
51
|
+
/** Whether `name` (any case) is a known built-in scalar function. */
|
|
52
|
+
export function isBuiltinFunction(name) {
|
|
53
|
+
return name.toUpperCase() in BUILTINS;
|
|
54
|
+
}
|
|
55
|
+
function truthy(v) {
|
|
56
|
+
if (typeof v === 'boolean')
|
|
57
|
+
return v;
|
|
58
|
+
if (v == null || v === '')
|
|
59
|
+
return false;
|
|
60
|
+
const n = num(v);
|
|
61
|
+
return Number.isFinite(n) ? n !== 0 : true;
|
|
62
|
+
}
|
|
63
|
+
/** Evaluate a scalar expression to a single value. */
|
|
64
|
+
export function evaluateScalar(expr, ctx) {
|
|
65
|
+
switch (expr.kind) {
|
|
66
|
+
case 'lit':
|
|
67
|
+
return expr.value;
|
|
68
|
+
case 'col':
|
|
69
|
+
return (readValue(ctx, ctx.row, expr.id) ?? null);
|
|
70
|
+
case 'neg':
|
|
71
|
+
return -num(evaluateScalar(expr.expr, ctx));
|
|
72
|
+
case 'bin': {
|
|
73
|
+
const l = evaluateScalar(expr.left, ctx);
|
|
74
|
+
const r = evaluateScalar(expr.right, ctx);
|
|
75
|
+
if (expr.op === '+') {
|
|
76
|
+
const ln = num(l);
|
|
77
|
+
const rn = num(r);
|
|
78
|
+
if (Number.isFinite(ln) && Number.isFinite(rn))
|
|
79
|
+
return ln + rn;
|
|
80
|
+
return String(l ?? '') + String(r ?? '');
|
|
81
|
+
}
|
|
82
|
+
const a = num(l);
|
|
83
|
+
const b = num(r);
|
|
84
|
+
switch (expr.op) {
|
|
85
|
+
case '-':
|
|
86
|
+
return a - b;
|
|
87
|
+
case '*':
|
|
88
|
+
return a * b;
|
|
89
|
+
case '/':
|
|
90
|
+
return b === 0 ? NaN : a / b;
|
|
91
|
+
case '%':
|
|
92
|
+
return b === 0 ? NaN : a % b;
|
|
93
|
+
// Rules are authored at runtime, so an operator outside the union can
|
|
94
|
+
// arrive from parsed JSON. Without this the switch falls out of its
|
|
95
|
+
// case and into `case 'agg'`, reading agg fields off a binary node.
|
|
96
|
+
default:
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
case 'agg': {
|
|
101
|
+
const rows = ctx.rows ?? [ctx.row];
|
|
102
|
+
if (expr.fn === 'count')
|
|
103
|
+
return rows.length;
|
|
104
|
+
const nums = [];
|
|
105
|
+
for (const row of rows) {
|
|
106
|
+
const n = num(readValue(ctx, row, expr.column));
|
|
107
|
+
if (Number.isFinite(n))
|
|
108
|
+
nums.push(n);
|
|
109
|
+
}
|
|
110
|
+
if (nums.length === 0)
|
|
111
|
+
return expr.fn === 'sum' ? 0 : null;
|
|
112
|
+
switch (expr.fn) {
|
|
113
|
+
case 'sum':
|
|
114
|
+
return nums.reduce((s, n) => s + n, 0);
|
|
115
|
+
case 'avg':
|
|
116
|
+
return nums.reduce((s, n) => s + n, 0) / nums.length;
|
|
117
|
+
case 'min':
|
|
118
|
+
return Math.min(...nums);
|
|
119
|
+
case 'max':
|
|
120
|
+
return Math.max(...nums);
|
|
121
|
+
// Same here: falling through to `case 'func'` would call
|
|
122
|
+
// `expr.name.toUpperCase()` on an agg node and throw.
|
|
123
|
+
default:
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
case 'func': {
|
|
128
|
+
const name = expr.name.toUpperCase();
|
|
129
|
+
const args = expr.args.map((a) => evaluateScalar(a, ctx));
|
|
130
|
+
const fn = ctx.functions?.[name] ?? BUILTINS[name];
|
|
131
|
+
return fn ? fn(args) : null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function compareScalar(a, op, b) {
|
|
136
|
+
switch (op) {
|
|
137
|
+
case '=':
|
|
138
|
+
return looseEqual(a, b);
|
|
139
|
+
case '!=':
|
|
140
|
+
return !looseEqual(a, b);
|
|
141
|
+
}
|
|
142
|
+
const na = num(a);
|
|
143
|
+
const nb = num(b);
|
|
144
|
+
const numeric = Number.isFinite(na) && Number.isFinite(nb);
|
|
145
|
+
const x = numeric ? na : String(a ?? '');
|
|
146
|
+
const y = numeric ? nb : String(b ?? '');
|
|
147
|
+
switch (op) {
|
|
148
|
+
case '>':
|
|
149
|
+
return x > y;
|
|
150
|
+
case '<':
|
|
151
|
+
return x < y;
|
|
152
|
+
case '>=':
|
|
153
|
+
return x >= y;
|
|
154
|
+
case '<=':
|
|
155
|
+
return x <= y;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Evaluate a predicate expression to a boolean for the context's row. */
|
|
159
|
+
export function evaluatePredicate(expr, ctx) {
|
|
160
|
+
switch (expr.kind) {
|
|
161
|
+
case 'const':
|
|
162
|
+
return expr.value;
|
|
163
|
+
case 'and':
|
|
164
|
+
return expr.parts.every((p) => evaluatePredicate(p, ctx));
|
|
165
|
+
case 'or':
|
|
166
|
+
return expr.parts.some((p) => evaluatePredicate(p, ctx));
|
|
167
|
+
case 'not':
|
|
168
|
+
return !evaluatePredicate(expr.expr, ctx);
|
|
169
|
+
case 'cmp':
|
|
170
|
+
return applyExcelFilter(readValue(ctx, ctx.row, expr.column), { id: expr.column, operator: expr.op, value: expr.value, valueTo: expr.valueTo }, { locale: ctx.locale });
|
|
171
|
+
case 'scalarCmp':
|
|
172
|
+
return compareScalar(evaluateScalar(expr.left, ctx), expr.op, evaluateScalar(expr.right, ctx));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Evaluate a change expression - true when the value moved between `ctx.prev`
|
|
177
|
+
* and `ctx.row` in the way the expression describes. Returns false when there
|
|
178
|
+
* is no prior snapshot (nothing has changed yet).
|
|
179
|
+
*/
|
|
180
|
+
export function evaluateChange(expr, ctx) {
|
|
181
|
+
if (ctx.prev == null)
|
|
182
|
+
return false;
|
|
183
|
+
const next = readValue(ctx, ctx.row, expr.column);
|
|
184
|
+
const prev = readValue(ctx, ctx.prev, expr.column);
|
|
185
|
+
switch (expr.kind) {
|
|
186
|
+
case 'changed':
|
|
187
|
+
return !looseEqual(prev, next);
|
|
188
|
+
case 'delta': {
|
|
189
|
+
const p = num(prev);
|
|
190
|
+
const n = num(next);
|
|
191
|
+
if (!Number.isFinite(p) || !Number.isFinite(n))
|
|
192
|
+
return false;
|
|
193
|
+
const d = expr.abs ? Math.abs(n - p) : n - p;
|
|
194
|
+
return compareScalar(d, expr.op, expr.value);
|
|
195
|
+
}
|
|
196
|
+
case 'percentChange': {
|
|
197
|
+
const p = num(prev);
|
|
198
|
+
const n = num(next);
|
|
199
|
+
if (!Number.isFinite(p) || !Number.isFinite(n) || p === 0)
|
|
200
|
+
return false;
|
|
201
|
+
const pc = ((n - p) / Math.abs(p)) * 100;
|
|
202
|
+
return compareScalar(expr.abs ? Math.abs(pc) : pc, expr.op, expr.value);
|
|
203
|
+
}
|
|
204
|
+
case 'crossed': {
|
|
205
|
+
const p = num(prev);
|
|
206
|
+
const n = num(next);
|
|
207
|
+
if (!Number.isFinite(p) || !Number.isFinite(n))
|
|
208
|
+
return false;
|
|
209
|
+
return expr.direction === 'above'
|
|
210
|
+
? p < expr.threshold && n >= expr.threshold
|
|
211
|
+
: p > expr.threshold && n <= expr.threshold;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Column metadata for the expression layer - the small, self-contained operator
|
|
3
|
+
* catalogue the editor draws from, plus name <-> id resolution for the
|
|
4
|
+
* `[Bracketed Name]` reference syntax.
|
|
5
|
+
*
|
|
6
|
+
* The operator set mirrors the grid's own filter row (text / number / date),
|
|
7
|
+
* so an expression's operators line up with what a user already knows from the
|
|
8
|
+
* column menu. We keep a local copy rather than importing the grid's internal
|
|
9
|
+
* `filter-operators` module (which is not part of the public surface).
|
|
10
|
+
*/
|
|
11
|
+
import type { ExcelFilterOperator } from '@svgrid/grid';
|
|
12
|
+
/** Coarse value type used to decide which operators a column offers. */
|
|
13
|
+
export type ExprColumnType = 'text' | 'number' | 'date' | 'datetime' | 'boolean';
|
|
14
|
+
/** A column as the expression layer sees it. */
|
|
15
|
+
export type ExprColumn = {
|
|
16
|
+
/** Canonical id (the field key stored in the AST). */
|
|
17
|
+
id: string;
|
|
18
|
+
/** Human label; also the token used inside `[Bracketed Name]` references. */
|
|
19
|
+
name?: string;
|
|
20
|
+
type?: ExprColumnType;
|
|
21
|
+
};
|
|
22
|
+
/** One operator entry: its label and which column types it applies to. */
|
|
23
|
+
export type OperatorMeta = {
|
|
24
|
+
value: ExcelFilterOperator;
|
|
25
|
+
label: string;
|
|
26
|
+
types: ReadonlyArray<ExprColumnType>;
|
|
27
|
+
/** No value input (acts on emptiness alone). */
|
|
28
|
+
valueless?: boolean;
|
|
29
|
+
/** Multi-value set membership (renders a token/chip input). */
|
|
30
|
+
set?: boolean;
|
|
31
|
+
/** Needs a second value (`valueTo`). */
|
|
32
|
+
range?: boolean;
|
|
33
|
+
};
|
|
34
|
+
/** The full operator catalogue, ordered as the editor should present it. */
|
|
35
|
+
export declare const OPERATORS: ReadonlyArray<OperatorMeta>;
|
|
36
|
+
/** Metadata for one operator (falls back to a plain `equals`). */
|
|
37
|
+
export declare function operatorMeta(op: ExcelFilterOperator): OperatorMeta;
|
|
38
|
+
/** Operators valid for a column type (defaults to the text set). */
|
|
39
|
+
export declare function operatorsForType(type: ExprColumnType | undefined): OperatorMeta[];
|
|
40
|
+
/** Whether an operator needs no value input. */
|
|
41
|
+
export declare function isValueless(op: ExcelFilterOperator): boolean;
|
|
42
|
+
/** Whether an operator takes a multi-value token list. */
|
|
43
|
+
export declare function isSetOperator(op: ExcelFilterOperator): boolean;
|
|
44
|
+
/** Whether an operator needs a second (`valueTo`) value. */
|
|
45
|
+
export declare function isRangeOperator(op: ExcelFilterOperator): boolean;
|
|
46
|
+
/** Look a column up by its canonical id. */
|
|
47
|
+
export declare function columnById(columns: ReadonlyArray<ExprColumn>, id: string): ExprColumn | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Resolve a reference (as written in an expression) to a column id. A reference
|
|
50
|
+
* matches a column id first, then a column name (case-insensitive) - so both
|
|
51
|
+
* `price` and `[Unit Price]` resolve. Returns the raw ref unchanged when
|
|
52
|
+
* nothing matches, leaving `validateExpression` to flag it.
|
|
53
|
+
*/
|
|
54
|
+
export declare function resolveColumnRef(columns: ReadonlyArray<ExprColumn>, ref: string): string;
|
|
55
|
+
/** The display label for a column id (its name, or the id itself). */
|
|
56
|
+
export declare function columnLabel(columns: ReadonlyArray<ExprColumn>, id: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* How a column id should be written inside an expression: `[Name]` when the
|
|
59
|
+
* label has spaces or non-word characters, otherwise the bare id.
|
|
60
|
+
*/
|
|
61
|
+
export declare function columnRefText(columns: ReadonlyArray<ExprColumn>, id: string): string;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const TEXT = ['text'];
|
|
2
|
+
const NUM = ['number'];
|
|
3
|
+
const DATES = ['date', 'datetime'];
|
|
4
|
+
const ALL = ['text', 'number', 'date', 'datetime', 'boolean'];
|
|
5
|
+
/** The full operator catalogue, ordered as the editor should present it. */
|
|
6
|
+
export const OPERATORS = [
|
|
7
|
+
{ value: 'equals', label: 'Equals', types: ALL },
|
|
8
|
+
{ value: 'notEquals', label: 'Not equals', types: ALL },
|
|
9
|
+
{ value: 'contains', label: 'Contains', types: TEXT },
|
|
10
|
+
{ value: 'notContains', label: 'Not contains', types: TEXT },
|
|
11
|
+
{ value: 'startsWith', label: 'Starts with', types: TEXT },
|
|
12
|
+
{ value: 'endsWith', label: 'Ends with', types: TEXT },
|
|
13
|
+
{ value: 'regex', label: 'Matches regex', types: TEXT },
|
|
14
|
+
{ value: 'greaterThan', label: 'Greater than', types: [...NUM, ...DATES] },
|
|
15
|
+
{ value: 'lessThan', label: 'Less than', types: [...NUM, ...DATES] },
|
|
16
|
+
{ value: 'between', label: 'Between', types: [...NUM, ...DATES], range: true },
|
|
17
|
+
{ value: 'in', label: 'In', types: ['text', 'number'], set: true },
|
|
18
|
+
{ value: 'notIn', label: 'Not in', types: ['text', 'number'], set: true },
|
|
19
|
+
{ value: 'isBlank', label: 'Is blank', types: ALL, valueless: true },
|
|
20
|
+
{ value: 'isNotBlank', label: 'Is not blank', types: ALL, valueless: true },
|
|
21
|
+
];
|
|
22
|
+
const BY_VALUE = new Map(OPERATORS.map((op) => [op.value, op]));
|
|
23
|
+
/** Metadata for one operator (falls back to a plain `equals`). */
|
|
24
|
+
export function operatorMeta(op) {
|
|
25
|
+
return BY_VALUE.get(op) ?? { value: 'equals', label: 'Equals', types: ALL };
|
|
26
|
+
}
|
|
27
|
+
/** Operators valid for a column type (defaults to the text set). */
|
|
28
|
+
export function operatorsForType(type) {
|
|
29
|
+
const t = type ?? 'text';
|
|
30
|
+
return OPERATORS.filter((op) => op.types.includes(t));
|
|
31
|
+
}
|
|
32
|
+
/** Whether an operator needs no value input. */
|
|
33
|
+
export function isValueless(op) {
|
|
34
|
+
return operatorMeta(op).valueless === true;
|
|
35
|
+
}
|
|
36
|
+
/** Whether an operator takes a multi-value token list. */
|
|
37
|
+
export function isSetOperator(op) {
|
|
38
|
+
return operatorMeta(op).set === true;
|
|
39
|
+
}
|
|
40
|
+
/** Whether an operator needs a second (`valueTo`) value. */
|
|
41
|
+
export function isRangeOperator(op) {
|
|
42
|
+
return operatorMeta(op).range === true;
|
|
43
|
+
}
|
|
44
|
+
/** Look a column up by its canonical id. */
|
|
45
|
+
export function columnById(columns, id) {
|
|
46
|
+
return columns.find((c) => c.id === id);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve a reference (as written in an expression) to a column id. A reference
|
|
50
|
+
* matches a column id first, then a column name (case-insensitive) - so both
|
|
51
|
+
* `price` and `[Unit Price]` resolve. Returns the raw ref unchanged when
|
|
52
|
+
* nothing matches, leaving `validateExpression` to flag it.
|
|
53
|
+
*/
|
|
54
|
+
export function resolveColumnRef(columns, ref) {
|
|
55
|
+
if (columnById(columns, ref))
|
|
56
|
+
return ref;
|
|
57
|
+
const lc = ref.toLowerCase();
|
|
58
|
+
const byName = columns.find((c) => (c.name ?? '').toLowerCase() === lc);
|
|
59
|
+
return byName ? byName.id : ref;
|
|
60
|
+
}
|
|
61
|
+
/** The display label for a column id (its name, or the id itself). */
|
|
62
|
+
export function columnLabel(columns, id) {
|
|
63
|
+
return columnById(columns, id)?.name ?? id;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* How a column id should be written inside an expression: `[Name]` when the
|
|
67
|
+
* label has spaces or non-word characters, otherwise the bare id.
|
|
68
|
+
*/
|
|
69
|
+
export function columnRefText(columns, id) {
|
|
70
|
+
const label = columnLabel(columns, id);
|
|
71
|
+
return /^[A-Za-z_$][\w$]*$/.test(label) ? label : `[${label}]`;
|
|
72
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expression / query language - the model layer.
|
|
3
|
+
*
|
|
4
|
+
* A tiny, dependency-free expression language that end users author through the
|
|
5
|
+
* grid UI. It is the connective tissue behind the Alert Rules engine (and, in
|
|
6
|
+
* time, styled columns and calculated columns): one predicate/scalar/change
|
|
7
|
+
* model, evaluated the same way everywhere.
|
|
8
|
+
*
|
|
9
|
+
* The canonical, persisted form is a JSON AST (the types below) - no parser on
|
|
10
|
+
* the hot path. A light tokenizer/parser (`parse.ts`) is offered only for the
|
|
11
|
+
* editor's free-text mode; the structured builder writes the AST directly.
|
|
12
|
+
*
|
|
13
|
+
* Leaf comparisons delegate to the grid's own `applyExcelFilter`, so a rule's
|
|
14
|
+
* "greater than" is byte-for-byte the grid filter's "greater than".
|
|
15
|
+
*/
|
|
16
|
+
import type { ExcelFilterOperator } from '@svgrid/grid';
|
|
17
|
+
/** Symbolic comparison operators used by `scalarCmp` (general value compare). */
|
|
18
|
+
export type ComparisonOp = '=' | '!=' | '>' | '<' | '>=' | '<=';
|
|
19
|
+
/** Arithmetic operators for `bin` scalar nodes. */
|
|
20
|
+
export type ArithmeticOp = '+' | '-' | '*' | '/' | '%';
|
|
21
|
+
/** Column aggregate reducers (evaluated over the row set in scope). */
|
|
22
|
+
export type AggFn = 'sum' | 'avg' | 'min' | 'max' | 'count';
|
|
23
|
+
/**
|
|
24
|
+
* A scalar expression - evaluates to a single value (number / string /
|
|
25
|
+
* boolean / null) for a given row (and, for aggregates, the row set).
|
|
26
|
+
*/
|
|
27
|
+
export type ScalarExpr = {
|
|
28
|
+
kind: 'col';
|
|
29
|
+
id: string;
|
|
30
|
+
} | {
|
|
31
|
+
kind: 'lit';
|
|
32
|
+
value: string | number | boolean | null;
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'neg';
|
|
35
|
+
expr: ScalarExpr;
|
|
36
|
+
} | {
|
|
37
|
+
kind: 'bin';
|
|
38
|
+
op: ArithmeticOp;
|
|
39
|
+
left: ScalarExpr;
|
|
40
|
+
right: ScalarExpr;
|
|
41
|
+
} | {
|
|
42
|
+
kind: 'agg';
|
|
43
|
+
fn: AggFn;
|
|
44
|
+
column: string;
|
|
45
|
+
} | {
|
|
46
|
+
kind: 'func';
|
|
47
|
+
name: string;
|
|
48
|
+
args: ScalarExpr[];
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* A boolean (predicate) expression - the thing an alert rule / filter needs.
|
|
52
|
+
*
|
|
53
|
+
* - `cmp` maps straight onto the grid's `applyExcelFilter` (text/set/range ops).
|
|
54
|
+
* - `scalarCmp` compares two scalar expressions with a symbolic operator, so
|
|
55
|
+
* cross-column maths (`[filled] / [target] >= 0.9`) is expressible.
|
|
56
|
+
*/
|
|
57
|
+
export type PredicateExpr = {
|
|
58
|
+
kind: 'and';
|
|
59
|
+
parts: PredicateExpr[];
|
|
60
|
+
} | {
|
|
61
|
+
kind: 'or';
|
|
62
|
+
parts: PredicateExpr[];
|
|
63
|
+
} | {
|
|
64
|
+
kind: 'not';
|
|
65
|
+
expr: PredicateExpr;
|
|
66
|
+
} | {
|
|
67
|
+
kind: 'cmp';
|
|
68
|
+
column: string;
|
|
69
|
+
op: ExcelFilterOperator;
|
|
70
|
+
value?: unknown;
|
|
71
|
+
valueTo?: unknown;
|
|
72
|
+
} | {
|
|
73
|
+
kind: 'scalarCmp';
|
|
74
|
+
left: ScalarExpr;
|
|
75
|
+
op: ComparisonOp;
|
|
76
|
+
right: ScalarExpr;
|
|
77
|
+
} | {
|
|
78
|
+
kind: 'const';
|
|
79
|
+
value: boolean;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* A change (observable) expression - true when a value moves between the
|
|
83
|
+
* previous and current snapshot of a row. Powers "relative change" alerts.
|
|
84
|
+
*/
|
|
85
|
+
export type ChangeExpr = {
|
|
86
|
+
kind: 'changed';
|
|
87
|
+
column: string;
|
|
88
|
+
} | {
|
|
89
|
+
kind: 'delta';
|
|
90
|
+
column: string;
|
|
91
|
+
op: ComparisonOp;
|
|
92
|
+
value: number;
|
|
93
|
+
abs?: boolean;
|
|
94
|
+
} | {
|
|
95
|
+
kind: 'percentChange';
|
|
96
|
+
column: string;
|
|
97
|
+
op: ComparisonOp;
|
|
98
|
+
value: number;
|
|
99
|
+
abs?: boolean;
|
|
100
|
+
} | {
|
|
101
|
+
kind: 'crossed';
|
|
102
|
+
column: string;
|
|
103
|
+
threshold: number;
|
|
104
|
+
direction: 'above' | 'below';
|
|
105
|
+
};
|
|
106
|
+
/** The shape the evaluator reads rows as (a plain field bag by default). */
|
|
107
|
+
export type ExprRow = Record<string, unknown>;
|
|
108
|
+
/**
|
|
109
|
+
* Everything the evaluator needs for one evaluation. `getValue` lets a caller
|
|
110
|
+
* resolve a column id to a value when it is not a plain `row[id]` field;
|
|
111
|
+
* `functions` injects extra scalar functions (e.g. delegate to HyperFormula).
|
|
112
|
+
*/
|
|
113
|
+
export type EvalContext<TData = ExprRow> = {
|
|
114
|
+
row: TData;
|
|
115
|
+
/** Prior snapshot of the same row - required by `ChangeExpr`. */
|
|
116
|
+
prev?: TData;
|
|
117
|
+
/** The row set in scope - required by aggregates. Defaults to `[row]`. */
|
|
118
|
+
rows?: ReadonlyArray<TData>;
|
|
119
|
+
/** Resolve a column id to its cell value. Defaults to `row[id]`. */
|
|
120
|
+
getValue?: (row: TData, columnId: string) => unknown;
|
|
121
|
+
/** BCP-47 locale(s) threaded into `applyExcelFilter` for text folding. */
|
|
122
|
+
locale?: string | ReadonlyArray<string>;
|
|
123
|
+
/** Extra scalar functions by upper-case name, merged over the builtins. */
|
|
124
|
+
functions?: Record<string, (args: Array<number | string | boolean | null>) => number | string | boolean | null>;
|
|
125
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { PredicateExpr, ScalarExpr } from './expression-types.js';
|
|
2
|
+
import { type ExprColumn } from './expression-columns.js';
|
|
3
|
+
/** Thrown by `parsePredicate` with a character offset into the source. */
|
|
4
|
+
export declare class ExpressionParseError extends Error {
|
|
5
|
+
pos: number;
|
|
6
|
+
constructor(message: string, pos: number);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Parse a free-text predicate into an AST. Column references (`[Name]` or a
|
|
10
|
+
* bare id) are resolved against `columns`. Throws `ExpressionParseError`
|
|
11
|
+
* (carrying a source offset) on a syntax error.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parsePredicate(text: string, columns?: ReadonlyArray<ExprColumn>): PredicateExpr;
|
|
14
|
+
/** Render a scalar expression back to source text. */
|
|
15
|
+
export declare function stringifyScalar(expr: ScalarExpr, columns: ReadonlyArray<ExprColumn>): string;
|
|
16
|
+
/** Render a predicate expression back to readable source text. */
|
|
17
|
+
export declare function stringifyPredicate(expr: PredicateExpr, columns?: ReadonlyArray<ExprColumn>): string;
|
|
18
|
+
/** Every column id referenced anywhere in a predicate (deduped, in order). */
|
|
19
|
+
export declare function collectColumnRefs(expr: PredicateExpr): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Structurally validate an AST against a column list. Returns a list of
|
|
22
|
+
* human-readable problems (empty when the expression is sound): unknown column
|
|
23
|
+
* references and unknown function names.
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateExpression(expr: PredicateExpr, columns: ReadonlyArray<ExprColumn>): string[];
|