@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,48 @@
|
|
|
1
|
+
import { refineField } from './field-inference.js';
|
|
2
|
+
/** Assemble an EntitySchema from discovered columns. */
|
|
3
|
+
export function buildEntitySchema(table, columns) {
|
|
4
|
+
if (!columns.length)
|
|
5
|
+
throw new Error(`buildEntitySchema: "${table}" has no columns`);
|
|
6
|
+
// Primary key: first flagged pk, else a column literally named "id", else the
|
|
7
|
+
// first column (so update/delete always have a key to target).
|
|
8
|
+
const explicitPk = columns.find((c) => c.primaryKey)?.name;
|
|
9
|
+
const idField = explicitPk ?? columns.find((c) => /^id$/i.test(c.name))?.name ?? columns[0].name;
|
|
10
|
+
const fields = columns.map((c) => {
|
|
11
|
+
const isPk = c.name === idField;
|
|
12
|
+
// A foreign-key column (that isn't the PK) becomes a relation field, so the
|
|
13
|
+
// form renders a lookup and master-detail can be inferred.
|
|
14
|
+
if (c.references && !isPk) {
|
|
15
|
+
const rel = { field: c.name, type: 'relation' };
|
|
16
|
+
rel.relation = {
|
|
17
|
+
entity: c.references.table,
|
|
18
|
+
foreignKey: c.name,
|
|
19
|
+
labelField: c.references.labelField ?? 'name',
|
|
20
|
+
};
|
|
21
|
+
if (c.dbColumn)
|
|
22
|
+
rel.dbColumn = c.dbColumn;
|
|
23
|
+
if (c.required)
|
|
24
|
+
rel.required = true;
|
|
25
|
+
return rel;
|
|
26
|
+
}
|
|
27
|
+
const type = c.enumValues?.length ? 'enum' : (c.type ?? 'text');
|
|
28
|
+
const f = { field: c.name, type };
|
|
29
|
+
if (c.dbColumn)
|
|
30
|
+
f.dbColumn = c.dbColumn;
|
|
31
|
+
if (isPk) {
|
|
32
|
+
f.primaryKey = true;
|
|
33
|
+
f.readonly = true;
|
|
34
|
+
}
|
|
35
|
+
else if (c.required) {
|
|
36
|
+
f.required = true;
|
|
37
|
+
}
|
|
38
|
+
if (type === 'enum' && c.enumValues?.length) {
|
|
39
|
+
f.options = c.enumValues.map((v) => ({ value: v, label: v }));
|
|
40
|
+
}
|
|
41
|
+
// Infer a rich editor from the column name/type (phone / email / rating / ...).
|
|
42
|
+
return refineField(f);
|
|
43
|
+
});
|
|
44
|
+
return { name: table, label: table, idField, fields };
|
|
45
|
+
}
|
|
46
|
+
// Schema-level relation helpers live in ../schema (studio consumes them under
|
|
47
|
+
// node16 resolution); re-exported here so introspection consumers get one entry.
|
|
48
|
+
export { pickLabelField, linkRelationLabels } from '../schema.js';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createSupabaseDataSource - a browser-ready `ServerDataSource` over a Supabase
|
|
3
|
+
* table, using the `supabase-js` client (PostgREST). You bring the client (so
|
|
4
|
+
* there's no dependency here and Row-Level Security + auth apply per request);
|
|
5
|
+
* this maps the grid's sort / filter / page / CRUD onto the query builder.
|
|
6
|
+
*
|
|
7
|
+
* import { createClient } from '@supabase/supabase-js'
|
|
8
|
+
* const client = createClient(url, anonKey)
|
|
9
|
+
* const source = createSupabaseDataSource({ client, table: 'customers', schema })
|
|
10
|
+
*
|
|
11
|
+
* Global search covers the schema's text + enum columns by default; override
|
|
12
|
+
* with `searchColumns`. The primary key comes from the schema (`idField`) and is
|
|
13
|
+
* stripped from inserts (it's database-generated).
|
|
14
|
+
*/
|
|
15
|
+
import type { RowData } from '@svgrid/grid';
|
|
16
|
+
import { type EntitySchema } from '../schema';
|
|
17
|
+
import type { WritableDataSource } from '../sveltekit/types';
|
|
18
|
+
/** The slice of a `supabase-js` client this adapter needs. */
|
|
19
|
+
export type SupabaseClientLike = {
|
|
20
|
+
from(table: string): any;
|
|
21
|
+
};
|
|
22
|
+
export type SupabaseDataSourceConfig<TData extends RowData> = {
|
|
23
|
+
client: SupabaseClientLike;
|
|
24
|
+
/** Table (or view) name. */
|
|
25
|
+
table: string;
|
|
26
|
+
schema: EntitySchema<TData>;
|
|
27
|
+
/**
|
|
28
|
+
* Columns the global search box matches (OR of ILIKEs). Defaults to the
|
|
29
|
+
* schema's text + enum fields.
|
|
30
|
+
*/
|
|
31
|
+
searchColumns?: string[];
|
|
32
|
+
};
|
|
33
|
+
export declare function createSupabaseDataSource<TData extends RowData>(config: SupabaseDataSourceConfig<TData>): WritableDataSource<TData>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { resolveIdField } from '../schema';
|
|
2
|
+
import { nudgeEnterprise } from '../license';
|
|
3
|
+
import { normalizeFilters } from './filters';
|
|
4
|
+
const sanitize = (term) => term.replace(/[%,()]/g, '');
|
|
5
|
+
export function createSupabaseDataSource(config) {
|
|
6
|
+
nudgeEnterprise('Studio'); // soft-gate; never blocks
|
|
7
|
+
const { client, table, schema } = config;
|
|
8
|
+
const idField = resolveIdField(schema);
|
|
9
|
+
const searchColumns = config.searchColumns ??
|
|
10
|
+
schema.fields.filter((f) => f.type === 'text' || f.type === 'enum').map((f) => String(f.field));
|
|
11
|
+
return {
|
|
12
|
+
async getRows(request) {
|
|
13
|
+
let q = client.from(table).select('*', { count: 'exact' });
|
|
14
|
+
const { predicates, search } = normalizeFilters(request.filterModel);
|
|
15
|
+
for (const p of predicates) {
|
|
16
|
+
switch (p.op) {
|
|
17
|
+
case 'in':
|
|
18
|
+
q = q.in(p.column, p.values);
|
|
19
|
+
break;
|
|
20
|
+
case 'contains':
|
|
21
|
+
q = q.ilike(p.column, `%${p.value}%`);
|
|
22
|
+
break;
|
|
23
|
+
case 'startsWith':
|
|
24
|
+
q = q.ilike(p.column, `${p.value}%`);
|
|
25
|
+
break;
|
|
26
|
+
case 'eq':
|
|
27
|
+
q = q.eq(p.column, p.value);
|
|
28
|
+
break;
|
|
29
|
+
case 'gt':
|
|
30
|
+
q = q.gt(p.column, p.value);
|
|
31
|
+
break;
|
|
32
|
+
case 'lt':
|
|
33
|
+
q = q.lt(p.column, p.value);
|
|
34
|
+
break;
|
|
35
|
+
case 'between':
|
|
36
|
+
q = q.gte(p.column, p.value).lte(p.column, p.valueTo);
|
|
37
|
+
break;
|
|
38
|
+
case 'isNull':
|
|
39
|
+
q = q.is(p.column, null);
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (search && searchColumns.length) {
|
|
44
|
+
const term = sanitize(search);
|
|
45
|
+
q = q.or(searchColumns.map((c) => `${c}.ilike.%${term}%`).join(','));
|
|
46
|
+
}
|
|
47
|
+
for (const s of request.sortModel)
|
|
48
|
+
q = q.order(s.id, { ascending: !s.desc });
|
|
49
|
+
const { data, count, error } = await q.range(request.startRow, request.endRow - 1);
|
|
50
|
+
if (error)
|
|
51
|
+
throw new Error(error.message);
|
|
52
|
+
return { rows: (data ?? []), rowCount: count ?? 0 };
|
|
53
|
+
},
|
|
54
|
+
async createRow(input) {
|
|
55
|
+
const rest = { ...input };
|
|
56
|
+
delete rest[idField]; // primary key is database-generated
|
|
57
|
+
const { data, error } = await client.from(table).insert(rest).select().single();
|
|
58
|
+
if (error)
|
|
59
|
+
throw new Error(error.message);
|
|
60
|
+
return (data ?? input);
|
|
61
|
+
},
|
|
62
|
+
async updateRow(id, patch) {
|
|
63
|
+
const { data, error } = await client.from(table).update(patch).eq(idField, id).select().single();
|
|
64
|
+
if (error)
|
|
65
|
+
throw new Error(error.message);
|
|
66
|
+
return (data ?? { ...patch, [idField]: id });
|
|
67
|
+
},
|
|
68
|
+
async deleteRow(id) {
|
|
69
|
+
const { error } = await client.from(table).delete().eq(idField, id);
|
|
70
|
+
if (error)
|
|
71
|
+
throw new Error(error.message);
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* withEntityRules - apply an `EntitySchema`'s computed fields and lifecycle
|
|
3
|
+
* hooks to any `ServerDataSource`, at the mutation boundary. It's a transparent
|
|
4
|
+
* wrapper: pass the result to `createServerDataSource` (or straight to the grid)
|
|
5
|
+
* and every read row gets its computed fields materialized, while writes run the
|
|
6
|
+
* schema's before/after hooks and cross-field validation.
|
|
7
|
+
*
|
|
8
|
+
* const source = withEntityRules(createSqlDataSource(...), orderSchema)
|
|
9
|
+
*
|
|
10
|
+
* - `getRows` -> each row through `applyComputed` (grid can sort/filter the
|
|
11
|
+
* computed value within the fetched page).
|
|
12
|
+
* - `createRow` -> `hooks.validate` + `hooks.beforeCreate` (may transform the
|
|
13
|
+
* payload or throw), then `applyComputed` on the returned row,
|
|
14
|
+
* then `hooks.afterCreate`.
|
|
15
|
+
* - `updateRow` -> the same with `beforeUpdate` / `afterUpdate`.
|
|
16
|
+
* - `deleteRow` -> `hooks.beforeDelete` (throw to veto) then `hooks.afterDelete`.
|
|
17
|
+
*
|
|
18
|
+
* Optional write methods stay optional, and any extra source capabilities
|
|
19
|
+
* (`getAggregate`, `rows()`) pass through untouched. Returning `applyComputed`
|
|
20
|
+
* rows from every method keeps the controller's optimistic reconciliation
|
|
21
|
+
* correct (a source must return the same row shape from all methods).
|
|
22
|
+
*/
|
|
23
|
+
import type { RowData, ServerDataSource } from '@svgrid/grid';
|
|
24
|
+
import { type EntitySchema } from '../schema';
|
|
25
|
+
export declare function withEntityRules<TData extends RowData, S extends ServerDataSource<TData>>(source: S, schema: EntitySchema<TData>): S;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { applyComputed, validateEntity } from '../schema';
|
|
2
|
+
function firstError(errors) {
|
|
3
|
+
return Object.values(errors)[0] ?? 'Validation failed';
|
|
4
|
+
}
|
|
5
|
+
export function withEntityRules(source, schema) {
|
|
6
|
+
const hooks = schema.hooks ?? {};
|
|
7
|
+
const compute = (row) => applyComputed(schema, row);
|
|
8
|
+
const wrapped = {
|
|
9
|
+
async getRows(request) {
|
|
10
|
+
const res = await source.getRows(request);
|
|
11
|
+
return { ...res, rows: res.rows.map(compute) };
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
if (source.createRow) {
|
|
15
|
+
const create = source.createRow.bind(source);
|
|
16
|
+
wrapped.createRow = async (input) => {
|
|
17
|
+
const errors = await validateEntity(schema, input);
|
|
18
|
+
if (Object.keys(errors).length)
|
|
19
|
+
throw new Error(firstError(errors));
|
|
20
|
+
const payload = hooks.beforeCreate ? await hooks.beforeCreate(input) : input;
|
|
21
|
+
const row = compute(await create(payload));
|
|
22
|
+
await hooks.afterCreate?.(row);
|
|
23
|
+
return row;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (source.updateRow) {
|
|
27
|
+
const update = source.updateRow.bind(source);
|
|
28
|
+
wrapped.updateRow = async (id, patch) => {
|
|
29
|
+
const errors = await validateEntity(schema, patch);
|
|
30
|
+
if (Object.keys(errors).length)
|
|
31
|
+
throw new Error(firstError(errors));
|
|
32
|
+
const payload = hooks.beforeUpdate ? await hooks.beforeUpdate(id, patch) : patch;
|
|
33
|
+
const row = compute(await update(id, payload));
|
|
34
|
+
await hooks.afterUpdate?.(row);
|
|
35
|
+
return row;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (source.deleteRow) {
|
|
39
|
+
const del = source.deleteRow.bind(source);
|
|
40
|
+
wrapped.deleteRow = async (id) => {
|
|
41
|
+
await hooks.beforeDelete?.(id);
|
|
42
|
+
await del(id);
|
|
43
|
+
await hooks.afterDelete?.(id);
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return { ...source, ...wrapped };
|
|
47
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* withRelationLabels - decorate a source's rows with the human label of each
|
|
3
|
+
* foreign key, so the grid can show "Acme Inc" instead of the raw id `42`. It
|
|
4
|
+
* resolves labels through a `RelationLookup` (the same cached resolver the edit
|
|
5
|
+
* form's picker uses), so a value is fetched at most once and stays fresh.
|
|
6
|
+
*
|
|
7
|
+
* const postsSource = withRelationLabels(rawPostsSource, [
|
|
8
|
+
* { fk: 'authorId', lookup: authorLookup, as: 'author' },
|
|
9
|
+
* ])
|
|
10
|
+
*
|
|
11
|
+
* Pair it with a schema where the FK field is `hidden: { grid: true }` and a
|
|
12
|
+
* read-only display column (`author`) shows the label. Because every method
|
|
13
|
+
* returns the decorated row shape, the controller's optimistic updates stay
|
|
14
|
+
* correct.
|
|
15
|
+
*/
|
|
16
|
+
import type { RowData, ServerDataSource } from '@svgrid/grid';
|
|
17
|
+
import type { RelationLookup } from './relation-lookup';
|
|
18
|
+
export type RelationLabelConfig = {
|
|
19
|
+
/** Local foreign-key field to resolve. */
|
|
20
|
+
fk: string;
|
|
21
|
+
/** Resolver for the related entity (see `createRelationLookup`). */
|
|
22
|
+
lookup: RelationLookup;
|
|
23
|
+
/** Field to write the resolved label onto. */
|
|
24
|
+
as: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function withRelationLabels<TData extends RowData, S extends ServerDataSource<TData>>(source: S, relations: RelationLabelConfig[]): S;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function withRelationLabels(source, relations) {
|
|
2
|
+
if (relations.length === 0)
|
|
3
|
+
return source;
|
|
4
|
+
/** Decorate one row (used by create/update returns). */
|
|
5
|
+
const decorate = async (row) => {
|
|
6
|
+
const copy = { ...row };
|
|
7
|
+
await Promise.all(relations.map(async (r) => {
|
|
8
|
+
copy[r.as] = (await r.lookup.labelFor(row[r.fk])) ?? '';
|
|
9
|
+
}));
|
|
10
|
+
return copy;
|
|
11
|
+
};
|
|
12
|
+
const wrapped = {
|
|
13
|
+
async getRows(request) {
|
|
14
|
+
const res = await source.getRows(request);
|
|
15
|
+
// Batch: one lookup query per relation for the whole page (no N+1).
|
|
16
|
+
const maps = await Promise.all(relations.map((r) => r.lookup.labelsFor(res.rows.map((row) => row[r.fk]))));
|
|
17
|
+
const rows = res.rows.map((row) => {
|
|
18
|
+
const copy = { ...row };
|
|
19
|
+
relations.forEach((r, i) => {
|
|
20
|
+
copy[r.as] = maps[i].get(String(row[r.fk])) ?? '';
|
|
21
|
+
});
|
|
22
|
+
return copy;
|
|
23
|
+
});
|
|
24
|
+
return { ...res, rows };
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
if (source.createRow) {
|
|
28
|
+
const fn = source.createRow.bind(source);
|
|
29
|
+
wrapped.createRow = async (input) => decorate(await fn(input));
|
|
30
|
+
}
|
|
31
|
+
if (source.updateRow) {
|
|
32
|
+
const fn = source.updateRow.bind(source);
|
|
33
|
+
wrapped.updateRow = async (id, patch) => decorate(await fn(id, patch));
|
|
34
|
+
}
|
|
35
|
+
if (source.deleteRow)
|
|
36
|
+
wrapped.deleteRow = source.deleteRow.bind(source);
|
|
37
|
+
return { ...source, ...wrapped };
|
|
38
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Staged editing - batch / draft mode for the grid.
|
|
3
|
+
*
|
|
4
|
+
* Without staged editing, every `onCellValueChange` writes immediately
|
|
5
|
+
* into the source data. Staged editing buffers writes into a draft
|
|
6
|
+
* shadow so the user can:
|
|
7
|
+
*
|
|
8
|
+
* - Review every change before it lands
|
|
9
|
+
* - Discard the whole batch
|
|
10
|
+
* - Commit atomically (one server roundtrip; one undo step)
|
|
11
|
+
*
|
|
12
|
+
* Stays out of the headless engine - lives in `@svgrid/enterprise` as a small
|
|
13
|
+
* stateful wrapper your `onCellValueChange` handler delegates to.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```ts
|
|
17
|
+
* const stage = createStagedEditing<Order>()
|
|
18
|
+
*
|
|
19
|
+
* <SvGrid {data} {columns} features={features}
|
|
20
|
+
* onCellValueChange={(e) => stage.record(e)}
|
|
21
|
+
* />
|
|
22
|
+
*
|
|
23
|
+
* stage.changes() // → Change[]
|
|
24
|
+
* stage.commit(rows => /* push to server, set data = mutated rows *\/)
|
|
25
|
+
* stage.revert() // → applies inverse writes back into the grid
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
import type { RowData } from '@svgrid/grid';
|
|
29
|
+
export type StagedChange<TData extends RowData> = {
|
|
30
|
+
/** Stable row id (the grid's row.id - or your getRowId result). */
|
|
31
|
+
rowId: string;
|
|
32
|
+
/** Source-array index at the time the change was recorded. */
|
|
33
|
+
rowIndex: number;
|
|
34
|
+
/** Field name on the row object. */
|
|
35
|
+
columnId: string;
|
|
36
|
+
/** Original value, BEFORE any staged edit. Stable across re-edits. */
|
|
37
|
+
original: unknown;
|
|
38
|
+
/** Most recent staged value. */
|
|
39
|
+
staged: unknown;
|
|
40
|
+
/** Timestamp the change was first staged (ms since epoch). */
|
|
41
|
+
recordedAt: number;
|
|
42
|
+
/** The whole row object as it was BEFORE the first edit. Useful for
|
|
43
|
+
* optimistic locking / row-level commits. */
|
|
44
|
+
originalRow?: TData;
|
|
45
|
+
};
|
|
46
|
+
export type StagedEditingEvent = {
|
|
47
|
+
rowIndex: number;
|
|
48
|
+
columnId: string;
|
|
49
|
+
oldValue: unknown;
|
|
50
|
+
newValue: unknown;
|
|
51
|
+
row: unknown;
|
|
52
|
+
};
|
|
53
|
+
export type StagedEditingApi<TData extends RowData> = {
|
|
54
|
+
/** Feed a grid `onCellValueChange` event into the staging buffer. */
|
|
55
|
+
record(e: StagedEditingEvent): void;
|
|
56
|
+
/** Snapshot of every pending change, ordered by first edit. */
|
|
57
|
+
changes(): StagedChange<TData>[];
|
|
58
|
+
/** True when at least one cell is staged. */
|
|
59
|
+
isDirty(): boolean;
|
|
60
|
+
/** Count of distinct (row, column) pairs currently staged. */
|
|
61
|
+
size(): number;
|
|
62
|
+
/** Cells changed grouped by row id - one entry per touched row. */
|
|
63
|
+
changesByRow(): Array<{
|
|
64
|
+
rowId: string;
|
|
65
|
+
rowIndex: number;
|
|
66
|
+
cells: StagedChange<TData>[];
|
|
67
|
+
}>;
|
|
68
|
+
/**
|
|
69
|
+
* Hand every staged change to `commitFn`. When `commitFn` resolves
|
|
70
|
+
* truthy / void, the staging buffer is cleared. Throw / reject from
|
|
71
|
+
* `commitFn` to keep the buffer (so the user can retry).
|
|
72
|
+
*/
|
|
73
|
+
commit(commitFn: (changes: StagedChange<TData>[]) => Promise<void> | void): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Roll back every staged cell. Each call to `applyRevert` is passed
|
|
76
|
+
* (rowIndex, columnId, originalValue) - typically wired to
|
|
77
|
+
* `api.setCellValue(rowIndex, columnId, originalValue)`.
|
|
78
|
+
*/
|
|
79
|
+
revert(applyRevert: (rowIndex: number, columnId: string, originalValue: unknown) => void): void;
|
|
80
|
+
/** Drop a single staged cell (without applying it). */
|
|
81
|
+
drop(rowId: string, columnId: string): void;
|
|
82
|
+
/** Wipe the buffer without applying anything. */
|
|
83
|
+
clear(): void;
|
|
84
|
+
};
|
|
85
|
+
export declare function createStagedEditing<TData extends RowData = RowData>(): StagedEditingApi<TData>;
|
|
Binary file
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Studio bug-report core (pure + node-safe, usable from the CLI and the
|
|
3
|
+
* designer). Two pieces:
|
|
4
|
+
*
|
|
5
|
+
* - `sanitizeStudioProject` - strip credentials + seed DATA from a project so
|
|
6
|
+
* a bug report never leaks a user's database or rows. It keeps the SCHEMA,
|
|
7
|
+
* screens, and block structure (what actually reproduces a Studio bug) and
|
|
8
|
+
* returns a plain-language list of what was removed, so the user sees it.
|
|
9
|
+
* - `buildStudioBugReport` - assemble a markdown report + a prefilled GitHub
|
|
10
|
+
* "new issue" URL. The URL carries a short summary (GitHub caps the prefill
|
|
11
|
+
* ~8 KB); the full sanitized report goes in `markdown` for the caller to
|
|
12
|
+
* copy to the clipboard / write to a file and paste in.
|
|
13
|
+
*
|
|
14
|
+
* The caller supplies `env` (version / node / os) so this stays free of any
|
|
15
|
+
* process or DOM access and is trivially testable.
|
|
16
|
+
*/
|
|
17
|
+
import type { StudioProject } from './project.js';
|
|
18
|
+
export type SanitizeResult = {
|
|
19
|
+
project: StudioProject;
|
|
20
|
+
redactions: string[];
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Return a copy of the project safe to attach to a bug report: credentials and
|
|
24
|
+
* seeded rows removed, schema + screens + blocks intact. Also returns a list of
|
|
25
|
+
* exactly what was stripped, for transparency.
|
|
26
|
+
*/
|
|
27
|
+
export declare function sanitizeStudioProject(project: StudioProject): SanitizeResult;
|
|
28
|
+
export type StudioEnv = {
|
|
29
|
+
studioVersion?: string;
|
|
30
|
+
node?: string;
|
|
31
|
+
os?: string;
|
|
32
|
+
};
|
|
33
|
+
export type BugReportInput = {
|
|
34
|
+
/** The current project model (studio.config.json). Sanitized before use. */
|
|
35
|
+
project?: StudioProject;
|
|
36
|
+
/** The error that triggered the report (on a crash), if any. */
|
|
37
|
+
error?: Error | {
|
|
38
|
+
message: string;
|
|
39
|
+
stack?: string;
|
|
40
|
+
} | string;
|
|
41
|
+
/** What the user was doing (e.g. "generating the app", "editing the CRM board"). */
|
|
42
|
+
action?: string;
|
|
43
|
+
env?: StudioEnv;
|
|
44
|
+
/** `owner/repo` the issue targets (default the public SvGrid repo). */
|
|
45
|
+
repo?: string;
|
|
46
|
+
};
|
|
47
|
+
export type BugReport = {
|
|
48
|
+
title: string;
|
|
49
|
+
/** Full markdown report - copy to clipboard / write to a file and paste in. */
|
|
50
|
+
markdown: string;
|
|
51
|
+
/** Prefilled GitHub "new issue" URL. */
|
|
52
|
+
issueUrl: string;
|
|
53
|
+
redactions: string[];
|
|
54
|
+
/** True when the report was too big for the URL, so `markdown` must be pasted. */
|
|
55
|
+
truncated: boolean;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Build a shareable bug report from the current Studio state. The project is
|
|
59
|
+
* sanitized first; secrets never reach the markdown or the URL.
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildStudioBugReport(input: BugReportInput): BugReport;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
const REDACTED = '<redacted>';
|
|
2
|
+
const DEFAULT_REPO = 'sv-grid/sv-grid';
|
|
3
|
+
/** Keep the prefilled issue URL comfortably under browser / GitHub limits. */
|
|
4
|
+
const MAX_URL = 7500;
|
|
5
|
+
/** Param names that carry secrets (substring, case-insensitive). */
|
|
6
|
+
const SECRET_NAME_RE = /(key|token|secret|auth|password|pass|bearer|credential)/i;
|
|
7
|
+
/** Redact one entity's data source; push a human note for anything removed. */
|
|
8
|
+
function sanitizeSource(entity, src, redactions) {
|
|
9
|
+
if (src.kind === 'memory') {
|
|
10
|
+
const { seed, ...rest } = src;
|
|
11
|
+
if (seed?.length)
|
|
12
|
+
redactions.push(`${entity}: ${seed.length} in-memory seed row(s) omitted`);
|
|
13
|
+
return rest;
|
|
14
|
+
}
|
|
15
|
+
if (src.kind === 'pglite') {
|
|
16
|
+
const { seed, ...rest } = src;
|
|
17
|
+
if (seed?.length)
|
|
18
|
+
redactions.push(`${entity}: ${seed.length} local-database seed row(s) omitted`);
|
|
19
|
+
return rest;
|
|
20
|
+
}
|
|
21
|
+
if (src.kind === 'supabase') {
|
|
22
|
+
const out = { ...src };
|
|
23
|
+
if (out.url) {
|
|
24
|
+
out.url = REDACTED;
|
|
25
|
+
redactions.push(`${entity}: Supabase URL redacted`);
|
|
26
|
+
}
|
|
27
|
+
if (out.key) {
|
|
28
|
+
out.key = REDACTED;
|
|
29
|
+
redactions.push(`${entity}: Supabase key redacted`);
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
if (src.kind === 'rest') {
|
|
34
|
+
const params = src.params.map((p) => {
|
|
35
|
+
// Header params and secret-named params carry auth; drop their values.
|
|
36
|
+
if (p.value && (p.location === 'header' || SECRET_NAME_RE.test(p.name))) {
|
|
37
|
+
redactions.push(`${entity}: REST ${p.location} param "${p.name}" value redacted`);
|
|
38
|
+
return { ...p, value: REDACTED };
|
|
39
|
+
}
|
|
40
|
+
return p;
|
|
41
|
+
});
|
|
42
|
+
let baseUrl = src.baseUrl;
|
|
43
|
+
if (/[?&](key|token|apikey|secret|auth|password)=/i.test(baseUrl)) {
|
|
44
|
+
baseUrl = baseUrl.replace(/([?&](?:key|token|apikey|secret|auth|password)=)[^&]*/gi, `$1${REDACTED}`);
|
|
45
|
+
redactions.push(`${entity}: credentials in REST baseUrl redacted`);
|
|
46
|
+
}
|
|
47
|
+
return { ...src, baseUrl, params };
|
|
48
|
+
}
|
|
49
|
+
// sql: the connection string lives in the host env, not the model - nothing to strip.
|
|
50
|
+
return src;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Return a copy of the project safe to attach to a bug report: credentials and
|
|
54
|
+
* seeded rows removed, schema + screens + blocks intact. Also returns a list of
|
|
55
|
+
* exactly what was stripped, for transparency.
|
|
56
|
+
*/
|
|
57
|
+
export function sanitizeStudioProject(project) {
|
|
58
|
+
const redactions = [];
|
|
59
|
+
if (!project.dataSources)
|
|
60
|
+
return { project, redactions };
|
|
61
|
+
const nextSources = {};
|
|
62
|
+
for (const [name, src] of Object.entries(project.dataSources)) {
|
|
63
|
+
nextSources[name] = sanitizeSource(name, src, redactions);
|
|
64
|
+
}
|
|
65
|
+
return { project: { ...project, dataSources: nextSources }, redactions };
|
|
66
|
+
}
|
|
67
|
+
function normalizeError(e) {
|
|
68
|
+
if (!e)
|
|
69
|
+
return undefined;
|
|
70
|
+
if (typeof e === 'string')
|
|
71
|
+
return { message: e };
|
|
72
|
+
return { message: e.message, stack: 'stack' in e ? e.stack : undefined };
|
|
73
|
+
}
|
|
74
|
+
function newIssueUrl(repo, title, body) {
|
|
75
|
+
const q = new URLSearchParams({ title, body, labels: 'studio,bug' });
|
|
76
|
+
return `https://github.com/${repo}/issues/new?${q.toString()}`;
|
|
77
|
+
}
|
|
78
|
+
function envLines(env) {
|
|
79
|
+
return [
|
|
80
|
+
`- Studio: ${env.studioVersion ?? 'unknown'}`,
|
|
81
|
+
`- Node: ${env.node ?? 'unknown'}`,
|
|
82
|
+
`- OS: ${env.os ?? 'unknown'}`,
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
function renderSummary(env, err, action, redactions) {
|
|
86
|
+
const lines = ['### Environment', ...envLines(env), ''];
|
|
87
|
+
if (action)
|
|
88
|
+
lines.push('### What I was doing', action, '');
|
|
89
|
+
if (err)
|
|
90
|
+
lines.push('### Error', '```', err.message, '```', '');
|
|
91
|
+
lines.push(`_${redactions.length} item(s) redacted (credentials + seed data)._`);
|
|
92
|
+
return lines.join('\n');
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Build a shareable bug report from the current Studio state. The project is
|
|
96
|
+
* sanitized first; secrets never reach the markdown or the URL.
|
|
97
|
+
*/
|
|
98
|
+
export function buildStudioBugReport(input) {
|
|
99
|
+
const env = input.env ?? {};
|
|
100
|
+
const err = normalizeError(input.error);
|
|
101
|
+
const { project, redactions } = input.project
|
|
102
|
+
? sanitizeStudioProject(input.project)
|
|
103
|
+
: { project: undefined, redactions: [] };
|
|
104
|
+
const firstLine = (err?.message ?? 'Bug report').split('\n')[0].trim().slice(0, 100);
|
|
105
|
+
const title = `[Studio] ${firstLine}`;
|
|
106
|
+
const md = ['## SvGrid Studio bug report', '', '### Environment', ...envLines(env), ''];
|
|
107
|
+
if (input.action)
|
|
108
|
+
md.push('### What I was doing', input.action, '');
|
|
109
|
+
if (err)
|
|
110
|
+
md.push('### Error', '```', err.message, ...(err.stack ? ['', err.stack] : []), '```', '');
|
|
111
|
+
if (project)
|
|
112
|
+
md.push('### Project', `${project.entities?.length ?? 0} entities, ${project.screens?.length ?? 0} screens.`, '');
|
|
113
|
+
md.push('### Redactions', redactions.length ? redactions.map((r) => `- ${r}`).join('\n') : '- none', '');
|
|
114
|
+
if (project)
|
|
115
|
+
md.push('### Sanitized studio.config.json', '```json', JSON.stringify(project, null, 2), '```');
|
|
116
|
+
const markdown = md.join('\n');
|
|
117
|
+
const repo = input.repo ?? DEFAULT_REPO;
|
|
118
|
+
let issueUrl = newIssueUrl(repo, title, markdown);
|
|
119
|
+
let truncated = false;
|
|
120
|
+
if (issueUrl.length > MAX_URL) {
|
|
121
|
+
truncated = true;
|
|
122
|
+
const body = `${renderSummary(env, err, input.action, redactions)}\n\n> The full sanitized report was copied to your clipboard - paste it below.`;
|
|
123
|
+
issueUrl = newIssueUrl(repo, title, body);
|
|
124
|
+
}
|
|
125
|
+
return { title, markdown, issueUrl, redactions, truncated };
|
|
126
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runStudioAdd - the one-command pipeline behind `@svgrid/studio add`: read a
|
|
3
|
+
* schema, introspect it, scaffold the files, merge-write them (preserving user
|
|
4
|
+
* edits outside managed regions), and verify the output compiles. This is the
|
|
5
|
+
* whole "CRUD screen in seconds" flow.
|
|
6
|
+
*
|
|
7
|
+
* Filesystem access is injected (`StudioIO`), so the orchestration is pure and
|
|
8
|
+
* unit-testable; the actual CLI bin supplies node:fs. No process/fs imports
|
|
9
|
+
* here, so it also runs in the browser (e.g. the designer's future
|
|
10
|
+
* write-to-project action).
|
|
11
|
+
*/
|
|
12
|
+
import type { EntitySchema } from '../schema.js';
|
|
13
|
+
import { type ScaffoldOptions } from './scaffold.js';
|
|
14
|
+
import { type ScaffoldAppOptions } from './scaffold-app.js';
|
|
15
|
+
import { type VerifyResult } from './verify.js';
|
|
16
|
+
export type StudioIO = {
|
|
17
|
+
/** Read a file; resolve to null when it doesn't exist. */
|
|
18
|
+
readFile: (path: string) => Promise<string | null>;
|
|
19
|
+
/** Write a file, creating parent directories as needed. */
|
|
20
|
+
writeFile: (path: string, contents: string) => Promise<void>;
|
|
21
|
+
};
|
|
22
|
+
export type AddOptions = ScaffoldOptions & {
|
|
23
|
+
/** Path to a Drizzle schema file to introspect. */
|
|
24
|
+
from?: string;
|
|
25
|
+
/** Which table in the Drizzle file to use (defaults to the first). */
|
|
26
|
+
table?: string;
|
|
27
|
+
/** Sample JSON rows to infer from, as an alternative to `from`. */
|
|
28
|
+
rows?: Array<Record<string, unknown>>;
|
|
29
|
+
/** Entity name (required with `rows`, ignored with `from`). */
|
|
30
|
+
name?: string;
|
|
31
|
+
/** A ready EntitySchema, bypassing introspection. */
|
|
32
|
+
schema?: EntitySchema;
|
|
33
|
+
};
|
|
34
|
+
export type AddResult = {
|
|
35
|
+
schema: EntitySchema;
|
|
36
|
+
/** Paths written, in order. */
|
|
37
|
+
written: string[];
|
|
38
|
+
verify: VerifyResult;
|
|
39
|
+
};
|
|
40
|
+
/** Resolve an EntitySchema from whichever input was provided. */
|
|
41
|
+
export declare function resolveSchema(options: AddOptions, io: StudioIO): Promise<EntitySchema>;
|
|
42
|
+
/**
|
|
43
|
+
* Resolve **every** entity from a Drizzle or Prisma schema file (the `--all
|
|
44
|
+
* --from` path), linked so foreign keys become working relation lookups.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveSchemas(from: string, io: StudioIO): Promise<EntitySchema[]>;
|
|
47
|
+
export declare function runStudioAdd(options: AddOptions, io: StudioIO): Promise<AddResult>;
|
|
48
|
+
export type AddAppResult = {
|
|
49
|
+
written: string[];
|
|
50
|
+
verify: VerifyResult;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Scaffold a whole multi-entity app - every entity's screen plus a nav layout
|
|
54
|
+
* and home page - and merge-write it. The `--all` path behind `svgrid-studio`.
|
|
55
|
+
*/
|
|
56
|
+
export declare function runStudioAddApp(schemas: EntitySchema[], options: ScaffoldAppOptions, io: StudioIO): Promise<AddAppResult>;
|