@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,320 +0,0 @@
1
- /**
2
- * The repo's first runtime (DOM) test: mount SvGridEditPanel in jsdom and assert
3
- * it renders the *rich* editor suite (not bare native inputs) and round-trips a
4
- * row's values - the path that was previously only compile-checked. Enabled by
5
- * the svelte plugin in vite.config.ts.
6
- */
7
- import { describe, it, expect, afterEach, vi } from 'vitest'
8
- import { mount, unmount, flushSync } from 'svelte'
9
- import SvGridEditPanel from './SvGridEditPanel.svelte'
10
- import type { EntitySchema } from './schema'
11
- import { getSampleApp } from './studio/samples/index'
12
-
13
- type Customer = { id: string; name: string; mrr: number; active: boolean; tier: string }
14
-
15
- const schema: EntitySchema<Customer> = {
16
- name: 'customers',
17
- idField: 'id',
18
- fields: [
19
- { field: 'id', type: 'text', primaryKey: true, readonly: true },
20
- { field: 'name', type: 'text', required: true },
21
- { field: 'mrr', type: 'number' },
22
- { field: 'active', type: 'boolean' },
23
- { field: 'tier', type: 'enum', options: [{ value: 'free', label: 'Free' }, { value: 'pro', label: 'Pro' }] },
24
- ],
25
- }
26
-
27
- let host: HTMLElement | null = null
28
- let comp: ReturnType<typeof mount> | null = null
29
-
30
- afterEach(() => {
31
- if (comp) { unmount(comp); comp = null }
32
- if (host) { host.remove(); host = null }
33
- })
34
-
35
- function render(props: Record<string, unknown>): HTMLElement {
36
- // Tear down a previous mount first: a test that renders more than once used to
37
- // leak every panel but the last, leaving live components (and duplicate field
38
- // ids) in the document for whatever ran next.
39
- if (comp) { unmount(comp); comp = null }
40
- if (host) { host.remove(); host = null }
41
- host = document.createElement('div')
42
- document.body.appendChild(host)
43
- comp = mount(SvGridEditPanel, { target: host, props })
44
- flushSync()
45
- return host
46
- }
47
-
48
- describe('SvGridEditPanel (DOM)', () => {
49
- it('mounts and renders each field with its rich editor, seeded from the row', () => {
50
- const el = render({
51
- schema,
52
- row: { id: '1', name: 'Ada', mrr: 1200, active: true, tier: 'pro' },
53
- presentation: 'inline',
54
- onSubmit: vi.fn(),
55
- onCancel: vi.fn(),
56
- })
57
-
58
- // Field labels are present.
59
- expect(el.textContent).toContain('Name')
60
- expect(el.textContent).toContain('Mrr')
61
-
62
- // number -> SvNumberInput (its .sv-num__input), not a bare <input type="number">.
63
- const numInput = el.querySelector<HTMLInputElement>('.sv-num__input')
64
- expect(numInput).toBeTruthy()
65
- expect(numInput!.value).toBe('1200') // seeded from the row
66
-
67
- // boolean -> SvSwitchButton, on because active === true.
68
- const sw = el.querySelector('.sv-switch')
69
- expect(sw).toBeTruthy()
70
- expect(sw!.classList.contains('is-on')).toBe(true)
71
-
72
- // The primary action reads "Save" in edit mode.
73
- const submit = el.querySelector<HTMLButtonElement>('button[type="submit"]')
74
- expect(submit?.textContent?.trim()).toBe('Save')
75
- })
76
-
77
- it('is in create mode with no row (empty number, switch off, "Create" button)', () => {
78
- const el = render({ schema, presentation: 'inline', onSubmit: vi.fn(), onCancel: vi.fn() })
79
- expect(el.querySelector<HTMLInputElement>('.sv-num__input')!.value).toBe('') // empty, not "0"
80
- expect(el.querySelector('.sv-switch')!.classList.contains('is-on')).toBe(false)
81
- expect(el.querySelector('button[type="submit"]')?.textContent?.trim()).toBe('Create')
82
- })
83
-
84
- it('routes each editorType to its rich editor from the suite', () => {
85
- const rich: EntitySchema = {
86
- name: 'assets',
87
- idField: 'id',
88
- fields: [
89
- { field: 'id', type: 'text', primaryKey: true, readonly: true },
90
- { field: 'brand', type: 'text', input: { editorType: 'color' } },
91
- { field: 'secret', type: 'text', input: { editorType: 'password' } },
92
- { field: 'labels', type: 'text', input: { editorType: 'chips' } },
93
- { field: 'due', type: 'date' },
94
- { field: 'phone', type: 'text', input: { editorType: 'phone' } },
95
- { field: 'score', type: 'number', input: { editorType: 'slider' }, min: 0, max: 10 },
96
- ],
97
- }
98
- const el = render({
99
- schema: rich,
100
- row: { id: '1', brand: '#ff0000', secret: 'pw', labels: 'a,b', due: '2024-01-02', phone: '+14155550100', score: 7 },
101
- presentation: 'inline',
102
- onSubmit: vi.fn(),
103
- onCancel: vi.fn(),
104
- })
105
- expect(el.querySelector('.sv-color')).toBeTruthy() // color -> SvColorInput
106
- expect(el.querySelector('.sv-pw')).toBeTruthy() // password -> SvPasswordInput
107
- expect(el.querySelector('.sv-tags')).toBeTruthy() // chips -> SvTagsInput
108
- expect(el.querySelector('.sv-dtp')).toBeTruthy() // date -> SvDateTimePicker
109
- expect(el.querySelector('.sv-phone')).toBeTruthy() // phone -> SvPhoneInput
110
- expect(el.querySelector('.sv-slider')).toBeTruthy() // slider -> SvSlider
111
- })
112
-
113
- it('renders the enriched CRM sample forms with real editors (samples <-> edit panel)', () => {
114
- const proj = getSampleApp('crm')!.build()
115
- const entity = (name: string) => proj.entities.find((e) => e.name === name)!
116
- const firstRow = (name: string) => (proj.dataSources?.[name] as { seed?: Record<string, unknown>[] }).seed![0]!
117
-
118
- // Contacts: phone -> SvPhoneInput, segments (chips) -> SvTagsInput.
119
- const contacts = render({ schema: entity('contacts'), row: firstRow('contacts'), presentation: 'inline', onSubmit: vi.fn(), onCancel: vi.fn() })
120
- expect(contacts.querySelector('.sv-phone')).toBeTruthy()
121
- expect(contacts.querySelector('.sv-tags')).toBeTruthy()
122
-
123
- // Deals: probability -> SvSlider (rendered for slider editorType).
124
- const deals = render({ schema: entity('deals'), row: firstRow('deals'), presentation: 'inline', onSubmit: vi.fn(), onCancel: vi.fn() })
125
- expect(deals.querySelector('.sv-slider')).toBeTruthy()
126
-
127
- // Companies: country -> SvCountryInput, health (rating) -> SvSlider.
128
- const companies = render({ schema: entity('companies'), row: firstRow('companies'), presentation: 'inline', onSubmit: vi.fn(), onCancel: vi.fn() })
129
- expect(companies.querySelector('.sv-country')).toBeTruthy()
130
- expect(companies.querySelector('.sv-slider')).toBeTruthy()
131
- })
132
-
133
- it('submits the row values (edit mode, readonly id omitted)', async () => {
134
- const onSubmit = vi.fn()
135
- const el = render({
136
- schema,
137
- row: { id: '1', name: 'Ada', mrr: 1200, active: true, tier: 'pro' },
138
- presentation: 'inline',
139
- onSubmit,
140
- onCancel: vi.fn(),
141
- })
142
- el.querySelector<HTMLButtonElement>('button[type="submit"]')!.click()
143
- // Submit validates asynchronously before calling onSubmit.
144
- await vi.waitFor(() => expect(onSubmit).toHaveBeenCalledTimes(1))
145
- const payload = onSubmit.mock.calls[0]![0] as { mode: string; id: string | null; values: Record<string, unknown> }
146
- expect(payload.mode).toBe('edit')
147
- expect(payload.id).toBe('1')
148
- expect(payload.values).toMatchObject({ name: 'Ada', mrr: 1200, active: true, tier: 'pro' })
149
- expect(payload.values).not.toHaveProperty('id') // readonly PK is never submitted
150
- })
151
-
152
- it('lays the form out from the schema, so a built form travels with the entity', () => {
153
- const laidOut: EntitySchema = {
154
- name: 'people',
155
- idField: 'id',
156
- fields: [
157
- { field: 'id', type: 'text', primaryKey: true, readonly: true },
158
- { field: 'name', type: 'text' },
159
- { field: 'email', type: 'text' },
160
- { field: 'street', type: 'text' },
161
- { field: 'city', type: 'text' },
162
- ],
163
- form: {
164
- columns: 2,
165
- sections: [
166
- { title: 'Who', description: 'How we reach them.', fields: ['name', 'email'] },
167
- { title: 'Where', columns: 1, fields: ['street', 'city'] },
168
- ],
169
- },
170
- }
171
- const el = render({ schema: laidOut, presentation: 'inline', onSubmit: vi.fn() })
172
-
173
- const titles = [...el.querySelectorAll('.sv-ep__section-title')].map((n) => n.textContent)
174
- expect(titles).toEqual(['Who', 'Where'])
175
- expect(el.querySelector('.sv-ep__section-desc')?.textContent).toBe('How we reach them.')
176
-
177
- // Per-section column count wins over the form's.
178
- const bodies = [...el.querySelectorAll<HTMLElement>('.sv-ep__body')]
179
- expect(bodies[0]!.style.getPropertyValue('--sv-ep-cols')).toBe('2')
180
- expect(bodies[1]!.style.getPropertyValue('--sv-ep-cols')).toBe('1')
181
-
182
- // The unassigned id field is not dropped - it lands in a trailing group.
183
- expect(el.querySelector('#sv-ef-id')).toBeTruthy()
184
- })
185
-
186
- it('waits until you leave a field before complaining, then clears as you fix it', async () => {
187
- const required: EntitySchema = {
188
- name: 'people',
189
- idField: 'id',
190
- fields: [
191
- { field: 'id', type: 'text', primaryKey: true, readonly: true },
192
- { field: 'email', type: 'text', required: true, format: 'email' },
193
- ],
194
- }
195
- const el = render({ schema: required, presentation: 'inline', onSubmit: vi.fn() })
196
- const input = el.querySelector<HTMLInputElement>('#sv-ef-email')!
197
-
198
- // Typing something invalid says nothing yet - the user is mid-thought.
199
- input.value = 'nope'
200
- input.dispatchEvent(new Event('input', { bubbles: true }))
201
- flushSync()
202
- expect(el.querySelector('.sv-ep-field__err')).toBeNull()
203
- expect(input.getAttribute('aria-invalid')).toBe('false')
204
-
205
- // Leaving it is the moment to speak up.
206
- input.dispatchEvent(new FocusEvent('focusout', { bubbles: true }))
207
- await vi.waitFor(() => expect(el.querySelector('.sv-ep-field__err')?.textContent).toMatch(/valid email/))
208
- expect(input.getAttribute('aria-invalid')).toBe('true')
209
- // The message is wired to the input for screen readers.
210
- expect(input.getAttribute('aria-describedby')).toBe('sv-ee-email')
211
- expect(el.querySelector('#sv-ee-email')).toBeTruthy()
212
-
213
- // Correcting it clears the message without another submit.
214
- input.value = 'ada@example.com'
215
- input.dispatchEvent(new Event('input', { bubbles: true }))
216
- await vi.waitFor(() => expect(el.querySelector('.sv-ep-field__err')).toBeNull())
217
- expect(input.getAttribute('aria-invalid')).toBe('false')
218
- })
219
-
220
- it('summarises a failed submit and focuses the first field that needs fixing', async () => {
221
- const required: EntitySchema = {
222
- name: 'people',
223
- idField: 'id',
224
- fields: [
225
- { field: 'id', type: 'text', primaryKey: true, readonly: true },
226
- { field: 'name', type: 'text', required: true },
227
- { field: 'email', type: 'text', required: true },
228
- ],
229
- }
230
- const onSubmit = vi.fn()
231
- const el = render({ schema: required, presentation: 'inline', onSubmit })
232
-
233
- el.querySelector<HTMLButtonElement>('button[type="submit"]')!.click()
234
-
235
- await vi.waitFor(() => expect(el.querySelector('.sv-ep__summary')).toBeTruthy())
236
- expect(onSubmit).not.toHaveBeenCalled()
237
- const summary = el.querySelector('.sv-ep__summary')!
238
- expect(summary.getAttribute('role')).toBe('alert')
239
- expect(summary.textContent).toContain('Name')
240
- expect(summary.textContent).toContain('Email')
241
- // Focus lands on the first problem, so fixing can start immediately.
242
- expect(document.activeElement?.id).toBe('sv-ef-name')
243
- })
244
-
245
- it('asks before throwing away edits, and closes straight away when there are none', () => {
246
- const onCancel = vi.fn()
247
- const el = render({
248
- schema,
249
- row: { id: '1', name: 'Ada', mrr: 1200, active: true, tier: 'pro' },
250
- presentation: 'inline',
251
- onSubmit: vi.fn(),
252
- onCancel,
253
- })
254
- const cancel = () => [...el.querySelectorAll<HTMLButtonElement>('button')].find((b) => b.textContent?.trim() === 'Cancel')!
255
-
256
- // Untouched: cancelling just closes.
257
- cancel().click()
258
- flushSync()
259
- expect(onCancel).toHaveBeenCalledTimes(1)
260
-
261
- // Now dirty the form; cancelling asks instead of discarding.
262
- const name = el.querySelector<HTMLInputElement>('#sv-ef-name')!
263
- name.value = 'Grace'
264
- name.dispatchEvent(new Event('input', { bubbles: true }))
265
- flushSync()
266
- cancel().click()
267
- flushSync()
268
- expect(onCancel).toHaveBeenCalledTimes(1) // still not closed
269
- expect(el.textContent).toContain('Discard your changes?')
270
-
271
- // "Keep editing" puts you back in the form with the edit intact.
272
- ;[...el.querySelectorAll<HTMLButtonElement>('button')].find((b) => b.textContent?.trim() === 'Keep editing')!.click()
273
- flushSync()
274
- expect(el.textContent).not.toContain('Discard your changes?')
275
- expect(el.querySelector<HTMLInputElement>('#sv-ef-name')!.value).toBe('Grace')
276
-
277
- // Confirming discards.
278
- cancel().click()
279
- flushSync()
280
- ;[...el.querySelectorAll<HTMLButtonElement>('button')].find((b) => b.textContent?.trim() === 'Discard')!.click()
281
- flushSync()
282
- expect(onCancel).toHaveBeenCalledTimes(2)
283
- })
284
-
285
- it('reveals and locks fields live as the answers change', async () => {
286
- // One answer drives two others: choosing "refund" asks for a justification
287
- // and unlocks the approver, both without a remount.
288
- const cmp = (column: string, op: string, value: unknown) => ({ kind: 'cmp', column, op, value })
289
- const returns = {
290
- name: 'returns',
291
- idField: 'id',
292
- fields: [
293
- { field: 'id', type: 'text', primaryKey: true, readonly: true },
294
- { field: 'mode', type: 'text' },
295
- { field: 'justification', type: 'text', label: 'Justification', when: { visible: cmp('mode', 'equals', 'refund') } },
296
- { field: 'approver', type: 'text', when: { disabled: cmp('mode', 'notEquals', 'refund') } },
297
- ],
298
- } as unknown as EntitySchema<Record<string, unknown>>
299
-
300
- const el = render({
301
- schema: returns,
302
- row: { id: '1', mode: 'exchange', justification: '', approver: '' },
303
- presentation: 'inline',
304
- onSubmit: vi.fn(),
305
- })
306
-
307
- // An exchange: no justification asked for, and the approver is locked.
308
- expect(el.textContent).not.toContain('Justification')
309
- expect(el.querySelector('#sv-ef-approver')!.hasAttribute('disabled')).toBe(true)
310
-
311
- // Switch to a refund; both fields react to the new value.
312
- const mode = el.querySelector<HTMLInputElement>('#sv-ef-mode')!
313
- mode.value = 'refund'
314
- mode.dispatchEvent(new Event('input', { bubbles: true }))
315
- flushSync()
316
-
317
- expect(el.textContent).toContain('Justification')
318
- expect(el.querySelector('#sv-ef-approver')!.hasAttribute('disabled')).toBe(false)
319
- })
320
- })
@@ -1,137 +0,0 @@
1
- /**
2
- * DOM test: SvRecordDetail renders a record header (title + status pill + metric
3
- * tiles), a tabbed Overview of field groups, and a related-collection timeline
4
- * filtered by the foreign key. Also mounts against the real CRM deals + activities
5
- * sample so the detail <-> sample path is covered.
6
- */
7
- import { describe, it, expect, afterEach } from 'vitest'
8
- import { mount, unmount, flushSync } from 'svelte'
9
- import SvRecordDetail from './SvRecordDetail.svelte'
10
- import { getSampleApp } from './studio/samples/index'
11
- import type { EntitySchema } from './schema'
12
-
13
- const dealsSchema: EntitySchema = {
14
- name: 'deals',
15
- idField: 'id',
16
- fields: [
17
- { field: 'id', type: 'text', primaryKey: true, readonly: true },
18
- { field: 'title', type: 'text' },
19
- { field: 'owner', type: 'text', label: 'Owner' },
20
- { field: 'value', type: 'number', label: 'Value ($)' },
21
- { field: 'probability', type: 'number', label: 'Probability (%)' },
22
- { field: 'stage', type: 'enum', options: [
23
- { value: 'lead', label: 'Lead', color: '#94a3b8' },
24
- { value: 'won', label: 'Won', color: '#10b981' },
25
- ] },
26
- ],
27
- }
28
- const actsSchema: EntitySchema = {
29
- name: 'activities',
30
- idField: 'id',
31
- fields: [
32
- { field: 'id', type: 'text', primaryKey: true },
33
- { field: 'subject', type: 'text' },
34
- { field: 'dealId', type: 'relation', relation: { entity: 'deals', foreignKey: 'dealId', labelField: 'title' } },
35
- { field: 'dueDate', type: 'date' },
36
- ],
37
- }
38
-
39
- let host: HTMLElement | null = null
40
- let comp: ReturnType<typeof mount> | null = null
41
- afterEach(() => { if (comp) { unmount(comp); comp = null } if (host) { host.remove(); host = null } })
42
-
43
- function render(props: Record<string, unknown>): HTMLElement {
44
- host = document.createElement('div')
45
- document.body.appendChild(host)
46
- comp = mount(SvRecordDetail, { target: host, props })
47
- flushSync()
48
- return host
49
- }
50
-
51
- describe('SvRecordDetail (DOM)', () => {
52
- it('renders header title, status pill, and metric tiles', () => {
53
- const rows = [{ id: 'd1', title: 'Alpha deal', owner: 'Sam', value: 1000, probability: 60, stage: 'won' }]
54
- const el = render({ schema: dealsSchema, rows, titleField: 'title', subtitleField: 'owner', statusField: 'stage', metricFields: ['value', 'probability'] })
55
- expect(el.querySelector('.sv-detail__title')?.textContent).toBe('Alpha deal')
56
- expect(el.querySelector('.sv-detail__status')?.textContent).toBe('Won')
57
- const metrics = [...el.querySelectorAll('.sv-detail__metric-value')].map((n) => n.textContent)
58
- expect(metrics).toContain('$1,000') // money-formatted from the "Value ($)" label
59
- expect(metrics).toContain('60')
60
- })
61
-
62
- it('auto-builds an Overview of the remaining fields when no sections given', () => {
63
- const rows = [{ id: 'd1', title: 'Alpha', owner: 'Sam', value: 1000, probability: 60, stage: 'won' }]
64
- const el = render({ schema: dealsSchema, rows, titleField: 'title', statusField: 'stage', metricFields: ['value'] })
65
- const labels = [...el.querySelectorAll('.sv-detail__field dt')].map((n) => n.textContent)
66
- // title/stage/value are surfaced in the header, so the auto group shows the rest.
67
- expect(labels).toContain('Owner')
68
- expect(labels).toContain('Probability (%)')
69
- expect(labels).not.toContain('Value ($)') // in the header metrics, not the Overview
70
- })
71
-
72
- it('shows a related timeline filtered by the foreign key', () => {
73
- const rows = [{ id: 'd1', title: 'Alpha', stage: 'won' }, { id: 'd2', title: 'Beta', stage: 'lead' }]
74
- const acts = [
75
- { id: 'a1', subject: 'Call', dealId: 'd1', dueDate: '2026-03-01' },
76
- { id: 'a2', subject: 'Email', dealId: 'd1', dueDate: '2026-03-05' },
77
- { id: 'a3', subject: 'Other', dealId: 'd2', dueDate: '2026-03-02' },
78
- ]
79
- const el = render({
80
- schema: dealsSchema, rows, titleField: 'title', statusField: 'stage',
81
- related: [{ label: 'Activities', schema: actsSchema, rows: acts, foreignKey: 'dealId', titleField: 'subject', dateField: 'dueDate' }],
82
- })
83
- // Two tabs: Overview + Activities.
84
- const tabs = [...el.querySelectorAll('.sv-detail__tab')].map((n) => n.textContent)
85
- expect(tabs).toEqual(['Overview', 'Activities'])
86
- // Switch to the Activities tab.
87
- const actTab = [...el.querySelectorAll<HTMLButtonElement>('.sv-detail__tab')].find((b) => b.textContent === 'Activities')!
88
- actTab.click()
89
- flushSync()
90
- const events = [...el.querySelectorAll('.sv-detail__event-title')].map((n) => n.textContent)
91
- expect(events).toEqual(['Email', 'Call']) // only d1's activities, newest date first
92
- })
93
-
94
- it('mounts against the real CRM deals + activities sample', () => {
95
- const proj = getSampleApp('crm')!.build()
96
- const deals = proj.entities.find((e) => e.name === 'deals')
97
- const activities = proj.entities.find((e) => e.name === 'activities')
98
- const dealRows = (proj.dataSources!.deals as { seed?: Record<string, unknown>[] }).seed!
99
- const actRows = (proj.dataSources!.activities as { seed?: Record<string, unknown>[] }).seed!
100
- const el = render({
101
- schema: deals, rows: dealRows, titleField: 'title', subtitleField: 'companyId', statusField: 'stage', metricFields: ['value', 'probability'],
102
- related: [{ label: 'Activities', schema: activities, rows: actRows, foreignKey: 'dealId', titleField: 'subject', dateField: 'dueDate', statusField: 'priority' }],
103
- })
104
- expect(el.querySelector('.sv-detail__title')?.textContent).toBeTruthy()
105
- expect(el.querySelectorAll('.sv-detail__metric').length).toBe(2)
106
- expect([...el.querySelectorAll('.sv-detail__tab')].map((n) => n.textContent)).toEqual(['Overview', 'Activities'])
107
- })
108
-
109
- it('matches a related timeline by parentField when the child has no FK id (denormalized view)', () => {
110
- const productsSchema: EntitySchema = {
111
- name: 'products', idField: 'id',
112
- fields: [{ field: 'id', type: 'number', primaryKey: true }, { field: 'name', type: 'text' }],
113
- }
114
- const linesSchema: EntitySchema = {
115
- name: 'order_lines', idField: 'id',
116
- fields: [{ field: 'id', type: 'number', primaryKey: true }, { field: 'product', type: 'text' }, { field: 'customer', type: 'text' }, { field: 'line_total', type: 'number', label: 'Total ($)' }],
117
- }
118
- const rows = [{ id: 1, name: 'Chai' }, { id: 2, name: 'Chang' }]
119
- // The view carries the product NAME (not its id), so the timeline matches name.
120
- const lines = [
121
- { id: 10, product: 'Chai', customer: 'Alfreds', line_total: 90 },
122
- { id: 11, product: 'Chang', customer: 'Berglunds', line_total: 40 },
123
- { id: 12, product: 'Chai', customer: "B's", line_total: 54 },
124
- ]
125
- const el = render({
126
- schema: productsSchema, rows, titleField: 'name',
127
- related: [{ label: 'Orders', schema: linesSchema, rows: lines, foreignKey: 'product', parentField: 'name', titleField: 'customer', subtitleField: 'line_total' }],
128
- })
129
- const ordersTab = [...el.querySelectorAll<HTMLButtonElement>('.sv-detail__tab')].find((b) => b.textContent === 'Orders')!
130
- ordersTab.click()
131
- flushSync()
132
- // Opens on Chai -> its two lines (matched by name, not id), $ money-formatted.
133
- const events = [...el.querySelectorAll('.sv-detail__event-title')].map((n) => n.textContent)
134
- expect(events.sort()).toEqual(['Alfreds', "B's"])
135
- expect(el.textContent).toContain('$90')
136
- })
137
- })
@@ -1,57 +0,0 @@
1
- /**
2
- * DOM test: SvSchedule renders a month grid anchored to the earliest event, places
3
- * each dated row as an event chip on its day, and paginates months.
4
- */
5
- import { describe, it, expect, afterEach } from 'vitest'
6
- import { mount, unmount, flushSync } from 'svelte'
7
- import SvSchedule from './SvSchedule.svelte'
8
- import type { EntitySchema } from './schema'
9
-
10
- const schema: EntitySchema = {
11
- name: 'events',
12
- idField: 'id',
13
- fields: [
14
- { field: 'id', type: 'text', primaryKey: true, readonly: true },
15
- { field: 'name', type: 'text' },
16
- { field: 'startAt', type: 'datetime' },
17
- { field: 'category', type: 'enum', options: [
18
- { value: 'conf', label: 'Conference', color: '#6366f1' },
19
- { value: 'workshop', label: 'Workshop', color: '#10b981' },
20
- ] },
21
- ],
22
- }
23
-
24
- let host: HTMLElement | null = null
25
- let comp: ReturnType<typeof mount> | null = null
26
- afterEach(() => { if (comp) { unmount(comp); comp = null } if (host) { host.remove(); host = null } })
27
- function render(props: Record<string, unknown>): HTMLElement {
28
- host = document.createElement('div')
29
- document.body.appendChild(host)
30
- comp = mount(SvSchedule, { target: host, props })
31
- flushSync()
32
- return host
33
- }
34
-
35
- describe('SvSchedule (DOM)', () => {
36
- const rows = [
37
- { id: 'e1', name: 'Svelte Summit', startAt: '2026-09-12T09:00:00Z', category: 'conf' },
38
- { id: 'e2', name: 'A11y Workshop', startAt: '2026-09-20T10:00:00Z', category: 'workshop' },
39
- ]
40
-
41
- it('anchors to the earliest event month and renders its events', () => {
42
- const el = render({ schema, rows, dateField: 'startAt', titleField: 'name', colorField: 'category' })
43
- expect(el.querySelector('.sv-sched__month')?.textContent).toContain('September 2026')
44
- expect(el.querySelectorAll('.sv-sched__cell').length).toBe(42) // 6 weeks
45
- const evs = [...el.querySelectorAll('.sv-sched__ev')].map((n) => n.textContent?.trim())
46
- expect(evs).toContain('Svelte Summit')
47
- expect(evs).toContain('A11y Workshop')
48
- })
49
-
50
- it('paginates to the next month (events drop off)', () => {
51
- const el = render({ schema, rows, dateField: 'startAt', titleField: 'name' })
52
- el.querySelector<HTMLButtonElement>('[aria-label="Next month"]')!.click()
53
- flushSync()
54
- expect(el.querySelector('.sv-sched__month')?.textContent).toContain('October 2026')
55
- expect(el.querySelectorAll('.sv-sched__ev').length).toBe(0)
56
- })
57
- })
@@ -1,77 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from 'vitest'
2
-
3
- // Capture exactly what exportGrid receives (so we don't need pdfmake / the DOM).
4
- const calls: Array<{ format: string; rows?: unknown[]; groupBy?: string[] }> = []
5
- vi.mock('./export', () => ({
6
- exportGrid: async (_api: unknown, opts: { format: string; rows?: unknown[]; groupBy?: string[] }) => {
7
- calls.push({ format: opts.format, rows: opts.rows as unknown[], groupBy: opts.groupBy })
8
- },
9
- }))
10
-
11
- import { aiExport, setAIProvider, mockAIProvider, registerExportProvider } from '@svgrid/grid'
12
- import { exportGrid } from './export'
13
- import { setLicenseKey } from './license'
14
-
15
- type Order = { country: string; company: string; product: string; quantity: number; price: number }
16
- const rows: Order[] = Array.from({ length: 120 }, (_, i) => ({
17
- country: ['USA', 'UK', 'Germany'][i % 3]!,
18
- company: `Co${i}`,
19
- product: 'Widget',
20
- quantity: 5 + (i % 50),
21
- price: Math.round((10 + ((i * 41) % 480)) * 100) / 100, // spread 10..490
22
- }))
23
-
24
- function makeApi() {
25
- return {
26
- getData: () => rows,
27
- // Simulate the grid returning EVERYTHING (the reactive-filter bug we route around).
28
- getDisplayedRows: () => rows,
29
- getSelectedRows: () => [],
30
- getColumns: () => [
31
- { id: 'country', field: 'country', header: 'Country', visible: true },
32
- { id: 'company', field: 'company', header: 'Company', visible: true },
33
- { id: 'product', field: 'product', header: 'Product', visible: true },
34
- { id: 'quantity', field: 'quantity', header: 'Qty', visible: true },
35
- { id: 'price', field: 'price', header: 'Price', visible: true },
36
- ],
37
- getState: () => ({ grouping: [] }),
38
- clearAllFilters: vi.fn(),
39
- clearSort: vi.fn(),
40
- setFilter: vi.fn(),
41
- setSort: vi.fn(),
42
- setGroupBy: vi.fn(),
43
- } as any
44
- }
45
-
46
- beforeEach(() => {
47
- calls.length = 0
48
- setLicenseKey('SVENTERPRISE-DEV-TEST')
49
- setAIProvider(mockAIProvider)
50
- // aiExport delegates to the registered engine - here the mocked exportGrid.
51
- registerExportProvider(exportGrid as never)
52
- })
53
-
54
- describe('aiExport - the demo 203 "grouped PDF" query', () => {
55
- it('parses the plan and exports non-empty, filtered, grouped rows', async () => {
56
- const plan = await aiExport(makeApi(), 'export orders over $300 as a grouped PDF by country')
57
-
58
- expect(plan.format).toBe('pdf')
59
- expect(plan.groupBy).toEqual(['country'])
60
- expect(plan.filters).toContainEqual({ field: 'price', operator: 'greaterThan', value: '300' })
61
-
62
- // exportGrid was called with real, filtered rows (not the empty grid view).
63
- expect(calls).toHaveLength(1)
64
- expect(calls[0]!.format).toBe('pdf')
65
- expect(calls[0]!.groupBy).toEqual(['country'])
66
- const exported = calls[0]!.rows as Order[]
67
- expect(exported.length).toBeGreaterThan(0)
68
- expect(exported.every((r) => r.price > 300)).toBe(true)
69
- // Rows are contiguous by country (group order preserved).
70
- const countries = exported.map((r) => r.country)
71
- const firstSeen = [...new Set(countries)]
72
- const contiguous = countries.join('|')
73
- for (const c of firstSeen) {
74
- expect(contiguous).toMatch(new RegExp(`(?:^|\\|)${c}(?:\\|${c})*(?:\\||$)`))
75
- }
76
- })
77
- })