@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,70 @@
|
|
|
1
|
+
import { introspectDrizzle, introspectDrizzleAll, introspectJson } from './introspect.js';
|
|
2
|
+
import { introspectPrisma, introspectPrismaAll } from './introspect-prisma.js';
|
|
3
|
+
import { mergeManaged, scaffold, skipUserOwned } from './scaffold.js';
|
|
4
|
+
import { scaffoldApp } from './scaffold-app.js';
|
|
5
|
+
import { verifyScaffold } from './verify.js';
|
|
6
|
+
/** A `.prisma` file (by extension or a `model X {` block) parses as Prisma; otherwise Drizzle. */
|
|
7
|
+
function isPrismaSource(path, source) {
|
|
8
|
+
return /\.prisma$/i.test(path) || /\bmodel\s+\w+\s*\{/.test(source);
|
|
9
|
+
}
|
|
10
|
+
/** Resolve an EntitySchema from whichever input was provided. */
|
|
11
|
+
export async function resolveSchema(options, io) {
|
|
12
|
+
if (options.schema)
|
|
13
|
+
return options.schema;
|
|
14
|
+
if (options.from) {
|
|
15
|
+
const src = await io.readFile(options.from);
|
|
16
|
+
if (src == null)
|
|
17
|
+
throw new Error(`runStudioAdd: schema file not found: ${options.from}`);
|
|
18
|
+
return isPrismaSource(options.from, src)
|
|
19
|
+
? introspectPrisma(src, options.table)
|
|
20
|
+
: introspectDrizzle(src, options.table);
|
|
21
|
+
}
|
|
22
|
+
if (options.rows) {
|
|
23
|
+
return introspectJson(options.name ?? options.route ?? 'entity', options.rows);
|
|
24
|
+
}
|
|
25
|
+
throw new Error('runStudioAdd: provide `from` (a Drizzle or Prisma schema file), `rows`, or `schema`');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolve **every** entity from a Drizzle or Prisma schema file (the `--all
|
|
29
|
+
* --from` path), linked so foreign keys become working relation lookups.
|
|
30
|
+
*/
|
|
31
|
+
export async function resolveSchemas(from, io) {
|
|
32
|
+
const src = await io.readFile(from);
|
|
33
|
+
if (src == null)
|
|
34
|
+
throw new Error(`runStudioAddApp: schema file not found: ${from}`);
|
|
35
|
+
return isPrismaSource(from, src) ? introspectPrismaAll(src) : introspectDrizzleAll(src);
|
|
36
|
+
}
|
|
37
|
+
/** Merge-write a set of generated files, preserving user edits outside managed regions. */
|
|
38
|
+
async function writeAll(files, io) {
|
|
39
|
+
const written = [];
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
const existing = await io.readFile(file.path);
|
|
42
|
+
// User-owned companions (a screen's `handlers.ts`) carry no managed markers -
|
|
43
|
+
// they're scaffolded once and then the developer's code forever. Skip if it
|
|
44
|
+
// already exists so a regenerate never clobbers hand-written logic. See
|
|
45
|
+
// HANDLERS-DESIGN.md (the round-trip contract).
|
|
46
|
+
if (skipUserOwned(file, existing != null))
|
|
47
|
+
continue;
|
|
48
|
+
// Regenerating? Replace only the managed region, keep the user's edits.
|
|
49
|
+
await io.writeFile(file.path, mergeManaged(existing, file.contents));
|
|
50
|
+
written.push(file.path);
|
|
51
|
+
}
|
|
52
|
+
return written;
|
|
53
|
+
}
|
|
54
|
+
export async function runStudioAdd(options, io) {
|
|
55
|
+
const schema = await resolveSchema(options, io);
|
|
56
|
+
const { files } = scaffold(schema, options);
|
|
57
|
+
const written = await writeAll(files, io);
|
|
58
|
+
const verify = await verifyScaffold(files);
|
|
59
|
+
return { schema, written, verify };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Scaffold a whole multi-entity app - every entity's screen plus a nav layout
|
|
63
|
+
* and home page - and merge-write it. The `--all` path behind `svgrid-studio`.
|
|
64
|
+
*/
|
|
65
|
+
export async function runStudioAddApp(schemas, options, io) {
|
|
66
|
+
const { files } = scaffoldApp(schemas, options);
|
|
67
|
+
const written = await writeAll(files, io);
|
|
68
|
+
const verify = await verifyScaffold(files);
|
|
69
|
+
return { written, verify };
|
|
70
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Studio Copilot - the pure, testable core. Builds the model request for "edit
|
|
3
|
+
* this project per the user's instruction" and parses/validates the model's
|
|
4
|
+
* reply back into a StudioProject. No network here: the CLI designer server
|
|
5
|
+
* does the actual Anthropic call (keys stay server-side), and the designer
|
|
6
|
+
* additionally re-validates + puts the result on the undo stack, so a bad
|
|
7
|
+
* edit is one Ctrl+Z away.
|
|
8
|
+
*/
|
|
9
|
+
import { type StudioProject } from './project.js';
|
|
10
|
+
export type CopilotMessages = {
|
|
11
|
+
system: string;
|
|
12
|
+
messages: Array<{
|
|
13
|
+
role: 'user';
|
|
14
|
+
content: string;
|
|
15
|
+
}>;
|
|
16
|
+
};
|
|
17
|
+
/** The system + user messages for one copilot edit round. */
|
|
18
|
+
export declare function buildCopilotMessages(prompt: string, project: StudioProject): CopilotMessages;
|
|
19
|
+
/** Parse the model's reply into a validated StudioProject. Tolerates a fenced
|
|
20
|
+
* code block or stray prose around the JSON; throws with a useful message when
|
|
21
|
+
* the reply isn't a valid project. */
|
|
22
|
+
export declare function projectFromModelText(text: string): StudioProject;
|
|
@@ -6,19 +6,13 @@
|
|
|
6
6
|
* additionally re-validates + puts the result on the undo stack, so a bad
|
|
7
7
|
* edit is one Ctrl+Z away.
|
|
8
8
|
*/
|
|
9
|
-
import { parseProject, serializeProject, validateProject, blockPalette
|
|
10
|
-
import { UI_COMPONENT_REGISTRY } from './ui-components.js'
|
|
11
|
-
|
|
12
|
-
export type CopilotMessages = {
|
|
13
|
-
system: string
|
|
14
|
-
messages: Array<{ role: 'user'; content: string }>
|
|
15
|
-
}
|
|
16
|
-
|
|
9
|
+
import { parseProject, serializeProject, validateProject, blockPalette } from './project.js';
|
|
10
|
+
import { UI_COMPONENT_REGISTRY } from './ui-components.js';
|
|
17
11
|
/** The system + user messages for one copilot edit round. */
|
|
18
|
-
export function buildCopilotMessages(prompt
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
export function buildCopilotMessages(prompt, project) {
|
|
13
|
+
const kinds = blockPalette.map((p) => p.kind).join(', ');
|
|
14
|
+
const components = UI_COMPONENT_REGISTRY.map((c) => c.key).join(', ');
|
|
15
|
+
const system = `You are SvGrid Studio's copilot. You edit a Studio project - the JSON model of a data app - according to the user's instruction, and return the COMPLETE updated project as JSON.
|
|
22
16
|
|
|
23
17
|
The model, briefly:
|
|
24
18
|
- entities: EntitySchema[] - { name, label, idField, fields: [{ field, label, type, primaryKey?, required?, formula?, options?: [{value,label,color?}], relation?: { entity, labelField } }] }. Field types: text | number | boolean | date | datetime | enum | relation | json.
|
|
@@ -32,34 +26,36 @@ Rules:
|
|
|
32
26
|
- New ids: short kebab/lower-camel strings unique within the project.
|
|
33
27
|
- New entities need at least an id/primary-key field and a label-ish field; give enum fields options with value+label; seed realistic demo data is NOT required.
|
|
34
28
|
- New screens need a unique route and at least one block bound to their entity.
|
|
35
|
-
- Prefer editing over rebuilding; keep the user's structure and naming style
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
29
|
+
- Prefer editing over rebuilding; keep the user's structure and naming style.`;
|
|
30
|
+
return {
|
|
31
|
+
system,
|
|
32
|
+
messages: [
|
|
33
|
+
{
|
|
34
|
+
role: 'user',
|
|
35
|
+
content: `Current project JSON:\n${serializeProject(project)}\n\nInstruction: ${prompt}\n\nReturn the complete updated project JSON.`,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
45
39
|
}
|
|
46
|
-
|
|
47
40
|
/** Parse the model's reply into a validated StudioProject. Tolerates a fenced
|
|
48
41
|
* code block or stray prose around the JSON; throws with a useful message when
|
|
49
42
|
* the reply isn't a valid project. */
|
|
50
|
-
export function projectFromModelText(text
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
43
|
+
export function projectFromModelText(text) {
|
|
44
|
+
let candidate = text.trim();
|
|
45
|
+
const fence = candidate.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
46
|
+
if (fence)
|
|
47
|
+
candidate = fence[1].trim();
|
|
48
|
+
if (!candidate.startsWith('{')) {
|
|
49
|
+
// Stray prose: cut to the outermost object literal.
|
|
50
|
+
const start = candidate.indexOf('{');
|
|
51
|
+
const end = candidate.lastIndexOf('}');
|
|
52
|
+
if (start === -1 || end <= start)
|
|
53
|
+
throw new Error('Copilot reply contained no JSON object.');
|
|
54
|
+
candidate = candidate.slice(start, end + 1);
|
|
55
|
+
}
|
|
56
|
+
const project = parseProject(candidate); // throws on malformed/invalid shapes
|
|
57
|
+
const errors = validateProject(project).filter((i) => i.level === 'error');
|
|
58
|
+
if (errors.length)
|
|
59
|
+
throw new Error(`Copilot returned an invalid project: ${errors.map((e) => e.message).join(' ')}`);
|
|
60
|
+
return project;
|
|
65
61
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSV / spreadsheet import - turn a pasted or uploaded CSV into a runnable
|
|
3
|
+
* entity: infer an `EntitySchema` from the header + values, and return the
|
|
4
|
+
* parsed rows (coerced to real JS types) so they can seed a data source.
|
|
5
|
+
*
|
|
6
|
+
* Pure and dependency-free: a hand-rolled RFC-4180-ish reader (quoted fields,
|
|
7
|
+
* escaped `""`, embedded newlines, CRLF), then per-column type inference. The
|
|
8
|
+
* Studio generator and the visual designer both call `csvToEntity` to add a
|
|
9
|
+
* table from a file the user drops in - no backend, no parsing library.
|
|
10
|
+
*/
|
|
11
|
+
import type { EntitySchema } from '../schema.js';
|
|
12
|
+
/**
|
|
13
|
+
* Sniff the field delimiter from the first (unquoted) line: whichever of
|
|
14
|
+
* `,` `;` `\t` `|` occurs most. Handles Excel/European exports (`;`) and TSV.
|
|
15
|
+
*/
|
|
16
|
+
export declare function detectDelimiter(text: string): ',' | ';' | '\t' | '|';
|
|
17
|
+
/** Parse CSV/TSV text into a matrix of string cells. Handles quotes, `""`, embedded
|
|
18
|
+
* newlines, CRLF, and auto-detects the delimiter (comma / semicolon / tab / pipe). */
|
|
19
|
+
export declare function parseCsv(text: string, delimiter?: string): string[][];
|
|
20
|
+
export type CsvEntity = {
|
|
21
|
+
schema: EntitySchema;
|
|
22
|
+
rows: Array<Record<string, unknown>>;
|
|
23
|
+
/** Fields whose header was renamed to a safe key (original -> key), for a UI note. */
|
|
24
|
+
renamed: Array<{
|
|
25
|
+
header: string;
|
|
26
|
+
field: string;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Parse CSV text into a ready-to-use entity: an `EntitySchema` (types inferred
|
|
31
|
+
* per column, an `id` primary key ensured) plus the coerced rows to seed with.
|
|
32
|
+
*
|
|
33
|
+
* If the file has no id-like column, a synthetic string `id` (`"1"`, `"2"`, ...)
|
|
34
|
+
* is added so the grid, edit form, and CRUD have a stable row key.
|
|
35
|
+
*/
|
|
36
|
+
export declare function csvToEntity(name: string, text: string): CsvEntity;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { refineFields } from '../sources/field-inference.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sniff the field delimiter from the first (unquoted) line: whichever of
|
|
4
|
+
* `,` `;` `\t` `|` occurs most. Handles Excel/European exports (`;`) and TSV.
|
|
5
|
+
*/
|
|
6
|
+
export function detectDelimiter(text) {
|
|
7
|
+
const s = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
|
|
8
|
+
const firstLine = s.slice(0, (s.indexOf('\n') + 1 || s.length + 1) - 1);
|
|
9
|
+
const candidates = [',', ';', '\t', '|'];
|
|
10
|
+
let best = ',';
|
|
11
|
+
let bestCount = -1;
|
|
12
|
+
for (const d of candidates) {
|
|
13
|
+
// Count only outside quotes so a comma inside "a,b" doesn't sway the guess.
|
|
14
|
+
let count = 0, inQ = false;
|
|
15
|
+
for (const ch of firstLine) {
|
|
16
|
+
if (ch === '"')
|
|
17
|
+
inQ = !inQ;
|
|
18
|
+
else if (ch === d && !inQ)
|
|
19
|
+
count++;
|
|
20
|
+
}
|
|
21
|
+
if (count > bestCount) {
|
|
22
|
+
bestCount = count;
|
|
23
|
+
best = d;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return best;
|
|
27
|
+
}
|
|
28
|
+
/** Parse CSV/TSV text into a matrix of string cells. Handles quotes, `""`, embedded
|
|
29
|
+
* newlines, CRLF, and auto-detects the delimiter (comma / semicolon / tab / pipe). */
|
|
30
|
+
export function parseCsv(text, delimiter) {
|
|
31
|
+
const delim = delimiter ?? detectDelimiter(text);
|
|
32
|
+
const rows = [];
|
|
33
|
+
let row = [];
|
|
34
|
+
let field = '';
|
|
35
|
+
let inQuotes = false;
|
|
36
|
+
// Strip a UTF-8 BOM if present so the first header isn't polluted.
|
|
37
|
+
const s = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
|
|
38
|
+
for (let i = 0; i < s.length; i++) {
|
|
39
|
+
const c = s[i];
|
|
40
|
+
if (inQuotes) {
|
|
41
|
+
if (c === '"') {
|
|
42
|
+
if (s[i + 1] === '"') {
|
|
43
|
+
field += '"';
|
|
44
|
+
i++;
|
|
45
|
+
} // escaped quote
|
|
46
|
+
else
|
|
47
|
+
inQuotes = false;
|
|
48
|
+
}
|
|
49
|
+
else
|
|
50
|
+
field += c;
|
|
51
|
+
}
|
|
52
|
+
else if (c === '"') {
|
|
53
|
+
inQuotes = true;
|
|
54
|
+
}
|
|
55
|
+
else if (c === delim) {
|
|
56
|
+
row.push(field);
|
|
57
|
+
field = '';
|
|
58
|
+
}
|
|
59
|
+
else if (c === '\n') {
|
|
60
|
+
row.push(field);
|
|
61
|
+
field = '';
|
|
62
|
+
rows.push(row);
|
|
63
|
+
row = [];
|
|
64
|
+
}
|
|
65
|
+
else if (c === '\r') {
|
|
66
|
+
// swallow; the paired \n (or EOF) ends the row
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
field += c;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Flush the trailing field/row (files without a final newline).
|
|
73
|
+
if (field !== '' || row.length > 0) {
|
|
74
|
+
row.push(field);
|
|
75
|
+
rows.push(row);
|
|
76
|
+
}
|
|
77
|
+
// Drop fully-empty trailing rows (a blank final line).
|
|
78
|
+
return rows.filter((r) => !(r.length === 1 && r[0] === ''));
|
|
79
|
+
}
|
|
80
|
+
const TRUE_SET = new Set(['true', 'yes', 'y', '1']);
|
|
81
|
+
const FALSE_SET = new Set(['false', 'no', 'n', '0']);
|
|
82
|
+
const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
83
|
+
const DATETIME_RE = /^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}/;
|
|
84
|
+
const NUMBER_RE = /^-?(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d+)?$/; // 1200, -3.5, 1,200
|
|
85
|
+
/** Coerce one raw cell to a JS value, given the column's inferred type. Empty -> null. */
|
|
86
|
+
function coerce(raw, type) {
|
|
87
|
+
const v = raw.trim();
|
|
88
|
+
if (v === '')
|
|
89
|
+
return null;
|
|
90
|
+
switch (type) {
|
|
91
|
+
case 'number': return Number(v.replace(/,/g, ''));
|
|
92
|
+
case 'boolean': return TRUE_SET.has(v.toLowerCase());
|
|
93
|
+
default: return v; // text / date / datetime / json stay strings (grid + schema handle them)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** Infer a column's type from all its non-empty raw values. Defaults to text. */
|
|
97
|
+
function inferColumnType(values) {
|
|
98
|
+
const nonEmpty = values.map((v) => v.trim()).filter((v) => v !== '');
|
|
99
|
+
if (nonEmpty.length === 0)
|
|
100
|
+
return 'text';
|
|
101
|
+
const all = (pred) => nonEmpty.every(pred);
|
|
102
|
+
if (all((v) => NUMBER_RE.test(v)))
|
|
103
|
+
return 'number';
|
|
104
|
+
if (all((v) => TRUE_SET.has(v.toLowerCase()) || FALSE_SET.has(v.toLowerCase())))
|
|
105
|
+
return 'boolean';
|
|
106
|
+
if (all((v) => DATETIME_RE.test(v)))
|
|
107
|
+
return 'datetime';
|
|
108
|
+
if (all((v) => DATE_RE.test(v)))
|
|
109
|
+
return 'dateString';
|
|
110
|
+
return 'text';
|
|
111
|
+
}
|
|
112
|
+
/** Turn a header string into a safe, camel-ish field key. */
|
|
113
|
+
function toFieldKey(header, index, taken) {
|
|
114
|
+
let key = header.trim().replace(/[^\w]+/g, '_').replace(/^_+|_+$/g, '').toLowerCase();
|
|
115
|
+
if (/^\d/.test(key))
|
|
116
|
+
key = 'col_' + key;
|
|
117
|
+
if (!key)
|
|
118
|
+
key = `col_${index + 1}`;
|
|
119
|
+
let unique = key, n = 2;
|
|
120
|
+
while (taken.has(unique))
|
|
121
|
+
unique = `${key}_${n++}`;
|
|
122
|
+
taken.add(unique);
|
|
123
|
+
return unique;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Parse CSV text into a ready-to-use entity: an `EntitySchema` (types inferred
|
|
127
|
+
* per column, an `id` primary key ensured) plus the coerced rows to seed with.
|
|
128
|
+
*
|
|
129
|
+
* If the file has no id-like column, a synthetic string `id` (`"1"`, `"2"`, ...)
|
|
130
|
+
* is added so the grid, edit form, and CRUD have a stable row key.
|
|
131
|
+
*/
|
|
132
|
+
export function csvToEntity(name, text) {
|
|
133
|
+
const matrix = parseCsv(text);
|
|
134
|
+
if (matrix.length === 0)
|
|
135
|
+
return { schema: { name, fields: [] }, rows: [], renamed: [] };
|
|
136
|
+
const headers = matrix[0];
|
|
137
|
+
const body = matrix.slice(1);
|
|
138
|
+
const taken = new Set();
|
|
139
|
+
const renamed = [];
|
|
140
|
+
const cols = headers.map((h, i) => {
|
|
141
|
+
const field = toFieldKey(h, i, taken);
|
|
142
|
+
const values = body.map((r) => r[i] ?? '');
|
|
143
|
+
const type = inferColumnType(values);
|
|
144
|
+
if (field !== h.trim())
|
|
145
|
+
renamed.push({ header: h.trim() || `Column ${i + 1}`, field });
|
|
146
|
+
return { field, type, index: i };
|
|
147
|
+
});
|
|
148
|
+
const rows = body.map((r) => {
|
|
149
|
+
const obj = {};
|
|
150
|
+
for (const c of cols)
|
|
151
|
+
obj[c.field] = coerce(r[c.index] ?? '', c.type);
|
|
152
|
+
return obj;
|
|
153
|
+
});
|
|
154
|
+
// Ensure a primary key: reuse an existing id-like column, else synthesize one.
|
|
155
|
+
const idCol = cols.find((c) => c.field === 'id') ?? cols.find((c) => /(^|_)id$/.test(c.field));
|
|
156
|
+
if (!idCol) {
|
|
157
|
+
rows.forEach((row, i) => { row.id = String(i + 1); });
|
|
158
|
+
cols.unshift({ field: 'id', type: 'text', index: -1 });
|
|
159
|
+
}
|
|
160
|
+
const fields = cols.map((c) => {
|
|
161
|
+
const f = { field: c.field, type: c.type };
|
|
162
|
+
const isId = idCol ? c.field === idCol.field : c.field === 'id';
|
|
163
|
+
if (isId) {
|
|
164
|
+
f.primaryKey = true;
|
|
165
|
+
f.readonly = true;
|
|
166
|
+
}
|
|
167
|
+
return f;
|
|
168
|
+
});
|
|
169
|
+
// Let introspectJson refine any 'json'/edge types from the actual coerced values,
|
|
170
|
+
// but keep our column types + pk decisions (they saw every row, not just the first).
|
|
171
|
+
const schema = refineFields({ name, fields });
|
|
172
|
+
return { schema, rows, renamed };
|
|
173
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection-string helpers for the Studio "connect your database" flow. A
|
|
3
|
+
* guided form collects host / port / database / user / password / SSL and
|
|
4
|
+
* `buildConnectionString` assembles the driver-ready URL, so users never have to
|
|
5
|
+
* hand-write `postgresql://user:pass@host:5432/db`. `parseConnectionString` does
|
|
6
|
+
* the reverse (best-effort) to pre-fill the form from a pasted URL, and
|
|
7
|
+
* `redactConnectionString` masks the password for display / logs.
|
|
8
|
+
*
|
|
9
|
+
* Pure and node-safe (no driver, no node APIs) - shared by the designer server,
|
|
10
|
+
* the CLI, and the (private) designer SPA, which imports it from
|
|
11
|
+
* `@svgrid/enterprise/studio`.
|
|
12
|
+
*/
|
|
13
|
+
import type { SqlDialectName } from './introspect-db.js';
|
|
14
|
+
export type SqlConnectionParts = {
|
|
15
|
+
host?: string;
|
|
16
|
+
port?: number | string;
|
|
17
|
+
database?: string;
|
|
18
|
+
user?: string;
|
|
19
|
+
password?: string;
|
|
20
|
+
/** Require TLS (adds the dialect's SSL query param). */
|
|
21
|
+
ssl?: boolean;
|
|
22
|
+
/** SQLite only: path to the `.db` file (host / user / etc are ignored). */
|
|
23
|
+
file?: string;
|
|
24
|
+
};
|
|
25
|
+
/** The npm driver package each dialect needs installed to connect. */
|
|
26
|
+
export declare const DRIVER_PACKAGE: Record<SqlDialectName, string>;
|
|
27
|
+
/** The default TCP port per dialect (null for the file-based SQLite). */
|
|
28
|
+
export declare const DEFAULT_PORT: Record<SqlDialectName, number | null>;
|
|
29
|
+
/** SQLite is a file on disk - the form shows a path field, not host/port/auth. */
|
|
30
|
+
export declare function isFileDialect(dialect: SqlDialectName): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Assemble a driver-ready connection string from the guided-form fields. SQLite
|
|
33
|
+
* returns the bare file path (what better-sqlite3 expects); every other dialect
|
|
34
|
+
* returns a URL with the credentials percent-encoded so passwords containing
|
|
35
|
+
* `@`, `:` or `/` don't corrupt it.
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildConnectionString(dialect: SqlDialectName, parts: SqlConnectionParts): string;
|
|
38
|
+
/**
|
|
39
|
+
* Best-effort inverse of `buildConnectionString` - split a pasted URL back into
|
|
40
|
+
* form fields so the guided form can pre-fill. Returns `{}` when the input isn't
|
|
41
|
+
* a parseable URL (the caller keeps whatever the user typed).
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseConnectionString(dialect: SqlDialectName, value: string): SqlConnectionParts;
|
|
44
|
+
/** Mask the password in a connection string for display / logging. */
|
|
45
|
+
export declare function redactConnectionString(value: string): string;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/** The npm driver package each dialect needs installed to connect. */
|
|
2
|
+
export const DRIVER_PACKAGE = {
|
|
3
|
+
postgres: 'pg',
|
|
4
|
+
supabase: 'pg',
|
|
5
|
+
mysql: 'mysql2',
|
|
6
|
+
mssql: 'mssql',
|
|
7
|
+
sqlite: 'better-sqlite3',
|
|
8
|
+
};
|
|
9
|
+
/** The default TCP port per dialect (null for the file-based SQLite). */
|
|
10
|
+
export const DEFAULT_PORT = {
|
|
11
|
+
postgres: 5432,
|
|
12
|
+
supabase: 5432,
|
|
13
|
+
mysql: 3306,
|
|
14
|
+
mssql: 1433,
|
|
15
|
+
sqlite: null,
|
|
16
|
+
};
|
|
17
|
+
/** SQLite is a file on disk - the form shows a path field, not host/port/auth. */
|
|
18
|
+
export function isFileDialect(dialect) {
|
|
19
|
+
return dialect === 'sqlite';
|
|
20
|
+
}
|
|
21
|
+
function urlScheme(dialect) {
|
|
22
|
+
if (dialect === 'mysql')
|
|
23
|
+
return 'mysql';
|
|
24
|
+
if (dialect === 'mssql')
|
|
25
|
+
return 'mssql';
|
|
26
|
+
return 'postgresql'; // postgres + supabase
|
|
27
|
+
}
|
|
28
|
+
function sslQuery(dialect, ssl) {
|
|
29
|
+
if (!ssl)
|
|
30
|
+
return '';
|
|
31
|
+
if (dialect === 'mysql')
|
|
32
|
+
return `?ssl=${encodeURIComponent('{"rejectUnauthorized":true}')}`;
|
|
33
|
+
if (dialect === 'mssql')
|
|
34
|
+
return '?encrypt=true&trustServerCertificate=true';
|
|
35
|
+
return '?sslmode=require'; // postgres + supabase
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Assemble a driver-ready connection string from the guided-form fields. SQLite
|
|
39
|
+
* returns the bare file path (what better-sqlite3 expects); every other dialect
|
|
40
|
+
* returns a URL with the credentials percent-encoded so passwords containing
|
|
41
|
+
* `@`, `:` or `/` don't corrupt it.
|
|
42
|
+
*/
|
|
43
|
+
export function buildConnectionString(dialect, parts) {
|
|
44
|
+
if (isFileDialect(dialect)) {
|
|
45
|
+
const file = (parts.file ?? parts.database ?? '').trim();
|
|
46
|
+
if (!file)
|
|
47
|
+
throw new Error('buildConnectionString: SQLite needs a database file path');
|
|
48
|
+
return file;
|
|
49
|
+
}
|
|
50
|
+
const host = (parts.host ?? '').trim() || 'localhost';
|
|
51
|
+
const portRaw = parts.port != null && `${parts.port}`.trim() !== '' ? Number(parts.port) : DEFAULT_PORT[dialect];
|
|
52
|
+
const port = Number.isFinite(portRaw) ? portRaw : null;
|
|
53
|
+
const db = (parts.database ?? '').trim();
|
|
54
|
+
const user = (parts.user ?? '').trim();
|
|
55
|
+
const pass = parts.password ?? '';
|
|
56
|
+
const auth = user
|
|
57
|
+
? `${encodeURIComponent(user)}${pass ? `:${encodeURIComponent(pass)}` : ''}@`
|
|
58
|
+
: '';
|
|
59
|
+
const hostPort = port ? `${host}:${port}` : host;
|
|
60
|
+
const dbPath = db ? `/${encodeURIComponent(db)}` : '';
|
|
61
|
+
return `${urlScheme(dialect)}://${auth}${hostPort}${dbPath}${sslQuery(dialect, parts.ssl)}`;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Best-effort inverse of `buildConnectionString` - split a pasted URL back into
|
|
65
|
+
* form fields so the guided form can pre-fill. Returns `{}` when the input isn't
|
|
66
|
+
* a parseable URL (the caller keeps whatever the user typed).
|
|
67
|
+
*/
|
|
68
|
+
export function parseConnectionString(dialect, value) {
|
|
69
|
+
const raw = (value ?? '').trim();
|
|
70
|
+
if (!raw)
|
|
71
|
+
return {};
|
|
72
|
+
if (isFileDialect(dialect))
|
|
73
|
+
return { file: raw };
|
|
74
|
+
try {
|
|
75
|
+
const u = new URL(raw);
|
|
76
|
+
const parts = {};
|
|
77
|
+
if (u.hostname)
|
|
78
|
+
parts.host = u.hostname;
|
|
79
|
+
if (u.port)
|
|
80
|
+
parts.port = Number(u.port);
|
|
81
|
+
const db = u.pathname.replace(/^\//, '');
|
|
82
|
+
if (db)
|
|
83
|
+
parts.database = decodeURIComponent(db);
|
|
84
|
+
if (u.username)
|
|
85
|
+
parts.user = decodeURIComponent(u.username);
|
|
86
|
+
if (u.password)
|
|
87
|
+
parts.password = decodeURIComponent(u.password);
|
|
88
|
+
const q = u.searchParams;
|
|
89
|
+
if (q.get('sslmode') === 'require' || q.has('ssl') || q.get('encrypt') === 'true')
|
|
90
|
+
parts.ssl = true;
|
|
91
|
+
return parts;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return {};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Mask the password in a connection string for display / logging. */
|
|
98
|
+
export function redactConnectionString(value) {
|
|
99
|
+
const raw = (value ?? '').trim();
|
|
100
|
+
if (!raw)
|
|
101
|
+
return raw;
|
|
102
|
+
try {
|
|
103
|
+
const u = new URL(raw);
|
|
104
|
+
if (!u.password)
|
|
105
|
+
return raw;
|
|
106
|
+
u.password = '***';
|
|
107
|
+
return u.toString();
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// key=value strings (e.g. mssql "Password=...") and bare paths.
|
|
111
|
+
return raw.replace(/(password|pwd)=([^;&\s]+)/gi, '$1=***');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `svgrid-studio deploy` - the pure, testable core. Resolves WHICH provider to
|
|
3
|
+
* deploy to (explicit flag > studio.config.json's deploy target > the SvelteKit
|
|
4
|
+
* adapter in svelte.config.js - never a guess) and WHAT commands that means.
|
|
5
|
+
* The thin CLI in @svgrid/studio does the file reads + process spawning.
|
|
6
|
+
*/
|
|
7
|
+
export type DeployProvider = 'vercel' | 'netlify' | 'cloudflare' | 'node';
|
|
8
|
+
export type DeployResolution = {
|
|
9
|
+
ok: true;
|
|
10
|
+
provider: DeployProvider;
|
|
11
|
+
source: 'flag' | 'config' | 'adapter';
|
|
12
|
+
} | {
|
|
13
|
+
ok: false;
|
|
14
|
+
reason: string;
|
|
15
|
+
};
|
|
16
|
+
/** Resolve the deploy provider from the inputs the CLI gathered (all optional). */
|
|
17
|
+
export declare function resolveDeployTarget(inputs: {
|
|
18
|
+
flag?: string;
|
|
19
|
+
configJson?: string | null;
|
|
20
|
+
svelteConfig?: string | null;
|
|
21
|
+
}): DeployResolution;
|
|
22
|
+
export type DeployPlanCommands = {
|
|
23
|
+
provider: DeployProvider;
|
|
24
|
+
/** Run first - validates the app compiles before anything leaves the machine. */
|
|
25
|
+
build: string;
|
|
26
|
+
/** The provider CLI command, or null when there's nothing to run (node target). */
|
|
27
|
+
deploy: string | null;
|
|
28
|
+
/** Shown before running (login hints, what the command does). */
|
|
29
|
+
notes: string[];
|
|
30
|
+
};
|
|
31
|
+
/** The commands a provider deploy runs - same one-liners the generated `deploy` script uses. */
|
|
32
|
+
export declare function deployCommands(provider: DeployProvider): DeployPlanCommands;
|
|
33
|
+
/** Env keys declared in .env.example (uncommented `KEY=` lines) that are absent
|
|
34
|
+
* from the local .env - surfaced as a preflight warning before deploying. */
|
|
35
|
+
export declare function missingEnvKeys(envExample: string | null, envLocal: string | null): string[];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `svgrid-studio deploy` - the pure, testable core. Resolves WHICH provider to
|
|
3
|
+
* deploy to (explicit flag > studio.config.json's deploy target > the SvelteKit
|
|
4
|
+
* adapter in svelte.config.js - never a guess) and WHAT commands that means.
|
|
5
|
+
* The thin CLI in @svgrid/studio does the file reads + process spawning.
|
|
6
|
+
*/
|
|
7
|
+
const PROVIDERS = ['vercel', 'netlify', 'cloudflare', 'node'];
|
|
8
|
+
/** Adapter package -> provider (what svelte.config.js imports). */
|
|
9
|
+
const ADAPTERS = [
|
|
10
|
+
['@sveltejs/adapter-vercel', 'vercel'],
|
|
11
|
+
['@sveltejs/adapter-netlify', 'netlify'],
|
|
12
|
+
['@sveltejs/adapter-cloudflare', 'cloudflare'],
|
|
13
|
+
['@sveltejs/adapter-node', 'node'],
|
|
14
|
+
];
|
|
15
|
+
const GUIDANCE = 'Set a target: pass --target vercel|netlify|cloudflare|node, pick a deploy target in the Studio designer ' +
|
|
16
|
+
'(saved to studio.config.json), or pin a concrete SvelteKit adapter in svelte.config.js.';
|
|
17
|
+
/** Resolve the deploy provider from the inputs the CLI gathered (all optional). */
|
|
18
|
+
export function resolveDeployTarget(inputs) {
|
|
19
|
+
const { flag, configJson, svelteConfig } = inputs;
|
|
20
|
+
if (flag !== undefined) {
|
|
21
|
+
if (PROVIDERS.includes(flag))
|
|
22
|
+
return { ok: true, provider: flag, source: 'flag' };
|
|
23
|
+
return { ok: false, reason: `Unknown --target "${flag}". Use one of: ${PROVIDERS.join(' | ')}.` };
|
|
24
|
+
}
|
|
25
|
+
if (configJson) {
|
|
26
|
+
try {
|
|
27
|
+
const deploy = JSON.parse(configJson).deploy;
|
|
28
|
+
if (deploy && PROVIDERS.includes(deploy))
|
|
29
|
+
return { ok: true, provider: deploy, source: 'config' };
|
|
30
|
+
// 'auto' (or unset) means the project never chose a provider - don't guess one.
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
/* unreadable config - fall through to the adapter */
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (svelteConfig) {
|
|
37
|
+
for (const [pkg, provider] of ADAPTERS)
|
|
38
|
+
if (svelteConfig.includes(pkg))
|
|
39
|
+
return { ok: true, provider, source: 'adapter' };
|
|
40
|
+
}
|
|
41
|
+
return { ok: false, reason: `No deploy target configured. ${GUIDANCE}` };
|
|
42
|
+
}
|
|
43
|
+
/** The commands a provider deploy runs - same one-liners the generated `deploy` script uses. */
|
|
44
|
+
export function deployCommands(provider) {
|
|
45
|
+
switch (provider) {
|
|
46
|
+
case 'vercel':
|
|
47
|
+
return { provider, build: 'npm run build', deploy: 'npx vercel deploy --prod', notes: ['Needs a Vercel login (npx vercel login) and a linked project (first run prompts to link).'] };
|
|
48
|
+
case 'netlify':
|
|
49
|
+
return { provider, build: 'npm run build', deploy: 'npx netlify deploy --build --prod', notes: ['Needs a Netlify login (npx netlify login) and a linked site (npx netlify link).'] };
|
|
50
|
+
case 'cloudflare':
|
|
51
|
+
return { provider, build: 'npm run build', deploy: 'npx wrangler pages deploy', notes: ['Needs a Cloudflare login (npx wrangler login).'] };
|
|
52
|
+
case 'node':
|
|
53
|
+
return {
|
|
54
|
+
provider,
|
|
55
|
+
build: 'npm run build',
|
|
56
|
+
deploy: null,
|
|
57
|
+
notes: [
|
|
58
|
+
'The node target has no hosted provider - after the build, run it yourself:',
|
|
59
|
+
' node build # serves on PORT (default 3000)',
|
|
60
|
+
' docker build -t app . && docker run -p 3000:3000 --env-file .env app',
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Env keys declared in .env.example (uncommented `KEY=` lines) that are absent
|
|
66
|
+
* from the local .env - surfaced as a preflight warning before deploying. */
|
|
67
|
+
export function missingEnvKeys(envExample, envLocal) {
|
|
68
|
+
if (!envExample)
|
|
69
|
+
return [];
|
|
70
|
+
const declared = envExample
|
|
71
|
+
.split('\n')
|
|
72
|
+
.map((l) => l.trim())
|
|
73
|
+
.filter((l) => /^[A-Z][A-Z0-9_]*=/.test(l))
|
|
74
|
+
.map((l) => l.slice(0, l.indexOf('=')));
|
|
75
|
+
const present = new Set((envLocal ?? '')
|
|
76
|
+
.split('\n')
|
|
77
|
+
.map((l) => l.trim())
|
|
78
|
+
.filter((l) => /^[A-Z][A-Z0-9_]*=.+/.test(l))
|
|
79
|
+
.map((l) => l.slice(0, l.indexOf('='))));
|
|
80
|
+
return declared.filter((k) => !present.has(k));
|
|
81
|
+
}
|