@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,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pure alert engine - no DOM, no timers. It turns rules + data snapshots
|
|
3
|
+
* into `AlertEvent`s, with true-edge de-duplication so a `dataChange` rule fires
|
|
4
|
+
* once when a row starts matching (not on every re-evaluation while it keeps
|
|
5
|
+
* matching). The reactive/observing wrapper lives in `alert-engine-attach.ts`.
|
|
6
|
+
*/
|
|
7
|
+
import { evaluateChange, evaluatePredicate } from '../expressions/evaluate';
|
|
8
|
+
import { collectColumnRefs } from '../expressions/parse';
|
|
9
|
+
const AGG_ROW_KEY = '*';
|
|
10
|
+
/** Fill message-template tokens from the firing context. */
|
|
11
|
+
export function renderTemplate(template, ctx) {
|
|
12
|
+
const { rule, row, columnId, value } = ctx;
|
|
13
|
+
return template
|
|
14
|
+
.replace(/\{rule\}/g, rule.name)
|
|
15
|
+
.replace(/\{severity\}/g, rule.severity)
|
|
16
|
+
.replace(/\{column\}/g, columnId ?? '')
|
|
17
|
+
.replace(/\{value\}/g, value == null ? '' : String(value))
|
|
18
|
+
.replace(/\{row\.([\w$]+)\}/g, (_m, key) => fmt(row?.[key]))
|
|
19
|
+
.replace(/\{([\w$]+)\}/g, (m, key) => (row && key in row ? fmt(row[key]) : m));
|
|
20
|
+
}
|
|
21
|
+
function fmt(v) {
|
|
22
|
+
return v == null ? '' : String(v);
|
|
23
|
+
}
|
|
24
|
+
function defaultMessage(rule) {
|
|
25
|
+
return rule.name;
|
|
26
|
+
}
|
|
27
|
+
export function createAlertEngine(options) {
|
|
28
|
+
let rules = options.rules;
|
|
29
|
+
const getValue = options.getValue;
|
|
30
|
+
const now = options.now ?? (() => Date.now());
|
|
31
|
+
// Edge memory: keys currently satisfying a `dataChange`/aggregate predicate.
|
|
32
|
+
const active = new Set();
|
|
33
|
+
const ctxFor = (row, rows, prev) => ({
|
|
34
|
+
row,
|
|
35
|
+
prev,
|
|
36
|
+
rows,
|
|
37
|
+
getValue,
|
|
38
|
+
locale: options.locale,
|
|
39
|
+
});
|
|
40
|
+
const val = (row, columnId) => columnId == null
|
|
41
|
+
? undefined
|
|
42
|
+
: getValue
|
|
43
|
+
? getValue(row, columnId)
|
|
44
|
+
: row?.[columnId];
|
|
45
|
+
// A representative column for the message `{value}`/`{column}` tokens: the
|
|
46
|
+
// rule's explicit target, else the first column its predicate references.
|
|
47
|
+
const primaryColumn = (rule) => rule.columns?.[0] ?? collectColumnRefs(rule.predicate)[0];
|
|
48
|
+
function buildEvent(rule, opts) {
|
|
49
|
+
const msgAction = rule.actions.find((a) => a.message);
|
|
50
|
+
const template = msgAction?.message ?? defaultMessage(rule);
|
|
51
|
+
const message = renderTemplate(template, {
|
|
52
|
+
rule,
|
|
53
|
+
row: opts.row,
|
|
54
|
+
columnId: opts.columnId,
|
|
55
|
+
value: opts.value,
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
ruleId: rule.id,
|
|
59
|
+
ruleName: rule.name,
|
|
60
|
+
severity: rule.severity,
|
|
61
|
+
scope: rule.scope,
|
|
62
|
+
triggerType: rule.trigger.type,
|
|
63
|
+
rowId: opts.rowId,
|
|
64
|
+
columnId: opts.columnId,
|
|
65
|
+
value: opts.value,
|
|
66
|
+
message,
|
|
67
|
+
actions: rule.actions,
|
|
68
|
+
firedAt: now(),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Aggregate-scope: one edge event when the predicate over all rows flips true. */
|
|
72
|
+
function evaluateAggregate(rule, rows) {
|
|
73
|
+
const key = `${rule.id}::${AGG_ROW_KEY}`;
|
|
74
|
+
const first = rows[0];
|
|
75
|
+
const matches = first != null && evaluatePredicate(rule.predicate, ctxFor(first, rows));
|
|
76
|
+
if (matches && !active.has(key)) {
|
|
77
|
+
active.add(key);
|
|
78
|
+
return [buildEvent(rule, {})];
|
|
79
|
+
}
|
|
80
|
+
if (!matches)
|
|
81
|
+
active.delete(key);
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
/** Row/cell dataChange: edge event when a row newly satisfies the predicate. */
|
|
85
|
+
function evaluateDataChangeRow(rule, row, rows) {
|
|
86
|
+
const id = options.getRowId(row);
|
|
87
|
+
const key = `${rule.id}::${id}`;
|
|
88
|
+
const matches = evaluatePredicate(rule.predicate, ctxFor(row, rows));
|
|
89
|
+
if (matches && !active.has(key)) {
|
|
90
|
+
active.add(key);
|
|
91
|
+
const source = primaryColumn(rule);
|
|
92
|
+
// Expose the column on the event only for cell scope; still surface its
|
|
93
|
+
// value for the message tokens regardless of scope.
|
|
94
|
+
const columnId = rule.scope === 'cell' ? source : undefined;
|
|
95
|
+
return [buildEvent(rule, { row, rowId: id, columnId, value: val(row, source) })];
|
|
96
|
+
}
|
|
97
|
+
if (!matches)
|
|
98
|
+
active.delete(key);
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
/** relativeChange: fires whenever the change test holds for a prev->next row. */
|
|
102
|
+
function evaluateRelative(rule, row, prev, rows) {
|
|
103
|
+
if (rule.trigger.type !== 'relativeChange' || prev == null)
|
|
104
|
+
return [];
|
|
105
|
+
const changed = evaluateChange(rule.trigger.expr, ctxFor(row, rows, prev));
|
|
106
|
+
if (!changed)
|
|
107
|
+
return [];
|
|
108
|
+
// Gate on the predicate too, so "price jumped AND price > 100" is expressible.
|
|
109
|
+
if (!evaluatePredicate(rule.predicate, ctxFor(row, rows, prev)))
|
|
110
|
+
return [];
|
|
111
|
+
const columnId = rule.trigger.expr.column;
|
|
112
|
+
return [
|
|
113
|
+
buildEvent(rule, {
|
|
114
|
+
row,
|
|
115
|
+
rowId: options.getRowId(row),
|
|
116
|
+
columnId,
|
|
117
|
+
value: val(row, columnId),
|
|
118
|
+
}),
|
|
119
|
+
];
|
|
120
|
+
}
|
|
121
|
+
function activeRules() {
|
|
122
|
+
return rules.filter((r) => r.enabled);
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
setRules(next) {
|
|
126
|
+
rules = next;
|
|
127
|
+
},
|
|
128
|
+
getRules() {
|
|
129
|
+
return rules;
|
|
130
|
+
},
|
|
131
|
+
needsPrev() {
|
|
132
|
+
return rules.some((r) => r.enabled && r.trigger.type === 'relativeChange');
|
|
133
|
+
},
|
|
134
|
+
needsFullSet() {
|
|
135
|
+
return rules.some((r) => r.enabled && r.scope === 'aggregate');
|
|
136
|
+
},
|
|
137
|
+
reset() {
|
|
138
|
+
active.clear();
|
|
139
|
+
},
|
|
140
|
+
evaluate(rows) {
|
|
141
|
+
const events = [];
|
|
142
|
+
for (const rule of activeRules()) {
|
|
143
|
+
if (rule.scope === 'aggregate') {
|
|
144
|
+
events.push(...evaluateAggregate(rule, rows));
|
|
145
|
+
}
|
|
146
|
+
else if (rule.trigger.type === 'dataChange' || rule.trigger.type === 'scheduled') {
|
|
147
|
+
for (const row of rows)
|
|
148
|
+
events.push(...evaluateDataChangeRow(rule, row, rows));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return events;
|
|
152
|
+
},
|
|
153
|
+
evaluateTransition(prev, next) {
|
|
154
|
+
const prevById = new Map();
|
|
155
|
+
for (const row of prev)
|
|
156
|
+
prevById.set(options.getRowId(row), row);
|
|
157
|
+
const events = [];
|
|
158
|
+
for (const rule of activeRules()) {
|
|
159
|
+
if (rule.scope === 'aggregate') {
|
|
160
|
+
events.push(...evaluateAggregate(rule, next));
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
for (const row of next) {
|
|
164
|
+
const before = prevById.get(options.getRowId(row));
|
|
165
|
+
if (rule.trigger.type === 'relativeChange') {
|
|
166
|
+
events.push(...evaluateRelative(rule, row, before, next));
|
|
167
|
+
}
|
|
168
|
+
else if (rule.trigger.type === 'dataChange') {
|
|
169
|
+
events.push(...evaluateDataChangeRow(rule, row, next));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return events;
|
|
174
|
+
},
|
|
175
|
+
validateEdit(row, columnId, nextValue) {
|
|
176
|
+
const candidate = { ...row, [columnId]: nextValue };
|
|
177
|
+
const events = [];
|
|
178
|
+
let vetoed = false;
|
|
179
|
+
for (const rule of activeRules()) {
|
|
180
|
+
if (rule.trigger.type !== 'validation')
|
|
181
|
+
continue;
|
|
182
|
+
if (!evaluatePredicate(rule.predicate, ctxFor(candidate)))
|
|
183
|
+
continue;
|
|
184
|
+
events.push(buildEvent(rule, {
|
|
185
|
+
row: candidate,
|
|
186
|
+
rowId: options.getRowId(candidate),
|
|
187
|
+
columnId,
|
|
188
|
+
value: nextValue,
|
|
189
|
+
}));
|
|
190
|
+
if (rule.actions.some((a) => a.kind === 'preventEdit'))
|
|
191
|
+
vetoed = true;
|
|
192
|
+
}
|
|
193
|
+
return { vetoed, events };
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge fired alert events to the grid's conditional-formatting engine. A
|
|
3
|
+
* `badge` / `highlight` action becomes a `RuleFormat` whose `when` matches the
|
|
4
|
+
* row that fired, so `resolveCellFormat` paints it - the same painter the grid
|
|
5
|
+
* already uses for color scales and data bars. No new rendering path.
|
|
6
|
+
*/
|
|
7
|
+
import type { ConditionalFormat } from '@svgrid/grid/format';
|
|
8
|
+
import type { AlertEvent, AlertRule } from './alert-types';
|
|
9
|
+
export type StylingContext<TData> = {
|
|
10
|
+
getValue?: (row: TData, columnId: string) => unknown;
|
|
11
|
+
locale?: string | ReadonlyArray<string>;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Persistent styling: one self-contained `RuleFormat` per enabled rule that has
|
|
15
|
+
* a `badge`/`highlight` action. The format's `when` runs the rule predicate
|
|
16
|
+
* directly, so the styling stays live as data changes (rows light up while they
|
|
17
|
+
* match and clear when they stop) without any row-id bookkeeping. One format
|
|
18
|
+
* per rule keeps the array tiny regardless of row count.
|
|
19
|
+
*/
|
|
20
|
+
export declare function rulesToConditionalFormats<TData = Record<string, unknown>>(rules: ReadonlyArray<AlertRule>, ctx?: StylingContext<TData>): ConditionalFormat<TData>[];
|
|
21
|
+
/**
|
|
22
|
+
* Turn active alert events into conditional formats. Events whose actions only
|
|
23
|
+
* toast/log/flash contribute nothing here. Matching is by row id, so the format
|
|
24
|
+
* follows the row through sort/filter rather than a fixed index.
|
|
25
|
+
*/
|
|
26
|
+
export declare function toConditionalFormats<TData = Record<string, unknown>>(events: ReadonlyArray<AlertEvent>, getRowId: (row: TData) => string): ConditionalFormat<TData>[];
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { evaluatePredicate } from '../expressions/evaluate';
|
|
2
|
+
/** Which action kinds paint onto cells. */
|
|
3
|
+
const STYLING_KINDS = new Set(['badge', 'highlight']);
|
|
4
|
+
/**
|
|
5
|
+
* Persistent styling: one self-contained `RuleFormat` per enabled rule that has
|
|
6
|
+
* a `badge`/`highlight` action. The format's `when` runs the rule predicate
|
|
7
|
+
* directly, so the styling stays live as data changes (rows light up while they
|
|
8
|
+
* match and clear when they stop) without any row-id bookkeeping. One format
|
|
9
|
+
* per rule keeps the array tiny regardless of row count.
|
|
10
|
+
*/
|
|
11
|
+
export function rulesToConditionalFormats(rules, ctx = {}) {
|
|
12
|
+
const formats = [];
|
|
13
|
+
for (const rule of rules) {
|
|
14
|
+
if (!rule.enabled)
|
|
15
|
+
continue;
|
|
16
|
+
for (const action of rule.actions) {
|
|
17
|
+
if (!STYLING_KINDS.has(action.kind))
|
|
18
|
+
continue;
|
|
19
|
+
const columns = action.columns ?? rule.columns;
|
|
20
|
+
const style = action.style ?? {};
|
|
21
|
+
formats.push({
|
|
22
|
+
type: 'rule',
|
|
23
|
+
...(columns ? { columns } : {}),
|
|
24
|
+
when: ({ row }) => evaluatePredicate(rule.predicate, { row, getValue: ctx.getValue, locale: ctx.locale }),
|
|
25
|
+
...(style.background ? { background: style.background } : {}),
|
|
26
|
+
...(style.color ? { color: style.color } : {}),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return formats;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Turn active alert events into conditional formats. Events whose actions only
|
|
34
|
+
* toast/log/flash contribute nothing here. Matching is by row id, so the format
|
|
35
|
+
* follows the row through sort/filter rather than a fixed index.
|
|
36
|
+
*/
|
|
37
|
+
export function toConditionalFormats(events, getRowId) {
|
|
38
|
+
const formats = [];
|
|
39
|
+
for (const event of events) {
|
|
40
|
+
if (event.rowId == null)
|
|
41
|
+
continue;
|
|
42
|
+
const rowId = event.rowId;
|
|
43
|
+
for (const action of event.actions) {
|
|
44
|
+
if (!STYLING_KINDS.has(action.kind))
|
|
45
|
+
continue;
|
|
46
|
+
const columns = action.columns ?? (event.columnId ? [event.columnId] : undefined);
|
|
47
|
+
const style = action.style ?? {};
|
|
48
|
+
formats.push({
|
|
49
|
+
type: 'rule',
|
|
50
|
+
...(columns ? { columns } : {}),
|
|
51
|
+
when: ({ row }) => getRowId(row) === rowId,
|
|
52
|
+
...(style.background ? { background: style.background } : {}),
|
|
53
|
+
...(style.color ? { color: style.color } : {}),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return formats;
|
|
58
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* alert-observer - the observation layer that turns data movement into engine
|
|
3
|
+
* passes WITHOUT ever blocking the grid's render frame, and in O(changed) rather
|
|
4
|
+
* than O(all rows).
|
|
5
|
+
*
|
|
6
|
+
* Two ways to feed it, both funnelling through the same coalescing scheduler so
|
|
7
|
+
* at most one evaluation runs per frame, post-paint:
|
|
8
|
+
*
|
|
9
|
+
* - PUSH (`pushChanged`) - the consumer already knows which rows changed (a
|
|
10
|
+
* streaming feed, a transaction, the flagship demo's own tick loop). We
|
|
11
|
+
* evaluate ONLY those rows. Cost is O(rows that changed) at any dataset size.
|
|
12
|
+
*
|
|
13
|
+
* - SCAN (`scan`) - the zero-effort fallback for a plain `data = ...` where no
|
|
14
|
+
* change signal exists. We index-diff the new array against the previous one
|
|
15
|
+
* (Svelte 5 replaces changed rows immutably, so unchanged rows keep their
|
|
16
|
+
* reference) and evaluate only the mismatches. Still O(all rows) to FIND the
|
|
17
|
+
* changes, but deferred to after paint so it never lengthens the grid's frame.
|
|
18
|
+
*
|
|
19
|
+
* Cloning of previous row values is gated on `engine.needsPrev()`: for a rule set
|
|
20
|
+
* that is purely `dataChange`/aggregate (the common case), we keep NO prev
|
|
21
|
+
* snapshots at all - the biggest GC saver on large live feeds. Full-set passes
|
|
22
|
+
* (aggregate scope, or a row-count change) run on the same deferred path.
|
|
23
|
+
*
|
|
24
|
+
* Pure TypeScript - no Svelte, no DOM. The `<SvGridAlerts>` overlay wires an
|
|
25
|
+
* instance to a scheduler and an `onEvents` sink; `attachAlertEngine` wraps it
|
|
26
|
+
* for non-Svelte hosts.
|
|
27
|
+
*/
|
|
28
|
+
import type { AlertEngine } from './alert-engine';
|
|
29
|
+
import type { AlertEvent, AlertRule } from './alert-types';
|
|
30
|
+
import { type AlertScheduler, type AlertSchedulerMode } from './alert-scheduler';
|
|
31
|
+
export type AlertObserverOptions<TData> = {
|
|
32
|
+
engine: AlertEngine<TData>;
|
|
33
|
+
getRowId: (row: TData) => string;
|
|
34
|
+
/** Fired events to route to side effects (toast/log/formats). Batched per run. */
|
|
35
|
+
onEvents: (events: AlertEvent[]) => void;
|
|
36
|
+
/** Scheduling strategy (default `raf`), or a custom scheduler for tests. */
|
|
37
|
+
schedule?: AlertSchedulerMode | AlertScheduler;
|
|
38
|
+
};
|
|
39
|
+
export type AlertObserver<TData> = {
|
|
40
|
+
/** Silent full seed - arms edges from the current set so pre-existing matches
|
|
41
|
+
* do not fire. Call on mount and after a rule change (in push mode). */
|
|
42
|
+
seed(rows: ReadonlyArray<TData>): void;
|
|
43
|
+
/** Queue changed rows for a deferred, O(changed) evaluation (push mode). */
|
|
44
|
+
pushChanged(rows: ReadonlyArray<TData>): void;
|
|
45
|
+
/** Schedule a deferred index-diff scan of the latest full row set (watch mode). */
|
|
46
|
+
scan(getRows: () => ReadonlyArray<TData>): void;
|
|
47
|
+
/** Swap the rule set; edge memory is reset and a fresh seed is required. */
|
|
48
|
+
setRules(rules: AlertRule[]): void;
|
|
49
|
+
/** Run any pending evaluation immediately (e.g. before a snapshot/test). */
|
|
50
|
+
flush(): void;
|
|
51
|
+
/** Stop: cancel pending work and release retained snapshots. */
|
|
52
|
+
detach(): void;
|
|
53
|
+
};
|
|
54
|
+
export declare function createAlertObserver<TData = Record<string, unknown>>(opts: AlertObserverOptions<TData>): AlertObserver<TData>;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { createAlertScheduler } from './alert-scheduler';
|
|
2
|
+
const clone = (r) => r && typeof r === 'object' ? { ...r } : r;
|
|
3
|
+
export function createAlertObserver(opts) {
|
|
4
|
+
const { engine, getRowId, onEvents } = opts;
|
|
5
|
+
const scheduler = opts.schedule && typeof opts.schedule === 'object'
|
|
6
|
+
? opts.schedule
|
|
7
|
+
: createAlertScheduler(opts.schedule ?? 'raf');
|
|
8
|
+
// Carry-over between runs. Only populated when a rule actually needs it.
|
|
9
|
+
let seeded = false;
|
|
10
|
+
let prevRows = []; // last array seen by scan (reference diff)
|
|
11
|
+
let prevSnapById = new Map(); // cloned prev VALUES (only if needsPrev)
|
|
12
|
+
let fullById = null; // full current set (only if needsFullSet)
|
|
13
|
+
// Pending work, accumulated between scheduler runs.
|
|
14
|
+
const pushQueue = new Map();
|
|
15
|
+
let scanSource = null;
|
|
16
|
+
function snapshotAll(rows) {
|
|
17
|
+
prevSnapById = new Map();
|
|
18
|
+
for (const row of rows)
|
|
19
|
+
prevSnapById.set(getRowId(row), clone(row));
|
|
20
|
+
}
|
|
21
|
+
function rebuildFullIndex(rows) {
|
|
22
|
+
fullById = new Map();
|
|
23
|
+
for (const row of rows)
|
|
24
|
+
fullById.set(getRowId(row), row);
|
|
25
|
+
}
|
|
26
|
+
function seedNow(rows) {
|
|
27
|
+
engine.reset();
|
|
28
|
+
engine.evaluate(rows); // arm dataChange/aggregate edges; discard the events
|
|
29
|
+
seeded = true;
|
|
30
|
+
prevRows = rows;
|
|
31
|
+
if (engine.needsPrev())
|
|
32
|
+
snapshotAll(rows);
|
|
33
|
+
else
|
|
34
|
+
prevSnapById = new Map();
|
|
35
|
+
if (engine.needsFullSet())
|
|
36
|
+
rebuildFullIndex(rows);
|
|
37
|
+
else
|
|
38
|
+
fullById = null;
|
|
39
|
+
}
|
|
40
|
+
function emit(events) {
|
|
41
|
+
if (events.length)
|
|
42
|
+
onEvents(events);
|
|
43
|
+
}
|
|
44
|
+
/** PUSH run: evaluate exactly the queued rows (or the full set for aggregates). */
|
|
45
|
+
function runPush() {
|
|
46
|
+
const next = [...pushQueue.values()];
|
|
47
|
+
pushQueue.clear();
|
|
48
|
+
if (next.length === 0)
|
|
49
|
+
return;
|
|
50
|
+
const needsPrev = engine.needsPrev();
|
|
51
|
+
if (engine.needsFullSet()) {
|
|
52
|
+
// Aggregates need every row; evaluate over the maintained full index.
|
|
53
|
+
const rows = fullById ? [...fullById.values()] : next;
|
|
54
|
+
const prev = needsPrev ? [...prevSnapById.values()] : [];
|
|
55
|
+
const events = engine.evaluateTransition(prev, rows);
|
|
56
|
+
if (needsPrev)
|
|
57
|
+
snapshotAll(rows);
|
|
58
|
+
emit(events);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const prev = needsPrev ? next.map((r) => prevSnapById.get(getRowId(r)) ?? r) : [];
|
|
62
|
+
if (needsPrev)
|
|
63
|
+
for (const r of next)
|
|
64
|
+
prevSnapById.set(getRowId(r), clone(r));
|
|
65
|
+
emit(engine.evaluateTransition(prev, next));
|
|
66
|
+
}
|
|
67
|
+
/** SCAN run: index-diff the latest full array and evaluate the mismatches. */
|
|
68
|
+
function runScan(rows) {
|
|
69
|
+
if (!seeded) {
|
|
70
|
+
seedNow(rows);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const needsPrev = engine.needsPrev();
|
|
74
|
+
const needsFull = engine.needsFullSet() || rows.length !== prevRows.length;
|
|
75
|
+
if (needsFull) {
|
|
76
|
+
const prev = needsPrev ? [...prevSnapById.values()] : [];
|
|
77
|
+
const events = engine.evaluateTransition(prev, rows);
|
|
78
|
+
prevRows = rows;
|
|
79
|
+
if (needsPrev)
|
|
80
|
+
snapshotAll(rows);
|
|
81
|
+
if (engine.needsFullSet())
|
|
82
|
+
rebuildFullIndex(rows);
|
|
83
|
+
emit(events);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Fast path: index-aligned reference diff (unchanged rows keep their ref).
|
|
87
|
+
const changedNext = [];
|
|
88
|
+
const changedPrev = [];
|
|
89
|
+
for (let i = 0; i < rows.length; i++) {
|
|
90
|
+
if (rows[i] !== prevRows[i]) {
|
|
91
|
+
const row = rows[i];
|
|
92
|
+
changedNext.push(row);
|
|
93
|
+
if (needsPrev)
|
|
94
|
+
changedPrev.push(prevSnapById.get(getRowId(row)) ?? row);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
prevRows = rows;
|
|
98
|
+
if (changedNext.length === 0)
|
|
99
|
+
return;
|
|
100
|
+
if (needsPrev)
|
|
101
|
+
for (const r of changedNext)
|
|
102
|
+
prevSnapById.set(getRowId(r), clone(r));
|
|
103
|
+
emit(engine.evaluateTransition(changedPrev, changedNext));
|
|
104
|
+
}
|
|
105
|
+
function run() {
|
|
106
|
+
// A consumer drives one mode at a time; be defensive and honour whichever
|
|
107
|
+
// has pending work (scan takes precedence as it carries the full set).
|
|
108
|
+
if (scanSource) {
|
|
109
|
+
const src = scanSource;
|
|
110
|
+
scanSource = null;
|
|
111
|
+
runScan(src());
|
|
112
|
+
}
|
|
113
|
+
if (pushQueue.size)
|
|
114
|
+
runPush();
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
seed(rows) {
|
|
118
|
+
// Seeding is a one-off; do it synchronously so edges are armed before the
|
|
119
|
+
// first data event, then let subsequent evaluations defer.
|
|
120
|
+
seedNow(rows);
|
|
121
|
+
},
|
|
122
|
+
pushChanged(rows) {
|
|
123
|
+
if (fullById)
|
|
124
|
+
for (const r of rows)
|
|
125
|
+
fullById.set(getRowId(r), r);
|
|
126
|
+
for (const r of rows)
|
|
127
|
+
pushQueue.set(getRowId(r), r);
|
|
128
|
+
if (!seeded)
|
|
129
|
+
seeded = true; // push implies the consumer is driving; edges arm lazily
|
|
130
|
+
scheduler.schedule(run);
|
|
131
|
+
},
|
|
132
|
+
scan(getRows) {
|
|
133
|
+
scanSource = getRows;
|
|
134
|
+
scheduler.schedule(run);
|
|
135
|
+
},
|
|
136
|
+
setRules(rules) {
|
|
137
|
+
engine.setRules(rules);
|
|
138
|
+
engine.reset();
|
|
139
|
+
// Force a fresh silent seed before anything fires under the new rules.
|
|
140
|
+
seeded = false;
|
|
141
|
+
prevSnapById = new Map();
|
|
142
|
+
fullById = null;
|
|
143
|
+
pushQueue.clear();
|
|
144
|
+
},
|
|
145
|
+
flush() {
|
|
146
|
+
scheduler.flush();
|
|
147
|
+
},
|
|
148
|
+
detach() {
|
|
149
|
+
scheduler.cancel();
|
|
150
|
+
prevSnapById = new Map();
|
|
151
|
+
fullById = null;
|
|
152
|
+
pushQueue.clear();
|
|
153
|
+
scanSource = null;
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* alert-scheduler - decouples WHEN alert evaluation runs from the reactive flush
|
|
3
|
+
* that mutates the grid's data. The whole performance premise of the rewrite is
|
|
4
|
+
* that alert work must never lengthen the frame that paints the grid: on a data
|
|
5
|
+
* change we schedule one evaluation for AFTER paint (`requestAnimationFrame`) and
|
|
6
|
+
* coalesce a burst of updates into a single run.
|
|
7
|
+
*
|
|
8
|
+
* Modes:
|
|
9
|
+
* - `raf` (default) - run once on the next animation frame, post-paint.
|
|
10
|
+
* - `idle` - run when the browser is idle (`requestIdleCallback`), best for
|
|
11
|
+
* non-urgent watch scans; falls back to `raf` where unavailable.
|
|
12
|
+
* - `sync` - run immediately (deterministic tests, or hosts with no rAF).
|
|
13
|
+
*
|
|
14
|
+
* The scheduler is intentionally tiny and dependency-free: it holds at most one
|
|
15
|
+
* pending callback (the latest wins), so repeated `schedule()` calls within a
|
|
16
|
+
* frame collapse to a single run. The observer accumulates the changed-row queue
|
|
17
|
+
* itself, so "latest wins" loses no work.
|
|
18
|
+
*/
|
|
19
|
+
export type AlertSchedulerMode = 'raf' | 'idle' | 'sync';
|
|
20
|
+
export type AlertScheduler = {
|
|
21
|
+
/** Queue `fn` to run once on the next tick (coalesced). */
|
|
22
|
+
schedule(fn: () => void): void;
|
|
23
|
+
/** Run any pending callback now, synchronously. No-op if nothing is pending. */
|
|
24
|
+
flush(): void;
|
|
25
|
+
/** Drop any pending callback without running it. */
|
|
26
|
+
cancel(): void;
|
|
27
|
+
/** Whether a callback is currently queued. */
|
|
28
|
+
readonly pending: boolean;
|
|
29
|
+
};
|
|
30
|
+
export declare function createAlertScheduler(mode?: AlertSchedulerMode): AlertScheduler;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const host = typeof globalThis !== 'undefined' ? globalThis : {};
|
|
2
|
+
function raf(cb) {
|
|
3
|
+
if (typeof host.requestAnimationFrame === 'function') {
|
|
4
|
+
const id = host.requestAnimationFrame(cb);
|
|
5
|
+
return () => host.cancelAnimationFrame?.(id);
|
|
6
|
+
}
|
|
7
|
+
const id = setTimeout(cb, 16);
|
|
8
|
+
return () => clearTimeout(id);
|
|
9
|
+
}
|
|
10
|
+
function idle(cb) {
|
|
11
|
+
if (typeof host.requestIdleCallback === 'function') {
|
|
12
|
+
const id = host.requestIdleCallback(cb);
|
|
13
|
+
return () => host.cancelIdleCallback?.(id);
|
|
14
|
+
}
|
|
15
|
+
return raf(cb);
|
|
16
|
+
}
|
|
17
|
+
export function createAlertScheduler(mode = 'raf') {
|
|
18
|
+
let pendingFn = null;
|
|
19
|
+
let cancelHandle = null;
|
|
20
|
+
const request = mode === 'idle' ? idle : raf;
|
|
21
|
+
const run = () => {
|
|
22
|
+
cancelHandle = null;
|
|
23
|
+
const fn = pendingFn;
|
|
24
|
+
pendingFn = null;
|
|
25
|
+
fn?.();
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
schedule(fn) {
|
|
29
|
+
if (mode === 'sync') {
|
|
30
|
+
fn();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Latest wins - the observer keeps the accumulated queue, so replacing the
|
|
34
|
+
// callback never drops queued rows; it just avoids double-running a frame.
|
|
35
|
+
pendingFn = fn;
|
|
36
|
+
if (!cancelHandle)
|
|
37
|
+
cancelHandle = request(run);
|
|
38
|
+
},
|
|
39
|
+
flush() {
|
|
40
|
+
if (!pendingFn)
|
|
41
|
+
return;
|
|
42
|
+
cancelHandle?.();
|
|
43
|
+
run();
|
|
44
|
+
},
|
|
45
|
+
cancel() {
|
|
46
|
+
cancelHandle?.();
|
|
47
|
+
cancelHandle = null;
|
|
48
|
+
pendingFn = null;
|
|
49
|
+
},
|
|
50
|
+
get pending() {
|
|
51
|
+
return pendingFn != null;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alert-rule persistence + sharing. Mirrors the grid's `named-views` storage
|
|
3
|
+
* shape: a pluggable `AlertRulesStorage` (in-memory or localStorage), wrapped by
|
|
4
|
+
* a small CRUD manager. `export()` / `import()` make a rule set shareable as
|
|
5
|
+
* JSON, so a team lead can hand round a set of alerts.
|
|
6
|
+
*/
|
|
7
|
+
import type { AlertRule } from './alert-types';
|
|
8
|
+
export type AlertRulesStorage = {
|
|
9
|
+
read(): AlertRule[];
|
|
10
|
+
write(rules: AlertRule[]): void;
|
|
11
|
+
};
|
|
12
|
+
/** In-memory storage (default). State lives only as long as the manager. */
|
|
13
|
+
export declare function memoryAlertRules(initial?: AlertRule[]): AlertRulesStorage;
|
|
14
|
+
/** localStorage-backed storage. Safe to construct under SSR (no-ops there). */
|
|
15
|
+
export declare function localStorageAlertRules(key: string): AlertRulesStorage;
|
|
16
|
+
export type AlertRulesManager = {
|
|
17
|
+
list(): AlertRule[];
|
|
18
|
+
get(id: string): AlertRule | undefined;
|
|
19
|
+
/** Insert or replace a rule (matched by id). Returns the saved rule. */
|
|
20
|
+
save(rule: AlertRule): AlertRule;
|
|
21
|
+
remove(id: string): boolean;
|
|
22
|
+
rename(id: string, name: string): boolean;
|
|
23
|
+
/** Flip a rule's `enabled` flag. Returns the new value (or undefined). */
|
|
24
|
+
toggle(id: string): boolean | undefined;
|
|
25
|
+
/** Serialise the whole rule set to shareable JSON. */
|
|
26
|
+
export(): string;
|
|
27
|
+
/** Replace the rule set from JSON produced by `export()`. */
|
|
28
|
+
import(json: string): AlertRule[];
|
|
29
|
+
};
|
|
30
|
+
/** CRUD manager over a storage adapter (defaults to in-memory). */
|
|
31
|
+
export declare function createAlertRules(storage?: AlertRulesStorage): AlertRulesManager;
|