@svgrid/enterprise 2.4.0 → 2.5.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 (161) hide show
  1. package/dist/cdn/svgrid-enterprise.svelte-external.js +5917 -5545
  2. package/dist/designer/assets/{index-okIcRP9P.js → index-qL7ir9C7.js} +3 -3
  3. package/dist/designer/assets/{src-CIla2aVG.js → src-96d31O63.js} +259 -228
  4. package/dist/designer/assets/{src-BvsJ00AO.css → src-D-O2F805.css} +1 -1
  5. package/dist/designer/index.html +3 -3
  6. package/dist/node/studio.js +681 -84
  7. package/package.json +3 -3
  8. package/src/SvGridEditPanel.dom.test.ts +174 -0
  9. package/src/SvGridEditPanel.svelte +209 -46
  10. package/src/edit-panel.test.ts +145 -36
  11. package/src/edit-panel.ts +167 -16
  12. package/src/expressions/evaluate.ts +1 -1
  13. package/src/expressions/parse.ts +3 -3
  14. package/src/index.ts +8 -0
  15. package/src/license-core.ts +77 -5
  16. package/src/license-expiry.test.ts +91 -0
  17. package/src/license.ts +31 -2
  18. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +1 -0
  19. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +178 -0
  20. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js +3875 -0
  21. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-ZrPsKxob.js.map +1 -0
  22. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js +21 -0
  23. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-ACqvWGE2.js.map +1 -0
  24. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js +1938 -0
  25. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-D3w5jt92.js.map +1 -0
  26. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js +205 -0
  27. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-CC2V3H0y.js.map +1 -0
  28. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js +18 -0
  29. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-BXP37tAa.js.map +1 -0
  30. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js +264 -0
  31. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-DwubnU5b.js.map +1 -0
  32. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js +697 -0
  33. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-hD7f6PUz.js.map +1 -0
  34. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +3 -0
  35. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +134 -0
  36. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +1 -0
  37. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +55 -0
  38. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +1 -0
  39. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +2 -0
  40. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +46843 -0
  41. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +1 -0
  42. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +237 -0
  43. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +1 -0
  44. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +2 -0
  45. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +4 -0
  46. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +1 -0
  47. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +7 -0
  48. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +4 -0
  49. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +1 -0
  50. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +5 -0
  51. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +1 -0
  52. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +5 -0
  53. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +1 -0
  54. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +5 -0
  55. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +1 -0
  56. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +6 -0
  57. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +83 -0
  58. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +1 -0
  59. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +559 -0
  60. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +1 -0
  61. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +24 -0
  62. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +1 -0
  63. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +122 -0
  64. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +1 -0
  65. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +2 -0
  66. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +89 -0
  67. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +1 -0
  68. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +241 -0
  69. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +1 -0
  70. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js +4938 -0
  71. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DBx1SCN6.js.map +1 -0
  72. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js +495 -0
  73. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-gjfpSTFS.js.map +1 -0
  74. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js +190 -0
  75. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-DKoOKg8S.js.map +1 -0
  76. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js +8 -0
  77. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-C0MiR7eR.js.map +1 -0
  78. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js +138 -0
  79. package/src/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-B6Y7P0Q-.js.map +1 -0
  80. package/src/schema.ts +63 -0
  81. package/src/studio/emit-project.test.ts +191 -0
  82. package/src/studio/emit-project.ts +237 -27
  83. package/src/studio/emit-schema.ts +4 -1
  84. package/src/studio/index.ts +2 -0
  85. package/src/studio/init-flow.test.ts +150 -0
  86. package/src/studio/init-flow.ts +169 -22
  87. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/_svelte_metadata.json +1 -0
  88. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/_metadata.json +178 -0
  89. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js +3875 -0
  90. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/attachments-BOv1rBKp.js.map +1 -0
  91. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js +21 -0
  92. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/constants-B9vgIdCd.js.map +1 -0
  93. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js +1938 -0
  94. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/dev-T1qbW_qD.js.map +1 -0
  95. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js +205 -0
  96. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/events-Bo11SfVK.js.map +1 -0
  97. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js +18 -0
  98. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/flags-X7D4vfrZ.js.map +1 -0
  99. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js +264 -0
  100. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/hydration-oyUje5i1.js.map +1 -0
  101. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js +697 -0
  102. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/legacy-client-DeSQgSFm.js.map +1 -0
  103. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/package.json +3 -0
  104. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js +134 -0
  105. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte.js.map +1 -0
  106. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js +55 -0
  107. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_animate.js.map +1 -0
  108. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_attachments.js +2 -0
  109. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js +46843 -0
  110. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_compiler.js.map +1 -0
  111. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js +237 -0
  112. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_easing.js.map +1 -0
  113. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_events.js +2 -0
  114. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js +4 -0
  115. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal.js.map +1 -0
  116. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_client.js +7 -0
  117. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js +4 -0
  118. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_disclose-version.js.map +1 -0
  119. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js +5 -0
  120. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_async.js.map +1 -0
  121. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js +5 -0
  122. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_legacy.js.map +1 -0
  123. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js +5 -0
  124. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_flags_tracing.js.map +1 -0
  125. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_internal_server.js +6 -0
  126. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js +83 -0
  127. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_legacy.js.map +1 -0
  128. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js +559 -0
  129. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_motion.js.map +1 -0
  130. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js +24 -0
  131. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity.js.map +1 -0
  132. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js +122 -0
  133. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_reactivity_window.js.map +1 -0
  134. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_server.js +2 -0
  135. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js +89 -0
  136. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_store.js.map +1 -0
  137. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js +241 -0
  138. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/svelte_transition.js.map +1 -0
  139. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js +4938 -0
  140. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-BbWyXNk1.js.map +1 -0
  141. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js +495 -0
  142. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/utils-DI_fC7vt.js.map +1 -0
  143. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js +190 -0
  144. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/validate-Dyr3lQv9.js.map +1 -0
  145. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js +8 -0
  146. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/version-_9FHH-LF.js.map +1 -0
  147. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js +138 -0
  148. package/src/studio/node_modules/.vite/vitest/be65d27ae088a0e03fd8e1331d90b01649464cb6/deps___vitest__/warnings-CUbSPnyP.js.map +1 -0
  149. package/src/studio/project.test.ts +30 -0
  150. package/src/studio/project.ts +72 -8
  151. package/src/studio/samples/crm.ts +11 -2
  152. package/src/studio/samples/insurance.ts +10 -4
  153. package/src/studio/samples/samples.test.ts +36 -0
  154. package/src/studio/samples/shared.ts +14 -0
  155. package/src/studio/samples/support.ts +12 -5
  156. package/src/studio/screen-suites.test.ts +43 -0
  157. package/src/studio/screen-suites.ts +5 -2
  158. package/src/studio/user-error.ts +31 -0
  159. package/src/upgrade-prompt.ts +23 -10
  160. package/src/version.test.ts +17 -0
  161. package/src/version.ts +13 -0
@@ -22,6 +22,7 @@ import { buildConnectionString, isFileDialect, type SqlConnectionParts } from '.
22
22
  import { emitStudioAppBundle } from './emit-project.js'
23
23
  import { mergeManaged, skipUserOwned } from './scaffold.js'
24
24
  import { getStudioTheme, studioThemes } from './themes.js'
25
+ import { UserError } from './user-error.js'
25
26
  import { serializeProject, type DataSourceKind, type EntityDataSource, type ProjectTheme, type StudioProject } from './project.js'
26
27
 
27
28
  /** Terminal I/O, injected so the flow can be scripted in tests. */
@@ -62,6 +63,8 @@ export type InitFlags = {
62
63
  title?: string
63
64
  /** Take every default; ask nothing that has one. */
64
65
  yes?: boolean
66
+ /** Write into a folder that already holds another app, without asking. */
67
+ force?: boolean
65
68
  }
66
69
 
67
70
  export type InitResult = {
@@ -83,6 +86,30 @@ type SourceKey = (typeof SOURCES)[number]['key']
83
86
 
84
87
  const DIALECTS: SqlDialectName[] = ['postgres', 'supabase', 'mysql', 'mssql', 'sqlite']
85
88
 
89
+ /** Shown above the connection prompt so the expected shape is never a guess. */
90
+ const CONNECTION_EXAMPLES: Record<string, string> = {
91
+ postgres: 'postgres://user:password@localhost:5432/mydb',
92
+ supabase: 'postgres://postgres:password@db.abcdefgh.supabase.co:5432/postgres',
93
+ mysql: 'mysql://user:password@localhost:3306/mydb',
94
+ mssql: 'Server=localhost,1433;Database=mydb;User Id=sa;Password=secret;Encrypt=false',
95
+ sqlite: './data.db',
96
+ }
97
+
98
+ /**
99
+ * Files that mean the target folder already holds an app. Writing the bundle
100
+ * over one of these replaces it wholesale (they carry no managed markers), so
101
+ * the flow stops and asks first. A `studio.config.json` is the exception: that
102
+ * folder IS a Studio app, and re-running init there is a regenerate.
103
+ */
104
+ const CLOBBER_MARKERS = [
105
+ 'package.json',
106
+ 'svelte.config.js',
107
+ 'svelte.config.ts',
108
+ 'vite.config.ts',
109
+ 'src/routes/+layout.svelte',
110
+ '.env',
111
+ ]
112
+
86
113
  /** Ask a numbered-list question; returns the chosen index. */
87
114
  async function pick(prompts: PromptIO, heading: string, items: { label: string; hint?: string }[], def = 1): Promise<number> {
88
115
  prompts.say('')
@@ -158,7 +185,12 @@ async function gatherData(flags: InitFlags, prompts: PromptIO, db: DbGateway | n
158
185
  datasetId = starterDatasets[i]!.id
159
186
  }
160
187
  const dataset = getStarterDataset(datasetId)
161
- if (!dataset) throw new Error(`Unknown dataset "${datasetId}". Try: ${starterDatasets.map((d) => d.id).join(', ')}`)
188
+ if (!dataset) {
189
+ throw new UserError(
190
+ `Unknown dataset "${datasetId}".`,
191
+ `Try one of: ${starterDatasets.map((d) => d.id).join(', ')}`,
192
+ )
193
+ }
162
194
  const { entities, seed } = dataset.build()
163
195
  const kind: DataSourceKind = source === 'pglite' ? 'pglite' : 'memory'
164
196
  const sources: Record<string, EntityDataSource> = {}
@@ -168,7 +200,7 @@ async function gatherData(flags: InitFlags, prompts: PromptIO, db: DbGateway | n
168
200
  }
169
201
 
170
202
  async function gatherFromDatabase(flags: InitFlags, prompts: PromptIO, db: DbGateway | null): Promise<Gathered> {
171
- if (!db) throw new Error('Connecting to a database is not available here.')
203
+ if (!db) throw new UserError('Connecting to a database is not available here.')
172
204
  let dialect = flags.db
173
205
  if (!dialect) {
174
206
  const i = await pick(prompts, 'Which database?', DIALECTS.map((d) => ({ label: d })))
@@ -179,19 +211,40 @@ async function gatherFromDatabase(flags: InitFlags, prompts: PromptIO, db: DbGat
179
211
  if (isFileDialect(dialect)) {
180
212
  url = (await prompts.ask('Database file:', './data.db')).trim()
181
213
  } else {
214
+ // Show the shape of the answer: a bare "Connection string:" prompt is the
215
+ // most common place a first run stalls.
216
+ prompts.say('')
217
+ prompts.say(` Example: ${CONNECTION_EXAMPLES[dialect] ?? CONNECTION_EXAMPLES.postgres}`)
182
218
  const answer = (await prompts.ask('Connection string (blank to enter host/port instead):', '')).trim()
183
219
  url = answer || buildConnectionString(dialect, await askConnectionParts(prompts))
184
220
  }
185
221
  }
186
- if (!url) throw new Error('A connection string is required.')
222
+ if (!url) throw new UserError('A connection string is required.')
187
223
 
188
224
  const driver = await db.ensureDriver(dialect)
189
- if (!driver.ok) throw new Error(driver.message ?? `Could not install the ${dialect} driver.`)
225
+ if (!driver.ok) throw new UserError(driver.message ?? `Could not install the ${dialect} driver.`)
190
226
 
191
227
  prompts.say(' Connecting...')
192
- const execute = await db.connect(dialect, url)
193
- const tables = await listDatabaseTables(dialect, execute)
194
- if (tables.length === 0) throw new Error('Connected, but the database has no tables.')
228
+ // A refused connection, a bad host, wrong credentials: the driver throws its
229
+ // own message here. That is the user's connection string to fix, not a defect,
230
+ // so keep the driver's wording but stop it looking like a crash.
231
+ let execute: DbExecute
232
+ let tables: string[]
233
+ try {
234
+ execute = await db.connect(dialect, url)
235
+ tables = await listDatabaseTables(dialect, execute)
236
+ } catch (e) {
237
+ throw new UserError(
238
+ `Could not read the database: ${e instanceof Error ? e.message : String(e)}`,
239
+ `Check the connection string. Expected shape: ${CONNECTION_EXAMPLES[dialect] ?? CONNECTION_EXAMPLES.postgres}`,
240
+ )
241
+ }
242
+ if (tables.length === 0) {
243
+ throw new UserError(
244
+ 'Connected, but the database has no tables.',
245
+ 'Check that the connection string points at the right database and schema.',
246
+ )
247
+ }
195
248
 
196
249
  const counts = await countTableRows(dialect, execute, tables)
197
250
  prompts.say('')
@@ -199,7 +252,7 @@ async function gatherFromDatabase(flags: InitFlags, prompts: PromptIO, db: DbGat
199
252
  counts.forEach((t, i) => prompts.say(` ${i + 1}. ${t.name}${t.rows == null ? '' : ` (${t.rows} rows)`}`))
200
253
  const answer = flags.yes ? 'all' : await prompts.ask('Which tables? (all, or a comma list of names/numbers)', 'all')
201
254
  const picked = parseSelection(answer, tables)
202
- if (picked.length === 0) throw new Error('No tables picked - nothing to build.')
255
+ if (picked.length === 0) throw new UserError('No tables picked - nothing to build.')
203
256
 
204
257
  const schemas: EntitySchema[] = []
205
258
  const sources: Record<string, EntityDataSource> = {}
@@ -213,7 +266,7 @@ async function gatherFromDatabase(flags: InitFlags, prompts: PromptIO, db: DbGat
213
266
  prompts.say(` ! Skipped ${table}: ${e instanceof Error ? e.message : String(e)}`)
214
267
  }
215
268
  }
216
- if (schemas.length === 0) throw new Error('None of the picked tables could be read.')
269
+ if (schemas.length === 0) throw new UserError('None of the picked tables could be read.')
217
270
  prompts.say(` Read ${schemas.length} ${schemas.length === 1 ? 'table' : 'tables'}.`)
218
271
  return { schemas, sources, seed: {}, kind: 'sql' }
219
272
  }
@@ -223,12 +276,27 @@ async function gatherFromDatabase(flags: InitFlags, prompts: PromptIO, db: DbGat
223
276
  * DbGateway - just the project URL and the anon key.
224
277
  */
225
278
  async function gatherFromSupabase(flags: InitFlags, prompts: PromptIO): Promise<Gathered> {
279
+ if (!flags.supabaseUrl || !flags.supabaseKey) {
280
+ // The designer's wizard says where these live; the CLI used to leave people
281
+ // hunting for them.
282
+ prompts.say('')
283
+ prompts.say(" Both are in your Supabase project's API settings (Project Settings -> API).")
284
+ prompts.say(' The URL looks like https://abcdefgh.supabase.co')
285
+ }
226
286
  const url = (flags.supabaseUrl ?? (await prompts.ask('Project URL:', ''))).trim()
227
287
  const key = (flags.supabaseKey ?? (await prompts.ask('Anon key:', ''))).trim()
228
- if (!url || !key) throw new Error('Both the project URL and the anon key are required.')
288
+ if (!url || !key) throw new UserError('Both the project URL and the anon key are required.')
229
289
 
230
290
  prompts.say(' Reading the API...')
231
- const tables = await listSupabaseTables(url, key)
291
+ let tables: string[]
292
+ try {
293
+ tables = await listSupabaseTables(url, key)
294
+ } catch (e) {
295
+ throw new UserError(
296
+ `Could not reach ${url}: ${e instanceof Error ? e.message : String(e)}`,
297
+ "Check the project URL and anon key in Project Settings -> API.",
298
+ )
299
+ }
232
300
  let picked: string[]
233
301
  if (tables.length) {
234
302
  prompts.say('')
@@ -243,7 +311,7 @@ async function gatherFromSupabase(flags: InitFlags, prompts: PromptIO): Promise<
243
311
  const typed = await prompts.ask('Table names (comma separated):', '')
244
312
  picked = typed.split(',').map((t) => t.trim()).filter(Boolean)
245
313
  }
246
- if (picked.length === 0) throw new Error('No tables picked - nothing to build.')
314
+ if (picked.length === 0) throw new UserError('No tables picked - nothing to build.')
247
315
 
248
316
  const schemas: EntitySchema[] = []
249
317
  const sources: Record<string, EntityDataSource> = {}
@@ -256,7 +324,7 @@ async function gatherFromSupabase(flags: InitFlags, prompts: PromptIO): Promise<
256
324
  schemas.push(schema as EntitySchema)
257
325
  sources[schema.name] = { kind: 'supabase', table, url, key }
258
326
  }
259
- if (schemas.length === 0) throw new Error('None of the picked tables could be read.')
327
+ if (schemas.length === 0) throw new UserError('None of the picked tables could be read.')
260
328
  prompts.say(` Read ${schemas.length} ${schemas.length === 1 ? 'table' : 'tables'}.`)
261
329
  return { schemas, sources, seed: {}, kind: 'supabase' }
262
330
  }
@@ -272,23 +340,41 @@ async function askConnectionParts(prompts: PromptIO): Promise<SqlConnectionParts
272
340
  }
273
341
 
274
342
  async function gatherFromRest(prompts: PromptIO, fetchText: FetchText | null): Promise<Gathered> {
275
- if (!fetchText) throw new Error('Reading a REST endpoint is not available here.')
343
+ if (!fetchText) throw new UserError('Reading a REST endpoint is not available here.')
276
344
  const src = (await prompts.ask('OpenAPI spec (file or URL), or a REST endpoint returning rows:', '')).trim()
277
- if (!src) throw new Error('A spec path/URL or endpoint is required.')
345
+ if (!src) throw new UserError('A spec path/URL or endpoint is required.')
278
346
  const text = await fetchText(src)
279
347
 
280
348
  // An OpenAPI document describes every resource; a plain endpoint gives one.
281
349
  if (/"(openapi|swagger|paths)"\s*:/.test(text)) {
282
350
  const { entities, sources, warnings } = introspectOpenApi(text)
283
351
  for (const w of warnings) prompts.say(` ! ${w}`)
284
- if (entities.length === 0) throw new Error('The spec described no collection resources.')
352
+ if (entities.length === 0) throw new UserError('The spec described no collection resources.')
285
353
  prompts.say(` Read ${entities.length} REST ${entities.length === 1 ? 'resource' : 'resources'}.`)
286
354
  return { schemas: entities, sources, seed: {}, kind: 'rest' }
287
355
  }
288
356
 
289
- const rows = unwrapRows(JSON.parse(text) as unknown)
290
- if (rows.length === 0) throw new Error('The endpoint returned no rows to read a shape from.')
291
- const url = new URL(src)
357
+ let rows: Record<string, unknown>[]
358
+ try {
359
+ rows = unwrapRows(JSON.parse(text) as unknown)
360
+ } catch {
361
+ throw new UserError(
362
+ `${src} did not return JSON.`,
363
+ 'Point this at an endpoint that returns rows, or at an OpenAPI (JSON) document.',
364
+ )
365
+ }
366
+ if (rows.length === 0) throw new UserError('The endpoint returned no rows to read a shape from.')
367
+ // A local file path or a bare hostname reaches this line too; `new URL` would
368
+ // throw a raw "Invalid URL" that reads like a crash.
369
+ let url: URL
370
+ try {
371
+ url = new URL(src)
372
+ } catch {
373
+ throw new UserError(
374
+ `"${src}" is not a full URL, so there is no endpoint to call at runtime.`,
375
+ 'Pass the absolute endpoint, for example https://api.example.com/widgets',
376
+ )
377
+ }
292
378
  const path = url.pathname.replace(/^\/+|\/+$/g, '')
293
379
  const suggested = path.split('/').filter(Boolean).pop() || 'items'
294
380
  const name = ((await prompts.ask('Table name:', suggested)).trim() || suggested).replace(/\W+/g, '_')
@@ -344,12 +430,66 @@ async function askTheme(flags: InitFlags, prompts: PromptIO): Promise<ProjectThe
344
430
  return { preset, mode: dark ? 'dark' : 'light' }
345
431
  }
346
432
 
433
+ /** Prefix a path with the output folder (`.` writes into the current one). */
434
+ const inDir = (outDir: string, path: string): string =>
435
+ (!outDir || outDir === '.' ? '' : outDir.replace(/[\\/]+$/, '') + '/') + path
436
+
437
+ /** Which marker files are present in `outDir` right now. */
438
+ async function markersIn(outDir: string, io: StudioIO): Promise<Set<string>> {
439
+ const found = new Set<string>()
440
+ for (const marker of CLOBBER_MARKERS) {
441
+ if ((await io.readFile(inDir(outDir, marker))) != null) found.add(marker)
442
+ }
443
+ return found
444
+ }
445
+
446
+ /**
447
+ * Stop before overwriting somebody else's app.
448
+ *
449
+ * `init` defaults to the current folder, and bare `svgrid-studio` in a terminal
450
+ * runs it, so a mistaken run inside an existing project would replace its
451
+ * package.json, svelte config and .env without a word. Re-running init on a
452
+ * folder Studio itself generated is a regenerate, not a clobber, so a
453
+ * `studio.config.json` waves the check through.
454
+ *
455
+ * `before` is the set of markers seen at startup, and only those count. Picking a
456
+ * database makes Studio install a driver into this folder first, which writes a
457
+ * package.json - without the snapshot the flow would trip over a file it had
458
+ * just created itself and refuse to build anything.
459
+ */
460
+ async function confirmTargetFolder(
461
+ outDir: string,
462
+ flags: InitFlags,
463
+ prompts: PromptIO,
464
+ io: StudioIO,
465
+ before: Set<string> | null,
466
+ ): Promise<void> {
467
+ if (flags.force) return
468
+ if ((await io.readFile(inDir(outDir, 'studio.config.json'))) != null) return
469
+
470
+ const present = await markersIn(outDir, io)
471
+ // `before` only describes the folder it was taken in; anywhere else, whatever
472
+ // is on disk now was there before we started.
473
+ const found = CLOBBER_MARKERS.filter((m) => present.has(m) && (before == null || before.has(m)))
474
+ if (found.length === 0) return
475
+
476
+ const where = !outDir || outDir === '.' ? 'This folder' : outDir
477
+ const message = `${where} already has ${found.join(', ')}, and Studio would overwrite ${found.length === 1 ? 'it' : 'them'}.`
478
+ if (flags.yes) {
479
+ throw new UserError(message, 'Pick an empty folder with --out <dir>, or pass --force to overwrite anyway.')
480
+ }
481
+ prompts.say('')
482
+ prompts.say(` ! ${message}`)
483
+ if (!isYes(await prompts.ask('Overwrite? (y/N)', 'n'), false)) {
484
+ throw new UserError('Stopped without writing anything.', 'Re-run with --out <dir> to build somewhere else.')
485
+ }
486
+ }
487
+
347
488
  /** Merge-write the generated files, preserving edits outside managed regions. */
348
489
  async function writeAll(files: { path: string; contents: string; userOwned?: boolean }[], outDir: string, io: StudioIO): Promise<string[]> {
349
490
  const written: string[] = []
350
- const prefix = !outDir || outDir === '.' ? '' : outDir.replace(/[\\/]+$/, '') + '/'
351
491
  for (const file of files) {
352
- const path = prefix + file.path
492
+ const path = inDir(outDir, file.path)
353
493
  const existing = await io.readFile(path)
354
494
  if (skipUserOwned(file, existing != null)) continue
355
495
  await io.writeFile(path, mergeManaged(existing, file.contents))
@@ -371,6 +511,12 @@ export async function runStudioInit(
371
511
  ): Promise<InitResult> {
372
512
  prompts.say('SvGrid Studio - let\'s build your app.')
373
513
 
514
+ // Snapshot the likely target before anything (a driver install, say) can add
515
+ // files to it, so the overwrite guard below judges the folder as the user left
516
+ // it rather than as Studio just changed it.
517
+ const candidateDir = flags.out ?? '.'
518
+ const markersBefore = await markersIn(candidateDir, io)
519
+
374
520
  const data = await gatherData(flags, prompts, db, fetchText)
375
521
  const perEntity = await askScreens(data.schemas, flags, prompts)
376
522
  const theme = await askTheme(flags, prompts)
@@ -378,6 +524,7 @@ export async function runStudioInit(
378
524
  const defaultTitle = flags.title ?? data.title ?? 'My app'
379
525
  const title = flags.yes || flags.title ? defaultTitle : (await prompts.ask('\nApp name:', defaultTitle)).trim() || defaultTitle
380
526
  const outDir = flags.out ?? (flags.yes ? '.' : (await prompts.ask('Write it where?', '.')).trim() || '.')
527
+ await confirmTargetFolder(outDir, flags, prompts, io, outDir === candidateDir ? markersBefore : null)
381
528
 
382
529
  const project = crudAppFromSchemas(data.schemas, {
383
530
  title,
@@ -392,7 +539,7 @@ export async function runStudioInit(
392
539
  const files = emitStudioAppBundle(project)
393
540
  const written = await writeAll(files, outDir, io)
394
541
  // The design itself, so `svgrid-studio designer` reopens exactly this app.
395
- const configPath = (!outDir || outDir === '.' ? '' : outDir.replace(/[\\/]+$/, '') + '/') + 'studio.config.json'
542
+ const configPath = inDir(outDir, 'studio.config.json')
396
543
  await io.writeFile(configPath, serializeProject(project))
397
544
  written.push(configPath)
398
545
 
@@ -0,0 +1 @@
1
+ {"compilerOptions":{"css":"external","dev":false,"hmr":false},"extensions":[".svelte"]}
@@ -0,0 +1,178 @@
1
+ {
2
+ "hash": "8bcf7ff4",
3
+ "configHash": "9360a471",
4
+ "lockfileHash": "13bfa257",
5
+ "browserHash": "db48a281",
6
+ "optimized": {
7
+ "svelte": {
8
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/index-server.js",
9
+ "file": "svelte.js",
10
+ "fileHash": "80974999",
11
+ "needsInterop": false
12
+ },
13
+ "svelte/animate": {
14
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/animate/index.js",
15
+ "file": "svelte_animate.js",
16
+ "fileHash": "a6715191",
17
+ "needsInterop": false
18
+ },
19
+ "svelte/attachments": {
20
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/attachments/index.js",
21
+ "file": "svelte_attachments.js",
22
+ "fileHash": "0705b4c9",
23
+ "needsInterop": false
24
+ },
25
+ "svelte/compiler": {
26
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/compiler/index.js",
27
+ "file": "svelte_compiler.js",
28
+ "fileHash": "30f322e9",
29
+ "needsInterop": false
30
+ },
31
+ "svelte/easing": {
32
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/easing/index.js",
33
+ "file": "svelte_easing.js",
34
+ "fileHash": "46020b65",
35
+ "needsInterop": false
36
+ },
37
+ "svelte/events": {
38
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/events/index.js",
39
+ "file": "svelte_events.js",
40
+ "fileHash": "2b34f89b",
41
+ "needsInterop": false
42
+ },
43
+ "svelte/internal": {
44
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/internal/index.js",
45
+ "file": "svelte_internal.js",
46
+ "fileHash": "4117a0c3",
47
+ "needsInterop": true
48
+ },
49
+ "svelte/internal/client": {
50
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/internal/client/index.js",
51
+ "file": "svelte_internal_client.js",
52
+ "fileHash": "29204770",
53
+ "needsInterop": false
54
+ },
55
+ "svelte/internal/disclose-version": {
56
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/internal/disclose-version.js",
57
+ "file": "svelte_internal_disclose-version.js",
58
+ "fileHash": "f83a157e",
59
+ "needsInterop": false
60
+ },
61
+ "svelte/internal/flags/async": {
62
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/internal/flags/async.js",
63
+ "file": "svelte_internal_flags_async.js",
64
+ "fileHash": "a900863b",
65
+ "needsInterop": false
66
+ },
67
+ "svelte/internal/flags/legacy": {
68
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/internal/flags/legacy.js",
69
+ "file": "svelte_internal_flags_legacy.js",
70
+ "fileHash": "907c28d5",
71
+ "needsInterop": false
72
+ },
73
+ "svelte/internal/flags/tracing": {
74
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/internal/flags/tracing.js",
75
+ "file": "svelte_internal_flags_tracing.js",
76
+ "fileHash": "1c558753",
77
+ "needsInterop": false
78
+ },
79
+ "svelte/internal/server": {
80
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/internal/server/index.js",
81
+ "file": "svelte_internal_server.js",
82
+ "fileHash": "4ec66909",
83
+ "needsInterop": false
84
+ },
85
+ "svelte/legacy": {
86
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/legacy/legacy-server.js",
87
+ "file": "svelte_legacy.js",
88
+ "fileHash": "befe146a",
89
+ "needsInterop": false
90
+ },
91
+ "svelte/motion": {
92
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/motion/index.js",
93
+ "file": "svelte_motion.js",
94
+ "fileHash": "a5d4cf5a",
95
+ "needsInterop": false
96
+ },
97
+ "svelte/reactivity": {
98
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/reactivity/index-server.js",
99
+ "file": "svelte_reactivity.js",
100
+ "fileHash": "502c911b",
101
+ "needsInterop": false
102
+ },
103
+ "svelte/reactivity/window": {
104
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/reactivity/window/index.js",
105
+ "file": "svelte_reactivity_window.js",
106
+ "fileHash": "2695aa3a",
107
+ "needsInterop": false
108
+ },
109
+ "svelte/server": {
110
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/server/index.js",
111
+ "file": "svelte_server.js",
112
+ "fileHash": "fd4fad45",
113
+ "needsInterop": false
114
+ },
115
+ "svelte/store": {
116
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/store/index-server.js",
117
+ "file": "svelte_store.js",
118
+ "fileHash": "a2d659d2",
119
+ "needsInterop": false
120
+ },
121
+ "svelte/transition": {
122
+ "src": "../../../../../../../../../node_modules/.pnpm/svelte@5.55.9_@typescript-eslint+types@8.67.0/node_modules/svelte/src/transition/index.js",
123
+ "file": "svelte_transition.js",
124
+ "fileHash": "cfc16474",
125
+ "needsInterop": false
126
+ }
127
+ },
128
+ "chunks": {
129
+ "attachments-BOv1rBKp": {
130
+ "file": "attachments-BOv1rBKp.js",
131
+ "isDynamicEntry": false
132
+ },
133
+ "constants-B9vgIdCd": {
134
+ "file": "constants-B9vgIdCd.js",
135
+ "isDynamicEntry": false
136
+ },
137
+ "dev-T1qbW_qD": {
138
+ "file": "dev-T1qbW_qD.js",
139
+ "isDynamicEntry": false
140
+ },
141
+ "events-Bo11SfVK": {
142
+ "file": "events-Bo11SfVK.js",
143
+ "isDynamicEntry": false
144
+ },
145
+ "flags-X7D4vfrZ": {
146
+ "file": "flags-X7D4vfrZ.js",
147
+ "isDynamicEntry": false
148
+ },
149
+ "hydration-oyUje5i1": {
150
+ "file": "hydration-oyUje5i1.js",
151
+ "isDynamicEntry": false
152
+ },
153
+ "legacy-client-DeSQgSFm": {
154
+ "file": "legacy-client-DeSQgSFm.js",
155
+ "isDynamicEntry": false
156
+ },
157
+ "utils-BbWyXNk1": {
158
+ "file": "utils-BbWyXNk1.js",
159
+ "isDynamicEntry": false
160
+ },
161
+ "utils-DI_fC7vt": {
162
+ "file": "utils-DI_fC7vt.js",
163
+ "isDynamicEntry": false
164
+ },
165
+ "validate-Dyr3lQv9": {
166
+ "file": "validate-Dyr3lQv9.js",
167
+ "isDynamicEntry": false
168
+ },
169
+ "version-_9FHH-LF": {
170
+ "file": "version-_9FHH-LF.js",
171
+ "isDynamicEntry": false
172
+ },
173
+ "warnings-CUbSPnyP": {
174
+ "file": "warnings-CUbSPnyP.js",
175
+ "isDynamicEntry": false
176
+ }
177
+ }
178
+ }