@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.
Files changed (620) hide show
  1. package/dist/SvAlertRuleEditor.svelte.d.ts +13 -0
  2. package/dist/SvAlertsManager.svelte.d.ts +14 -0
  3. package/dist/SvAlertsPanel.svelte.d.ts +9 -0
  4. package/dist/SvAuthGate.svelte.d.ts +22 -0
  5. package/dist/SvBoard.svelte.d.ts +35 -0
  6. package/dist/SvExportMenu.svelte.d.ts +61 -0
  7. package/dist/SvExpressionEditor.svelte.d.ts +12 -0
  8. package/dist/SvFileInput.svelte.d.ts +20 -0
  9. package/dist/SvGridAlerts.svelte.d.ts +77 -0
  10. package/dist/SvGridBoard.svelte.d.ts +30 -0
  11. package/dist/SvGridEditPanel.svelte.d.ts +73 -0
  12. package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
  13. package/dist/SvGridScheduler.svelte.d.ts +30 -0
  14. package/dist/SvImportDialog.svelte.d.ts +88 -0
  15. package/dist/SvLookupInput.svelte.d.ts +21 -0
  16. package/dist/SvPivotDesigner.svelte.d.ts +176 -0
  17. package/dist/SvRecordDetail.svelte.d.ts +58 -0
  18. package/dist/SvSchedule.svelte.d.ts +29 -0
  19. package/dist/SvSchemaChart.svelte.d.ts +61 -0
  20. package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
  21. package/dist/alerts/alert-engine-attach.d.ts +79 -0
  22. package/dist/alerts/alert-engine-attach.js +106 -0
  23. package/dist/alerts/alert-engine.d.ts +42 -0
  24. package/dist/alerts/alert-engine.js +196 -0
  25. package/dist/alerts/alert-formats.d.ts +26 -0
  26. package/dist/alerts/alert-formats.js +58 -0
  27. package/dist/alerts/alert-observer.d.ts +54 -0
  28. package/dist/alerts/alert-observer.js +156 -0
  29. package/dist/alerts/alert-scheduler.d.ts +30 -0
  30. package/dist/alerts/alert-scheduler.js +54 -0
  31. package/dist/alerts/alert-storage.d.ts +31 -0
  32. package/dist/alerts/alert-storage.js +92 -0
  33. package/dist/alerts/alert-store.svelte.d.ts +24 -0
  34. package/dist/alerts/alert-store.svelte.js +69 -0
  35. package/dist/alerts/alert-types.d.ts +86 -0
  36. package/dist/alerts/alert-types.js +1 -0
  37. package/dist/alerts.d.ts +2 -0
  38. package/{src/alerts.ts → dist/alerts.js} +9 -9
  39. package/dist/board.d.ts +7 -0
  40. package/{src/board.ts → dist/board.js} +13 -14
  41. package/dist/cdn/svgrid-enterprise.svelte-external.js +2987 -2981
  42. package/dist/designer/assets/{index-CM5xvaOy.js → index-BF0UH638.js} +3 -3
  43. package/dist/designer/assets/{src-D-ET9Mmo.js → src-BPJruwB9.js} +184 -184
  44. package/dist/designer/index.html +2 -2
  45. package/dist/edit-panel.d.ts +105 -0
  46. package/dist/edit-panel.js +350 -0
  47. package/dist/export-conditional.d.ts +31 -0
  48. package/dist/export-conditional.js +65 -0
  49. package/dist/export-ooxml.d.ts +93 -0
  50. package/dist/export-ooxml.js +385 -0
  51. package/dist/export-pdf.d.ts +107 -0
  52. package/dist/export-pdf.js +144 -0
  53. package/dist/export-print.d.ts +55 -0
  54. package/dist/export-print.js +91 -0
  55. package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
  56. package/dist/export-serialize.js +11 -0
  57. package/dist/export-xls.d.ts +26 -0
  58. package/dist/export-xls.js +157 -0
  59. package/dist/export.d.ts +323 -0
  60. package/dist/export.js +1021 -0
  61. package/dist/expressions/evaluate.d.ts +17 -0
  62. package/dist/expressions/evaluate.js +214 -0
  63. package/dist/expressions/expression-columns.d.ts +61 -0
  64. package/dist/expressions/expression-columns.js +72 -0
  65. package/dist/expressions/expression-types.d.ts +125 -0
  66. package/dist/expressions/expression-types.js +1 -0
  67. package/dist/expressions/parse.d.ts +25 -0
  68. package/dist/expressions/parse.js +537 -0
  69. package/dist/import.d.ts +232 -0
  70. package/dist/import.js +846 -0
  71. package/dist/index.d.ts +66 -0
  72. package/dist/index.js +91 -0
  73. package/dist/install.d.ts +70 -0
  74. package/dist/install.js +61 -0
  75. package/dist/license-core.d.ts +37 -0
  76. package/dist/license-core.js +81 -0
  77. package/dist/license.d.ts +30 -0
  78. package/dist/license.js +139 -0
  79. package/dist/master-detail.d.ts +23 -0
  80. package/dist/master-detail.js +35 -0
  81. package/dist/node/studio.js +1 -1
  82. package/dist/pivot-chart.d.ts +28 -0
  83. package/dist/pivot-chart.js +71 -0
  84. package/dist/pivot-designer.d.ts +69 -0
  85. package/dist/pivot-designer.js +38 -0
  86. package/dist/pivot-enable.d.ts +6 -0
  87. package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
  88. package/dist/pivot.d.ts +111 -0
  89. package/dist/pivot.js +353 -0
  90. package/dist/print.d.ts +33 -0
  91. package/dist/print.js +61 -0
  92. package/dist/revoked.d.ts +1 -0
  93. package/{src/revoked.ts → dist/revoked.js} +5 -6
  94. package/dist/scheduler-assignments.d.ts +64 -0
  95. package/dist/scheduler-assignments.js +92 -0
  96. package/dist/scheduler-axis.d.ts +81 -0
  97. package/dist/scheduler-axis.js +180 -0
  98. package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
  99. package/dist/scheduler-booking.js +50 -0
  100. package/dist/scheduler-config.d.ts +177 -0
  101. package/dist/scheduler-config.js +1 -0
  102. package/dist/scheduler-dependencies.d.ts +89 -0
  103. package/dist/scheduler-dependencies.js +179 -0
  104. package/dist/scheduler-freebusy.d.ts +19 -0
  105. package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
  106. package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
  107. package/dist/scheduler-heatmap.js +41 -0
  108. package/dist/scheduler-resource-tree.d.ts +48 -0
  109. package/dist/scheduler-resource-tree.js +78 -0
  110. package/dist/scheduler-slots.d.ts +37 -0
  111. package/dist/scheduler-slots.js +80 -0
  112. package/dist/scheduler-summary.d.ts +41 -0
  113. package/dist/scheduler-summary.js +54 -0
  114. package/dist/scheduler.d.ts +7 -0
  115. package/{src/scheduler.ts → dist/scheduler.js} +13 -14
  116. package/dist/scheduling.d.ts +132 -0
  117. package/dist/scheduling.js +228 -0
  118. package/dist/schema-designer.d.ts +42 -0
  119. package/dist/schema-designer.js +117 -0
  120. package/dist/schema.d.ts +369 -0
  121. package/dist/schema.js +216 -0
  122. package/dist/smart-shim.d.ts +62 -0
  123. package/dist/smart-shim.js +34 -0
  124. package/dist/sources/aggregate.d.ts +43 -0
  125. package/dist/sources/aggregate.js +60 -0
  126. package/dist/sources/auth-supabase.d.ts +69 -0
  127. package/dist/sources/auth-supabase.js +39 -0
  128. package/dist/sources/dashboard.d.ts +65 -0
  129. package/dist/sources/dashboard.js +95 -0
  130. package/dist/sources/field-inference.d.ts +23 -0
  131. package/dist/sources/field-inference.js +52 -0
  132. package/dist/sources/filters.d.ts +35 -0
  133. package/dist/sources/filters.js +52 -0
  134. package/dist/sources/index.d.ts +18 -0
  135. package/dist/sources/index.js +18 -0
  136. package/dist/sources/introspect-supabase.d.ts +30 -0
  137. package/dist/sources/introspect-supabase.js +134 -0
  138. package/dist/sources/realtime-supabase.d.ts +37 -0
  139. package/dist/sources/realtime-supabase.js +52 -0
  140. package/dist/sources/relation-lookup.d.ts +50 -0
  141. package/dist/sources/relation-lookup.js +77 -0
  142. package/dist/sources/rest-adapters.d.ts +48 -0
  143. package/dist/sources/rest-adapters.js +85 -0
  144. package/dist/sources/rest.d.ts +38 -0
  145. package/dist/sources/rest.js +86 -0
  146. package/dist/sources/schema-from-columns.d.ts +37 -0
  147. package/dist/sources/schema-from-columns.js +48 -0
  148. package/dist/sources/supabase.d.ts +33 -0
  149. package/dist/sources/supabase.js +74 -0
  150. package/dist/sources/with-entity-rules.d.ts +25 -0
  151. package/dist/sources/with-entity-rules.js +47 -0
  152. package/dist/sources/with-relation-labels.d.ts +26 -0
  153. package/dist/sources/with-relation-labels.js +38 -0
  154. package/dist/staged-editing.d.ts +85 -0
  155. package/dist/staged-editing.js +0 -0
  156. package/dist/studio/bug-report.d.ts +61 -0
  157. package/dist/studio/bug-report.js +126 -0
  158. package/dist/studio/cli.d.ts +56 -0
  159. package/dist/studio/cli.js +70 -0
  160. package/dist/studio/copilot-core.d.ts +22 -0
  161. package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
  162. package/dist/studio/csv.d.ts +36 -0
  163. package/dist/studio/csv.js +173 -0
  164. package/dist/studio/db-connect-string.d.ts +45 -0
  165. package/dist/studio/db-connect-string.js +113 -0
  166. package/dist/studio/deploy-cli.d.ts +35 -0
  167. package/dist/studio/deploy-cli.js +81 -0
  168. package/dist/studio/emit-project.d.ts +77 -0
  169. package/dist/studio/emit-project.js +5389 -0
  170. package/dist/studio/emit-schema.d.ts +110 -0
  171. package/dist/studio/emit-schema.js +1128 -0
  172. package/dist/studio/index.d.ts +35 -0
  173. package/dist/studio/index.js +38 -0
  174. package/dist/studio/init-flow.d.ts +58 -0
  175. package/dist/studio/init-flow.js +451 -0
  176. package/dist/studio/introspect-db.d.ts +47 -0
  177. package/dist/studio/introspect-db.js +255 -0
  178. package/dist/studio/introspect-openapi.d.ts +19 -0
  179. package/dist/studio/introspect-openapi.js +244 -0
  180. package/dist/studio/introspect-prisma.d.ts +25 -0
  181. package/dist/studio/introspect-prisma.js +164 -0
  182. package/dist/studio/introspect.d.ts +35 -0
  183. package/dist/studio/introspect.js +306 -0
  184. package/dist/studio/project.d.ts +1327 -0
  185. package/dist/studio/project.js +1798 -0
  186. package/dist/studio/sample-data.d.ts +19 -0
  187. package/dist/studio/sample-data.js +207 -0
  188. package/dist/studio/samples/ats.d.ts +2 -0
  189. package/dist/studio/samples/ats.js +194 -0
  190. package/dist/studio/samples/clinic.d.ts +2 -0
  191. package/dist/studio/samples/clinic.js +171 -0
  192. package/dist/studio/samples/crm.d.ts +2 -0
  193. package/dist/studio/samples/crm.js +280 -0
  194. package/dist/studio/samples/datasets.d.ts +38 -0
  195. package/dist/studio/samples/datasets.js +296 -0
  196. package/dist/studio/samples/ecommerce.d.ts +2 -0
  197. package/dist/studio/samples/ecommerce.js +178 -0
  198. package/dist/studio/samples/events.d.ts +2 -0
  199. package/dist/studio/samples/events.js +192 -0
  200. package/dist/studio/samples/fleet.d.ts +2 -0
  201. package/dist/studio/samples/fleet.js +203 -0
  202. package/dist/studio/samples/gym.d.ts +2 -0
  203. package/dist/studio/samples/gym.js +205 -0
  204. package/dist/studio/samples/hr.d.ts +2 -0
  205. package/dist/studio/samples/hr.js +186 -0
  206. package/dist/studio/samples/index.d.ts +13 -0
  207. package/dist/studio/samples/index.js +44 -0
  208. package/dist/studio/samples/insurance.d.ts +2 -0
  209. package/dist/studio/samples/insurance.js +220 -0
  210. package/dist/studio/samples/inventory.d.ts +2 -0
  211. package/dist/studio/samples/inventory.js +204 -0
  212. package/dist/studio/samples/invoicing.d.ts +2 -0
  213. package/dist/studio/samples/invoicing.js +154 -0
  214. package/dist/studio/samples/library.d.ts +2 -0
  215. package/dist/studio/samples/library.js +171 -0
  216. package/dist/studio/samples/live-data.d.ts +5 -0
  217. package/dist/studio/samples/live-data.js +261 -0
  218. package/dist/studio/samples/projects.d.ts +2 -0
  219. package/dist/studio/samples/projects.js +203 -0
  220. package/dist/studio/samples/realestate.d.ts +2 -0
  221. package/dist/studio/samples/realestate.js +187 -0
  222. package/dist/studio/samples/restaurant.d.ts +2 -0
  223. package/dist/studio/samples/restaurant.js +180 -0
  224. package/dist/studio/samples/school.d.ts +2 -0
  225. package/dist/studio/samples/school.js +188 -0
  226. package/dist/studio/samples/shared.d.ts +142 -0
  227. package/dist/studio/samples/shared.js +164 -0
  228. package/dist/studio/samples/starter.d.ts +4 -0
  229. package/dist/studio/samples/starter.js +237 -0
  230. package/dist/studio/samples/subscriptions.d.ts +2 -0
  231. package/dist/studio/samples/subscriptions.js +175 -0
  232. package/dist/studio/samples/support.d.ts +2 -0
  233. package/dist/studio/samples/support.js +209 -0
  234. package/dist/studio/scaffold-app.d.ts +22 -0
  235. package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
  236. package/dist/studio/scaffold.d.ts +63 -0
  237. package/dist/studio/scaffold.js +346 -0
  238. package/dist/studio/screen-suites.d.ts +193 -0
  239. package/dist/studio/screen-suites.js +297 -0
  240. package/dist/studio/themes.d.ts +34 -0
  241. package/dist/studio/themes.js +41 -0
  242. package/dist/studio/ui-components.d.ts +89 -0
  243. package/dist/studio/ui-components.generated.d.ts +29 -0
  244. package/dist/studio/ui-components.generated.js +7139 -0
  245. package/dist/studio/ui-components.js +673 -0
  246. package/dist/studio/user-error.d.ts +23 -0
  247. package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
  248. package/dist/studio/verify.d.ts +34 -0
  249. package/dist/studio/verify.js +47 -0
  250. package/dist/sveltekit/in-memory.d.ts +14 -0
  251. package/dist/sveltekit/in-memory.js +113 -0
  252. package/dist/sveltekit/index.d.ts +6 -0
  253. package/dist/sveltekit/index.js +5 -0
  254. package/dist/sveltekit/query-plan.d.ts +44 -0
  255. package/dist/sveltekit/query-plan.js +76 -0
  256. package/dist/sveltekit/sql-source.d.ts +47 -0
  257. package/dist/sveltekit/sql-source.js +106 -0
  258. package/dist/sveltekit/sql.d.ts +48 -0
  259. package/dist/sveltekit/sql.js +73 -0
  260. package/dist/sveltekit/transport.d.ts +209 -0
  261. package/dist/sveltekit/transport.js +219 -0
  262. package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
  263. package/dist/sveltekit/types.js +1 -0
  264. package/dist/upgrade-prompt.d.ts +16 -0
  265. package/dist/upgrade-prompt.js +141 -0
  266. package/dist/version.d.ts +13 -0
  267. package/{src/version.ts → dist/version.js} +1 -1
  268. package/dist/watermark.d.ts +2 -0
  269. package/dist/watermark.js +146 -0
  270. package/package.json +26 -24
  271. package/src/SvBoard.dom.test.ts +0 -67
  272. package/src/SvGridAlerts.dom.test.ts +0 -113
  273. package/src/SvGridEditPanel.dom.test.ts +0 -320
  274. package/src/SvRecordDetail.dom.test.ts +0 -137
  275. package/src/SvSchedule.dom.test.ts +0 -57
  276. package/src/ai-export-pdf.dom.test.ts +0 -77
  277. package/src/ai-export-xlsx.dom.test.ts +0 -90
  278. package/src/ai-export.dom.test.ts +0 -114
  279. package/src/alerts/alert-engine-attach.ts +0 -165
  280. package/src/alerts/alert-engine.test.ts +0 -135
  281. package/src/alerts/alert-engine.ts +0 -260
  282. package/src/alerts/alert-formats.test.ts +0 -87
  283. package/src/alerts/alert-formats.ts +0 -77
  284. package/src/alerts/alert-observer.test.ts +0 -189
  285. package/src/alerts/alert-observer.ts +0 -208
  286. package/src/alerts/alert-scheduler.ts +0 -96
  287. package/src/alerts/alert-storage.test.ts +0 -54
  288. package/src/alerts/alert-storage.ts +0 -116
  289. package/src/alerts/alert-store.svelte.ts +0 -80
  290. package/src/alerts/alert-types.ts +0 -94
  291. package/src/board.dom.test.ts +0 -941
  292. package/src/edit-panel.test.ts +0 -322
  293. package/src/edit-panel.ts +0 -379
  294. package/src/export-conditional.test.ts +0 -60
  295. package/src/export-conditional.ts +0 -94
  296. package/src/export-ooxml.test.ts +0 -152
  297. package/src/export-ooxml.ts +0 -489
  298. package/src/export-pdf.test.ts +0 -138
  299. package/src/export-pdf.ts +0 -245
  300. package/src/export-print.test.ts +0 -66
  301. package/src/export-print.ts +0 -132
  302. package/src/export-serialize.test.ts +0 -56
  303. package/src/export-xls.ts +0 -199
  304. package/src/export-xlsx-roundtrip.test.ts +0 -120
  305. package/src/export-xlsx.test.ts +0 -150
  306. package/src/export.test.ts +0 -349
  307. package/src/export.ts +0 -1464
  308. package/src/expressions/evaluate.test.ts +0 -111
  309. package/src/expressions/evaluate.ts +0 -237
  310. package/src/expressions/expression-columns.ts +0 -133
  311. package/src/expressions/expression-types.ts +0 -84
  312. package/src/expressions/parse.test.ts +0 -106
  313. package/src/expressions/parse.ts +0 -610
  314. package/src/import-automap.test.ts +0 -131
  315. package/src/import-hardening.test.ts +0 -158
  316. package/src/import.test.ts +0 -415
  317. package/src/import.ts +0 -1044
  318. package/src/index.ts +0 -569
  319. package/src/install.ts +0 -154
  320. package/src/license-core.test.ts +0 -23
  321. package/src/license-core.ts +0 -107
  322. package/src/license-expiry.test.ts +0 -127
  323. package/src/license.ts +0 -137
  324. package/src/master-detail.test.ts +0 -61
  325. package/src/master-detail.ts +0 -42
  326. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  327. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
  328. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
  329. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
  330. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
  331. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
  332. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
  333. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
  334. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
  335. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
  336. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
  337. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
  338. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
  339. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
  340. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
  341. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  342. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  343. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  344. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  345. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  346. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  347. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  348. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  349. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  350. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  351. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  352. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  353. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  354. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  355. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  356. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  357. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  358. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  359. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  360. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  361. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  362. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  363. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  364. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  365. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  366. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  367. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  368. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  369. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  370. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  371. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  372. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  373. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  374. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  375. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  376. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
  377. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
  378. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
  379. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
  380. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
  381. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
  382. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
  383. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
  384. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
  385. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
  386. package/src/pivot-chart.test.ts +0 -86
  387. package/src/pivot-chart.ts +0 -112
  388. package/src/pivot-designer.ts +0 -101
  389. package/src/pivot.test.ts +0 -335
  390. package/src/pivot.ts +0 -578
  391. package/src/print.ts +0 -107
  392. package/src/scheduler-assignments.test.ts +0 -97
  393. package/src/scheduler-assignments.ts +0 -134
  394. package/src/scheduler-axis.test.ts +0 -108
  395. package/src/scheduler-axis.ts +0 -238
  396. package/src/scheduler-booking.test.ts +0 -57
  397. package/src/scheduler-config.ts +0 -179
  398. package/src/scheduler-dependencies.test.ts +0 -155
  399. package/src/scheduler-dependencies.ts +0 -223
  400. package/src/scheduler-freebusy.test.ts +0 -41
  401. package/src/scheduler-heatmap.test.ts +0 -39
  402. package/src/scheduler-resource-tree.test.ts +0 -84
  403. package/src/scheduler-resource-tree.ts +0 -107
  404. package/src/scheduler-slots.test.ts +0 -53
  405. package/src/scheduler-slots.ts +0 -94
  406. package/src/scheduler-summary.test.ts +0 -47
  407. package/src/scheduler-summary.ts +0 -81
  408. package/src/scheduling.test.ts +0 -194
  409. package/src/scheduling.ts +0 -293
  410. package/src/schema-designer.test.ts +0 -121
  411. package/src/schema-designer.ts +0 -142
  412. package/src/schema.test.ts +0 -268
  413. package/src/schema.ts +0 -562
  414. package/src/smart-shim.ts +0 -107
  415. package/src/sources/aggregate.test.ts +0 -79
  416. package/src/sources/aggregate.ts +0 -102
  417. package/src/sources/auth-supabase.test.ts +0 -80
  418. package/src/sources/auth-supabase.ts +0 -87
  419. package/src/sources/dashboard.kpi.test.ts +0 -50
  420. package/src/sources/dashboard.test.ts +0 -61
  421. package/src/sources/dashboard.ts +0 -136
  422. package/src/sources/field-inference.test.ts +0 -60
  423. package/src/sources/field-inference.ts +0 -63
  424. package/src/sources/filters.test.ts +0 -58
  425. package/src/sources/filters.ts +0 -70
  426. package/src/sources/index.ts +0 -67
  427. package/src/sources/introspect-supabase.test.ts +0 -112
  428. package/src/sources/introspect-supabase.ts +0 -139
  429. package/src/sources/realtime-supabase.test.ts +0 -93
  430. package/src/sources/realtime-supabase.ts +0 -99
  431. package/src/sources/relation-lookup.test.ts +0 -99
  432. package/src/sources/relation-lookup.ts +0 -128
  433. package/src/sources/rest-adapters.test.ts +0 -95
  434. package/src/sources/rest-adapters.ts +0 -120
  435. package/src/sources/rest.test.ts +0 -104
  436. package/src/sources/rest.ts +0 -129
  437. package/src/sources/schema-from-columns.test.ts +0 -106
  438. package/src/sources/schema-from-columns.ts +0 -88
  439. package/src/sources/supabase.test.ts +0 -110
  440. package/src/sources/supabase.ts +0 -99
  441. package/src/sources/with-entity-rules.test.ts +0 -104
  442. package/src/sources/with-entity-rules.ts +0 -78
  443. package/src/sources/with-relation-labels.test.ts +0 -75
  444. package/src/sources/with-relation-labels.ts +0 -73
  445. package/src/staged-editing.ts +0 -0
  446. package/src/studio/bug-report.test.ts +0 -101
  447. package/src/studio/bug-report.ts +0 -165
  448. package/src/studio/cli.test.ts +0 -187
  449. package/src/studio/cli.ts +0 -117
  450. package/src/studio/copilot-core.test.ts +0 -45
  451. package/src/studio/csv.test.ts +0 -90
  452. package/src/studio/csv.ts +0 -165
  453. package/src/studio/db-connect-string.test.ts +0 -94
  454. package/src/studio/db-connect-string.ts +0 -128
  455. package/src/studio/deploy-cli.test.ts +0 -56
  456. package/src/studio/deploy-cli.ts +0 -100
  457. package/src/studio/emit-project.test.ts +0 -3324
  458. package/src/studio/emit-project.ts +0 -5377
  459. package/src/studio/emit-schema.test.ts +0 -111
  460. package/src/studio/emit-schema.ts +0 -1181
  461. package/src/studio/index.ts +0 -380
  462. package/src/studio/init-flow.test.ts +0 -514
  463. package/src/studio/init-flow.ts +0 -556
  464. package/src/studio/introspect-db.test.ts +0 -186
  465. package/src/studio/introspect-db.ts +0 -312
  466. package/src/studio/introspect-openapi.test.ts +0 -84
  467. package/src/studio/introspect-openapi.ts +0 -252
  468. package/src/studio/introspect-prisma.test.ts +0 -99
  469. package/src/studio/introspect-prisma.ts +0 -175
  470. package/src/studio/introspect.test.ts +0 -172
  471. package/src/studio/introspect.ts +0 -310
  472. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  473. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  474. package/src/studio/pipeline.test.ts +0 -42
  475. package/src/studio/project-robust.test.ts +0 -157
  476. package/src/studio/project.test.ts +0 -929
  477. package/src/studio/project.ts +0 -2394
  478. package/src/studio/sample-data.test.ts +0 -58
  479. package/src/studio/sample-data.ts +0 -203
  480. package/src/studio/samples/ats.ts +0 -202
  481. package/src/studio/samples/clinic.ts +0 -179
  482. package/src/studio/samples/crm.ts +0 -291
  483. package/src/studio/samples/datasets.test.ts +0 -84
  484. package/src/studio/samples/datasets.ts +0 -340
  485. package/src/studio/samples/ecommerce.ts +0 -187
  486. package/src/studio/samples/events.ts +0 -201
  487. package/src/studio/samples/fleet.ts +0 -213
  488. package/src/studio/samples/gym.ts +0 -215
  489. package/src/studio/samples/hr.ts +0 -195
  490. package/src/studio/samples/index.ts +0 -55
  491. package/src/studio/samples/insurance.ts +0 -229
  492. package/src/studio/samples/inventory.ts +0 -213
  493. package/src/studio/samples/invoicing.ts +0 -162
  494. package/src/studio/samples/library.ts +0 -180
  495. package/src/studio/samples/live-data.test.ts +0 -99
  496. package/src/studio/samples/live-data.ts +0 -306
  497. package/src/studio/samples/projects.ts +0 -212
  498. package/src/studio/samples/realestate.ts +0 -196
  499. package/src/studio/samples/restaurant.ts +0 -189
  500. package/src/studio/samples/samples.test.ts +0 -304
  501. package/src/studio/samples/school.ts +0 -197
  502. package/src/studio/samples/seed-floor.test.ts +0 -25
  503. package/src/studio/samples/shared.ts +0 -237
  504. package/src/studio/samples/starter.ts +0 -251
  505. package/src/studio/samples/subscriptions.ts +0 -183
  506. package/src/studio/samples/support.ts +0 -216
  507. package/src/studio/scaffold-app.test.ts +0 -91
  508. package/src/studio/scaffold.test.ts +0 -192
  509. package/src/studio/scaffold.ts +0 -390
  510. package/src/studio/screen-suites.test.ts +0 -269
  511. package/src/studio/screen-suites.ts +0 -448
  512. package/src/studio/themes.ts +0 -62
  513. package/src/studio/ui-components-surface.test.ts +0 -185
  514. package/src/studio/ui-components.generated.ts +0 -7154
  515. package/src/studio/ui-components.ts +0 -742
  516. package/src/studio/verify.test.ts +0 -47
  517. package/src/studio/verify.ts +0 -79
  518. package/src/sveltekit/in-memory.test.ts +0 -104
  519. package/src/sveltekit/in-memory.ts +0 -129
  520. package/src/sveltekit/index.ts +0 -24
  521. package/src/sveltekit/query-plan.test.ts +0 -109
  522. package/src/sveltekit/query-plan.ts +0 -125
  523. package/src/sveltekit/sql-source.test.ts +0 -198
  524. package/src/sveltekit/sql-source.ts +0 -171
  525. package/src/sveltekit/sql.test.ts +0 -80
  526. package/src/sveltekit/sql.ts +0 -131
  527. package/src/sveltekit/transport-scope.test.ts +0 -125
  528. package/src/sveltekit/transport.test.ts +0 -201
  529. package/src/sveltekit/transport.ts +0 -373
  530. package/src/upgrade-prompt.test.ts +0 -71
  531. package/src/upgrade-prompt.ts +0 -162
  532. package/src/version.test.ts +0 -17
  533. package/src/watermark.test.ts +0 -97
  534. package/src/watermark.ts +0 -156
  535. /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
  536. /package/{src → dist}/SvAlertsManager.svelte +0 -0
  537. /package/{src → dist}/SvAlertsPanel.svelte +0 -0
  538. /package/{src → dist}/SvAuthGate.svelte +0 -0
  539. /package/{src → dist}/SvBoard.svelte +0 -0
  540. /package/{src → dist}/SvExportMenu.svelte +0 -0
  541. /package/{src → dist}/SvExpressionEditor.svelte +0 -0
  542. /package/{src → dist}/SvFileInput.svelte +0 -0
  543. /package/{src → dist}/SvGridAlerts.svelte +0 -0
  544. /package/{src → dist}/SvGridBoard.svelte +0 -0
  545. /package/{src → dist}/SvGridEditPanel.svelte +0 -0
  546. /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
  547. /package/{src → dist}/SvGridScheduler.svelte +0 -0
  548. /package/{src → dist}/SvImportDialog.svelte +0 -0
  549. /package/{src → dist}/SvLookupInput.svelte +0 -0
  550. /package/{src → dist}/SvPivotDesigner.svelte +0 -0
  551. /package/{src → dist}/SvRecordDetail.svelte +0 -0
  552. /package/{src → dist}/SvSchedule.svelte +0 -0
  553. /package/{src → dist}/SvSchemaChart.svelte +0 -0
  554. /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
  555. /package/{src → dist}/pdfmake-shims.d.ts +0 -0
  556. /package/{src → dist}/smart.export.d.ts +0 -0
  557. /package/{src → dist}/smart.export.js +0 -0
  558. /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
  559. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
  560. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
  561. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
  562. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
  563. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
  564. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
  565. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
  566. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
  567. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
  568. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
  569. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
  570. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
  571. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
  572. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
  573. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
  574. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
  575. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
  576. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
  577. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
  578. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
  579. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
  580. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
  581. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
  582. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
  583. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
  584. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
  585. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
  586. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
  587. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
  588. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
  589. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
  590. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
  591. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
  592. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
  593. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
  594. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
  595. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
  596. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
  597. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
  598. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
  599. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
  600. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
  601. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
  602. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
  603. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
  604. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
  605. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
  606. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
  607. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
  608. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
  609. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
  610. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
  611. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
  612. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
  613. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
  614. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
  615. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
  616. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
  617. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
  618. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
  619. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
  620. /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
- }
@@ -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
- })
@@ -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
- })
@@ -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
- }