@svgrid/enterprise 2.5.2 → 2.6.0

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