@svgrid/enterprise 2.5.3 → 2.6.1

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 (624) 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/{src → dist}/SvExpressionEditor.svelte +4 -1
  8. package/dist/SvExpressionEditor.svelte.d.ts +12 -0
  9. package/dist/SvFileInput.svelte.d.ts +20 -0
  10. package/dist/SvGridAlerts.svelte.d.ts +77 -0
  11. package/dist/SvGridBoard.svelte.d.ts +30 -0
  12. package/{src → dist}/SvGridEditPanel.svelte +173 -28
  13. package/dist/SvGridEditPanel.svelte.d.ts +75 -0
  14. package/dist/SvGridMasterDetail.svelte.d.ts +49 -0
  15. package/dist/SvGridScheduler.svelte.d.ts +30 -0
  16. package/dist/SvImportDialog.svelte.d.ts +88 -0
  17. package/dist/SvLookupInput.svelte.d.ts +21 -0
  18. package/dist/SvPivotDesigner.svelte.d.ts +176 -0
  19. package/dist/SvRecordDetail.svelte.d.ts +58 -0
  20. package/dist/SvSchedule.svelte.d.ts +29 -0
  21. package/dist/SvSchemaChart.svelte.d.ts +61 -0
  22. package/dist/SvSchemaDashboard.svelte.d.ts +46 -0
  23. package/dist/alerts/alert-engine-attach.d.ts +79 -0
  24. package/dist/alerts/alert-engine-attach.js +106 -0
  25. package/dist/alerts/alert-engine.d.ts +42 -0
  26. package/dist/alerts/alert-engine.js +196 -0
  27. package/dist/alerts/alert-formats.d.ts +26 -0
  28. package/dist/alerts/alert-formats.js +58 -0
  29. package/dist/alerts/alert-observer.d.ts +54 -0
  30. package/dist/alerts/alert-observer.js +156 -0
  31. package/dist/alerts/alert-scheduler.d.ts +30 -0
  32. package/dist/alerts/alert-scheduler.js +54 -0
  33. package/dist/alerts/alert-storage.d.ts +31 -0
  34. package/dist/alerts/alert-storage.js +92 -0
  35. package/dist/alerts/alert-store.svelte.d.ts +24 -0
  36. package/dist/alerts/alert-store.svelte.js +69 -0
  37. package/dist/alerts/alert-types.d.ts +86 -0
  38. package/dist/alerts/alert-types.js +1 -0
  39. package/dist/alerts.d.ts +2 -0
  40. package/{src/alerts.ts → dist/alerts.js} +9 -9
  41. package/dist/board.d.ts +7 -0
  42. package/{src/board.ts → dist/board.js} +13 -14
  43. package/dist/cdn/svgrid-enterprise.svelte-external.js +3220 -2607
  44. package/dist/designer/assets/index-BfzoL904.css +1 -0
  45. package/dist/designer/assets/{index-CBYU-KNn.js → index-CKdwDseq.js} +139 -139
  46. package/dist/designer/assets/src-DCKhP5Xy.css +1 -0
  47. package/dist/designer/assets/{src-i309BeJb.js → src-DLsSdh3J.js} +213 -193
  48. package/dist/designer/index.html +4 -4
  49. package/dist/edit-panel.d.ts +105 -0
  50. package/dist/edit-panel.js +350 -0
  51. package/dist/export-conditional.d.ts +31 -0
  52. package/dist/export-conditional.js +65 -0
  53. package/dist/export-ooxml.d.ts +93 -0
  54. package/dist/export-ooxml.js +385 -0
  55. package/dist/export-pdf.d.ts +107 -0
  56. package/dist/export-pdf.js +144 -0
  57. package/dist/export-print.d.ts +55 -0
  58. package/dist/export-print.js +91 -0
  59. package/{src/export-serialize.ts → dist/export-serialize.d.ts} +11 -24
  60. package/dist/export-serialize.js +11 -0
  61. package/dist/export-xls.d.ts +26 -0
  62. package/dist/export-xls.js +157 -0
  63. package/dist/export.d.ts +323 -0
  64. package/dist/export.js +1021 -0
  65. package/dist/expressions/evaluate.d.ts +17 -0
  66. package/dist/expressions/evaluate.js +214 -0
  67. package/dist/expressions/expression-columns.d.ts +61 -0
  68. package/dist/expressions/expression-columns.js +72 -0
  69. package/dist/expressions/expression-types.d.ts +125 -0
  70. package/dist/expressions/expression-types.js +1 -0
  71. package/dist/expressions/parse.d.ts +25 -0
  72. package/dist/expressions/parse.js +537 -0
  73. package/dist/import.d.ts +232 -0
  74. package/dist/import.js +846 -0
  75. package/dist/index.d.ts +66 -0
  76. package/dist/index.js +91 -0
  77. package/dist/install.d.ts +70 -0
  78. package/dist/install.js +61 -0
  79. package/dist/license-core.d.ts +37 -0
  80. package/dist/license-core.js +81 -0
  81. package/dist/license.d.ts +30 -0
  82. package/dist/license.js +139 -0
  83. package/dist/master-detail.d.ts +23 -0
  84. package/dist/master-detail.js +35 -0
  85. package/dist/node/studio.js +683 -13
  86. package/dist/pivot-chart.d.ts +28 -0
  87. package/dist/pivot-chart.js +71 -0
  88. package/dist/pivot-designer.d.ts +69 -0
  89. package/dist/pivot-designer.js +38 -0
  90. package/dist/pivot-enable.d.ts +6 -0
  91. package/{src/pivot-enable.ts → dist/pivot-enable.js} +13 -18
  92. package/dist/pivot.d.ts +111 -0
  93. package/dist/pivot.js +353 -0
  94. package/dist/print.d.ts +33 -0
  95. package/dist/print.js +61 -0
  96. package/dist/revoked.d.ts +1 -0
  97. package/{src/revoked.ts → dist/revoked.js} +5 -6
  98. package/dist/scheduler-assignments.d.ts +64 -0
  99. package/dist/scheduler-assignments.js +92 -0
  100. package/dist/scheduler-axis.d.ts +81 -0
  101. package/dist/scheduler-axis.js +180 -0
  102. package/{src/scheduler-booking.ts → dist/scheduler-booking.d.ts} +10 -43
  103. package/dist/scheduler-booking.js +50 -0
  104. package/dist/scheduler-config.d.ts +177 -0
  105. package/dist/scheduler-config.js +1 -0
  106. package/dist/scheduler-dependencies.d.ts +89 -0
  107. package/dist/scheduler-dependencies.js +179 -0
  108. package/dist/scheduler-freebusy.d.ts +19 -0
  109. package/{src/scheduler-freebusy.ts → dist/scheduler-freebusy.js} +9 -19
  110. package/{src/scheduler-heatmap.ts → dist/scheduler-heatmap.d.ts} +12 -35
  111. package/dist/scheduler-heatmap.js +41 -0
  112. package/dist/scheduler-resource-tree.d.ts +48 -0
  113. package/dist/scheduler-resource-tree.js +78 -0
  114. package/dist/scheduler-slots.d.ts +37 -0
  115. package/dist/scheduler-slots.js +80 -0
  116. package/dist/scheduler-summary.d.ts +41 -0
  117. package/dist/scheduler-summary.js +54 -0
  118. package/dist/scheduler.d.ts +7 -0
  119. package/{src/scheduler.ts → dist/scheduler.js} +13 -14
  120. package/dist/scheduling.d.ts +132 -0
  121. package/dist/scheduling.js +228 -0
  122. package/dist/schema-designer.d.ts +42 -0
  123. package/dist/schema-designer.js +117 -0
  124. package/dist/schema.d.ts +408 -0
  125. package/dist/schema.js +225 -0
  126. package/dist/smart-shim.d.ts +62 -0
  127. package/dist/smart-shim.js +34 -0
  128. package/dist/sources/aggregate.d.ts +43 -0
  129. package/dist/sources/aggregate.js +60 -0
  130. package/dist/sources/auth-supabase.d.ts +69 -0
  131. package/dist/sources/auth-supabase.js +39 -0
  132. package/dist/sources/dashboard.d.ts +65 -0
  133. package/dist/sources/dashboard.js +95 -0
  134. package/dist/sources/field-inference.d.ts +23 -0
  135. package/dist/sources/field-inference.js +52 -0
  136. package/dist/sources/filters.d.ts +35 -0
  137. package/dist/sources/filters.js +52 -0
  138. package/dist/sources/index.d.ts +18 -0
  139. package/dist/sources/index.js +18 -0
  140. package/dist/sources/introspect-supabase.d.ts +30 -0
  141. package/dist/sources/introspect-supabase.js +134 -0
  142. package/dist/sources/realtime-supabase.d.ts +37 -0
  143. package/dist/sources/realtime-supabase.js +52 -0
  144. package/dist/sources/relation-lookup.d.ts +50 -0
  145. package/dist/sources/relation-lookup.js +77 -0
  146. package/dist/sources/rest-adapters.d.ts +48 -0
  147. package/dist/sources/rest-adapters.js +85 -0
  148. package/dist/sources/rest.d.ts +38 -0
  149. package/dist/sources/rest.js +86 -0
  150. package/dist/sources/schema-from-columns.d.ts +37 -0
  151. package/dist/sources/schema-from-columns.js +48 -0
  152. package/dist/sources/supabase.d.ts +33 -0
  153. package/dist/sources/supabase.js +74 -0
  154. package/dist/sources/with-entity-rules.d.ts +25 -0
  155. package/dist/sources/with-entity-rules.js +47 -0
  156. package/dist/sources/with-relation-labels.d.ts +26 -0
  157. package/dist/sources/with-relation-labels.js +38 -0
  158. package/dist/staged-editing.d.ts +85 -0
  159. package/dist/staged-editing.js +0 -0
  160. package/dist/studio/bug-report.d.ts +61 -0
  161. package/dist/studio/bug-report.js +126 -0
  162. package/dist/studio/cli.d.ts +56 -0
  163. package/dist/studio/cli.js +70 -0
  164. package/dist/studio/copilot-core.d.ts +22 -0
  165. package/{src/studio/copilot-core.ts → dist/studio/copilot-core.js} +34 -38
  166. package/dist/studio/csv.d.ts +36 -0
  167. package/dist/studio/csv.js +173 -0
  168. package/dist/studio/db-connect-string.d.ts +45 -0
  169. package/dist/studio/db-connect-string.js +113 -0
  170. package/dist/studio/deploy-cli.d.ts +35 -0
  171. package/dist/studio/deploy-cli.js +81 -0
  172. package/dist/studio/emit-project.d.ts +77 -0
  173. package/dist/studio/emit-project.js +5463 -0
  174. package/dist/studio/emit-schema.d.ts +110 -0
  175. package/dist/studio/emit-schema.js +1128 -0
  176. package/dist/studio/index.d.ts +35 -0
  177. package/dist/studio/index.js +41 -0
  178. package/dist/studio/init-flow.d.ts +58 -0
  179. package/dist/studio/init-flow.js +451 -0
  180. package/dist/studio/introspect-db.d.ts +47 -0
  181. package/dist/studio/introspect-db.js +255 -0
  182. package/dist/studio/introspect-openapi.d.ts +19 -0
  183. package/dist/studio/introspect-openapi.js +244 -0
  184. package/dist/studio/introspect-prisma.d.ts +25 -0
  185. package/dist/studio/introspect-prisma.js +164 -0
  186. package/dist/studio/introspect.d.ts +35 -0
  187. package/dist/studio/introspect.js +306 -0
  188. package/dist/studio/project.d.ts +1448 -0
  189. package/dist/studio/project.js +2187 -0
  190. package/dist/studio/sample-data.d.ts +19 -0
  191. package/dist/studio/sample-data.js +207 -0
  192. package/dist/studio/samples/ats.d.ts +2 -0
  193. package/dist/studio/samples/ats.js +194 -0
  194. package/dist/studio/samples/clinic.d.ts +2 -0
  195. package/dist/studio/samples/clinic.js +171 -0
  196. package/dist/studio/samples/crm.d.ts +2 -0
  197. package/dist/studio/samples/crm.js +280 -0
  198. package/dist/studio/samples/datasets.d.ts +38 -0
  199. package/dist/studio/samples/datasets.js +296 -0
  200. package/dist/studio/samples/ecommerce.d.ts +2 -0
  201. package/dist/studio/samples/ecommerce.js +178 -0
  202. package/dist/studio/samples/events.d.ts +2 -0
  203. package/dist/studio/samples/events.js +192 -0
  204. package/dist/studio/samples/fleet.d.ts +2 -0
  205. package/dist/studio/samples/fleet.js +203 -0
  206. package/dist/studio/samples/gym.d.ts +2 -0
  207. package/dist/studio/samples/gym.js +205 -0
  208. package/dist/studio/samples/hr.d.ts +2 -0
  209. package/dist/studio/samples/hr.js +186 -0
  210. package/dist/studio/samples/index.d.ts +13 -0
  211. package/dist/studio/samples/index.js +44 -0
  212. package/dist/studio/samples/insurance.d.ts +2 -0
  213. package/dist/studio/samples/insurance.js +220 -0
  214. package/dist/studio/samples/inventory.d.ts +2 -0
  215. package/dist/studio/samples/inventory.js +204 -0
  216. package/dist/studio/samples/invoicing.d.ts +2 -0
  217. package/dist/studio/samples/invoicing.js +154 -0
  218. package/dist/studio/samples/library.d.ts +2 -0
  219. package/dist/studio/samples/library.js +171 -0
  220. package/dist/studio/samples/live-data.d.ts +5 -0
  221. package/dist/studio/samples/live-data.js +261 -0
  222. package/dist/studio/samples/projects.d.ts +2 -0
  223. package/dist/studio/samples/projects.js +203 -0
  224. package/dist/studio/samples/realestate.d.ts +2 -0
  225. package/dist/studio/samples/realestate.js +187 -0
  226. package/dist/studio/samples/restaurant.d.ts +2 -0
  227. package/dist/studio/samples/restaurant.js +180 -0
  228. package/dist/studio/samples/school.d.ts +2 -0
  229. package/dist/studio/samples/school.js +188 -0
  230. package/dist/studio/samples/shared.d.ts +142 -0
  231. package/dist/studio/samples/shared.js +164 -0
  232. package/dist/studio/samples/starter.d.ts +4 -0
  233. package/dist/studio/samples/starter.js +237 -0
  234. package/dist/studio/samples/subscriptions.d.ts +2 -0
  235. package/dist/studio/samples/subscriptions.js +175 -0
  236. package/dist/studio/samples/support.d.ts +2 -0
  237. package/dist/studio/samples/support.js +209 -0
  238. package/dist/studio/scaffold-app.d.ts +22 -0
  239. package/{src/studio/scaffold-app.ts → dist/studio/scaffold-app.js} +45 -63
  240. package/dist/studio/scaffold.d.ts +63 -0
  241. package/dist/studio/scaffold.js +346 -0
  242. package/dist/studio/screen-suites.d.ts +193 -0
  243. package/dist/studio/screen-suites.js +297 -0
  244. package/dist/studio/themes.d.ts +34 -0
  245. package/dist/studio/themes.js +41 -0
  246. package/dist/studio/ui-components.d.ts +89 -0
  247. package/dist/studio/ui-components.generated.d.ts +29 -0
  248. package/dist/studio/ui-components.generated.js +7319 -0
  249. package/dist/studio/ui-components.js +673 -0
  250. package/dist/studio/user-error.d.ts +23 -0
  251. package/{src/studio/user-error.ts → dist/studio/user-error.js} +10 -13
  252. package/dist/studio/verify.d.ts +34 -0
  253. package/dist/studio/verify.js +47 -0
  254. package/dist/sveltekit/in-memory.d.ts +14 -0
  255. package/dist/sveltekit/in-memory.js +113 -0
  256. package/dist/sveltekit/index.d.ts +6 -0
  257. package/dist/sveltekit/index.js +5 -0
  258. package/dist/sveltekit/query-plan.d.ts +44 -0
  259. package/dist/sveltekit/query-plan.js +76 -0
  260. package/dist/sveltekit/sql-source.d.ts +47 -0
  261. package/dist/sveltekit/sql-source.js +106 -0
  262. package/dist/sveltekit/sql.d.ts +48 -0
  263. package/dist/sveltekit/sql.js +73 -0
  264. package/dist/sveltekit/transport.d.ts +209 -0
  265. package/dist/sveltekit/transport.js +219 -0
  266. package/{src/sveltekit/types.ts → dist/sveltekit/types.d.ts} +8 -11
  267. package/dist/sveltekit/types.js +1 -0
  268. package/dist/upgrade-prompt.d.ts +16 -0
  269. package/dist/upgrade-prompt.js +141 -0
  270. package/dist/version.d.ts +13 -0
  271. package/{src/version.ts → dist/version.js} +1 -1
  272. package/dist/watermark.d.ts +2 -0
  273. package/dist/watermark.js +146 -0
  274. package/package.json +28 -26
  275. package/dist/designer/assets/index-oYok52zd.css +0 -1
  276. package/dist/designer/assets/src-D-O2F805.css +0 -1
  277. package/src/SvBoard.dom.test.ts +0 -67
  278. package/src/SvGridAlerts.dom.test.ts +0 -113
  279. package/src/SvGridEditPanel.dom.test.ts +0 -320
  280. package/src/SvRecordDetail.dom.test.ts +0 -137
  281. package/src/SvSchedule.dom.test.ts +0 -57
  282. package/src/ai-export-pdf.dom.test.ts +0 -77
  283. package/src/ai-export-xlsx.dom.test.ts +0 -90
  284. package/src/ai-export.dom.test.ts +0 -114
  285. package/src/alerts/alert-engine-attach.ts +0 -165
  286. package/src/alerts/alert-engine.test.ts +0 -135
  287. package/src/alerts/alert-engine.ts +0 -260
  288. package/src/alerts/alert-formats.test.ts +0 -87
  289. package/src/alerts/alert-formats.ts +0 -77
  290. package/src/alerts/alert-observer.test.ts +0 -189
  291. package/src/alerts/alert-observer.ts +0 -208
  292. package/src/alerts/alert-scheduler.ts +0 -96
  293. package/src/alerts/alert-storage.test.ts +0 -54
  294. package/src/alerts/alert-storage.ts +0 -116
  295. package/src/alerts/alert-store.svelte.ts +0 -80
  296. package/src/alerts/alert-types.ts +0 -94
  297. package/src/board.dom.test.ts +0 -941
  298. package/src/edit-panel.test.ts +0 -322
  299. package/src/edit-panel.ts +0 -379
  300. package/src/export-conditional.test.ts +0 -60
  301. package/src/export-conditional.ts +0 -94
  302. package/src/export-ooxml.test.ts +0 -152
  303. package/src/export-ooxml.ts +0 -489
  304. package/src/export-pdf.test.ts +0 -138
  305. package/src/export-pdf.ts +0 -245
  306. package/src/export-print.test.ts +0 -66
  307. package/src/export-print.ts +0 -132
  308. package/src/export-serialize.test.ts +0 -56
  309. package/src/export-xls.ts +0 -199
  310. package/src/export-xlsx-roundtrip.test.ts +0 -120
  311. package/src/export-xlsx.test.ts +0 -150
  312. package/src/export.test.ts +0 -349
  313. package/src/export.ts +0 -1464
  314. package/src/expressions/evaluate.test.ts +0 -111
  315. package/src/expressions/evaluate.ts +0 -237
  316. package/src/expressions/expression-columns.ts +0 -133
  317. package/src/expressions/expression-types.ts +0 -84
  318. package/src/expressions/parse.test.ts +0 -106
  319. package/src/expressions/parse.ts +0 -610
  320. package/src/import-automap.test.ts +0 -131
  321. package/src/import-hardening.test.ts +0 -158
  322. package/src/import.test.ts +0 -415
  323. package/src/import.ts +0 -1044
  324. package/src/index.ts +0 -569
  325. package/src/install.ts +0 -154
  326. package/src/license-core.test.ts +0 -23
  327. package/src/license-core.ts +0 -107
  328. package/src/license-expiry.test.ts +0 -144
  329. package/src/license.ts +0 -157
  330. package/src/master-detail.test.ts +0 -61
  331. package/src/master-detail.ts +0 -42
  332. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -178
  333. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +0 -3875
  334. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +0 -1
  335. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +0 -21
  336. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +0 -1
  337. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +0 -1938
  338. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +0 -1
  339. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +0 -205
  340. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +0 -1
  341. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +0 -18
  342. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +0 -1
  343. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +0 -264
  344. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +0 -1
  345. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +0 -697
  346. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +0 -1
  347. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -134
  348. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -1
  349. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -55
  350. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -1
  351. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -2
  352. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -46843
  353. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -1
  354. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -237
  355. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -1
  356. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -2
  357. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -4
  358. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -1
  359. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -7
  360. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -4
  361. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -1
  362. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -5
  363. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -1
  364. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -5
  365. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -1
  366. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -5
  367. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -1
  368. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -6
  369. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -83
  370. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -1
  371. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -559
  372. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -1
  373. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -24
  374. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -1
  375. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -122
  376. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -1
  377. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -2
  378. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -89
  379. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -1
  380. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -241
  381. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -1
  382. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +0 -4938
  383. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +0 -1
  384. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +0 -495
  385. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +0 -1
  386. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +0 -190
  387. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +0 -1
  388. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +0 -8
  389. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +0 -1
  390. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +0 -138
  391. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +0 -1
  392. package/src/pivot-chart.test.ts +0 -86
  393. package/src/pivot-chart.ts +0 -112
  394. package/src/pivot-designer.ts +0 -101
  395. package/src/pivot.test.ts +0 -335
  396. package/src/pivot.ts +0 -578
  397. package/src/print.ts +0 -107
  398. package/src/scheduler-assignments.test.ts +0 -97
  399. package/src/scheduler-assignments.ts +0 -134
  400. package/src/scheduler-axis.test.ts +0 -108
  401. package/src/scheduler-axis.ts +0 -238
  402. package/src/scheduler-booking.test.ts +0 -57
  403. package/src/scheduler-config.ts +0 -179
  404. package/src/scheduler-dependencies.test.ts +0 -155
  405. package/src/scheduler-dependencies.ts +0 -223
  406. package/src/scheduler-freebusy.test.ts +0 -41
  407. package/src/scheduler-heatmap.test.ts +0 -39
  408. package/src/scheduler-resource-tree.test.ts +0 -84
  409. package/src/scheduler-resource-tree.ts +0 -107
  410. package/src/scheduler-slots.test.ts +0 -53
  411. package/src/scheduler-slots.ts +0 -94
  412. package/src/scheduler-summary.test.ts +0 -47
  413. package/src/scheduler-summary.ts +0 -81
  414. package/src/scheduling.test.ts +0 -194
  415. package/src/scheduling.ts +0 -293
  416. package/src/schema-designer.test.ts +0 -121
  417. package/src/schema-designer.ts +0 -142
  418. package/src/schema.test.ts +0 -268
  419. package/src/schema.ts +0 -562
  420. package/src/smart-shim.ts +0 -107
  421. package/src/sources/aggregate.test.ts +0 -79
  422. package/src/sources/aggregate.ts +0 -102
  423. package/src/sources/auth-supabase.test.ts +0 -80
  424. package/src/sources/auth-supabase.ts +0 -87
  425. package/src/sources/dashboard.kpi.test.ts +0 -50
  426. package/src/sources/dashboard.test.ts +0 -61
  427. package/src/sources/dashboard.ts +0 -136
  428. package/src/sources/field-inference.test.ts +0 -60
  429. package/src/sources/field-inference.ts +0 -63
  430. package/src/sources/filters.test.ts +0 -58
  431. package/src/sources/filters.ts +0 -70
  432. package/src/sources/index.ts +0 -67
  433. package/src/sources/introspect-supabase.test.ts +0 -112
  434. package/src/sources/introspect-supabase.ts +0 -139
  435. package/src/sources/realtime-supabase.test.ts +0 -93
  436. package/src/sources/realtime-supabase.ts +0 -99
  437. package/src/sources/relation-lookup.test.ts +0 -99
  438. package/src/sources/relation-lookup.ts +0 -128
  439. package/src/sources/rest-adapters.test.ts +0 -95
  440. package/src/sources/rest-adapters.ts +0 -120
  441. package/src/sources/rest.test.ts +0 -104
  442. package/src/sources/rest.ts +0 -129
  443. package/src/sources/schema-from-columns.test.ts +0 -106
  444. package/src/sources/schema-from-columns.ts +0 -88
  445. package/src/sources/supabase.test.ts +0 -110
  446. package/src/sources/supabase.ts +0 -99
  447. package/src/sources/with-entity-rules.test.ts +0 -104
  448. package/src/sources/with-entity-rules.ts +0 -78
  449. package/src/sources/with-relation-labels.test.ts +0 -75
  450. package/src/sources/with-relation-labels.ts +0 -73
  451. package/src/staged-editing.ts +0 -0
  452. package/src/studio/bug-report.test.ts +0 -101
  453. package/src/studio/bug-report.ts +0 -165
  454. package/src/studio/cli.test.ts +0 -187
  455. package/src/studio/cli.ts +0 -117
  456. package/src/studio/copilot-core.test.ts +0 -45
  457. package/src/studio/csv.test.ts +0 -90
  458. package/src/studio/csv.ts +0 -165
  459. package/src/studio/db-connect-string.test.ts +0 -94
  460. package/src/studio/db-connect-string.ts +0 -128
  461. package/src/studio/deploy-cli.test.ts +0 -56
  462. package/src/studio/deploy-cli.ts +0 -100
  463. package/src/studio/emit-project.test.ts +0 -3324
  464. package/src/studio/emit-project.ts +0 -5377
  465. package/src/studio/emit-schema.test.ts +0 -111
  466. package/src/studio/emit-schema.ts +0 -1181
  467. package/src/studio/index.ts +0 -380
  468. package/src/studio/init-flow.test.ts +0 -514
  469. package/src/studio/init-flow.ts +0 -556
  470. package/src/studio/introspect-db.test.ts +0 -186
  471. package/src/studio/introspect-db.ts +0 -312
  472. package/src/studio/introspect-openapi.test.ts +0 -84
  473. package/src/studio/introspect-openapi.ts +0 -252
  474. package/src/studio/introspect-prisma.test.ts +0 -99
  475. package/src/studio/introspect-prisma.ts +0 -175
  476. package/src/studio/introspect.test.ts +0 -172
  477. package/src/studio/introspect.ts +0 -310
  478. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -1
  479. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -3
  480. package/src/studio/pipeline.test.ts +0 -42
  481. package/src/studio/project-robust.test.ts +0 -157
  482. package/src/studio/project.test.ts +0 -929
  483. package/src/studio/project.ts +0 -2394
  484. package/src/studio/sample-data.test.ts +0 -58
  485. package/src/studio/sample-data.ts +0 -203
  486. package/src/studio/samples/ats.ts +0 -202
  487. package/src/studio/samples/clinic.ts +0 -179
  488. package/src/studio/samples/crm.ts +0 -291
  489. package/src/studio/samples/datasets.test.ts +0 -84
  490. package/src/studio/samples/datasets.ts +0 -340
  491. package/src/studio/samples/ecommerce.ts +0 -187
  492. package/src/studio/samples/events.ts +0 -201
  493. package/src/studio/samples/fleet.ts +0 -213
  494. package/src/studio/samples/gym.ts +0 -215
  495. package/src/studio/samples/hr.ts +0 -195
  496. package/src/studio/samples/index.ts +0 -55
  497. package/src/studio/samples/insurance.ts +0 -229
  498. package/src/studio/samples/inventory.ts +0 -213
  499. package/src/studio/samples/invoicing.ts +0 -162
  500. package/src/studio/samples/library.ts +0 -180
  501. package/src/studio/samples/live-data.test.ts +0 -99
  502. package/src/studio/samples/live-data.ts +0 -306
  503. package/src/studio/samples/projects.ts +0 -212
  504. package/src/studio/samples/realestate.ts +0 -196
  505. package/src/studio/samples/restaurant.ts +0 -189
  506. package/src/studio/samples/samples.test.ts +0 -304
  507. package/src/studio/samples/school.ts +0 -197
  508. package/src/studio/samples/seed-floor.test.ts +0 -25
  509. package/src/studio/samples/shared.ts +0 -237
  510. package/src/studio/samples/starter.ts +0 -251
  511. package/src/studio/samples/subscriptions.ts +0 -183
  512. package/src/studio/samples/support.ts +0 -216
  513. package/src/studio/scaffold-app.test.ts +0 -91
  514. package/src/studio/scaffold.test.ts +0 -192
  515. package/src/studio/scaffold.ts +0 -390
  516. package/src/studio/screen-suites.test.ts +0 -269
  517. package/src/studio/screen-suites.ts +0 -448
  518. package/src/studio/themes.ts +0 -62
  519. package/src/studio/ui-components-surface.test.ts +0 -185
  520. package/src/studio/ui-components.generated.ts +0 -7154
  521. package/src/studio/ui-components.ts +0 -742
  522. package/src/studio/verify.test.ts +0 -47
  523. package/src/studio/verify.ts +0 -79
  524. package/src/sveltekit/in-memory.test.ts +0 -104
  525. package/src/sveltekit/in-memory.ts +0 -129
  526. package/src/sveltekit/index.ts +0 -24
  527. package/src/sveltekit/query-plan.test.ts +0 -109
  528. package/src/sveltekit/query-plan.ts +0 -125
  529. package/src/sveltekit/sql-source.test.ts +0 -198
  530. package/src/sveltekit/sql-source.ts +0 -171
  531. package/src/sveltekit/sql.test.ts +0 -80
  532. package/src/sveltekit/sql.ts +0 -131
  533. package/src/sveltekit/transport-scope.test.ts +0 -125
  534. package/src/sveltekit/transport.test.ts +0 -201
  535. package/src/sveltekit/transport.ts +0 -373
  536. package/src/upgrade-prompt.test.ts +0 -71
  537. package/src/upgrade-prompt.ts +0 -162
  538. package/src/version.test.ts +0 -17
  539. package/src/watermark.test.ts +0 -97
  540. package/src/watermark.ts +0 -156
  541. /package/{src → dist}/SvAlertRuleEditor.svelte +0 -0
  542. /package/{src → dist}/SvAlertsManager.svelte +0 -0
  543. /package/{src → dist}/SvAlertsPanel.svelte +0 -0
  544. /package/{src → dist}/SvAuthGate.svelte +0 -0
  545. /package/{src → dist}/SvBoard.svelte +0 -0
  546. /package/{src → dist}/SvExportMenu.svelte +0 -0
  547. /package/{src → dist}/SvFileInput.svelte +0 -0
  548. /package/{src → dist}/SvGridAlerts.svelte +0 -0
  549. /package/{src → dist}/SvGridBoard.svelte +0 -0
  550. /package/{src → dist}/SvGridMasterDetail.svelte +0 -0
  551. /package/{src → dist}/SvGridScheduler.svelte +0 -0
  552. /package/{src → dist}/SvImportDialog.svelte +0 -0
  553. /package/{src → dist}/SvLookupInput.svelte +0 -0
  554. /package/{src → dist}/SvPivotDesigner.svelte +0 -0
  555. /package/{src → dist}/SvRecordDetail.svelte +0 -0
  556. /package/{src → dist}/SvSchedule.svelte +0 -0
  557. /package/{src → dist}/SvSchemaChart.svelte +0 -0
  558. /package/{src → dist}/SvSchemaDashboard.svelte +0 -0
  559. /package/{src → dist}/pdfmake-shims.d.ts +0 -0
  560. /package/{src → dist}/smart.export.d.ts +0 -0
  561. /package/{src → dist}/smart.export.js +0 -0
  562. /package/{src → dist}/studio/HANDLERS-DESIGN.md +0 -0
  563. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +0 -0
  564. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +0 -0
  565. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +0 -0
  566. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +0 -0
  567. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +0 -0
  568. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +0 -0
  569. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +0 -0
  570. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +0 -0
  571. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +0 -0
  572. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +0 -0
  573. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +0 -0
  574. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +0 -0
  575. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +0 -0
  576. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +0 -0
  577. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +0 -0
  578. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +0 -0
  579. /package/{src → dist/studio}/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +0 -0
  580. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +0 -0
  581. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +0 -0
  582. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +0 -0
  583. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +0 -0
  584. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +0 -0
  585. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +0 -0
  586. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +0 -0
  587. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +0 -0
  588. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +0 -0
  589. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +0 -0
  590. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +0 -0
  591. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +0 -0
  592. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +0 -0
  593. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +0 -0
  594. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +0 -0
  595. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +0 -0
  596. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +0 -0
  597. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +0 -0
  598. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +0 -0
  599. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +0 -0
  600. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +0 -0
  601. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +0 -0
  602. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +0 -0
  603. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +0 -0
  604. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +0 -0
  605. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +0 -0
  606. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +0 -0
  607. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +0 -0
  608. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +0 -0
  609. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +0 -0
  610. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +0 -0
  611. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +0 -0
  612. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +0 -0
  613. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +0 -0
  614. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +0 -0
  615. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +0 -0
  616. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +0 -0
  617. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +0 -0
  618. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +0 -0
  619. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +0 -0
  620. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +0 -0
  621. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +0 -0
  622. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +0 -0
  623. /package/{src → dist}/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +0 -0
  624. /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,144 +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 watermark, the console notice AND the card', () => {
101
- vi.useFakeTimers({ now: new Date('2026-09-20T10:00:00Z') })
102
- const info = vi.spyOn(console, 'info').mockImplementation(() => {})
103
- setLicenseKey(KEY)
104
- assertEnterpriseLicensed('Export')
105
-
106
- // The evaluation is over, so the app stops looking licensed on every
107
- // surface - it just keeps working.
108
- expect(document.querySelector(CARD)).not.toBeNull()
109
- expect(watermarkCalls()).toBeGreaterThan(0)
110
- expect(info.mock.calls.flat().join(' ')).toMatch(/evaluation license expired on 2026-09-04/)
111
- info.mockRestore()
112
- })
113
-
114
- it('the expiry console notice fires once, not on every Pro call', () => {
115
- vi.useFakeTimers({ now: new Date('2026-09-20T10:00:00Z') })
116
- const info = vi.spyOn(console, 'info').mockImplementation(() => {})
117
- setLicenseKey(KEY)
118
- assertEnterpriseLicensed('Export')
119
- assertEnterpriseLicensed('Export')
120
- assertEnterpriseLicensed('Print')
121
-
122
- const expiryNotices = info.mock.calls
123
- .flat()
124
- .filter((m) => typeof m === 'string' && m.includes('evaluation license expired'))
125
- expect(expiryNotices).toHaveLength(1)
126
- info.mockRestore()
127
- })
128
-
129
- it('an app with no key at all still gets the watermark', () => {
130
- clearLicenseKey()
131
- assertEnterpriseLicensed('Export')
132
-
133
- expect(document.querySelector(CARD)).not.toBeNull()
134
- expect(watermarkCalls()).toBeGreaterThan(0)
135
- })
136
-
137
- it('a paid key never shows the card', () => {
138
- vi.useFakeTimers({ now: new Date('2026-09-20T10:00:00Z') })
139
- setLicenseKey('SVENTERPRISE-ACME-5-202705-ABC123')
140
- expect(isLicenseExpired()).toBe(false)
141
- assertEnterpriseLicensed('Export')
142
- expect(document.querySelector(CARD)).toBeNull()
143
- })
144
- })
package/src/license.ts DELETED
@@ -1,157 +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 stops looking
16
- // licensed: watermark + a one-time
17
- // console notice naming the expiry date
18
- // + the upgrade card. Stays a soft gate
19
- // so a 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
- let noticedExpired = false
31
-
32
- /** One-time console notice for a trial that has run out. Separate from the
33
- * dev/eval notice: that one says "not for production", this one says the
34
- * evaluation is over and names the date, which is the actionable part. */
35
- function noticeExpired(info: LicenseInfo): void {
36
- if (noticedExpired) return
37
- noticedExpired = true
38
- const on = info.expiresAt ? ` on ${info.expiresAt.toISOString().slice(0, 10)}` : ''
39
- // eslint-disable-next-line no-console
40
- console.info(
41
- `@svgrid/enterprise: your evaluation license expired${on}. Everything still ` +
42
- 'works, but the watermark and upgrade notice stay until a license key is set. ' +
43
- 'Contact sales@jqwidgets.com or see https://svgrid.com/pricing',
44
- )
45
- }
46
-
47
- export function setLicenseKey(key: string): void {
48
- if (typeof key !== 'string' || key.length === 0) {
49
- throw new Error('@svgrid/enterprise: setLicenseKey() requires a non-empty string')
50
- }
51
- currentKey = key
52
- noticedDev = false
53
- noticedExpired = false
54
- }
55
-
56
- export function clearLicenseKey(): void {
57
- currentKey = null
58
- noticedDev = false
59
- noticedExpired = false
60
- }
61
-
62
- export function getLicenseKey(): string | null {
63
- return currentKey
64
- }
65
-
66
- /** True if a key is set at all (regardless of validity). */
67
- export function isLicenseKeySet(): boolean {
68
- return currentKey != null
69
- }
70
-
71
- /**
72
- * True if the current key passes every check: present, valid prefix, not
73
- * revoked. Use this from callers that want to branch on license status
74
- * (e.g. UI that hides Pro-only options when unlicensed).
75
- */
76
- export function hasValidLicense(): boolean {
77
- return checkLicenseKey(currentKey).valid
78
- }
79
-
80
- /**
81
- * True when the current key encoded an expiry that has passed. The feature set
82
- * still runs - this exists so a host can show its own banner rather than rely
83
- * on the built-in card. Returns false when the key carries no expiry.
84
- */
85
- export function isLicenseExpired(): boolean {
86
- return checkLicenseKey(currentKey).expired === true
87
- }
88
-
89
- /** When the current key lapses, or null if it encodes no expiry. */
90
- export function getLicenseExpiry(): Date | null {
91
- return checkLicenseKey(currentKey).expiresAt ?? null
92
- }
93
-
94
- /**
95
- * Soft-gate a Pro surface: if the current key isn't valid, nudge (watermark +
96
- * one-time console log + a moment-of-intent upgrade card naming `feature`) and
97
- * return. NEVER throws and NEVER blocks - the feature always runs. This is the
98
- * gate the Studio uses, and it's safe to call on the server (the nudges no-op
99
- * without a DOM). Idempotent/self-throttling, so call it freely at chokepoints.
100
- */
101
- export function nudgeEnterprise(feature?: EnterpriseFeatureLabel): void {
102
- const info = checkLicenseKey(currentKey)
103
- // `valid` stays true past a trial's expiry (the feature keeps running), so
104
- // checking it alone would let a lapsed trial through silently forever.
105
- if (info.valid && !info.expired) return
106
- const lapsedTrial = info.valid && info.expired === true
107
- // A lapsed trial gets the same treatment as an unlicensed app - watermark,
108
- // console notice and card. The evaluation is over; the app keeps running,
109
- // but it stops looking licensed.
110
- emitUnlicensedNudge()
111
- if (lapsedTrial) noticeExpired(info)
112
- showUpgradePrompt(feature, { expired: lapsedTrial })
113
- }
114
-
115
- export function assertEnterpriseLicensed(feature?: EnterpriseFeatureLabel): void {
116
- const info: LicenseInfo = checkLicenseKey(currentKey)
117
- switch (info.status) {
118
- case 'unset':
119
- // Soft-gate: the feature still runs, but the user gets a watermark +
120
- // a one-time console.log nudge directing them to pricing, plus a
121
- // contextual moment-of-intent upgrade card naming the feature they
122
- // just reached for.
123
- emitUnlicensedNudge()
124
- showUpgradePrompt(feature)
125
- return
126
- case 'invalid':
127
- throw new Error(
128
- `@svgrid/enterprise: invalid license key format (expected "${VALID_PREFIX}..." prefix).`,
129
- )
130
- case 'revoked':
131
- throw new Error(
132
- '@svgrid/enterprise: this license key has been revoked. ' +
133
- 'Contact sales@jqwidgets.com for a replacement.',
134
- )
135
- case 'dev':
136
- case 'eval':
137
- if (info.expired) {
138
- // The trial is over. Deliberately NOT a throw: the app keeps working,
139
- // so the developer sees the nudges without their users hitting a broken
140
- // build. Watermark + console notice + card, same as an unlicensed app.
141
- emitUnlicensedNudge()
142
- noticeExpired(info)
143
- showUpgradePrompt(feature, { expired: true })
144
- return
145
- }
146
- if (!noticedDev) {
147
- // eslint-disable-next-line no-console
148
- console.info(
149
- '@svgrid/enterprise: using a development / evaluation license. Not for production use.',
150
- )
151
- noticedDev = true
152
- }
153
- return
154
- case 'licensed':
155
- return
156
- }
157
- }
@@ -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
- })