@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
|
@@ -1,208 +0,0 @@
|
|
|
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 { createAlertScheduler, type AlertScheduler, type AlertSchedulerMode } from './alert-scheduler'
|
|
31
|
-
|
|
32
|
-
export type AlertObserverOptions<TData> = {
|
|
33
|
-
engine: AlertEngine<TData>
|
|
34
|
-
getRowId: (row: TData) => string
|
|
35
|
-
/** Fired events to route to side effects (toast/log/formats). Batched per run. */
|
|
36
|
-
onEvents: (events: AlertEvent[]) => void
|
|
37
|
-
/** Scheduling strategy (default `raf`), or a custom scheduler for tests. */
|
|
38
|
-
schedule?: AlertSchedulerMode | AlertScheduler
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export type AlertObserver<TData> = {
|
|
42
|
-
/** Silent full seed - arms edges from the current set so pre-existing matches
|
|
43
|
-
* do not fire. Call on mount and after a rule change (in push mode). */
|
|
44
|
-
seed(rows: ReadonlyArray<TData>): void
|
|
45
|
-
/** Queue changed rows for a deferred, O(changed) evaluation (push mode). */
|
|
46
|
-
pushChanged(rows: ReadonlyArray<TData>): void
|
|
47
|
-
/** Schedule a deferred index-diff scan of the latest full row set (watch mode). */
|
|
48
|
-
scan(getRows: () => ReadonlyArray<TData>): void
|
|
49
|
-
/** Swap the rule set; edge memory is reset and a fresh seed is required. */
|
|
50
|
-
setRules(rules: AlertRule[]): void
|
|
51
|
-
/** Run any pending evaluation immediately (e.g. before a snapshot/test). */
|
|
52
|
-
flush(): void
|
|
53
|
-
/** Stop: cancel pending work and release retained snapshots. */
|
|
54
|
-
detach(): void
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const clone = <TData>(r: TData): TData =>
|
|
58
|
-
r && typeof r === 'object' ? ({ ...(r as Record<string, unknown>) } as TData) : r
|
|
59
|
-
|
|
60
|
-
export function createAlertObserver<TData = Record<string, unknown>>(
|
|
61
|
-
opts: AlertObserverOptions<TData>,
|
|
62
|
-
): AlertObserver<TData> {
|
|
63
|
-
const { engine, getRowId, onEvents } = opts
|
|
64
|
-
const scheduler: AlertScheduler =
|
|
65
|
-
opts.schedule && typeof opts.schedule === 'object'
|
|
66
|
-
? opts.schedule
|
|
67
|
-
: createAlertScheduler(opts.schedule ?? 'raf')
|
|
68
|
-
|
|
69
|
-
// Carry-over between runs. Only populated when a rule actually needs it.
|
|
70
|
-
let seeded = false
|
|
71
|
-
let prevRows: ReadonlyArray<TData> = [] // last array seen by scan (reference diff)
|
|
72
|
-
let prevSnapById = new Map<string, TData>() // cloned prev VALUES (only if needsPrev)
|
|
73
|
-
let fullById: Map<string, TData> | null = null // full current set (only if needsFullSet)
|
|
74
|
-
|
|
75
|
-
// Pending work, accumulated between scheduler runs.
|
|
76
|
-
const pushQueue = new Map<string, TData>()
|
|
77
|
-
let scanSource: (() => ReadonlyArray<TData>) | null = null
|
|
78
|
-
|
|
79
|
-
function snapshotAll(rows: ReadonlyArray<TData>) {
|
|
80
|
-
prevSnapById = new Map()
|
|
81
|
-
for (const row of rows) prevSnapById.set(getRowId(row), clone(row))
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function rebuildFullIndex(rows: ReadonlyArray<TData>) {
|
|
85
|
-
fullById = new Map()
|
|
86
|
-
for (const row of rows) fullById.set(getRowId(row), row)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function seedNow(rows: ReadonlyArray<TData>) {
|
|
90
|
-
engine.reset()
|
|
91
|
-
engine.evaluate(rows) // arm dataChange/aggregate edges; discard the events
|
|
92
|
-
seeded = true
|
|
93
|
-
prevRows = rows
|
|
94
|
-
if (engine.needsPrev()) snapshotAll(rows)
|
|
95
|
-
else prevSnapById = new Map()
|
|
96
|
-
if (engine.needsFullSet()) rebuildFullIndex(rows)
|
|
97
|
-
else fullById = null
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function emit(events: AlertEvent[]) {
|
|
101
|
-
if (events.length) onEvents(events)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/** PUSH run: evaluate exactly the queued rows (or the full set for aggregates). */
|
|
105
|
-
function runPush() {
|
|
106
|
-
const next = [...pushQueue.values()]
|
|
107
|
-
pushQueue.clear()
|
|
108
|
-
if (next.length === 0) return
|
|
109
|
-
const needsPrev = engine.needsPrev()
|
|
110
|
-
|
|
111
|
-
if (engine.needsFullSet()) {
|
|
112
|
-
// Aggregates need every row; evaluate over the maintained full index.
|
|
113
|
-
const rows = fullById ? [...fullById.values()] : next
|
|
114
|
-
const prev = needsPrev ? [...prevSnapById.values()] : []
|
|
115
|
-
const events = engine.evaluateTransition(prev, rows)
|
|
116
|
-
if (needsPrev) snapshotAll(rows)
|
|
117
|
-
emit(events)
|
|
118
|
-
return
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const prev = needsPrev ? next.map((r) => prevSnapById.get(getRowId(r)) ?? r) : []
|
|
122
|
-
if (needsPrev) for (const r of next) prevSnapById.set(getRowId(r), clone(r))
|
|
123
|
-
emit(engine.evaluateTransition(prev, next))
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/** SCAN run: index-diff the latest full array and evaluate the mismatches. */
|
|
127
|
-
function runScan(rows: ReadonlyArray<TData>) {
|
|
128
|
-
if (!seeded) {
|
|
129
|
-
seedNow(rows)
|
|
130
|
-
return
|
|
131
|
-
}
|
|
132
|
-
const needsPrev = engine.needsPrev()
|
|
133
|
-
const needsFull = engine.needsFullSet() || rows.length !== prevRows.length
|
|
134
|
-
|
|
135
|
-
if (needsFull) {
|
|
136
|
-
const prev = needsPrev ? [...prevSnapById.values()] : []
|
|
137
|
-
const events = engine.evaluateTransition(prev, rows)
|
|
138
|
-
prevRows = rows
|
|
139
|
-
if (needsPrev) snapshotAll(rows)
|
|
140
|
-
if (engine.needsFullSet()) rebuildFullIndex(rows)
|
|
141
|
-
emit(events)
|
|
142
|
-
return
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Fast path: index-aligned reference diff (unchanged rows keep their ref).
|
|
146
|
-
const changedNext: TData[] = []
|
|
147
|
-
const changedPrev: TData[] = []
|
|
148
|
-
for (let i = 0; i < rows.length; i++) {
|
|
149
|
-
if (rows[i] !== prevRows[i]) {
|
|
150
|
-
const row = rows[i] as TData
|
|
151
|
-
changedNext.push(row)
|
|
152
|
-
if (needsPrev) changedPrev.push(prevSnapById.get(getRowId(row)) ?? row)
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
prevRows = rows
|
|
156
|
-
if (changedNext.length === 0) return
|
|
157
|
-
if (needsPrev) for (const r of changedNext) prevSnapById.set(getRowId(r), clone(r))
|
|
158
|
-
emit(engine.evaluateTransition(changedPrev, changedNext))
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
function run() {
|
|
162
|
-
// A consumer drives one mode at a time; be defensive and honour whichever
|
|
163
|
-
// has pending work (scan takes precedence as it carries the full set).
|
|
164
|
-
if (scanSource) {
|
|
165
|
-
const src = scanSource
|
|
166
|
-
scanSource = null
|
|
167
|
-
runScan(src())
|
|
168
|
-
}
|
|
169
|
-
if (pushQueue.size) runPush()
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
return {
|
|
173
|
-
seed(rows) {
|
|
174
|
-
// Seeding is a one-off; do it synchronously so edges are armed before the
|
|
175
|
-
// first data event, then let subsequent evaluations defer.
|
|
176
|
-
seedNow(rows)
|
|
177
|
-
},
|
|
178
|
-
pushChanged(rows) {
|
|
179
|
-
if (fullById) for (const r of rows) fullById.set(getRowId(r), r)
|
|
180
|
-
for (const r of rows) pushQueue.set(getRowId(r), r)
|
|
181
|
-
if (!seeded) seeded = true // push implies the consumer is driving; edges arm lazily
|
|
182
|
-
scheduler.schedule(run)
|
|
183
|
-
},
|
|
184
|
-
scan(getRows) {
|
|
185
|
-
scanSource = getRows
|
|
186
|
-
scheduler.schedule(run)
|
|
187
|
-
},
|
|
188
|
-
setRules(rules) {
|
|
189
|
-
engine.setRules(rules)
|
|
190
|
-
engine.reset()
|
|
191
|
-
// Force a fresh silent seed before anything fires under the new rules.
|
|
192
|
-
seeded = false
|
|
193
|
-
prevSnapById = new Map()
|
|
194
|
-
fullById = null
|
|
195
|
-
pushQueue.clear()
|
|
196
|
-
},
|
|
197
|
-
flush() {
|
|
198
|
-
scheduler.flush()
|
|
199
|
-
},
|
|
200
|
-
detach() {
|
|
201
|
-
scheduler.cancel()
|
|
202
|
-
prevSnapById = new Map()
|
|
203
|
-
fullById = null
|
|
204
|
-
pushQueue.clear()
|
|
205
|
-
scanSource = null
|
|
206
|
-
},
|
|
207
|
-
}
|
|
208
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
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
|
-
|
|
21
|
-
export type AlertScheduler = {
|
|
22
|
-
/** Queue `fn` to run once on the next tick (coalesced). */
|
|
23
|
-
schedule(fn: () => void): void
|
|
24
|
-
/** Run any pending callback now, synchronously. No-op if nothing is pending. */
|
|
25
|
-
flush(): void
|
|
26
|
-
/** Drop any pending callback without running it. */
|
|
27
|
-
cancel(): void
|
|
28
|
-
/** Whether a callback is currently queued. */
|
|
29
|
-
readonly pending: boolean
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
type RafHost = {
|
|
33
|
-
requestAnimationFrame?: (cb: () => void) => number
|
|
34
|
-
cancelAnimationFrame?: (handle: number) => void
|
|
35
|
-
requestIdleCallback?: (cb: () => void) => number
|
|
36
|
-
cancelIdleCallback?: (handle: number) => void
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const host: RafHost = typeof globalThis !== 'undefined' ? (globalThis as RafHost) : {}
|
|
40
|
-
|
|
41
|
-
function raf(cb: () => void): () => void {
|
|
42
|
-
if (typeof host.requestAnimationFrame === 'function') {
|
|
43
|
-
const id = host.requestAnimationFrame(cb)
|
|
44
|
-
return () => host.cancelAnimationFrame?.(id)
|
|
45
|
-
}
|
|
46
|
-
const id = setTimeout(cb, 16)
|
|
47
|
-
return () => clearTimeout(id)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function idle(cb: () => void): () => void {
|
|
51
|
-
if (typeof host.requestIdleCallback === 'function') {
|
|
52
|
-
const id = host.requestIdleCallback(cb)
|
|
53
|
-
return () => host.cancelIdleCallback?.(id)
|
|
54
|
-
}
|
|
55
|
-
return raf(cb)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function createAlertScheduler(mode: AlertSchedulerMode = 'raf'): AlertScheduler {
|
|
59
|
-
let pendingFn: (() => void) | null = null
|
|
60
|
-
let cancelHandle: (() => void) | null = null
|
|
61
|
-
|
|
62
|
-
const request = mode === 'idle' ? idle : raf
|
|
63
|
-
|
|
64
|
-
const run = () => {
|
|
65
|
-
cancelHandle = null
|
|
66
|
-
const fn = pendingFn
|
|
67
|
-
pendingFn = null
|
|
68
|
-
fn?.()
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
schedule(fn) {
|
|
73
|
-
if (mode === 'sync') {
|
|
74
|
-
fn()
|
|
75
|
-
return
|
|
76
|
-
}
|
|
77
|
-
// Latest wins - the observer keeps the accumulated queue, so replacing the
|
|
78
|
-
// callback never drops queued rows; it just avoids double-running a frame.
|
|
79
|
-
pendingFn = fn
|
|
80
|
-
if (!cancelHandle) cancelHandle = request(run)
|
|
81
|
-
},
|
|
82
|
-
flush() {
|
|
83
|
-
if (!pendingFn) return
|
|
84
|
-
cancelHandle?.()
|
|
85
|
-
run()
|
|
86
|
-
},
|
|
87
|
-
cancel() {
|
|
88
|
-
cancelHandle?.()
|
|
89
|
-
cancelHandle = null
|
|
90
|
-
pendingFn = null
|
|
91
|
-
},
|
|
92
|
-
get pending() {
|
|
93
|
-
return pendingFn != null
|
|
94
|
-
},
|
|
95
|
-
}
|
|
96
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import { createAlertRules, memoryAlertRules } from './alert-storage'
|
|
3
|
-
import type { AlertRule } from './alert-types'
|
|
4
|
-
|
|
5
|
-
const rule = (id: string, over: Partial<AlertRule> = {}): AlertRule => ({
|
|
6
|
-
id,
|
|
7
|
-
name: `Rule ${id}`,
|
|
8
|
-
enabled: true,
|
|
9
|
-
severity: 'info',
|
|
10
|
-
scope: 'row',
|
|
11
|
-
predicate: { kind: 'const', value: true },
|
|
12
|
-
trigger: { type: 'dataChange' },
|
|
13
|
-
actions: [{ kind: 'toast' }],
|
|
14
|
-
createdAt: 0,
|
|
15
|
-
...over,
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
describe('createAlertRules CRUD', () => {
|
|
19
|
-
it('saves, replaces, gets, removes and toggles', () => {
|
|
20
|
-
const mgr = createAlertRules(memoryAlertRules())
|
|
21
|
-
mgr.save(rule('a'))
|
|
22
|
-
mgr.save(rule('b'))
|
|
23
|
-
expect(mgr.list().map((r) => r.id)).toEqual(['a', 'b'])
|
|
24
|
-
|
|
25
|
-
// Save with an existing id replaces in place.
|
|
26
|
-
mgr.save(rule('a', { name: 'Renamed' }))
|
|
27
|
-
expect(mgr.get('a')?.name).toBe('Renamed')
|
|
28
|
-
expect(mgr.list()).toHaveLength(2)
|
|
29
|
-
|
|
30
|
-
expect(mgr.toggle('a')).toBe(false)
|
|
31
|
-
expect(mgr.get('a')?.enabled).toBe(false)
|
|
32
|
-
|
|
33
|
-
expect(mgr.rename('b', 'Bee')).toBe(true)
|
|
34
|
-
expect(mgr.get('b')?.name).toBe('Bee')
|
|
35
|
-
|
|
36
|
-
expect(mgr.remove('a')).toBe(true)
|
|
37
|
-
expect(mgr.remove('missing')).toBe(false)
|
|
38
|
-
expect(mgr.list().map((r) => r.id)).toEqual(['b'])
|
|
39
|
-
})
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
describe('export / import share', () => {
|
|
43
|
-
it('round-trips a rule set through JSON', () => {
|
|
44
|
-
const src = createAlertRules(memoryAlertRules())
|
|
45
|
-
src.save(rule('a'))
|
|
46
|
-
src.save(rule('b', { severity: 'error' }))
|
|
47
|
-
const json = src.export()
|
|
48
|
-
|
|
49
|
-
const dest = createAlertRules(memoryAlertRules())
|
|
50
|
-
const imported = dest.import(json)
|
|
51
|
-
expect(imported).toHaveLength(2)
|
|
52
|
-
expect(dest.get('b')?.severity).toBe('error')
|
|
53
|
-
})
|
|
54
|
-
})
|
|
@@ -1,116 +0,0 @@
|
|
|
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
|
-
|
|
9
|
-
export type AlertRulesStorage = {
|
|
10
|
-
read(): AlertRule[]
|
|
11
|
-
write(rules: AlertRule[]): void
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/** In-memory storage (default). State lives only as long as the manager. */
|
|
15
|
-
export function memoryAlertRules(initial: AlertRule[] = []): AlertRulesStorage {
|
|
16
|
-
let rules = [...initial]
|
|
17
|
-
return {
|
|
18
|
-
read: () => rules,
|
|
19
|
-
write: (next) => {
|
|
20
|
-
rules = next
|
|
21
|
-
},
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** localStorage-backed storage. Safe to construct under SSR (no-ops there). */
|
|
26
|
-
export function localStorageAlertRules(key: string): AlertRulesStorage {
|
|
27
|
-
const available = typeof localStorage !== 'undefined'
|
|
28
|
-
return {
|
|
29
|
-
read() {
|
|
30
|
-
if (!available) return []
|
|
31
|
-
try {
|
|
32
|
-
const raw = localStorage.getItem(key)
|
|
33
|
-
const parsed = raw ? JSON.parse(raw) : []
|
|
34
|
-
return Array.isArray(parsed) ? (parsed as AlertRule[]) : []
|
|
35
|
-
} catch {
|
|
36
|
-
return []
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
write(rules) {
|
|
40
|
-
if (!available) return
|
|
41
|
-
try {
|
|
42
|
-
localStorage.setItem(key, JSON.stringify(rules))
|
|
43
|
-
} catch {
|
|
44
|
-
// quota / private-mode - persistence is best-effort
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export type AlertRulesManager = {
|
|
51
|
-
list(): AlertRule[]
|
|
52
|
-
get(id: string): AlertRule | undefined
|
|
53
|
-
/** Insert or replace a rule (matched by id). Returns the saved rule. */
|
|
54
|
-
save(rule: AlertRule): AlertRule
|
|
55
|
-
remove(id: string): boolean
|
|
56
|
-
rename(id: string, name: string): boolean
|
|
57
|
-
/** Flip a rule's `enabled` flag. Returns the new value (or undefined). */
|
|
58
|
-
toggle(id: string): boolean | undefined
|
|
59
|
-
/** Serialise the whole rule set to shareable JSON. */
|
|
60
|
-
export(): string
|
|
61
|
-
/** Replace the rule set from JSON produced by `export()`. */
|
|
62
|
-
import(json: string): AlertRule[]
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** CRUD manager over a storage adapter (defaults to in-memory). */
|
|
66
|
-
export function createAlertRules(
|
|
67
|
-
storage: AlertRulesStorage = memoryAlertRules(),
|
|
68
|
-
): AlertRulesManager {
|
|
69
|
-
const load = () => storage.read()
|
|
70
|
-
const commit = (rules: AlertRule[]) => storage.write(rules)
|
|
71
|
-
|
|
72
|
-
return {
|
|
73
|
-
list: () => load(),
|
|
74
|
-
get: (id) => load().find((r) => r.id === id),
|
|
75
|
-
save(rule) {
|
|
76
|
-
const rules = load()
|
|
77
|
-
const i = rules.findIndex((r) => r.id === rule.id)
|
|
78
|
-
if (i >= 0) rules[i] = rule
|
|
79
|
-
else rules.push(rule)
|
|
80
|
-
commit(rules)
|
|
81
|
-
return rule
|
|
82
|
-
},
|
|
83
|
-
remove(id) {
|
|
84
|
-
const rules = load()
|
|
85
|
-
const next = rules.filter((r) => r.id !== id)
|
|
86
|
-
if (next.length === rules.length) return false
|
|
87
|
-
commit(next)
|
|
88
|
-
return true
|
|
89
|
-
},
|
|
90
|
-
rename(id, name) {
|
|
91
|
-
const rules = load()
|
|
92
|
-
const rule = rules.find((r) => r.id === id)
|
|
93
|
-
if (!rule) return false
|
|
94
|
-
rule.name = name
|
|
95
|
-
commit(rules)
|
|
96
|
-
return true
|
|
97
|
-
},
|
|
98
|
-
toggle(id) {
|
|
99
|
-
const rules = load()
|
|
100
|
-
const rule = rules.find((r) => r.id === id)
|
|
101
|
-
if (!rule) return undefined
|
|
102
|
-
rule.enabled = !rule.enabled
|
|
103
|
-
commit(rules)
|
|
104
|
-
return rule.enabled
|
|
105
|
-
},
|
|
106
|
-
export() {
|
|
107
|
-
return JSON.stringify(load(), null, 2)
|
|
108
|
-
},
|
|
109
|
-
import(json) {
|
|
110
|
-
const parsed = JSON.parse(json)
|
|
111
|
-
const rules = Array.isArray(parsed) ? (parsed as AlertRule[]) : []
|
|
112
|
-
commit(rules)
|
|
113
|
-
return rules
|
|
114
|
-
},
|
|
115
|
-
}
|
|
116
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* alert-store - the reactive log behind the alerts badge + panel. A singleton
|
|
3
|
-
* queue of fired `AlertEvent`s (newest first) with an unacknowledged count,
|
|
4
|
-
* mirroring the grid's `toast-store` shape. The observer pushes events here; the
|
|
5
|
-
* badge reads `activeCount`; the panel lists, acknowledges, and clears them.
|
|
6
|
-
*
|
|
7
|
-
* Perf: a burst of events from one evaluation is written in ONE array update via
|
|
8
|
-
* `pushMany` (not one reassignment per event), and `activeCount` is a maintained
|
|
9
|
-
* counter - not an O(n) reduce recomputed on every render.
|
|
10
|
-
*/
|
|
11
|
-
import type { AlertEvent } from './alert-types'
|
|
12
|
-
|
|
13
|
-
const MAX = 500
|
|
14
|
-
|
|
15
|
-
function createAlertStore() {
|
|
16
|
-
let events = $state<AlertEvent[]>([])
|
|
17
|
-
let active = $state(0)
|
|
18
|
-
let seq = 0
|
|
19
|
-
|
|
20
|
-
/** Recompute the unacknowledged counter after a trim/clear/ack. */
|
|
21
|
-
function recount(list: ReadonlyArray<AlertEvent>): number {
|
|
22
|
-
let n = 0
|
|
23
|
-
for (const e of list) if (!e.acknowledged) n++
|
|
24
|
-
return n
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return {
|
|
28
|
-
get events() {
|
|
29
|
-
return events
|
|
30
|
-
},
|
|
31
|
-
/** Number of unacknowledged events (what the badge shows). */
|
|
32
|
-
get activeCount() {
|
|
33
|
-
return active
|
|
34
|
-
},
|
|
35
|
-
/** Append one event (kept for API compatibility; prefer `pushMany`). */
|
|
36
|
-
push(event: AlertEvent) {
|
|
37
|
-
this.pushMany([event])
|
|
38
|
-
},
|
|
39
|
-
/** Append a batch of events in a single reactive update (newest first). */
|
|
40
|
-
pushMany(batch: ReadonlyArray<AlertEvent>) {
|
|
41
|
-
if (batch.length === 0) return
|
|
42
|
-
const tagged: AlertEvent[] = []
|
|
43
|
-
let added = 0
|
|
44
|
-
// Newest first: reverse so the last event in the batch ends up on top.
|
|
45
|
-
for (let i = batch.length - 1; i >= 0; i--) {
|
|
46
|
-
tagged.push({ ...batch[i]!, _id: ++seq } as AlertEvent & { _id: number })
|
|
47
|
-
if (!batch[i]!.acknowledged) added++
|
|
48
|
-
}
|
|
49
|
-
let next = [...tagged, ...events]
|
|
50
|
-
if (next.length > MAX) {
|
|
51
|
-
next = next.slice(0, MAX)
|
|
52
|
-
// A trim can drop unacknowledged events - recount to stay exact.
|
|
53
|
-
active = recount(next)
|
|
54
|
-
} else {
|
|
55
|
-
active += added
|
|
56
|
-
}
|
|
57
|
-
events = next
|
|
58
|
-
},
|
|
59
|
-
acknowledge(index: number) {
|
|
60
|
-
const next = events.slice()
|
|
61
|
-
const cur = next[index]
|
|
62
|
-
if (cur && !cur.acknowledged) {
|
|
63
|
-
next[index] = { ...cur, acknowledged: true }
|
|
64
|
-
active = Math.max(0, active - 1)
|
|
65
|
-
events = next
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
acknowledgeAll() {
|
|
69
|
-
events = events.map((e) => (e.acknowledged ? e : { ...e, acknowledged: true }))
|
|
70
|
-
active = 0
|
|
71
|
-
},
|
|
72
|
-
clear() {
|
|
73
|
-
events = []
|
|
74
|
-
active = 0
|
|
75
|
-
},
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/** The shared alerts log. Read `.events` / `.activeCount` inside a component. */
|
|
80
|
-
export const alertStore = createAlertStore()
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Alert Rules engine - the model layer.
|
|
3
|
-
*
|
|
4
|
-
* An alert rule is a declarative "when this predicate holds (or this value
|
|
5
|
-
* moves), do these things": raise a toast, paint a badge/highlight, flash the
|
|
6
|
-
* cell, veto the edit, or log it. Rules are authored by end users at runtime,
|
|
7
|
-
* persisted, and shareable - the AdapTable-style alerting surface, built on the
|
|
8
|
-
* grid's own filter/conditional-format engines.
|
|
9
|
-
*
|
|
10
|
-
* Predicates and change tests come from the expression layer (`../expressions`).
|
|
11
|
-
*/
|
|
12
|
-
import type { ChangeExpr, PredicateExpr } from '../expressions/expression-types'
|
|
13
|
-
import type { Schedule } from '../scheduling'
|
|
14
|
-
|
|
15
|
-
/** Maps onto the toast variants + conditional-format intent. */
|
|
16
|
-
export type AlertSeverity = 'info' | 'success' | 'warning' | 'error'
|
|
17
|
-
|
|
18
|
-
/** What the rule watches over. */
|
|
19
|
-
export type AlertScope = 'row' | 'cell' | 'aggregate'
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* When a rule fires:
|
|
23
|
-
* - `dataChange` - a row newly satisfies `predicate` after an edit/update.
|
|
24
|
-
* - `relativeChange` - a value moved (delta / percent / crossed a threshold).
|
|
25
|
-
* - `validation` - evaluated on edit; may veto the change (`preventEdit`).
|
|
26
|
-
* - `scheduled` - re-checked on a cron/one-off schedule (reuses the enterprise
|
|
27
|
-
* scheduler); surfaces rows currently matching `predicate`.
|
|
28
|
-
*/
|
|
29
|
-
export type AlertTrigger =
|
|
30
|
-
| { type: 'dataChange' }
|
|
31
|
-
| { type: 'relativeChange'; expr: ChangeExpr }
|
|
32
|
-
| { type: 'validation' }
|
|
33
|
-
| { type: 'scheduled'; schedule: Schedule }
|
|
34
|
-
|
|
35
|
-
/** A thing the rule does when it fires. */
|
|
36
|
-
export type AlertActionKind =
|
|
37
|
-
| 'toast'
|
|
38
|
-
| 'badge'
|
|
39
|
-
| 'cellFlash'
|
|
40
|
-
| 'highlight'
|
|
41
|
-
| 'preventEdit'
|
|
42
|
-
| 'log'
|
|
43
|
-
|
|
44
|
-
/** Visual styling for `badge` / `highlight` actions. */
|
|
45
|
-
export type AlertActionStyle = {
|
|
46
|
-
background?: string
|
|
47
|
-
color?: string
|
|
48
|
-
/** A short glyph/emoji shown as a badge. */
|
|
49
|
-
icon?: string
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export type AlertAction = {
|
|
53
|
-
kind: AlertActionKind
|
|
54
|
-
/**
|
|
55
|
-
* Message template. Tokens: `{rule}`, `{severity}`, `{column}`, `{value}`,
|
|
56
|
-
* and `{field}` / `{row.field}` for any row field.
|
|
57
|
-
*/
|
|
58
|
-
message?: string
|
|
59
|
-
style?: AlertActionStyle
|
|
60
|
-
/** Columns the badge/highlight/flash targets (defaults to the rule's). */
|
|
61
|
-
columns?: string[]
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export type AlertRule = {
|
|
65
|
-
id: string
|
|
66
|
-
name: string
|
|
67
|
-
enabled: boolean
|
|
68
|
-
severity: AlertSeverity
|
|
69
|
-
scope: AlertScope
|
|
70
|
-
predicate: PredicateExpr
|
|
71
|
-
trigger: AlertTrigger
|
|
72
|
-
actions: AlertAction[]
|
|
73
|
-
/** Columns in scope for cell-level styling (badge/highlight/flash). */
|
|
74
|
-
columns?: string[]
|
|
75
|
-
createdAt: number
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/** A single firing of a rule. */
|
|
79
|
-
export type AlertEvent = {
|
|
80
|
-
ruleId: string
|
|
81
|
-
ruleName: string
|
|
82
|
-
severity: AlertSeverity
|
|
83
|
-
scope: AlertScope
|
|
84
|
-
triggerType: AlertTrigger['type']
|
|
85
|
-
/** The row that matched (absent for aggregate-scope events). */
|
|
86
|
-
rowId?: string
|
|
87
|
-
/** The column that triggered/targets the event, when applicable. */
|
|
88
|
-
columnId?: string
|
|
89
|
-
value?: unknown
|
|
90
|
-
message: string
|
|
91
|
-
actions: AlertAction[]
|
|
92
|
-
firedAt: number
|
|
93
|
-
acknowledged?: boolean
|
|
94
|
-
}
|