@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
@@ -1,373 +0,0 @@
1
- /**
2
- * SvelteKit transport - the deep integration an agnostic grid can't ship.
3
- *
4
- * Two halves that speak one small JSON protocol over a single route:
5
- *
6
- * - `createKitDataSource({ endpoint })` runs in the browser (or a `load`
7
- * function) and returns a `ServerDataSource` that POSTs requests to your
8
- * endpoint. Drop it straight into `createServerDataSource`.
9
- *
10
- * - `createKitHandlers({ schema, source })` runs on the server and returns a
11
- * `POST` handler for a `+server.ts` route. It parses the protocol, calls
12
- * your backend `ServerDataSource` (in-memory, SQL, Drizzle, ...), and
13
- * returns JSON.
14
- *
15
- * Example `src/routes/api/customers/+server.ts`:
16
- *
17
- * import { createKitHandlers } from '@svgrid/enterprise'
18
- * import { customerSchema, customerSource } from '$lib/customers'
19
- * export const { POST } = createKitHandlers({ schema: customerSchema, source: customerSource })
20
- *
21
- * Client:
22
- *
23
- * const source = createKitDataSource({ endpoint: '/api/customers' })
24
- * const controller = createServerDataSource(source, { onChange: ... })
25
- */
26
- import type {
27
- RowData,
28
- ServerDataSource,
29
- ServerRequest,
30
- ServerResult,
31
- } from '@svgrid/grid'
32
- import type { EntitySchema } from '../schema'
33
- import { validateAll } from '../edit-panel'
34
- import type { WritableDataSource } from './types'
35
-
36
- /** Wire protocol: the single JSON body shape the client POSTs and the server dispatches on. */
37
- export type KitMessage<TData> =
38
- | { kind: 'query'; request: ServerRequest }
39
- | { kind: 'mutate'; op: 'create'; input: Partial<TData> }
40
- | { kind: 'mutate'; op: 'update'; id: string; patch: Partial<TData> }
41
- | { kind: 'mutate'; op: 'delete'; id: string }
42
-
43
- type FetchLike = (input: string, init?: RequestInit) => Promise<Response>
44
-
45
- function jsonResponse(data: unknown, status = 200): Response {
46
- return new Response(JSON.stringify(data), {
47
- status,
48
- headers: { 'content-type': 'application/json' },
49
- })
50
- }
51
-
52
- // --- client ---------------------------------------------------------------
53
-
54
- export type KitDataSourceOptions = {
55
- /** Route that `createKitHandlers` is mounted on, e.g. `'/api/customers'`. */
56
- endpoint: string
57
- /**
58
- * Fetch implementation. Pass SvelteKit's event `fetch` inside a `load` so
59
- * requests are same-origin and SSR-safe; defaults to the global `fetch`.
60
- */
61
- fetch?: FetchLike
62
- }
63
-
64
- export function createKitDataSource<TData extends RowData>(
65
- options: KitDataSourceOptions,
66
- ): WritableDataSource<TData> {
67
- const doFetch: FetchLike = options.fetch ?? ((i, init) => fetch(i, init))
68
-
69
- async function post<T>(body: KitMessage<TData>): Promise<T> {
70
- const res = await doFetch(options.endpoint, {
71
- method: 'POST',
72
- headers: { 'content-type': 'application/json' },
73
- body: JSON.stringify(body),
74
- })
75
- if (!res.ok) {
76
- const detail = await res.text().catch(() => '')
77
- throw new Error(`svgrid kit: ${res.status} ${res.statusText}${detail ? ` - ${detail}` : ''}`)
78
- }
79
- return (await res.json()) as T
80
- }
81
-
82
- return {
83
- getRows: (request) => post<ServerResult<TData>>({ kind: 'query', request }),
84
- createRow: (input) => post<TData>({ kind: 'mutate', op: 'create', input }),
85
- updateRow: (id, patch) => post<TData>({ kind: 'mutate', op: 'update', id, patch }),
86
- deleteRow: (id) => post<void>({ kind: 'mutate', op: 'delete', id }).then(() => undefined),
87
- }
88
- }
89
-
90
- // --- server ---------------------------------------------------------------
91
-
92
- /** The CRUD action a Kit message maps to (`query` -> `read`). */
93
- export type KitAction = 'read' | 'create' | 'update' | 'delete'
94
- /** Context passed to the `authorize` guard before every op. */
95
- export type KitAuthorizeContext<TData extends RowData> = {
96
- action: KitAction
97
- /** The SvelteKit request event, so you can read `locals` / session for the
98
- * caller's role or user id. Only `request` is guaranteed in non-Kit callers. */
99
- event: { request: Request; locals?: Record<string, unknown> }
100
- message: KitMessage<TData>
101
- }
102
-
103
- /** A field-error map (`{ field: message }`); empty/undefined means valid. */
104
- export type KitFieldErrors = Record<string, string>
105
- /** Context passed to a custom `validate` function before a create / update. */
106
- export type KitValidateContext<TData extends RowData> = {
107
- action: 'create' | 'update'
108
- values: Partial<TData>
109
- event: { request: Request; locals?: Record<string, unknown> }
110
- }
111
-
112
- /** A row-scoping rule: every row this caller may touch has `field === value`. */
113
- export type KitScope = { field: string; value: unknown }
114
-
115
- export type KitHandlerOptions<TData extends RowData> = {
116
- schema: EntitySchema<TData>
117
- source: ServerDataSource<TData>
118
- /**
119
- * Restrict every operation to rows matching one column - the mechanism behind
120
- * multi-tenancy (`field: 'tenantId'`), and usable for any "you only see your
121
- * own rows" rule.
122
- *
123
- * Enforced on all four paths, because scoping reads alone is not isolation:
124
- * - **read**: the predicate is merged into the query's filter model;
125
- * - **create**: the value is stamped onto the row, overriding whatever the
126
- * client sent;
127
- * - **update / delete**: the target row is re-read under the scope first, and
128
- * the write is rejected with `403` if it isn't the caller's - otherwise
129
- * guessing an id would reach across tenants.
130
- *
131
- * Return `null` to apply no scope (e.g. a super-admin). Throwing rejects the
132
- * request, which is the safer default when a tenant cannot be resolved.
133
- */
134
- scope?: (ctx: { event: { request: Request; locals?: Record<string, unknown> } }) => KitScope | null | Promise<KitScope | null>
135
- /**
136
- * Optional server-side guard run BEFORE every op. Return `false` (or throw) to
137
- * reject the request with `403`. Receives the SvelteKit event, so you can read
138
- * `event.locals` / the session to resolve the caller's role - this is where
139
- * server-enforced authorization (RBAC) lives, independent of any client UI.
140
- */
141
- authorize?: (ctx: KitAuthorizeContext<TData>) => boolean | Promise<boolean>
142
- /**
143
- * Server-enforced validation, run BEFORE a create / update reaches the source.
144
- * - `true`: validate the payload against the `schema`'s declarative constraints
145
- * (required, min/max, length, pattern, email/url, per-field + cross-field
146
- * rules) via `validateAll`. Updates validate only the fields present in the
147
- * patch. Defect payloads are rejected with `422 { error, fieldErrors }`.
148
- * - a function: your own check returning a `{ field: message }` map (non-empty
149
- * -> 422).
150
- * Default off, so existing routes are unchanged; the Studio generator turns it
151
- * on. Enforcing here means a client that skips its form validation still can't
152
- * write bad data.
153
- */
154
- validate?: boolean | ((ctx: KitValidateContext<TData>) => KitFieldErrors | null | undefined | Promise<KitFieldErrors | null | undefined>)
155
- /**
156
- * Called AFTER a successful create / update / delete with the change details,
157
- * so you can write an audit record (who / what / when). Receives the SvelteKit
158
- * event for `locals` (the actor). Best-effort: a throw here is swallowed and
159
- * logged, so an audit-sink hiccup never fails the underlying write.
160
- */
161
- audit?: (entry: KitAuditEntry<TData>) => void | Promise<void>
162
- /**
163
- * Business-logic lifecycle hooks, run server-side around each mutation (the
164
- * Studio generator compiles a screen's visual "triggers" into these). A
165
- * `before*` hook may transform the payload (return a new object) or throw to
166
- * reject the write (-> `422 { error }`), so a rule enforced here holds even if
167
- * the client skips it. `after*` hooks run once the write succeeds (cascades,
168
- * notifications) - a throw there fails the request (`500`).
169
- */
170
- hooks?: KitHooks<TData>
171
- }
172
-
173
- /** The SvelteKit event slice handed to every hook (read `locals` for the actor). */
174
- export type KitEvent = { request: Request; locals?: Record<string, unknown> }
175
-
176
- /** Server-side mutation lifecycle hooks (see `KitHandlerOptions.hooks`). */
177
- export type KitHooks<TData extends RowData> = {
178
- beforeCreate?: (ctx: { values: Partial<TData>; event: KitEvent }) => Partial<TData> | void | Promise<Partial<TData> | void>
179
- afterCreate?: (ctx: { row: TData; event: KitEvent }) => void | Promise<void>
180
- beforeUpdate?: (ctx: { id: string; patch: Partial<TData>; event: KitEvent }) => Partial<TData> | void | Promise<Partial<TData> | void>
181
- afterUpdate?: (ctx: { id: string; row: TData; event: KitEvent }) => void | Promise<void>
182
- beforeDelete?: (ctx: { id: string; event: KitEvent }) => void | Promise<void>
183
- afterDelete?: (ctx: { id: string; event: KitEvent }) => void | Promise<void>
184
- }
185
-
186
- /** The change details handed to the `audit` hook after a successful mutation. */
187
- export type KitAuditEntry<TData extends RowData> = {
188
- action: 'create' | 'update' | 'delete'
189
- /** The affected row's id. */
190
- id: string | null
191
- /** Submitted values: create input / update patch. Undefined for delete. */
192
- values?: Partial<TData>
193
- /** The row the source returned (create / update). Undefined for delete. */
194
- result?: TData
195
- event: { request: Request; locals?: Record<string, unknown> }
196
- }
197
-
198
- export type KitHandlers = {
199
- /** SvelteKit `+server.ts` route handler. Export it as `export const { POST } = ...`. */
200
- POST: (event: { request: Request; locals?: Record<string, unknown> }) => Promise<Response>
201
- /** Lower-level dispatcher over a raw `Request`, for custom wiring or tests. */
202
- handle: (request: Request, event?: { locals?: Record<string, unknown> }) => Promise<Response>
203
- }
204
-
205
- const actionOf = <TData extends RowData>(msg: KitMessage<TData>): KitAction =>
206
- msg.kind === 'query' ? 'read' : msg.op
207
-
208
- export function createKitHandlers<TData extends RowData>(
209
- options: KitHandlerOptions<TData>,
210
- ): KitHandlers {
211
- const { source, authorize, validate, audit, hooks, scope } = options
212
- const idField = options.schema.idField ?? options.schema.fields.find((f) => f.primaryKey)?.field ?? 'id'
213
- const rowId = (row: unknown): string | null => {
214
- const v = (row as Record<string, unknown> | null)?.[idField]
215
- return v == null ? null : String(v)
216
- }
217
- // Best-effort: never let an audit-sink error fail the write it's recording.
218
- const fireAudit = async (entry: KitAuditEntry<TData>) => {
219
- if (!audit) return
220
- try { await audit(entry) } catch (err) { console.error('svgrid kit: audit hook failed', err) }
221
- }
222
-
223
- async function handle(request: Request, event?: { locals?: Record<string, unknown> }): Promise<Response> {
224
- let msg: KitMessage<TData>
225
- try {
226
- msg = (await request.json()) as KitMessage<TData>
227
- } catch {
228
- return jsonResponse({ error: 'invalid JSON body' }, 400)
229
- }
230
-
231
- // Authorize BEFORE touching the source. A thrown guard is treated as a deny.
232
- if (authorize) {
233
- let allowed: boolean
234
- try {
235
- allowed = await authorize({ action: actionOf(msg), event: { request, locals: event?.locals }, message: msg })
236
- } catch (err) {
237
- return jsonResponse({ error: err instanceof Error ? err.message : 'forbidden' }, 403)
238
- }
239
- if (!allowed) return jsonResponse({ error: 'forbidden' }, 403)
240
- }
241
-
242
- // Validate create / update payloads BEFORE the source. 422 on field errors.
243
- if (validate && msg.kind === 'mutate' && (msg.op === 'create' || msg.op === 'update')) {
244
- const values = (msg.op === 'create' ? msg.input : msg.patch) as Partial<TData>
245
- let errors: KitFieldErrors | null | undefined
246
- if (validate === true) {
247
- const all = await validateAll(options.schema, values as Record<string, unknown>)
248
- // On update, only the supplied fields are validated (a patch omits the rest).
249
- errors = msg.op === 'update'
250
- ? Object.fromEntries(Object.keys(values).filter((k) => all[k]).map((k) => [k, all[k]!]))
251
- : all
252
- } else {
253
- errors = await validate({ action: msg.op, values, event: { request, locals: event?.locals } })
254
- }
255
- if (errors && Object.keys(errors).length) {
256
- return jsonResponse({ error: 'validation failed', fieldErrors: errors }, 422)
257
- }
258
- }
259
-
260
- // Resolve the row scope once per request. A thrown resolver is a rejection,
261
- // not a 500: "I can't tell which tenant you are" must not fall through to
262
- // an unscoped query.
263
- let activeScope: KitScope | null = null
264
- if (scope) {
265
- try {
266
- activeScope = (await scope({ event: { request, locals: event?.locals } })) ?? null
267
- } catch (err) {
268
- return jsonResponse({ error: err instanceof Error ? err.message : 'forbidden' }, 403)
269
- }
270
- }
271
- /** True when `id` exists AND belongs to the caller's scope. */
272
- const ownsRow = async (id: string): Promise<boolean> => {
273
- if (!activeScope) return true
274
- const idField = options.schema.idField ?? options.schema.fields.find((f) => f.primaryKey)?.field ?? 'id'
275
- const { rows } = await source.getRows({
276
- startRow: 0,
277
- endRow: 1,
278
- pageIndex: 0,
279
- pageSize: 1,
280
- sortModel: [],
281
- filterModel: {
282
- columns: {
283
- [idField]: { operator: 'equals' as const, value: id },
284
- [activeScope.field]: { operator: 'equals' as const, value: String(activeScope.value) },
285
- },
286
- },
287
- })
288
- return rows.length > 0
289
- }
290
-
291
- try {
292
- if (msg.kind === 'query') {
293
- // Merge the scope into the requested filter. Written last so a client
294
- // that sends its own `tenantId` filter cannot widen the scope.
295
- const request = activeScope
296
- ? {
297
- ...msg.request,
298
- filterModel: {
299
- ...msg.request.filterModel,
300
- columns: {
301
- ...(msg.request.filterModel?.columns ?? {}),
302
- [activeScope.field]: { operator: 'equals' as const, value: String(activeScope.value) },
303
- },
304
- },
305
- }
306
- : msg.request
307
- const result = await source.getRows(request)
308
- return jsonResponse(result)
309
- }
310
- if (msg.kind === 'mutate') {
311
- const evt = { request, locals: event?.locals }
312
- // Cross-tenant writes: reject before the source sees the id.
313
- if (activeScope && (msg.op === 'update' || msg.op === 'delete')) {
314
- if (!(await ownsRow(msg.id))) return jsonResponse({ error: 'forbidden' }, 403)
315
- }
316
- // A `before*` hook throwing is a business-rule rejection -> 422 (not a 500).
317
- const runBefore = async <R>(fn: () => Promise<R>): Promise<R | Response> => {
318
- try { return await fn() } catch (err) { return jsonResponse({ error: err instanceof Error ? err.message : 'rejected' }, 422) }
319
- }
320
- if (msg.op === 'create') {
321
- if (!source.createRow) return jsonResponse({ error: 'create not supported' }, 405)
322
- let input = msg.input
323
- if (hooks?.beforeCreate) {
324
- const r = await runBefore(() => Promise.resolve(hooks.beforeCreate!({ values: input, event: evt })))
325
- if (r instanceof Response) return r
326
- if (r) input = r as Partial<TData>
327
- }
328
- // Stamp the scope LAST - after the before-hook - so neither the client
329
- // nor a business rule can write a row into another tenant.
330
- if (activeScope) input = { ...input, [activeScope.field]: activeScope.value } as Partial<TData>
331
- const row = await source.createRow(input)
332
- if (hooks?.afterCreate) await hooks.afterCreate({ row, event: evt })
333
- await fireAudit({ action: 'create', id: rowId(row), values: input, result: row, event: evt })
334
- return jsonResponse(row)
335
- }
336
- if (msg.op === 'update') {
337
- if (!source.updateRow) return jsonResponse({ error: 'update not supported' }, 405)
338
- let patch = msg.patch
339
- if (hooks?.beforeUpdate) {
340
- const r = await runBefore(() => Promise.resolve(hooks.beforeUpdate!({ id: msg.id, patch, event: evt })))
341
- if (r instanceof Response) return r
342
- if (r) patch = r as Partial<TData>
343
- }
344
- // A patch must not be able to hand the row to another tenant.
345
- if (activeScope) patch = { ...patch, [activeScope.field]: activeScope.value } as Partial<TData>
346
- const row = await source.updateRow(msg.id, patch)
347
- if (hooks?.afterUpdate) await hooks.afterUpdate({ id: msg.id, row, event: evt })
348
- await fireAudit({ action: 'update', id: msg.id, values: patch, result: row, event: evt })
349
- return jsonResponse(row)
350
- }
351
- if (msg.op === 'delete') {
352
- if (!source.deleteRow) return jsonResponse({ error: 'delete not supported' }, 405)
353
- if (hooks?.beforeDelete) {
354
- const r = await runBefore(() => Promise.resolve(hooks.beforeDelete!({ id: msg.id, event: evt })))
355
- if (r instanceof Response) return r
356
- }
357
- await source.deleteRow(msg.id)
358
- if (hooks?.afterDelete) await hooks.afterDelete({ id: msg.id, event: evt })
359
- await fireAudit({ action: 'delete', id: msg.id, event: evt })
360
- return jsonResponse({ ok: true })
361
- }
362
- }
363
- return jsonResponse({ error: 'unknown message kind' }, 400)
364
- } catch (err) {
365
- return jsonResponse({ error: err instanceof Error ? err.message : String(err) }, 500)
366
- }
367
- }
368
-
369
- return {
370
- handle,
371
- POST: (event) => handle(event.request, event),
372
- }
373
- }
@@ -1,71 +0,0 @@
1
- /**
2
- * Tests for the moment-of-intent PLG upgrade prompt. Unlike the passive
3
- * watermark, this card is triggered when a Pro feature is actually invoked
4
- * unlicensed, names that feature, links to a free trial, and shows at most
5
- * once per session.
6
- */
7
-
8
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
9
- import { showUpgradePrompt, dismissUpgradePrompt } from './upgrade-prompt'
10
-
11
- const CARD_ATTR = 'data-svgrid-enterprise-upgrade'
12
-
13
- function card(): HTMLElement | null {
14
- return document.querySelector(`[${CARD_ATTR}]`)
15
- }
16
-
17
- describe('upgrade prompt (moment-of-intent PLG nudge)', () => {
18
- beforeEach(() => {
19
- dismissUpgradePrompt()
20
- document.body.innerHTML = ''
21
- })
22
-
23
- afterEach(() => {
24
- dismissUpgradePrompt()
25
- })
26
-
27
- it('renders a card naming the feature, with a trial CTA', () => {
28
- showUpgradePrompt('Export')
29
- const el = card()
30
- expect(el).not.toBeNull()
31
- expect(el!.textContent).toContain('Export')
32
- expect(el!.textContent).toContain('Unlock SvGrid Pro')
33
-
34
- const trial = el!.querySelector('a[data-act="trial"]') as HTMLAnchorElement
35
- expect(trial).not.toBeNull()
36
- expect(trial.href).toContain('svgrid.com/pricing')
37
- expect(trial.href).toContain('ref=in-app')
38
- expect(trial.target).toBe('_blank')
39
- })
40
-
41
- it('shows at most once per session', () => {
42
- showUpgradePrompt('Export')
43
- expect(card()).not.toBeNull()
44
- // A second feature call must not stack a second card.
45
- showUpgradePrompt('Import')
46
- expect(document.querySelectorAll(`[${CARD_ATTR}]`).length).toBe(1)
47
- })
48
-
49
- it('removes the card on close and does not re-show for the session', () => {
50
- vi.useFakeTimers()
51
- try {
52
- showUpgradePrompt('Print')
53
- const closeBtn = card()!.querySelector('[data-act="x"]') as HTMLButtonElement
54
- closeBtn.click()
55
- // close animates out, then removes the node after the fade.
56
- vi.advanceTimersByTime(300)
57
- expect(card()).toBeNull()
58
- // A later feature call must not bring it back this session (the flag
59
- // stays set; only dismissUpgradePrompt() re-arms it).
60
- showUpgradePrompt('AI assistant')
61
- expect(card()).toBeNull()
62
- } finally {
63
- vi.useRealTimers()
64
- }
65
- })
66
-
67
- it('falls back to a generic message when no feature is named', () => {
68
- showUpgradePrompt()
69
- expect(card()!.textContent).toContain('Pro')
70
- })
71
- })
@@ -1,162 +0,0 @@
1
- // Product-led-growth (PLG) upgrade nudge, shown at the *moment of intent*: the
2
- // instant a developer actually calls a Pro feature (export / import / print /
3
- // AI) without a license key set. Unlike the passive corner watermark
4
- // (watermark.ts), this is a one-click contextual card that names the feature
5
- // they just used and links straight to a free trial.
6
- //
7
- // Rules of the road:
8
- // - Soft, never blocking. The feature already ran; this only nudges.
9
- // - Shows once per session (SPA lifetime). Once shown - whether the user
10
- // acts on it or closes it - it stays quiet for the rest of the session.
11
- // Calling setLicenseKey() silences it before it ever appears.
12
- // - Storage-free: no cookies, no localStorage, no sessionStorage. State is
13
- // a single in-memory flag, so the library keeps its "zero web storage"
14
- // promise (see docs/help/security.md). A hard reload may show it once
15
- // more - by design; that's still a moment-of-intent nudge.
16
- // - SSR-safe: every DOM access is guarded. On the server it's a no-op.
17
- // - Zero dependencies, inline styles - no CSS file to import, nothing to
18
- // bundle, works in any host app regardless of its styling.
19
-
20
- const CARD_ATTR = 'data-svgrid-enterprise-upgrade'
21
- const PRICING_URL = 'https://svgrid.com/pricing'
22
- // ?ref=in-app lets us measure how many trials start from this exact prompt
23
- // vs. the pricing page itself - the whole point of a moment-of-intent CTA.
24
- const TRIAL_URL = 'https://svgrid.com/pricing?ref=in-app&utm_source=svgrid-enterprise&utm_medium=upgrade-prompt'
25
-
26
- let shownThisSession = false
27
-
28
- /** Human-readable labels for the Pro surfaces that gate behind a license. */
29
- export type EnterpriseFeatureLabel =
30
- | 'Export'
31
- | 'Import'
32
- | 'Print'
33
- | 'AI assistant'
34
- | 'Pivot'
35
- | 'Studio'
36
-
37
- /**
38
- * Show the contextual upgrade prompt for `feature`. No-ops if one has already
39
- * been shown this session, a card is already up, or we're on the server. Safe
40
- * to call on every Pro feature invocation - it self-throttles.
41
- */
42
- export function showUpgradePrompt(
43
- feature?: EnterpriseFeatureLabel | string,
44
- opts?: { expired?: boolean },
45
- ): void {
46
- if (shownThisSession) return
47
- if (typeof document === 'undefined' || typeof window === 'undefined') return
48
- if (document.querySelector(`[${CARD_ATTR}]`)) return
49
- shownThisSession = true
50
-
51
- const card = buildCard(feature, opts?.expired === true)
52
- document.body.appendChild(card)
53
- // Animate in on the next frame so the transition actually runs.
54
- requestAnimationFrame(() => {
55
- card.style.opacity = '1'
56
- card.style.transform = 'translateY(0)'
57
- })
58
- }
59
-
60
- /**
61
- * Remove the card if present and re-arm the once-per-session flag so a later
62
- * `showUpgradePrompt()` can show again. Mainly for hosts that want to control
63
- * the nudge themselves (and for tests).
64
- */
65
- export function dismissUpgradePrompt(): void {
66
- shownThisSession = false
67
- if (typeof document === 'undefined') return
68
- document.querySelectorAll(`[${CARD_ATTR}]`).forEach((el) => el.remove())
69
- }
70
-
71
- // User closed or clicked through the card. Remove it, but leave
72
- // `shownThisSession` set so it does not reappear for the rest of the session.
73
- function close(card: HTMLElement): void {
74
- card.style.opacity = '0'
75
- card.style.transform = 'translateY(8px)'
76
- window.setTimeout(() => card.remove(), 220)
77
- }
78
-
79
- function buildCard(feature?: EnterpriseFeatureLabel | string, expired = false): HTMLElement {
80
- const card = document.createElement('div')
81
- card.setAttribute(CARD_ATTR, '1')
82
- card.setAttribute('role', 'dialog')
83
- card.setAttribute('aria-label', expired ? 'Your trial has ended' : 'Unlock SvGrid Pro')
84
- Object.assign(card.style, {
85
- position: 'fixed',
86
- bottom: '16px',
87
- right: '16px',
88
- zIndex: '2147483646', // one below the watermark so they never collide
89
- width: '320px',
90
- maxWidth: 'calc(100vw - 32px)',
91
- boxSizing: 'border-box',
92
- padding: '16px 16px 14px',
93
- background: '#0f172a',
94
- color: '#e2e8f0',
95
- borderRadius: '12px',
96
- border: '1px solid rgba(99,102,241,0.4)',
97
- boxShadow: '0 12px 40px rgba(0,0,0,0.45)',
98
- fontFamily: '-apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
99
- fontSize: '13px',
100
- lineHeight: '1.45',
101
- opacity: '0',
102
- transform: 'translateY(8px)',
103
- transition: 'opacity 220ms ease, transform 220ms ease',
104
- } as Partial<CSSStyleDeclaration> as CSSStyleDeclaration)
105
-
106
- const featureName = feature ? String(feature) : 'This'
107
- const featurePhrase = feature
108
- ? `<strong style="color:#fff">${escapeHtml(featureName)}</strong> is a Pro feature.`
109
- : `You just used a <strong style="color:#fff">Pro</strong> feature.`
110
-
111
- // An expired trial is a different message from "you never had a licence":
112
- // they already evaluated, so the ask is to convert, not to start over.
113
- const badge = expired ? 'TRIAL ENDED' : 'PRO'
114
- const heading = expired ? 'Your trial has ended' : 'Unlock SvGrid Pro'
115
- const body = expired
116
- ? `${featurePhrase} Your evaluation period is over - everything still works,
117
- but this notice stays until a licence key is set.`
118
- : `${featurePhrase} It runs in evaluation with a watermark - start a free trial
119
- to remove it and ship to production.`
120
- const cta = expired ? 'Buy a licence' : 'Start free trial'
121
-
122
- card.innerHTML = `
123
- <button type="button" data-act="x" aria-label="Dismiss"
124
- style="position:absolute;top:8px;right:8px;width:24px;height:24px;display:flex;
125
- align-items:center;justify-content:center;background:transparent;border:0;
126
- color:#94a3b8;font-size:18px;line-height:1;cursor:pointer;border-radius:6px;">&times;</button>
127
- <div style="display:flex;align-items:center;gap:8px;margin-bottom:8px;">
128
- <span style="display:inline-block;background:${expired ? '#b45309' : '#4f46e5'};color:#fff;font-size:10px;
129
- font-weight:700;letter-spacing:0.06em;padding:2px 7px;border-radius:999px;">${badge}</span>
130
- <span style="font-weight:700;color:#fff;">${heading}</span>
131
- </div>
132
- <p style="margin:0 0 12px;color:#cbd5e1;">
133
- ${body}
134
- </p>
135
- <div style="display:flex;gap:8px;align-items:center;">
136
- <a data-act="trial" href="${TRIAL_URL}" target="_blank" rel="noopener noreferrer"
137
- style="flex:1;text-align:center;background:#6366f1;color:#fff;font-weight:600;
138
- text-decoration:none;padding:8px 12px;border-radius:8px;">${cta}</a>
139
- <a data-act="pricing" href="${PRICING_URL}" target="_blank" rel="noopener noreferrer"
140
- style="color:#a5b4fc;text-decoration:none;padding:8px 6px;font-weight:600;">Pricing</a>
141
- </div>
142
- <p style="margin:10px 0 0;font-size:11px;color:#64748b;">
143
- Already licensed? Call <code style="color:#94a3b8;">setLicenseKey()</code> at startup to hide this.
144
- </p>
145
- `
146
-
147
- card.querySelector('[data-act="x"]')?.addEventListener('click', () => close(card))
148
- // Clicking through to a trial / pricing also counts as "handled" - close the
149
- // card, but let the link open in its new tab first.
150
- card.querySelector('[data-act="trial"]')?.addEventListener('click', () => close(card))
151
- card.querySelector('[data-act="pricing"]')?.addEventListener('click', () => close(card))
152
-
153
- return card
154
- }
155
-
156
- function escapeHtml(s: string): string {
157
- return s
158
- .replace(/&/g, '&amp;')
159
- .replace(/</g, '&lt;')
160
- .replace(/>/g, '&gt;')
161
- .replace(/"/g, '&quot;')
162
- }
@@ -1,17 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { readFileSync } from 'node:fs'
3
- import { resolve } from 'node:path'
4
- import { SVGRID_VERSION } from './version'
5
-
6
- describe('SVGRID_VERSION', () => {
7
- it('matches package.json, so generated apps pin a version that exists', () => {
8
- // Generated apps depend on `^SVGRID_VERSION`. If this drifts below the real
9
- // version, every scaffolded app asks for a runtime older than the generator
10
- // and can miss features the emitted code uses.
11
- const pkg = JSON.parse(readFileSync(resolve(process.cwd(), 'package.json'), 'utf8')) as { name: string; version: string }
12
- // Guard the guard: if the runner's cwd ever moves, fail loudly here rather
13
- // than quietly comparing against some other package's version.
14
- expect(pkg.name).toBe('@svgrid/enterprise')
15
- expect(SVGRID_VERSION).toBe(pkg.version)
16
- })
17
- })