@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
package/src/install.ts
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import type { RowData, TableFeatures, SvGridApi } from '@svgrid/grid'
|
|
2
|
-
import {
|
|
3
|
-
exportGrid,
|
|
4
|
-
copyExportToClipboard,
|
|
5
|
-
type ExportOptions,
|
|
6
|
-
type ExportResult,
|
|
7
|
-
type ClipboardExportOptions,
|
|
8
|
-
} from './export'
|
|
9
|
-
import { printGrid, type PrintOptions } from './print'
|
|
10
|
-
import { importData, type ImportOptions, type ImportResult } from './import'
|
|
11
|
-
import { isLicenseKeySet } from './license'
|
|
12
|
-
import { emitUnlicensedNudge } from './watermark'
|
|
13
|
-
// AI helpers are built-in + free in @svgrid/grid now; enterprise just wires them
|
|
14
|
-
// into the Pro API and registers its export engine so AI exports can write xlsx/pdf.
|
|
15
|
-
import {
|
|
16
|
-
aiFilter, aiSmartFill, aiSummarize, aiClassify, aiExport, aiFindAnomalies,
|
|
17
|
-
aiChart, enableAiCharting, registerExportProvider,
|
|
18
|
-
type AIChartOptions, type AIChartPlan,
|
|
19
|
-
type AIFilterOptions, type AIFilterResult,
|
|
20
|
-
type AISmartFillOptions, type AISmartFillResult,
|
|
21
|
-
type AISummarizeOptions, type AISummary,
|
|
22
|
-
type AIClassifyOptions, type AIClassifyResult,
|
|
23
|
-
type AIExportOptions, type AIExportPlan,
|
|
24
|
-
type AIAnomalyOptions, type AIAnomalyResult,
|
|
25
|
-
} from '@svgrid/grid'
|
|
26
|
-
import {
|
|
27
|
-
createPivotModel,
|
|
28
|
-
type PivotConfig,
|
|
29
|
-
type PivotResult,
|
|
30
|
-
} from './pivot'
|
|
31
|
-
import { enableSchedulerView } from './scheduler'
|
|
32
|
-
import { enableBoardView } from './board'
|
|
33
|
-
import { enablePivot } from './pivot-enable'
|
|
34
|
-
|
|
35
|
-
export type EnterpriseAIApi<TData extends RowData> = {
|
|
36
|
-
/** Natural-language -> filter + sort plan (and optionally apply it). */
|
|
37
|
-
filter(query: string, opts?: AIFilterOptions): Promise<AIFilterResult>
|
|
38
|
-
/** Propose values for empty cells based on a few worked examples. */
|
|
39
|
-
smartFill<TValue = unknown>(opts: AISmartFillOptions): Promise<AISmartFillResult<TValue>>
|
|
40
|
-
/** One-paragraph + bullets summary of a row, selection, group, or the whole view. */
|
|
41
|
-
summarize(opts: AISummarizeOptions): Promise<AISummary>
|
|
42
|
-
/** Classify free-text cells into one of a known set of labels. */
|
|
43
|
-
classify(opts: AIClassifyOptions): Promise<AIClassifyResult>
|
|
44
|
-
/** Natural-language export: "export EU orders from Q2 as a grouped PDF". */
|
|
45
|
-
export(query: string, opts?: AIExportOptions): Promise<AIExportPlan>
|
|
46
|
-
/** Scan a slice for anomalies / outliers, returning a structured list. */
|
|
47
|
-
findAnomalies(opts?: AIAnomalyOptions): Promise<AIAnomalyResult>
|
|
48
|
-
/** Natural-language chart: "revenue by region, stacked by product". */
|
|
49
|
-
chart(query: string, opts?: AIChartOptions): Promise<AIChartPlan>
|
|
50
|
-
// TData is referenced so the type stays bound to the row shape even
|
|
51
|
-
// though the helpers all read through `api.getData()`. Lets callers
|
|
52
|
-
// get correct inference downstream without explicit generics.
|
|
53
|
-
readonly _rowType?: TData
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export type EnterprisePivotApi<
|
|
57
|
-
TFeatures extends TableFeatures,
|
|
58
|
-
TData extends RowData,
|
|
59
|
-
> = {
|
|
60
|
-
/**
|
|
61
|
-
* Build a pivot row/column model from the grid's current data. Returns
|
|
62
|
-
* `{ rows, columns }` you can feed to a separate `<SvGrid>` instance
|
|
63
|
-
* (the typical pattern - the source grid stays unmodified). Pure: no
|
|
64
|
-
* mutation, no DOM access.
|
|
65
|
-
*/
|
|
66
|
-
build(config: PivotConfig<TData>): PivotResult<TFeatures>
|
|
67
|
-
/**
|
|
68
|
-
* Build a pivot from an arbitrary array (not necessarily the grid's
|
|
69
|
-
* data). Useful for previewing a designer's config against a sample
|
|
70
|
-
* before committing.
|
|
71
|
-
*/
|
|
72
|
-
buildFrom<TIn extends RowData>(
|
|
73
|
-
data: ReadonlyArray<TIn>,
|
|
74
|
-
config: PivotConfig<TIn>,
|
|
75
|
-
): PivotResult<TFeatures>
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export type EnterpriseGridApi<
|
|
79
|
-
TFeatures extends TableFeatures,
|
|
80
|
-
TData extends RowData,
|
|
81
|
-
> = SvGridApi<TFeatures, TData> & {
|
|
82
|
-
/** Export the current visible rows to the chosen format. Returns the built
|
|
83
|
-
* file ({@link ExportResult}) for the dependency-free paths (undefined for
|
|
84
|
-
* the vendored-writer xlsx paths, which download directly). */
|
|
85
|
-
exportData(opts: ExportOptions<TData>): Promise<ExportResult | undefined>
|
|
86
|
-
/** Copy the grid (view / selection / all) to the clipboard in a native text
|
|
87
|
-
* format (default `tsv`, pastes into Excel / Sheets as columns). */
|
|
88
|
-
copyExport(opts?: ClipboardExportOptions<TData>): Promise<void>
|
|
89
|
-
/** Open a printable view of the current visible rows in a new window. */
|
|
90
|
-
print(opts?: PrintOptions<TData>): Promise<void>
|
|
91
|
-
/** Read an Excel / CSV / TSV / JSON file (or inline text) into typed
|
|
92
|
-
* rows. Caller decides whether to commit into the grid or preview
|
|
93
|
-
* the parsed result first via the returned `ImportResult`. */
|
|
94
|
-
importData(opts: ImportOptions<TData>): Promise<ImportResult<TData>>
|
|
95
|
-
/** AI helpers (Pro). All calls route through a consumer-registered
|
|
96
|
-
* AIProvider via setAIProvider(); no model client is bundled. */
|
|
97
|
-
ai: EnterpriseAIApi<TData>
|
|
98
|
-
/** Pivot table builder (Pro). Pure - returns `{ rows, columns }` you
|
|
99
|
-
* hand to a separate `<SvGrid>` instance. */
|
|
100
|
-
pivot: EnterprisePivotApi<TFeatures, TData>
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Augment a SvGridApi instance with Pro methods (`exportData`, `print`,
|
|
105
|
-
* `ai.*`). Mutates and returns the same object so existing references
|
|
106
|
-
* keep working.
|
|
107
|
-
*
|
|
108
|
-
* If no license key has been set, the Pro methods still function but the
|
|
109
|
-
* grid shows a small "unlicensed" watermark linking to jqwidgets.com and
|
|
110
|
-
* the console emits a one-time nudge. Revoked or malformed keys throw on
|
|
111
|
-
* first call.
|
|
112
|
-
*/
|
|
113
|
-
export function installEnterprise<
|
|
114
|
-
TFeatures extends TableFeatures,
|
|
115
|
-
TData extends RowData,
|
|
116
|
-
>(api: SvGridApi<TFeatures, TData>): EnterpriseGridApi<TFeatures, TData> {
|
|
117
|
-
const pro = api as EnterpriseGridApi<TFeatures, TData>
|
|
118
|
-
pro.exportData = (opts) => exportGrid(pro, opts)
|
|
119
|
-
pro.copyExport = (opts) => copyExportToClipboard(pro, opts)
|
|
120
|
-
pro.print = (opts) => printGrid(pro, opts)
|
|
121
|
-
pro.importData = (opts) => importData(pro, opts)
|
|
122
|
-
pro.ai = {
|
|
123
|
-
filter: (query, opts) => aiFilter(pro, query, opts),
|
|
124
|
-
smartFill: (opts) => aiSmartFill(pro, opts),
|
|
125
|
-
summarize: (opts) => aiSummarize(pro, opts),
|
|
126
|
-
classify: (opts) => aiClassify(pro, opts),
|
|
127
|
-
export: (query, opts) => aiExport(pro, query, opts),
|
|
128
|
-
findAnomalies: (opts) => aiFindAnomalies(pro, opts),
|
|
129
|
-
chart: (query, opts) => aiChart(pro, query, opts),
|
|
130
|
-
}
|
|
131
|
-
// Wire the built-in chart panel's AI button (no-op without the `charting` prop).
|
|
132
|
-
enableAiCharting(pro)
|
|
133
|
-
// Register the scheduler / calendar view (no-op without the `scheduler` prop).
|
|
134
|
-
enableSchedulerView()
|
|
135
|
-
// Register the Kanban board view (no-op without the `board` prop).
|
|
136
|
-
enableBoardView()
|
|
137
|
-
// Register the export engine so built-in AI exports (aiExport) can write the
|
|
138
|
-
// enterprise formats (xlsx / pdf / ...); free grids without it get the plan only.
|
|
139
|
-
registerExportProvider(exportGrid as never)
|
|
140
|
-
enablePivot()
|
|
141
|
-
pro.pivot = {
|
|
142
|
-
build: (config) =>
|
|
143
|
-
createPivotModel<TFeatures, TData>(pro.getData(), config),
|
|
144
|
-
buildFrom: <TIn extends RowData>(data: ReadonlyArray<TIn>, config: PivotConfig<TIn>) =>
|
|
145
|
-
// PivotConfig is variance-strict in TIn; the runtime call only needs
|
|
146
|
-
// the row shape to match config.rows / config.cols field names, which
|
|
147
|
-
// the caller-side generic enforces.
|
|
148
|
-
createPivotModel<TFeatures, TIn>(data, config),
|
|
149
|
-
}
|
|
150
|
-
// Surface the soft-gate state at install time so the watermark appears
|
|
151
|
-
// alongside the grid, not just after the user clicks Export.
|
|
152
|
-
if (!isLicenseKeySet()) emitUnlicensedNudge()
|
|
153
|
-
return pro
|
|
154
|
-
}
|
package/src/license-core.test.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import { checkLicenseKey } from './license-core'
|
|
3
|
-
|
|
4
|
-
describe('checkLicenseKey', () => {
|
|
5
|
-
it('unset for null / empty', () => {
|
|
6
|
-
expect(checkLicenseKey(null)).toEqual({ status: 'unset', valid: false })
|
|
7
|
-
expect(checkLicenseKey(undefined)).toEqual({ status: 'unset', valid: false })
|
|
8
|
-
expect(checkLicenseKey('')).toEqual({ status: 'unset', valid: false })
|
|
9
|
-
})
|
|
10
|
-
|
|
11
|
-
it('invalid for a wrong prefix', () => {
|
|
12
|
-
expect(checkLicenseKey('nope-123')).toEqual({ status: 'invalid', valid: false })
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
it('dev / eval keys are valid but flagged', () => {
|
|
16
|
-
expect(checkLicenseKey('SVENTERPRISE-DEV-abc')).toEqual({ status: 'dev', valid: true })
|
|
17
|
-
expect(checkLicenseKey('SVENTERPRISE-EVAL-acme-2026')).toEqual({ status: 'eval', valid: true })
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
it('any other SVENTERPRISE- key is licensed', () => {
|
|
21
|
-
expect(checkLicenseKey('SVENTERPRISE-ACME-2026-9XYZ')).toEqual({ status: 'licensed', valid: true })
|
|
22
|
-
})
|
|
23
|
-
})
|
package/src/license-core.ts
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
// Pure license classification - no DOM, no Svelte, no module state. Shared by
|
|
2
|
-
// the browser gate (license.ts, via setLicenseKey) AND the Node/MCP generator
|
|
3
|
-
// (which reads the key from the SVGRID_LICENSE_KEY env var). One definition of
|
|
4
|
-
// "what a valid key is," so the two contexts can never drift.
|
|
5
|
-
//
|
|
6
|
-
// This is deliberately NOT crypto (see license.ts). It classifies a key string;
|
|
7
|
-
// callers decide what to do with the result. The Studio is soft-gate only:
|
|
8
|
-
// unlicensed use still works, it just nudges.
|
|
9
|
-
import { REVOKED_KEYS } from './revoked.js'
|
|
10
|
-
|
|
11
|
-
export const VALID_PREFIX = 'SVENTERPRISE-'
|
|
12
|
-
|
|
13
|
-
export type LicenseStatus =
|
|
14
|
-
| 'unset' // no key provided
|
|
15
|
-
| 'invalid' // present but wrong prefix (usually a typo)
|
|
16
|
-
| 'revoked' // valid prefix but on the revoked list
|
|
17
|
-
| 'dev' // SVENTERPRISE-DEV... - works, not for production
|
|
18
|
-
| 'eval' // SVENTERPRISE-EVAL... - works, not for production
|
|
19
|
-
| 'licensed' // any other SVENTERPRISE-... - paid production
|
|
20
|
-
|
|
21
|
-
export type LicenseInfo = {
|
|
22
|
-
status: LicenseStatus
|
|
23
|
-
/** True when the key permits use (dev / eval / licensed). */
|
|
24
|
-
valid: boolean
|
|
25
|
-
/** Expiry encoded in the key, when it carries one. Undefined otherwise. */
|
|
26
|
-
expiresAt?: Date
|
|
27
|
-
/**
|
|
28
|
-
* True once `expiresAt` has passed. Deliberately does NOT clear `valid`:
|
|
29
|
-
* an expired trial keeps working and the callers nudge instead. Turning a
|
|
30
|
-
* lapsed key into a hard stop would break a running app on a date boundary,
|
|
31
|
-
* which is exactly what a soft gate exists to avoid.
|
|
32
|
-
*/
|
|
33
|
-
expired?: boolean
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Pull the expiry out of a key.
|
|
38
|
-
*
|
|
39
|
-
* Keys are `SVENTERPRISE[-KIND]-<SLUG>-<SEATS>-<DATE>-<RANDOM>`, so the date is
|
|
40
|
-
* always the second-to-last segment regardless of whether a KIND is present.
|
|
41
|
-
* Two widths are accepted:
|
|
42
|
-
*
|
|
43
|
-
* YYYYMM - subscription granularity; expires at the end of that month.
|
|
44
|
-
* YYYYMMDD - trial granularity; expires at the end of that day.
|
|
45
|
-
*
|
|
46
|
-
* The 6-digit form came first, so every key issued before day-precision trials
|
|
47
|
-
* existed still parses. Anything else (including the older keys whose slug sits
|
|
48
|
-
* in that position) yields null, which reads as "no expiry encoded".
|
|
49
|
-
*
|
|
50
|
-
* Boundaries are UTC so a key does not lapse at a different instant per
|
|
51
|
-
* timezone. Kept in sync with `tools/issue-license.mjs`.
|
|
52
|
-
*/
|
|
53
|
-
export function parseLicenseExpiry(key: string | null | undefined): Date | null {
|
|
54
|
-
if (!key) return null
|
|
55
|
-
const segments = key.split('-')
|
|
56
|
-
if (segments.length < 3) return null
|
|
57
|
-
const stamp = segments[segments.length - 2]
|
|
58
|
-
if (stamp == null) return null
|
|
59
|
-
|
|
60
|
-
if (/^\d{6}$/.test(stamp)) {
|
|
61
|
-
const year = Number(stamp.slice(0, 4))
|
|
62
|
-
const month = Number(stamp.slice(4, 6))
|
|
63
|
-
if (month < 1 || month > 12) return null
|
|
64
|
-
// Date.UTC's month is 0-based, so passing the 1-based month lands on the
|
|
65
|
-
// first of the FOLLOWING month; one millisecond earlier is the last instant
|
|
66
|
-
// of the month the key names.
|
|
67
|
-
return new Date(Date.UTC(year, month, 1) - 1)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (/^\d{8}$/.test(stamp)) {
|
|
71
|
-
const year = Number(stamp.slice(0, 4))
|
|
72
|
-
const month = Number(stamp.slice(4, 6))
|
|
73
|
-
const day = Number(stamp.slice(6, 8))
|
|
74
|
-
if (month < 1 || month > 12 || day < 1 || day > 31) return null
|
|
75
|
-
const end = new Date(Date.UTC(year, month - 1, day, 23, 59, 59, 999))
|
|
76
|
-
// Reject a date that rolled over (e.g. 20260231), which would otherwise
|
|
77
|
-
// silently grant a few extra days.
|
|
78
|
-
if (end.getUTCMonth() !== month - 1) return null
|
|
79
|
-
return end
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return null
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/** Classify a license key string. Pure and side-effect-free.
|
|
86
|
-
* `now` is injectable so expiry behaviour is testable without faking clocks. */
|
|
87
|
-
export function checkLicenseKey(
|
|
88
|
-
key: string | null | undefined,
|
|
89
|
-
now: Date = new Date(),
|
|
90
|
-
): LicenseInfo {
|
|
91
|
-
if (key == null || key === '') return { status: 'unset', valid: false }
|
|
92
|
-
if (!key.startsWith(VALID_PREFIX)) return { status: 'invalid', valid: false }
|
|
93
|
-
if (REVOKED_KEYS.has(key)) return { status: 'revoked', valid: false }
|
|
94
|
-
|
|
95
|
-
const expiresAt = parseLicenseExpiry(key) ?? undefined
|
|
96
|
-
// Left undefined rather than false when the key encodes no date, so callers
|
|
97
|
-
// can tell "not expired" apart from "no expiry to check".
|
|
98
|
-
const expired = expiresAt ? now.getTime() > expiresAt.getTime() : undefined
|
|
99
|
-
|
|
100
|
-
const status: LicenseStatus = key.startsWith('SVENTERPRISE-DEV')
|
|
101
|
-
? 'dev'
|
|
102
|
-
: key.startsWith('SVENTERPRISE-EVAL')
|
|
103
|
-
? 'eval'
|
|
104
|
-
: 'licensed'
|
|
105
|
-
|
|
106
|
-
return { status, valid: true, expiresAt, expired }
|
|
107
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
3
|
-
import { checkLicenseKey, parseLicenseExpiry } from './license-core'
|
|
4
|
-
import {
|
|
5
|
-
assertEnterpriseLicensed,
|
|
6
|
-
clearLicenseKey,
|
|
7
|
-
getLicenseExpiry,
|
|
8
|
-
isLicenseExpired,
|
|
9
|
-
setLicenseKey,
|
|
10
|
-
} from './license'
|
|
11
|
-
import { dismissUpgradePrompt } from './upgrade-prompt'
|
|
12
|
-
import { emitUnlicensedNudge } from './watermark'
|
|
13
|
-
|
|
14
|
-
// Keep everything else in the module real; only the watermark emitter is spied.
|
|
15
|
-
vi.mock('./watermark', async (importOriginal) => ({
|
|
16
|
-
...(await importOriginal()),
|
|
17
|
-
emitUnlicensedNudge: vi.fn(),
|
|
18
|
-
}))
|
|
19
|
-
|
|
20
|
-
const KEY = 'SVENTERPRISE-EVAL-GUNEI-5-20260904-RGY2TN'
|
|
21
|
-
const CARD = '[data-svgrid-enterprise-upgrade]'
|
|
22
|
-
|
|
23
|
-
/** Calls to emitUnlicensedNudge() since the last reset.
|
|
24
|
-
*
|
|
25
|
-
* Spied rather than counted in the DOM: the real function attaches its badge
|
|
26
|
-
* to grid elements on a microtask, so in a document with no grid it renders
|
|
27
|
-
* nothing and a node count would read 0 for every case - passing even if the
|
|
28
|
-
* watermark were wired up wrongly. The call is the contract under test. */
|
|
29
|
-
const watermarkCalls = () => vi.mocked(emitUnlicensedNudge).mock.calls.length
|
|
30
|
-
|
|
31
|
-
describe('trial key expiry parsing', () => {
|
|
32
|
-
it('unlocks Enterprise today', () => {
|
|
33
|
-
const info = checkLicenseKey(KEY, new Date('2026-08-21T12:00:00Z'))
|
|
34
|
-
expect(info).toMatchObject({ status: 'eval', valid: true, expired: false })
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
it('expires end of 2026-09-04, not end of September', () => {
|
|
38
|
-
expect(parseLicenseExpiry(KEY)?.toISOString()).toBe('2026-09-04T23:59:59.999Z')
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('still valid on the final day', () => {
|
|
42
|
-
expect(checkLicenseKey(KEY, new Date('2026-09-04T23:00:00Z')).expired).toBe(false)
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
it('expired the next day, but still permitted', () => {
|
|
46
|
-
const info = checkLicenseKey(KEY, new Date('2026-09-05T00:30:00Z'))
|
|
47
|
-
expect(info.expired).toBe(true)
|
|
48
|
-
expect(info.valid).toBe(true)
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it('keeps parsing month-granularity keys issued before day precision', () => {
|
|
52
|
-
expect(parseLicenseExpiry('SVENTERPRISE-ACME-5-202705-ABC123')?.toISOString()).toBe(
|
|
53
|
-
'2027-05-31T23:59:59.999Z',
|
|
54
|
-
)
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
it('a key with no encoded date has no expiry', () => {
|
|
58
|
-
const info = checkLicenseKey('SVENTERPRISE-EVAL-acme-2026')
|
|
59
|
-
expect(info.expiresAt).toBeUndefined()
|
|
60
|
-
expect(info.expired).toBeUndefined()
|
|
61
|
-
})
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
describe('what happens after the trial ends', () => {
|
|
65
|
-
beforeEach(() => {
|
|
66
|
-
vi.useRealTimers()
|
|
67
|
-
clearLicenseKey()
|
|
68
|
-
dismissUpgradePrompt()
|
|
69
|
-
vi.mocked(emitUnlicensedNudge).mockClear()
|
|
70
|
-
document.body.innerHTML = ''
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it('during the trial: no card, and nothing thrown', () => {
|
|
74
|
-
vi.useFakeTimers({ now: new Date('2026-08-25T10:00:00Z') })
|
|
75
|
-
setLicenseKey(KEY)
|
|
76
|
-
expect(isLicenseExpired()).toBe(false)
|
|
77
|
-
expect(() => assertEnterpriseLicensed('Export')).not.toThrow()
|
|
78
|
-
expect(document.querySelector(CARD)).toBeNull()
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
it('after the trial: pops the message, and STILL does not throw', () => {
|
|
82
|
-
vi.useFakeTimers({ now: new Date('2026-09-20T10:00:00Z') })
|
|
83
|
-
setLicenseKey(KEY)
|
|
84
|
-
expect(isLicenseExpired()).toBe(true)
|
|
85
|
-
|
|
86
|
-
expect(() => assertEnterpriseLicensed('Export')).not.toThrow()
|
|
87
|
-
|
|
88
|
-
const card = document.querySelector(CARD)
|
|
89
|
-
expect(card).not.toBeNull()
|
|
90
|
-
expect(card!.textContent).toContain('Your trial has ended')
|
|
91
|
-
expect(card!.textContent).toContain('everything still works')
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
it('exposes the expiry date so a host can render its own banner', () => {
|
|
95
|
-
vi.useFakeTimers({ now: new Date('2026-09-20T10:00:00Z') })
|
|
96
|
-
setLicenseKey(KEY)
|
|
97
|
-
expect(getLicenseExpiry()?.toISOString()).toBe('2026-09-04T23:59:59.999Z')
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
it('a lapsed trial gets the card but NOT the watermark', () => {
|
|
101
|
-
vi.useFakeTimers({ now: new Date('2026-09-20T10:00:00Z') })
|
|
102
|
-
setLicenseKey(KEY)
|
|
103
|
-
assertEnterpriseLicensed('Export')
|
|
104
|
-
|
|
105
|
-
expect(document.querySelector(CARD)).not.toBeNull()
|
|
106
|
-
// Someone who evaluated and let the clock run out is a prospect mid-
|
|
107
|
-
// conversation; stamping their UI is the wrong pressure. An app with no
|
|
108
|
-
// key at all still gets both surfaces - covered below.
|
|
109
|
-
expect(watermarkCalls()).toBe(0)
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
it('an app with no key at all still gets the watermark', () => {
|
|
113
|
-
clearLicenseKey()
|
|
114
|
-
assertEnterpriseLicensed('Export')
|
|
115
|
-
|
|
116
|
-
expect(document.querySelector(CARD)).not.toBeNull()
|
|
117
|
-
expect(watermarkCalls()).toBeGreaterThan(0)
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
it('a paid key never shows the card', () => {
|
|
121
|
-
vi.useFakeTimers({ now: new Date('2026-09-20T10:00:00Z') })
|
|
122
|
-
setLicenseKey('SVENTERPRISE-ACME-5-202705-ABC123')
|
|
123
|
-
expect(isLicenseExpired()).toBe(false)
|
|
124
|
-
assertEnterpriseLicensed('Export')
|
|
125
|
-
expect(document.querySelector(CARD)).toBeNull()
|
|
126
|
-
})
|
|
127
|
-
})
|
package/src/license.ts
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
// Polite license gate. Not crypto - anyone with devtools can extract the key
|
|
2
|
-
// from a deployed bundle. The point is to make commercial use require a
|
|
3
|
-
// transaction, not to defeat reverse engineering.
|
|
4
|
-
//
|
|
5
|
-
// Behavior matrix:
|
|
6
|
-
//
|
|
7
|
-
// currentKey state -> result
|
|
8
|
-
// ────────────────────────────────────────────────────────────────────
|
|
9
|
-
// null (no key set) -> soft-gate: watermark + console.log,
|
|
10
|
-
// feature still runs
|
|
11
|
-
// does not start with "SVENTERPRISE-" -> throws (programmer error)
|
|
12
|
-
// in REVOKED_KEYS -> throws (revoked / leaked / expired)
|
|
13
|
-
// starts with "SVENTERPRISE-DEV" or
|
|
14
|
-
// "SVENTERPRISE-EVAL" -> works; one-time console.info notice
|
|
15
|
-
// an EXPIRED dev/eval key -> still works, but shows the upgrade
|
|
16
|
-
// card each session. No watermark: a
|
|
17
|
-
// lapsed trial is a prospect, not an
|
|
18
|
-
// unlicensed app. Stays a soft gate so a
|
|
19
|
-
// trial ending cannot break a build.
|
|
20
|
-
// any other "SVENTERPRISE-..." -> works silently (paid production)
|
|
21
|
-
|
|
22
|
-
import { checkLicenseKey, VALID_PREFIX, type LicenseInfo } from './license-core'
|
|
23
|
-
import { emitUnlicensedNudge } from './watermark'
|
|
24
|
-
import { showUpgradePrompt, type EnterpriseFeatureLabel } from './upgrade-prompt'
|
|
25
|
-
|
|
26
|
-
export { checkLicenseKey, type LicenseInfo, type LicenseStatus } from './license-core'
|
|
27
|
-
|
|
28
|
-
let currentKey: string | null = null
|
|
29
|
-
let noticedDev = false
|
|
30
|
-
|
|
31
|
-
export function setLicenseKey(key: string): void {
|
|
32
|
-
if (typeof key !== 'string' || key.length === 0) {
|
|
33
|
-
throw new Error('@svgrid/enterprise: setLicenseKey() requires a non-empty string')
|
|
34
|
-
}
|
|
35
|
-
currentKey = key
|
|
36
|
-
noticedDev = false
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function clearLicenseKey(): void {
|
|
40
|
-
currentKey = null
|
|
41
|
-
noticedDev = false
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function getLicenseKey(): string | null {
|
|
45
|
-
return currentKey
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/** True if a key is set at all (regardless of validity). */
|
|
49
|
-
export function isLicenseKeySet(): boolean {
|
|
50
|
-
return currentKey != null
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* True if the current key passes every check: present, valid prefix, not
|
|
55
|
-
* revoked. Use this from callers that want to branch on license status
|
|
56
|
-
* (e.g. UI that hides Pro-only options when unlicensed).
|
|
57
|
-
*/
|
|
58
|
-
export function hasValidLicense(): boolean {
|
|
59
|
-
return checkLicenseKey(currentKey).valid
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* True when the current key encoded an expiry that has passed. The feature set
|
|
64
|
-
* still runs - this exists so a host can show its own banner rather than rely
|
|
65
|
-
* on the built-in card. Returns false when the key carries no expiry.
|
|
66
|
-
*/
|
|
67
|
-
export function isLicenseExpired(): boolean {
|
|
68
|
-
return checkLicenseKey(currentKey).expired === true
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/** When the current key lapses, or null if it encodes no expiry. */
|
|
72
|
-
export function getLicenseExpiry(): Date | null {
|
|
73
|
-
return checkLicenseKey(currentKey).expiresAt ?? null
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Soft-gate a Pro surface: if the current key isn't valid, nudge (watermark +
|
|
78
|
-
* one-time console log + a moment-of-intent upgrade card naming `feature`) and
|
|
79
|
-
* return. NEVER throws and NEVER blocks - the feature always runs. This is the
|
|
80
|
-
* gate the Studio uses, and it's safe to call on the server (the nudges no-op
|
|
81
|
-
* without a DOM). Idempotent/self-throttling, so call it freely at chokepoints.
|
|
82
|
-
*/
|
|
83
|
-
export function nudgeEnterprise(feature?: EnterpriseFeatureLabel): void {
|
|
84
|
-
const info = checkLicenseKey(currentKey)
|
|
85
|
-
// `valid` stays true past a trial's expiry (the feature keeps running), so
|
|
86
|
-
// checking it alone would let a lapsed trial through silently forever.
|
|
87
|
-
if (info.valid && !info.expired) return
|
|
88
|
-
const lapsedTrial = info.valid && info.expired === true
|
|
89
|
-
// A lapsed trial gets the card but NOT the watermark. Someone who evaluated
|
|
90
|
-
// and let the clock run out is a prospect mid-conversation, not an app that
|
|
91
|
-
// never had a licence - stamping their UI is the wrong pressure. An app with
|
|
92
|
-
// no key at all still gets both.
|
|
93
|
-
if (!lapsedTrial) emitUnlicensedNudge()
|
|
94
|
-
showUpgradePrompt(feature, { expired: lapsedTrial })
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export function assertEnterpriseLicensed(feature?: EnterpriseFeatureLabel): void {
|
|
98
|
-
const info: LicenseInfo = checkLicenseKey(currentKey)
|
|
99
|
-
switch (info.status) {
|
|
100
|
-
case 'unset':
|
|
101
|
-
// Soft-gate: the feature still runs, but the user gets a watermark +
|
|
102
|
-
// a one-time console.log nudge directing them to pricing, plus a
|
|
103
|
-
// contextual moment-of-intent upgrade card naming the feature they
|
|
104
|
-
// just reached for.
|
|
105
|
-
emitUnlicensedNudge()
|
|
106
|
-
showUpgradePrompt(feature)
|
|
107
|
-
return
|
|
108
|
-
case 'invalid':
|
|
109
|
-
throw new Error(
|
|
110
|
-
`@svgrid/enterprise: invalid license key format (expected "${VALID_PREFIX}..." prefix).`,
|
|
111
|
-
)
|
|
112
|
-
case 'revoked':
|
|
113
|
-
throw new Error(
|
|
114
|
-
'@svgrid/enterprise: this license key has been revoked. ' +
|
|
115
|
-
'Contact sales@jqwidgets.com for a replacement.',
|
|
116
|
-
)
|
|
117
|
-
case 'dev':
|
|
118
|
-
case 'eval':
|
|
119
|
-
if (info.expired) {
|
|
120
|
-
// The trial is over. Deliberately NOT a throw: the app keeps working,
|
|
121
|
-
// so the developer sees the nudge without their users hitting a broken
|
|
122
|
-
// build. Card only - no watermark; see nudgeEnterprise() for why.
|
|
123
|
-
showUpgradePrompt(feature, { expired: true })
|
|
124
|
-
return
|
|
125
|
-
}
|
|
126
|
-
if (!noticedDev) {
|
|
127
|
-
// eslint-disable-next-line no-console
|
|
128
|
-
console.info(
|
|
129
|
-
'@svgrid/enterprise: using a development / evaluation license. Not for production use.',
|
|
130
|
-
)
|
|
131
|
-
noticedDev = true
|
|
132
|
-
}
|
|
133
|
-
return
|
|
134
|
-
case 'licensed':
|
|
135
|
-
return
|
|
136
|
-
}
|
|
137
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import { buildDisplayRows, isDetailRow, toggleExpanded } from './master-detail'
|
|
3
|
-
|
|
4
|
-
type Order = { id: string; customer: string }
|
|
5
|
-
const orders: Order[] = [
|
|
6
|
-
{ id: 'o1', customer: 'Ann' },
|
|
7
|
-
{ id: 'o2', customer: 'Bob' },
|
|
8
|
-
{ id: 'o3', customer: 'Cara' },
|
|
9
|
-
]
|
|
10
|
-
const idOf = (o: Order) => o.id
|
|
11
|
-
|
|
12
|
-
describe('toggleExpanded', () => {
|
|
13
|
-
it('adds then removes an id, immutably', () => {
|
|
14
|
-
const a = toggleExpanded(new Set(), 'o1')
|
|
15
|
-
expect([...a]).toEqual(['o1'])
|
|
16
|
-
const b = toggleExpanded(a, 'o1')
|
|
17
|
-
expect([...b]).toEqual([])
|
|
18
|
-
expect([...a]).toEqual(['o1']) // original untouched
|
|
19
|
-
})
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
describe('isDetailRow', () => {
|
|
23
|
-
it('distinguishes detail markers from plain rows', () => {
|
|
24
|
-
expect(isDetailRow({ __svgridDetail: true, parent: {}, parentId: 'x' })).toBe(true)
|
|
25
|
-
expect(isDetailRow({ id: 'o1' })).toBe(false)
|
|
26
|
-
expect(isDetailRow(null)).toBe(false)
|
|
27
|
-
})
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
describe('buildDisplayRows', () => {
|
|
31
|
-
it('returns just the parents when nothing is expanded', () => {
|
|
32
|
-
const rows = buildDisplayRows(orders, new Set(), idOf)
|
|
33
|
-
expect(rows).toHaveLength(3)
|
|
34
|
-
expect(rows.every((r) => !isDetailRow(r))).toBe(true)
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
it('inserts a detail row right after each expanded parent, preserving order', () => {
|
|
38
|
-
const rows = buildDisplayRows(orders, new Set(['o2']), idOf)
|
|
39
|
-
expect(rows).toHaveLength(4)
|
|
40
|
-
expect(isDetailRow(rows[2])).toBe(true) // after o2
|
|
41
|
-
const detail = rows[2]
|
|
42
|
-
if (isDetailRow(detail)) {
|
|
43
|
-
expect(detail.parentId).toBe('o2')
|
|
44
|
-
expect((detail.parent as Order).customer).toBe('Bob')
|
|
45
|
-
}
|
|
46
|
-
// surrounding parents intact
|
|
47
|
-
expect((rows[1] as Order).id).toBe('o2')
|
|
48
|
-
expect((rows[3] as Order).id).toBe('o3')
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it('handles multiple expanded parents', () => {
|
|
52
|
-
const rows = buildDisplayRows(orders, new Set(['o1', 'o3']), idOf)
|
|
53
|
-
expect(rows.map((r) => (isDetailRow(r) ? 'detail' : (r as Order).id))).toEqual([
|
|
54
|
-
'o1',
|
|
55
|
-
'detail',
|
|
56
|
-
'o2',
|
|
57
|
-
'o3',
|
|
58
|
-
'detail',
|
|
59
|
-
])
|
|
60
|
-
})
|
|
61
|
-
})
|
package/src/master-detail.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Master-detail logic. The testable core behind `SvGridMasterDetail.svelte`:
|
|
3
|
-
* track which parent rows are expanded and splice a synthetic "detail" row in
|
|
4
|
-
* after each expanded parent, so a single `<SvGrid>` renders both the master
|
|
5
|
-
* rows and a full-width detail region (via the grid's `isDetailRow` /
|
|
6
|
-
* `renderDetailRow`). Pure - no Svelte, no DOM.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/** A synthetic row inserted after an expanded parent; carries the parent it belongs to. */
|
|
10
|
-
export type DetailRow<TParent> = { __svgridDetail: true; parent: TParent; parentId: string }
|
|
11
|
-
|
|
12
|
-
/** True for the synthetic detail rows produced by `buildDisplayRows`. */
|
|
13
|
-
export function isDetailRow(row: unknown): row is DetailRow<unknown> {
|
|
14
|
-
return !!row && typeof row === 'object' && (row as { __svgridDetail?: unknown }).__svgridDetail === true
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/** Toggle a parent id in the expanded set, returning a new set (immutable). */
|
|
18
|
-
export function toggleExpanded(expanded: ReadonlySet<string>, id: string): Set<string> {
|
|
19
|
-
const next = new Set(expanded)
|
|
20
|
-
if (next.has(id)) next.delete(id)
|
|
21
|
-
else next.add(id)
|
|
22
|
-
return next
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Weave detail rows into the master rows: each expanded parent is followed by a
|
|
27
|
-
* `DetailRow` marker. Order is otherwise preserved, so the grid renders parents
|
|
28
|
-
* in place with their detail region directly beneath.
|
|
29
|
-
*/
|
|
30
|
-
export function buildDisplayRows<TParent>(
|
|
31
|
-
parents: ReadonlyArray<TParent>,
|
|
32
|
-
expanded: ReadonlySet<string>,
|
|
33
|
-
getRowId: (parent: TParent) => string,
|
|
34
|
-
): Array<TParent | DetailRow<TParent>> {
|
|
35
|
-
const out: Array<TParent | DetailRow<TParent>> = []
|
|
36
|
-
for (const parent of parents) {
|
|
37
|
-
out.push(parent)
|
|
38
|
-
const id = getRowId(parent)
|
|
39
|
-
if (expanded.has(id)) out.push({ __svgridDetail: true, parent, parentId: id })
|
|
40
|
-
}
|
|
41
|
-
return out
|
|
42
|
-
}
|