@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,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scheduler-summary - the pure core behind Scheduler Pro's *per-time-column
|
|
3
|
+
* summary* strip (counts / sums / a custom roll-up aligned to the timeline axis).
|
|
4
|
+
* No Svelte, no DOM. Each event is clipped to the column it falls in before the
|
|
5
|
+
* reducer runs, so duration-based reducers (busy minutes) are per-column.
|
|
6
|
+
*/
|
|
7
|
+
const MS_MIN = 60000;
|
|
8
|
+
function overlaps(aStart, aEnd, bStart, bEnd) {
|
|
9
|
+
return aStart.getTime() < bEnd.getTime() && aEnd.getTime() > bStart.getTime();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* One summary value per column. For each column, collect the events overlapping
|
|
13
|
+
* it, clip each to the column bounds, then apply `reducer`. Empty columns yield
|
|
14
|
+
* `0` for `count` / `sum` and `reducer([])` for the function form.
|
|
15
|
+
*/
|
|
16
|
+
export function columnSummaries(events, columns, reducer, opts) {
|
|
17
|
+
return columns.map((col) => {
|
|
18
|
+
const items = [];
|
|
19
|
+
for (const e of events) {
|
|
20
|
+
const s = opts.startOf(e);
|
|
21
|
+
const en = opts.endOf(e);
|
|
22
|
+
if (!overlaps(s, en, col.start, col.end))
|
|
23
|
+
continue;
|
|
24
|
+
items.push({
|
|
25
|
+
row: opts.rowOf(e),
|
|
26
|
+
start: new Date(Math.max(s.getTime(), col.start.getTime())),
|
|
27
|
+
end: new Date(Math.min(en.getTime(), col.end.getTime())),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (reducer === 'count')
|
|
31
|
+
return items.length;
|
|
32
|
+
if (typeof reducer === 'function')
|
|
33
|
+
return reducer(items);
|
|
34
|
+
// { sum: field }
|
|
35
|
+
const field = reducer.sum;
|
|
36
|
+
let total = 0;
|
|
37
|
+
for (const it of items) {
|
|
38
|
+
const v = it.row[field];
|
|
39
|
+
if (typeof v === 'number' && Number.isFinite(v))
|
|
40
|
+
total += v;
|
|
41
|
+
}
|
|
42
|
+
return total;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Built-in reducer: sum a numeric row field. */
|
|
46
|
+
export function sumReducer(field) {
|
|
47
|
+
return { sum: field };
|
|
48
|
+
}
|
|
49
|
+
/** Built-in reducer: count events. */
|
|
50
|
+
export const countReducer = 'count';
|
|
51
|
+
/** Built-in reducer: total column-clipped busy minutes across the column's events. */
|
|
52
|
+
export function busyMinutesReducer() {
|
|
53
|
+
return (items) => items.reduce((sum, it) => sum + (it.end.getTime() - it.start.getTime()) / MS_MIN, 0);
|
|
54
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register the Enterprise scheduler view. Idempotent - safe to call from every
|
|
3
|
+
* component that uses `scheduler`, or once at app start. Also invoked by
|
|
4
|
+
* {@link installEnterprise} so wiring the Pro API turns the view on too.
|
|
5
|
+
*/
|
|
6
|
+
export declare function enableSchedulerView(): void;
|
|
7
|
+
export { default as SvGridScheduler } from './SvGridScheduler.svelte';
|
|
@@ -15,23 +15,22 @@
|
|
|
15
15
|
* // then: <SvGrid {data} {columns} scheduler={{ startField: 'start', endField: 'end' }} />
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
|
-
import { registerSchedulerView } from '@svgrid/grid'
|
|
19
|
-
import { isLicenseKeySet } from './license'
|
|
20
|
-
import { emitUnlicensedNudge } from './watermark'
|
|
21
|
-
import SvGridScheduler from './SvGridScheduler.svelte'
|
|
22
|
-
|
|
23
|
-
let enabled = false
|
|
24
|
-
|
|
18
|
+
import { registerSchedulerView } from '@svgrid/grid';
|
|
19
|
+
import { isLicenseKeySet } from './license';
|
|
20
|
+
import { emitUnlicensedNudge } from './watermark';
|
|
21
|
+
import SvGridScheduler from './SvGridScheduler.svelte';
|
|
22
|
+
let enabled = false;
|
|
25
23
|
/**
|
|
26
24
|
* Register the Enterprise scheduler view. Idempotent - safe to call from every
|
|
27
25
|
* component that uses `scheduler`, or once at app start. Also invoked by
|
|
28
26
|
* {@link installEnterprise} so wiring the Pro API turns the view on too.
|
|
29
27
|
*/
|
|
30
|
-
export function enableSchedulerView()
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
export function enableSchedulerView() {
|
|
29
|
+
if (enabled)
|
|
30
|
+
return;
|
|
31
|
+
enabled = true;
|
|
32
|
+
registerSchedulerView(SvGridScheduler);
|
|
33
|
+
if (!isLicenseKeySet())
|
|
34
|
+
emitUnlicensedNudge();
|
|
35
35
|
}
|
|
36
|
-
|
|
37
|
-
export { default as SvGridScheduler } from './SvGridScheduler.svelte'
|
|
36
|
+
export { default as SvGridScheduler } from './SvGridScheduler.svelte';
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduling - client-side, cron-driven automation for grid actions.
|
|
3
|
+
*
|
|
4
|
+
* Two everyday jobs that normally need a backend job runner - "email me this
|
|
5
|
+
* report every weekday at 17:30" and "remind the desk at 09:00 to reconcile" -
|
|
6
|
+
* are, in a long-lived data app, just a timer plus an action you already have:
|
|
7
|
+
* an export (`api.exportCsv` / `@svgrid/enterprise` Excel/PDF) or an alert
|
|
8
|
+
* (`toast`). This module supplies the missing middle: a pure cron matcher and a
|
|
9
|
+
* small runtime that fires your callback when a schedule comes due.
|
|
10
|
+
*
|
|
11
|
+
* Everything here is pure and injectable (`now`), so the matching logic is
|
|
12
|
+
* unit-testable without wall-clock flakiness, and the render/app layer just
|
|
13
|
+
* wires `onFire` to whatever action it wants.
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { createScheduler } from '@svgrid/enterprise'
|
|
17
|
+
* import { toast } from '@svgrid/grid'
|
|
18
|
+
*
|
|
19
|
+
* const scheduler = createScheduler({
|
|
20
|
+
* schedules: [
|
|
21
|
+
* { id: 'eod', name: 'End-of-day CSV', cron: '30 17 * * 1-5' },
|
|
22
|
+
* { id: 'standup', name: 'Stand-up reminder', cron: '0 9 * * *' },
|
|
23
|
+
* ],
|
|
24
|
+
* onFire(schedule) {
|
|
25
|
+
* if (schedule.id === 'eod') api.exportCsv({ filename: 'eod' })
|
|
26
|
+
* else toast.info(`${schedule.name}`)
|
|
27
|
+
* },
|
|
28
|
+
* })
|
|
29
|
+
* scheduler.start() // stop() on teardown
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* Caveat, by design: schedules run entirely in the browser tab, so the app has
|
|
33
|
+
* to be open when a schedule is due. Pair with a server job for guaranteed
|
|
34
|
+
* delivery; use this for the far more common "the dashboard is always up on the
|
|
35
|
+
* wall" case where a backend cron is overkill.
|
|
36
|
+
*/
|
|
37
|
+
/** A field in the range [min, max] that a parsed cron sub-expression matches. */
|
|
38
|
+
type CronField = {
|
|
39
|
+
min: number;
|
|
40
|
+
max: number;
|
|
41
|
+
match: (n: number) => boolean;
|
|
42
|
+
};
|
|
43
|
+
export type Schedule = {
|
|
44
|
+
/** Stable id - used to dedupe fires and to key your `onFire` switch. */
|
|
45
|
+
id: string;
|
|
46
|
+
/** Human label shown in a schedules panel / toast. */
|
|
47
|
+
name?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Recurring trigger: a standard 5-field cron expression
|
|
50
|
+
* `"minute hour day-of-month month day-of-week"`. Ignored when `runAt` is set.
|
|
51
|
+
* Supports `*`, lists (`1,15`), ranges (`1-5`), and steps (`*/15`, `9-17/2`).
|
|
52
|
+
* Day-of-week is `0-6` with Sunday `0` (`7` also accepted for Sunday).
|
|
53
|
+
*/
|
|
54
|
+
cron?: string;
|
|
55
|
+
/**
|
|
56
|
+
* One-off trigger: an ISO datetime string. Fires a single time when the
|
|
57
|
+
* wall clock reaches that minute, then never again. Takes precedence over
|
|
58
|
+
* `cron` when both are present.
|
|
59
|
+
*/
|
|
60
|
+
runAt?: string;
|
|
61
|
+
/** Set `false` to keep the definition but stop it firing. Default `true`. */
|
|
62
|
+
enabled?: boolean;
|
|
63
|
+
};
|
|
64
|
+
type ParsedCron = {
|
|
65
|
+
minute: CronField;
|
|
66
|
+
hour: CronField;
|
|
67
|
+
dom: CronField;
|
|
68
|
+
month: CronField;
|
|
69
|
+
dow: CronField;
|
|
70
|
+
/** True when BOTH day-of-month and day-of-week are restricted (not `*`). */
|
|
71
|
+
domAndDowRestricted: boolean;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Parse a 5-field cron expression. Throws on the wrong field count or an
|
|
75
|
+
* unparseable field, so a bad schedule surfaces at setup, not silently at 3am.
|
|
76
|
+
*/
|
|
77
|
+
export declare function parseCron(expr: string): ParsedCron;
|
|
78
|
+
/** Whether a parsed cron matches a specific `Date` to the minute. */
|
|
79
|
+
export declare function cronMatchesParsed(parsed: ParsedCron, date: Date): boolean;
|
|
80
|
+
/** Whether a cron expression matches a `Date` to the minute. */
|
|
81
|
+
export declare function cronMatches(expr: string, date: Date): boolean;
|
|
82
|
+
/** Whether a schedule is due to fire during the minute containing `date`. */
|
|
83
|
+
export declare function isScheduleDue(schedule: Schedule, date: Date): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* The next `Date` (to the minute) at or after `from` that `schedule` fires,
|
|
86
|
+
* or `null` if it never will again (past one-off, or no match within a year).
|
|
87
|
+
* Handy for a "next run" column in a schedules panel.
|
|
88
|
+
*/
|
|
89
|
+
export declare function nextRun(schedule: Schedule, from: Date): Date | null;
|
|
90
|
+
export type SchedulerOptions = {
|
|
91
|
+
/** The schedules to run. Read once per tick, so you may mutate the array. */
|
|
92
|
+
schedules: ReadonlyArray<Schedule>;
|
|
93
|
+
/** Called when a schedule comes due. Receives the schedule + the fire time. */
|
|
94
|
+
onFire: (schedule: Schedule, firedAt: Date) => void;
|
|
95
|
+
/**
|
|
96
|
+
* Clock source, injectable for tests. Default `() => new Date()`.
|
|
97
|
+
*/
|
|
98
|
+
now?: () => Date;
|
|
99
|
+
/**
|
|
100
|
+
* How often to check, in ms. Default 30_000 (twice a minute) so a fire is
|
|
101
|
+
* never more than ~30s late; per-minute dedupe keeps it firing once.
|
|
102
|
+
*/
|
|
103
|
+
intervalMs?: number;
|
|
104
|
+
};
|
|
105
|
+
export type Scheduler = {
|
|
106
|
+
/** Begin ticking. No-op if already started. */
|
|
107
|
+
start: () => void;
|
|
108
|
+
/** Stop ticking and clear the timer. */
|
|
109
|
+
stop: () => void;
|
|
110
|
+
/**
|
|
111
|
+
* Run one check against `at` (default now) and fire anything due. Exposed for
|
|
112
|
+
* tests and for a "run due now" button; the internal tick calls this too.
|
|
113
|
+
*/
|
|
114
|
+
tick: (at?: Date) => void;
|
|
115
|
+
/** Upcoming fire time per schedule id, from `at` (default now). */
|
|
116
|
+
upcoming: (at?: Date) => Array<{
|
|
117
|
+
id: string;
|
|
118
|
+
at: Date | null;
|
|
119
|
+
}>;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* A client-side scheduler: ticks on an interval, fires `onFire` for every
|
|
123
|
+
* schedule due in the current minute, and guarantees at most one fire per
|
|
124
|
+
* schedule per minute (and exactly one, ever, for a one-off).
|
|
125
|
+
*/
|
|
126
|
+
export declare function createScheduler(options: SchedulerOptions): Scheduler;
|
|
127
|
+
/** A few common cron expressions, for docs, presets, and pickers. */
|
|
128
|
+
export declare const CRON_PRESETS: ReadonlyArray<{
|
|
129
|
+
label: string;
|
|
130
|
+
cron: string;
|
|
131
|
+
}>;
|
|
132
|
+
export {};
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduling - client-side, cron-driven automation for grid actions.
|
|
3
|
+
*
|
|
4
|
+
* Two everyday jobs that normally need a backend job runner - "email me this
|
|
5
|
+
* report every weekday at 17:30" and "remind the desk at 09:00 to reconcile" -
|
|
6
|
+
* are, in a long-lived data app, just a timer plus an action you already have:
|
|
7
|
+
* an export (`api.exportCsv` / `@svgrid/enterprise` Excel/PDF) or an alert
|
|
8
|
+
* (`toast`). This module supplies the missing middle: a pure cron matcher and a
|
|
9
|
+
* small runtime that fires your callback when a schedule comes due.
|
|
10
|
+
*
|
|
11
|
+
* Everything here is pure and injectable (`now`), so the matching logic is
|
|
12
|
+
* unit-testable without wall-clock flakiness, and the render/app layer just
|
|
13
|
+
* wires `onFire` to whatever action it wants.
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { createScheduler } from '@svgrid/enterprise'
|
|
17
|
+
* import { toast } from '@svgrid/grid'
|
|
18
|
+
*
|
|
19
|
+
* const scheduler = createScheduler({
|
|
20
|
+
* schedules: [
|
|
21
|
+
* { id: 'eod', name: 'End-of-day CSV', cron: '30 17 * * 1-5' },
|
|
22
|
+
* { id: 'standup', name: 'Stand-up reminder', cron: '0 9 * * *' },
|
|
23
|
+
* ],
|
|
24
|
+
* onFire(schedule) {
|
|
25
|
+
* if (schedule.id === 'eod') api.exportCsv({ filename: 'eod' })
|
|
26
|
+
* else toast.info(`${schedule.name}`)
|
|
27
|
+
* },
|
|
28
|
+
* })
|
|
29
|
+
* scheduler.start() // stop() on teardown
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* Caveat, by design: schedules run entirely in the browser tab, so the app has
|
|
33
|
+
* to be open when a schedule is due. Pair with a server job for guaranteed
|
|
34
|
+
* delivery; use this for the far more common "the dashboard is always up on the
|
|
35
|
+
* wall" case where a backend cron is overkill.
|
|
36
|
+
*/
|
|
37
|
+
const RANGES = {
|
|
38
|
+
minute: [0, 59],
|
|
39
|
+
hour: [0, 23],
|
|
40
|
+
dom: [1, 31],
|
|
41
|
+
month: [1, 12],
|
|
42
|
+
dow: [0, 6],
|
|
43
|
+
};
|
|
44
|
+
/** Parse one cron field (e.g. `*/15`, `1-5`, `0,30`) into a matcher. */
|
|
45
|
+
function parseField(raw, min, max) {
|
|
46
|
+
const allowed = new Set();
|
|
47
|
+
for (const part of raw.split(',')) {
|
|
48
|
+
const [rangePart, stepPart] = part.split('/');
|
|
49
|
+
const step = stepPart ? parseInt(stepPart, 10) : 1;
|
|
50
|
+
if (!Number.isFinite(step) || step < 1) {
|
|
51
|
+
throw new Error(`Invalid cron step in "${raw}"`);
|
|
52
|
+
}
|
|
53
|
+
let lo;
|
|
54
|
+
let hi;
|
|
55
|
+
if (rangePart === '*' || rangePart === '') {
|
|
56
|
+
lo = min;
|
|
57
|
+
hi = max;
|
|
58
|
+
}
|
|
59
|
+
else if (rangePart.includes('-')) {
|
|
60
|
+
const [a, b] = rangePart.split('-');
|
|
61
|
+
lo = parseInt(a, 10);
|
|
62
|
+
hi = parseInt(b, 10);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
lo = parseInt(rangePart, 10);
|
|
66
|
+
hi = lo;
|
|
67
|
+
}
|
|
68
|
+
if (!Number.isFinite(lo) || !Number.isFinite(hi)) {
|
|
69
|
+
throw new Error(`Invalid cron field "${raw}"`);
|
|
70
|
+
}
|
|
71
|
+
for (let n = lo; n <= hi; n += step) {
|
|
72
|
+
if (n >= min && n <= max)
|
|
73
|
+
allowed.add(n);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return { min, max, match: (n) => allowed.has(n) };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Parse a 5-field cron expression. Throws on the wrong field count or an
|
|
80
|
+
* unparseable field, so a bad schedule surfaces at setup, not silently at 3am.
|
|
81
|
+
*/
|
|
82
|
+
export function parseCron(expr) {
|
|
83
|
+
const fields = expr.trim().split(/\s+/);
|
|
84
|
+
if (fields.length !== 5) {
|
|
85
|
+
throw new Error(`Cron needs 5 fields "min hour dom month dow", got ${fields.length}: "${expr}"`);
|
|
86
|
+
}
|
|
87
|
+
const [min, hour, dom, month, dow] = fields;
|
|
88
|
+
// Day-of-week 7 is an alias for Sunday (0); normalize before parsing.
|
|
89
|
+
const dowNorm = dow.replace(/7/g, '0');
|
|
90
|
+
return {
|
|
91
|
+
minute: parseField(min, ...RANGES.minute),
|
|
92
|
+
hour: parseField(hour, ...RANGES.hour),
|
|
93
|
+
dom: parseField(dom, ...RANGES.dom),
|
|
94
|
+
month: parseField(month, ...RANGES.month),
|
|
95
|
+
dow: parseField(dowNorm, ...RANGES.dow),
|
|
96
|
+
domAndDowRestricted: dom !== '*' && dow !== '*',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Whether a parsed cron matches a specific `Date` to the minute. */
|
|
100
|
+
export function cronMatchesParsed(parsed, date) {
|
|
101
|
+
if (!parsed.minute.match(date.getMinutes()))
|
|
102
|
+
return false;
|
|
103
|
+
if (!parsed.hour.match(date.getHours()))
|
|
104
|
+
return false;
|
|
105
|
+
if (!parsed.month.match(date.getMonth() + 1))
|
|
106
|
+
return false;
|
|
107
|
+
const domOk = parsed.dom.match(date.getDate());
|
|
108
|
+
const dowOk = parsed.dow.match(date.getDay());
|
|
109
|
+
// Standard cron semantics: when both day fields are restricted the match is
|
|
110
|
+
// the UNION (fires if either matches); otherwise plain AND.
|
|
111
|
+
return parsed.domAndDowRestricted ? domOk || dowOk : domOk && dowOk;
|
|
112
|
+
}
|
|
113
|
+
/** Whether a cron expression matches a `Date` to the minute. */
|
|
114
|
+
export function cronMatches(expr, date) {
|
|
115
|
+
return cronMatchesParsed(parseCron(expr), date);
|
|
116
|
+
}
|
|
117
|
+
/** Two dates fall in the same wall-clock minute. */
|
|
118
|
+
function sameMinute(a, b) {
|
|
119
|
+
return (a.getFullYear() === b.getFullYear() &&
|
|
120
|
+
a.getMonth() === b.getMonth() &&
|
|
121
|
+
a.getDate() === b.getDate() &&
|
|
122
|
+
a.getHours() === b.getHours() &&
|
|
123
|
+
a.getMinutes() === b.getMinutes());
|
|
124
|
+
}
|
|
125
|
+
/** Whether a schedule is due to fire during the minute containing `date`. */
|
|
126
|
+
export function isScheduleDue(schedule, date) {
|
|
127
|
+
if (schedule.enabled === false)
|
|
128
|
+
return false;
|
|
129
|
+
if (schedule.runAt) {
|
|
130
|
+
const at = new Date(schedule.runAt);
|
|
131
|
+
return !Number.isNaN(at.getTime()) && sameMinute(at, date);
|
|
132
|
+
}
|
|
133
|
+
if (schedule.cron)
|
|
134
|
+
return cronMatches(schedule.cron, date);
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The next `Date` (to the minute) at or after `from` that `schedule` fires,
|
|
139
|
+
* or `null` if it never will again (past one-off, or no match within a year).
|
|
140
|
+
* Handy for a "next run" column in a schedules panel.
|
|
141
|
+
*/
|
|
142
|
+
export function nextRun(schedule, from) {
|
|
143
|
+
if (schedule.enabled === false)
|
|
144
|
+
return null;
|
|
145
|
+
if (schedule.runAt) {
|
|
146
|
+
const at = new Date(schedule.runAt);
|
|
147
|
+
if (Number.isNaN(at.getTime()))
|
|
148
|
+
return null;
|
|
149
|
+
// Compare at minute granularity - a runAt in the current minute is "now".
|
|
150
|
+
const floor = new Date(from);
|
|
151
|
+
floor.setSeconds(0, 0);
|
|
152
|
+
return at.getTime() >= floor.getTime() ? at : null;
|
|
153
|
+
}
|
|
154
|
+
if (!schedule.cron)
|
|
155
|
+
return null;
|
|
156
|
+
const parsed = parseCron(schedule.cron);
|
|
157
|
+
const cursor = new Date(from);
|
|
158
|
+
cursor.setSeconds(0, 0);
|
|
159
|
+
// Scan minute-by-minute for up to ~366 days (527040 minutes).
|
|
160
|
+
for (let i = 0; i < 527040; i += 1) {
|
|
161
|
+
if (cronMatchesParsed(parsed, cursor))
|
|
162
|
+
return new Date(cursor);
|
|
163
|
+
cursor.setMinutes(cursor.getMinutes() + 1);
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* A client-side scheduler: ticks on an interval, fires `onFire` for every
|
|
169
|
+
* schedule due in the current minute, and guarantees at most one fire per
|
|
170
|
+
* schedule per minute (and exactly one, ever, for a one-off).
|
|
171
|
+
*/
|
|
172
|
+
export function createScheduler(options) {
|
|
173
|
+
const now = options.now ?? (() => new Date());
|
|
174
|
+
const intervalMs = options.intervalMs ?? 30000;
|
|
175
|
+
// Per-schedule guard: the minute-key we last fired, so a twice-a-minute tick
|
|
176
|
+
// (or a manual tick) never double-fires the same minute. One-offs are marked
|
|
177
|
+
// done so they never fire again even across minutes.
|
|
178
|
+
const lastFiredKey = new Map();
|
|
179
|
+
const oneOffDone = new Set();
|
|
180
|
+
let timer = null;
|
|
181
|
+
const minuteKey = (d) => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}-${d.getHours()}-${d.getMinutes()}`;
|
|
182
|
+
function tick(at = now()) {
|
|
183
|
+
const key = minuteKey(at);
|
|
184
|
+
for (const schedule of options.schedules) {
|
|
185
|
+
if (schedule.enabled === false)
|
|
186
|
+
continue;
|
|
187
|
+
const oneOff = !!schedule.runAt;
|
|
188
|
+
if (oneOff && oneOffDone.has(schedule.id))
|
|
189
|
+
continue;
|
|
190
|
+
if (lastFiredKey.get(schedule.id) === key)
|
|
191
|
+
continue;
|
|
192
|
+
if (!isScheduleDue(schedule, at))
|
|
193
|
+
continue;
|
|
194
|
+
lastFiredKey.set(schedule.id, key);
|
|
195
|
+
if (oneOff)
|
|
196
|
+
oneOffDone.add(schedule.id);
|
|
197
|
+
options.onFire(schedule, at);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
start() {
|
|
202
|
+
if (timer != null)
|
|
203
|
+
return;
|
|
204
|
+
timer = setInterval(() => tick(), intervalMs);
|
|
205
|
+
},
|
|
206
|
+
stop() {
|
|
207
|
+
if (timer != null) {
|
|
208
|
+
clearInterval(timer);
|
|
209
|
+
timer = null;
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
tick,
|
|
213
|
+
upcoming(at = now()) {
|
|
214
|
+
return options.schedules.map((s) => ({ id: s.id, at: nextRun(s, at) }));
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/** A few common cron expressions, for docs, presets, and pickers. */
|
|
219
|
+
export const CRON_PRESETS = [
|
|
220
|
+
{ label: 'Every minute', cron: '* * * * *' },
|
|
221
|
+
{ label: 'Every 15 minutes', cron: '*/15 * * * *' },
|
|
222
|
+
{ label: 'Hourly, on the hour', cron: '0 * * * *' },
|
|
223
|
+
{ label: 'Every weekday at 09:00', cron: '0 9 * * 1-5' },
|
|
224
|
+
{ label: 'Weekdays at 17:30', cron: '30 17 * * 1-5' },
|
|
225
|
+
{ label: 'Daily at midnight', cron: '0 0 * * *' },
|
|
226
|
+
{ label: 'Monday mornings at 08:00', cron: '0 8 * * 1' },
|
|
227
|
+
{ label: 'First of the month at 06:00', cron: '0 6 1 * *' },
|
|
228
|
+
];
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-designer logic. The testable core behind `SvSchemaDesigner.svelte`:
|
|
3
|
+
* immutable operations that edit an `EntitySchema` (add / remove / reorder /
|
|
4
|
+
* retype fields, set the primary key), validation of the schema being designed,
|
|
5
|
+
* and sample-row generation for the live grid preview.
|
|
6
|
+
*
|
|
7
|
+
* Pure (no Svelte, no DOM), mirroring the pivot-designer / edit-panel split.
|
|
8
|
+
* Every mutation returns a NEW schema so Svelte reactivity and undo stay simple.
|
|
9
|
+
*/
|
|
10
|
+
import type { EntityField, EntityFieldType, EntitySchema } from './schema';
|
|
11
|
+
/** All field types the designer offers, in menu order. */
|
|
12
|
+
export declare const FIELD_TYPES: ReadonlyArray<EntityFieldType>;
|
|
13
|
+
/** A fresh field with a name unique within the schema. */
|
|
14
|
+
export declare function blankField(schema: EntitySchema): EntityField;
|
|
15
|
+
/** Append a field (a blank one when none is given). */
|
|
16
|
+
export declare function addField(schema: EntitySchema, field?: EntityField): EntitySchema;
|
|
17
|
+
/** Remove a field by name. Clears `idField` if it pointed at the removed field. */
|
|
18
|
+
export declare function removeField(schema: EntitySchema, fieldName: string): EntitySchema;
|
|
19
|
+
/**
|
|
20
|
+
* Patch a field by name. Setting `primaryKey: true` clears it on every other
|
|
21
|
+
* field (a schema has at most one). Switching `type` drops now-irrelevant
|
|
22
|
+
* `options` (leaving enum) / `relation` (leaving relation).
|
|
23
|
+
*/
|
|
24
|
+
export declare function updateField(schema: EntitySchema, fieldName: string, patch: Partial<EntityField>): EntitySchema;
|
|
25
|
+
/** Move a field one slot up (`-1`) or down (`+1`). No-op at the ends. */
|
|
26
|
+
export declare function moveField(schema: EntitySchema, fieldName: string, dir: -1 | 1): EntitySchema;
|
|
27
|
+
export type SchemaIssueLevel = 'error' | 'warning';
|
|
28
|
+
export type SchemaIssue = {
|
|
29
|
+
level: SchemaIssueLevel;
|
|
30
|
+
message: string;
|
|
31
|
+
field?: string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Validate the schema under construction. Errors block code generation;
|
|
35
|
+
* warnings are advisory. Covers: at least one field, unique field names, a
|
|
36
|
+
* resolvable primary key, enums with options, and complete relations.
|
|
37
|
+
*/
|
|
38
|
+
export declare function validateSchema(schema: EntitySchema): SchemaIssue[];
|
|
39
|
+
/** True when the schema has no error-level issues (warnings are allowed). */
|
|
40
|
+
export declare function isSchemaValid(schema: EntitySchema): boolean;
|
|
41
|
+
/** Deterministic, realistic sample rows for the designer's grid preview. */
|
|
42
|
+
export declare function sampleRows(schema: EntitySchema, count?: number): Array<Record<string, unknown>>;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { resolveIdField } from './schema';
|
|
2
|
+
import { generateRows } from './studio/sample-data';
|
|
3
|
+
/** All field types the designer offers, in menu order. */
|
|
4
|
+
export const FIELD_TYPES = [
|
|
5
|
+
'text',
|
|
6
|
+
'number',
|
|
7
|
+
'boolean',
|
|
8
|
+
'date',
|
|
9
|
+
'dateString',
|
|
10
|
+
'datetime',
|
|
11
|
+
'enum',
|
|
12
|
+
'relation',
|
|
13
|
+
'json',
|
|
14
|
+
];
|
|
15
|
+
/** A fresh field with a name unique within the schema. */
|
|
16
|
+
export function blankField(schema) {
|
|
17
|
+
const taken = new Set(schema.fields.map((f) => f.field));
|
|
18
|
+
let n = schema.fields.length + 1;
|
|
19
|
+
let name = `field${n}`;
|
|
20
|
+
while (taken.has(name))
|
|
21
|
+
name = `field${++n}`;
|
|
22
|
+
return { field: name, type: 'text' };
|
|
23
|
+
}
|
|
24
|
+
/** Append a field (a blank one when none is given). */
|
|
25
|
+
export function addField(schema, field) {
|
|
26
|
+
return { ...schema, fields: [...schema.fields, field ?? blankField(schema)] };
|
|
27
|
+
}
|
|
28
|
+
/** Remove a field by name. Clears `idField` if it pointed at the removed field. */
|
|
29
|
+
export function removeField(schema, fieldName) {
|
|
30
|
+
const fields = schema.fields.filter((f) => f.field !== fieldName);
|
|
31
|
+
const idField = schema.idField === fieldName ? undefined : schema.idField;
|
|
32
|
+
return { ...schema, fields, idField };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Patch a field by name. Setting `primaryKey: true` clears it on every other
|
|
36
|
+
* field (a schema has at most one). Switching `type` drops now-irrelevant
|
|
37
|
+
* `options` (leaving enum) / `relation` (leaving relation).
|
|
38
|
+
*/
|
|
39
|
+
export function updateField(schema, fieldName, patch) {
|
|
40
|
+
const makesPrimary = patch.primaryKey === true;
|
|
41
|
+
const fields = schema.fields.map((f) => {
|
|
42
|
+
if (f.field !== fieldName) {
|
|
43
|
+
return makesPrimary && f.primaryKey ? { ...f, primaryKey: false } : f;
|
|
44
|
+
}
|
|
45
|
+
const next = { ...f, ...patch };
|
|
46
|
+
if (patch.type && patch.type !== f.type) {
|
|
47
|
+
if (patch.type !== 'enum')
|
|
48
|
+
delete next.options;
|
|
49
|
+
if (patch.type !== 'relation')
|
|
50
|
+
delete next.relation;
|
|
51
|
+
}
|
|
52
|
+
return next;
|
|
53
|
+
});
|
|
54
|
+
return { ...schema, fields };
|
|
55
|
+
}
|
|
56
|
+
/** Move a field one slot up (`-1`) or down (`+1`). No-op at the ends. */
|
|
57
|
+
export function moveField(schema, fieldName, dir) {
|
|
58
|
+
const i = schema.fields.findIndex((f) => f.field === fieldName);
|
|
59
|
+
const j = i + dir;
|
|
60
|
+
if (i < 0 || j < 0 || j >= schema.fields.length)
|
|
61
|
+
return schema;
|
|
62
|
+
const fields = [...schema.fields];
|
|
63
|
+
const a = fields[i];
|
|
64
|
+
const b = fields[j];
|
|
65
|
+
fields[i] = b;
|
|
66
|
+
fields[j] = a;
|
|
67
|
+
return { ...schema, fields };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Validate the schema under construction. Errors block code generation;
|
|
71
|
+
* warnings are advisory. Covers: at least one field, unique field names, a
|
|
72
|
+
* resolvable primary key, enums with options, and complete relations.
|
|
73
|
+
*/
|
|
74
|
+
export function validateSchema(schema) {
|
|
75
|
+
const issues = [];
|
|
76
|
+
if (schema.fields.length === 0) {
|
|
77
|
+
issues.push({ level: 'error', message: 'Add at least one field.' });
|
|
78
|
+
}
|
|
79
|
+
const seen = new Set();
|
|
80
|
+
for (const f of schema.fields) {
|
|
81
|
+
if (!f.field.trim()) {
|
|
82
|
+
issues.push({ level: 'error', message: 'A field has an empty name.' });
|
|
83
|
+
}
|
|
84
|
+
else if (seen.has(f.field)) {
|
|
85
|
+
issues.push({ level: 'error', message: `Duplicate field name "${f.field}".`, field: f.field });
|
|
86
|
+
}
|
|
87
|
+
seen.add(f.field);
|
|
88
|
+
if (f.type === 'enum' && (!f.options || f.options.length === 0)) {
|
|
89
|
+
issues.push({ level: 'warning', message: `Enum "${f.field}" has no options.`, field: f.field });
|
|
90
|
+
}
|
|
91
|
+
if (f.type === 'relation' && (!f.relation?.entity || !f.relation?.labelField)) {
|
|
92
|
+
issues.push({
|
|
93
|
+
level: 'warning',
|
|
94
|
+
message: `Relation "${f.field}" needs a related entity and label field.`,
|
|
95
|
+
field: f.field,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
resolveIdField(schema);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
issues.push({
|
|
104
|
+
level: 'error',
|
|
105
|
+
message: 'No primary key: flag a field as primary key, set idField, or name a field "id".',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return issues;
|
|
109
|
+
}
|
|
110
|
+
/** True when the schema has no error-level issues (warnings are allowed). */
|
|
111
|
+
export function isSchemaValid(schema) {
|
|
112
|
+
return !validateSchema(schema).some((i) => i.level === 'error');
|
|
113
|
+
}
|
|
114
|
+
/** Deterministic, realistic sample rows for the designer's grid preview. */
|
|
115
|
+
export function sampleRows(schema, count = 3) {
|
|
116
|
+
return generateRows(schema.fields, count);
|
|
117
|
+
}
|