plum-e2e 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/backend/_scaffold/utils/browser.ts +1 -0
  2. package/backend/package-lock.json +2 -2
  3. package/backend/package.json +1 -1
  4. package/bin/plum.js +4 -3
  5. package/frontend/.svelte-kit/adapter-node/.vite/manifest.json +190 -0
  6. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Badge.DLLowvEA.css +17 -0
  7. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Button.cBruH0aD.css +17 -0
  8. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.D7eM-6MV.css +17 -0
  9. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BVnUajEa.css +17 -0
  10. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CGnCsn5q.css +17 -0
  11. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DBhBrHFz.css +17 -0
  12. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DOqo0UR4.css +17 -0
  13. package/frontend/.svelte-kit/adapter-node/chunks/Badge.js +30 -0
  14. package/frontend/.svelte-kit/adapter-node/chunks/Button.js +32 -0
  15. package/frontend/.svelte-kit/adapter-node/chunks/attributes.js +34 -0
  16. package/frontend/.svelte-kit/adapter-node/chunks/client.js +59 -0
  17. package/frontend/.svelte-kit/adapter-node/chunks/equality.js +31 -0
  18. package/frontend/.svelte-kit/adapter-node/chunks/escaping.js +36 -0
  19. package/frontend/.svelte-kit/adapter-node/chunks/exports.js +247 -0
  20. package/frontend/.svelte-kit/adapter-node/chunks/index.js +1135 -0
  21. package/frontend/.svelte-kit/adapter-node/chunks/internal.js +695 -0
  22. package/frontend/.svelte-kit/adapter-node/chunks/reports.js +57 -0
  23. package/frontend/.svelte-kit/adapter-node/entries/fallbacks/error.svelte.js +44 -0
  24. package/frontend/.svelte-kit/adapter-node/entries/pages/_layout.svelte.js +181 -0
  25. package/frontend/.svelte-kit/adapter-node/entries/pages/_page.svelte.js +164 -0
  26. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_page.svelte.js +141 -0
  27. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_slug_/_page.svelte.js +42 -0
  28. package/frontend/.svelte-kit/adapter-node/entries/pages/scheduled-tests/_page.svelte.js +179 -0
  29. package/frontend/.svelte-kit/adapter-node/index.js +3144 -0
  30. package/frontend/.svelte-kit/adapter-node/internal.js +30 -0
  31. package/frontend/.svelte-kit/adapter-node/manifest-full.js +77 -0
  32. package/frontend/.svelte-kit/adapter-node/manifest.js +81 -0
  33. package/frontend/.svelte-kit/adapter-node/nodes/0.js +25 -0
  34. package/frontend/.svelte-kit/adapter-node/nodes/1.js +25 -0
  35. package/frontend/.svelte-kit/adapter-node/nodes/2.js +25 -0
  36. package/frontend/.svelte-kit/adapter-node/nodes/3.js +25 -0
  37. package/frontend/.svelte-kit/adapter-node/nodes/4.js +25 -0
  38. package/frontend/.svelte-kit/adapter-node/nodes/5.js +25 -0
  39. package/frontend/.svelte-kit/ambient.d.ts +240 -0
  40. package/frontend/.svelte-kit/generated/client/app.js +51 -0
  41. package/frontend/.svelte-kit/generated/client/matchers.js +18 -0
  42. package/frontend/.svelte-kit/generated/client/nodes/0.js +18 -0
  43. package/frontend/.svelte-kit/generated/client/nodes/1.js +18 -0
  44. package/frontend/.svelte-kit/generated/client/nodes/2.js +18 -0
  45. package/frontend/.svelte-kit/generated/client/nodes/3.js +18 -0
  46. package/frontend/.svelte-kit/generated/client/nodes/4.js +18 -0
  47. package/frontend/.svelte-kit/generated/client/nodes/5.js +18 -0
  48. package/frontend/.svelte-kit/generated/client-optimized/app.js +51 -0
  49. package/frontend/.svelte-kit/generated/client-optimized/matchers.js +18 -0
  50. package/frontend/.svelte-kit/generated/client-optimized/nodes/0.js +18 -0
  51. package/frontend/.svelte-kit/generated/client-optimized/nodes/1.js +18 -0
  52. package/frontend/.svelte-kit/generated/client-optimized/nodes/2.js +18 -0
  53. package/frontend/.svelte-kit/generated/client-optimized/nodes/3.js +18 -0
  54. package/frontend/.svelte-kit/generated/client-optimized/nodes/4.js +18 -0
  55. package/frontend/.svelte-kit/generated/client-optimized/nodes/5.js +18 -0
  56. package/frontend/.svelte-kit/generated/root.js +20 -0
  57. package/frontend/.svelte-kit/generated/root.svelte +83 -0
  58. package/frontend/.svelte-kit/generated/server/internal.js +65 -0
  59. package/frontend/.svelte-kit/non-ambient.d.ts +42 -0
  60. package/frontend/.svelte-kit/output/client/.vite/manifest.json +289 -0
  61. package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.CnXRuPt4.css +17 -0
  62. package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.CGnCsn5q.css +17 -0
  63. package/frontend/.svelte-kit/output/client/_app/immutable/assets/3.BVnUajEa.css +17 -0
  64. package/frontend/.svelte-kit/output/client/_app/immutable/assets/4.DBhBrHFz.css +17 -0
  65. package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.D93VAB-w.css +17 -0
  66. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Badge.DLLowvEA.css +17 -0
  67. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Button.cBruH0aD.css +17 -0
  68. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.D7eM-6MV.css +17 -0
  69. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BVnUajEa.css +17 -0
  70. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CGnCsn5q.css +17 -0
  71. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DBhBrHFz.css +17 -0
  72. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DOqo0UR4.css +17 -0
  73. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B0bn91RF.js +18 -0
  74. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B1kE5jmt.js +23 -0
  75. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BKz6FZdB.js +18 -0
  76. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Be4iUAB0.js +18 -0
  77. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BpaMqo9O.js +18 -0
  78. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Bt3-Z7H1.js +18 -0
  79. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CHV2KnPr.js +18 -0
  80. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CJ8q7g9Y.js +18 -0
  81. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Cit9MuSg.js +20 -0
  82. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CwBTqcbj.js +18 -0
  83. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DBk3zeq4.js +18 -0
  84. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DFJLQFic.js +18 -0
  85. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DTUE7kkY.js +18 -0
  86. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/IYPwzKs_.js +20 -0
  87. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/oc0we5Us.js +18 -0
  88. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/rVEKg0Ak.js +18 -0
  89. package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.C2MbX06K.js +19 -0
  90. package/frontend/.svelte-kit/output/client/_app/immutable/entry/start.GiBry-lw.js +18 -0
  91. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.BsCYK-Tn.js +21 -0
  92. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/1.N4gjrCnX.js +18 -0
  93. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.D9yQNzK8.js +18 -0
  94. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/3.CBC5WvNb.js +18 -0
  95. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/4.BU6UZHSE.js +19 -0
  96. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.Dzzfrntl.js +18 -0
  97. package/frontend/.svelte-kit/output/client/_app/version.json +1 -0
  98. package/frontend/.svelte-kit/output/client/favicon.png +0 -0
  99. package/frontend/.svelte-kit/output/server/.vite/manifest.json +190 -0
  100. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Badge.DLLowvEA.css +17 -0
  101. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Button.cBruH0aD.css +17 -0
  102. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.D7eM-6MV.css +17 -0
  103. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BVnUajEa.css +17 -0
  104. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CGnCsn5q.css +17 -0
  105. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DBhBrHFz.css +17 -0
  106. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DOqo0UR4.css +17 -0
  107. package/frontend/.svelte-kit/output/server/chunks/Badge.js +30 -0
  108. package/frontend/.svelte-kit/output/server/chunks/Button.js +32 -0
  109. package/frontend/.svelte-kit/output/server/chunks/attributes.js +34 -0
  110. package/frontend/.svelte-kit/output/server/chunks/client.js +59 -0
  111. package/frontend/.svelte-kit/output/server/chunks/equality.js +31 -0
  112. package/frontend/.svelte-kit/output/server/chunks/escaping.js +36 -0
  113. package/frontend/.svelte-kit/output/server/chunks/exports.js +247 -0
  114. package/frontend/.svelte-kit/output/server/chunks/index.js +1135 -0
  115. package/frontend/.svelte-kit/output/server/chunks/internal.js +695 -0
  116. package/frontend/.svelte-kit/output/server/chunks/reports.js +57 -0
  117. package/frontend/.svelte-kit/output/server/entries/fallbacks/error.svelte.js +44 -0
  118. package/frontend/.svelte-kit/output/server/entries/pages/_layout.svelte.js +181 -0
  119. package/frontend/.svelte-kit/output/server/entries/pages/_page.svelte.js +164 -0
  120. package/frontend/.svelte-kit/output/server/entries/pages/reports/_page.svelte.js +141 -0
  121. package/frontend/.svelte-kit/output/server/entries/pages/reports/_slug_/_page.svelte.js +42 -0
  122. package/frontend/.svelte-kit/output/server/entries/pages/scheduled-tests/_page.svelte.js +179 -0
  123. package/frontend/.svelte-kit/output/server/index.js +3144 -0
  124. package/frontend/.svelte-kit/output/server/internal.js +30 -0
  125. package/frontend/.svelte-kit/output/server/manifest-full.js +77 -0
  126. package/frontend/.svelte-kit/output/server/manifest.js +77 -0
  127. package/frontend/.svelte-kit/output/server/nodes/0.js +25 -0
  128. package/frontend/.svelte-kit/output/server/nodes/1.js +25 -0
  129. package/frontend/.svelte-kit/output/server/nodes/2.js +25 -0
  130. package/frontend/.svelte-kit/output/server/nodes/3.js +25 -0
  131. package/frontend/.svelte-kit/output/server/nodes/4.js +25 -0
  132. package/frontend/.svelte-kit/output/server/nodes/5.js +25 -0
  133. package/frontend/.svelte-kit/tsconfig.json +49 -0
  134. package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css +17 -0
  135. package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css.br +0 -0
  136. package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css.gz +0 -0
  137. package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css +17 -0
  138. package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css.br +0 -0
  139. package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css.gz +0 -0
  140. package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css +17 -0
  141. package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css.br +0 -0
  142. package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css.gz +0 -0
  143. package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css +17 -0
  144. package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css.br +0 -0
  145. package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css.gz +0 -0
  146. package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css +17 -0
  147. package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css.br +0 -0
  148. package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css.gz +0 -0
  149. package/frontend/build/client/_app/immutable/assets/Badge.DLLowvEA.css +17 -0
  150. package/frontend/build/client/_app/immutable/assets/Badge.DLLowvEA.css.br +0 -0
  151. package/frontend/build/client/_app/immutable/assets/Badge.DLLowvEA.css.gz +0 -0
  152. package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css +17 -0
  153. package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css.br +0 -0
  154. package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css.gz +0 -0
  155. package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css +17 -0
  156. package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css.br +0 -0
  157. package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css.gz +0 -0
  158. package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css +17 -0
  159. package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css.br +0 -0
  160. package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css.gz +0 -0
  161. package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css +17 -0
  162. package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css.br +0 -0
  163. package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css.gz +0 -0
  164. package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css +17 -0
  165. package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css.br +0 -0
  166. package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css.gz +0 -0
  167. package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css +17 -0
  168. package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css.br +0 -0
  169. package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css.gz +0 -0
  170. package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js +18 -0
  171. package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js.br +0 -0
  172. package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js.gz +0 -0
  173. package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js +23 -0
  174. package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js.br +0 -0
  175. package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js.gz +0 -0
  176. package/frontend/build/client/_app/immutable/chunks/BKz6FZdB.js +18 -0
  177. package/frontend/build/client/_app/immutable/chunks/BKz6FZdB.js.br +0 -0
  178. package/frontend/build/client/_app/immutable/chunks/BKz6FZdB.js.gz +0 -0
  179. package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js +18 -0
  180. package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js.br +0 -0
  181. package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js.gz +0 -0
  182. package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js +18 -0
  183. package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js.br +0 -0
  184. package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js.gz +0 -0
  185. package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js +18 -0
  186. package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js.br +0 -0
  187. package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js.gz +0 -0
  188. package/frontend/build/client/_app/immutable/chunks/CHV2KnPr.js +18 -0
  189. package/frontend/build/client/_app/immutable/chunks/CHV2KnPr.js.br +18 -0
  190. package/frontend/build/client/_app/immutable/chunks/CHV2KnPr.js.gz +0 -0
  191. package/frontend/build/client/_app/immutable/chunks/CJ8q7g9Y.js +18 -0
  192. package/{resources/comments-format.text → frontend/build/client/_app/immutable/chunks/CJ8q7g9Y.js.br} +0 -0
  193. package/frontend/build/client/_app/immutable/chunks/CJ8q7g9Y.js.gz +0 -0
  194. package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js +20 -0
  195. package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js.br +0 -0
  196. package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js.gz +0 -0
  197. package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js +18 -0
  198. package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js.br +0 -0
  199. package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js.gz +0 -0
  200. package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js +18 -0
  201. package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js.br +0 -0
  202. package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js.gz +0 -0
  203. package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js +18 -0
  204. package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js.br +0 -0
  205. package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js.gz +0 -0
  206. package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js +18 -0
  207. package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js.br +0 -0
  208. package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js.gz +0 -0
  209. package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js +20 -0
  210. package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js.br +0 -0
  211. package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js.gz +0 -0
  212. package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js +18 -0
  213. package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js.br +0 -0
  214. package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js.gz +0 -0
  215. package/frontend/build/client/_app/immutable/chunks/rVEKg0Ak.js +18 -0
  216. package/frontend/build/client/_app/immutable/chunks/rVEKg0Ak.js.br +0 -0
  217. package/frontend/build/client/_app/immutable/chunks/rVEKg0Ak.js.gz +0 -0
  218. package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js +19 -0
  219. package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js.br +0 -0
  220. package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js.gz +0 -0
  221. package/frontend/build/client/_app/immutable/entry/start.GiBry-lw.js +18 -0
  222. package/frontend/build/client/_app/immutable/entry/start.GiBry-lw.js.br +18 -0
  223. package/frontend/build/client/_app/immutable/entry/start.GiBry-lw.js.gz +0 -0
  224. package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js +21 -0
  225. package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js.br +0 -0
  226. package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js.gz +0 -0
  227. package/frontend/build/client/_app/immutable/nodes/1.N4gjrCnX.js +18 -0
  228. package/frontend/build/client/_app/immutable/nodes/1.N4gjrCnX.js.br +0 -0
  229. package/frontend/build/client/_app/immutable/nodes/1.N4gjrCnX.js.gz +0 -0
  230. package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js +18 -0
  231. package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js.br +0 -0
  232. package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js.gz +0 -0
  233. package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js +18 -0
  234. package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js.br +0 -0
  235. package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js.gz +0 -0
  236. package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js +19 -0
  237. package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js.br +0 -0
  238. package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js.gz +0 -0
  239. package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js +18 -0
  240. package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js.br +0 -0
  241. package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js.gz +0 -0
  242. package/frontend/build/client/_app/version.json +1 -0
  243. package/frontend/build/client/_app/version.json.br +0 -0
  244. package/frontend/build/client/_app/version.json.gz +0 -0
  245. package/frontend/build/client/favicon.png +0 -0
  246. package/frontend/build/env.js +111 -0
  247. package/frontend/build/handler.js +1511 -0
  248. package/frontend/build/index.js +362 -0
  249. package/frontend/build/server/chunks/0-BFfqmlsS.js +26 -0
  250. package/frontend/build/server/chunks/0-BFfqmlsS.js.map +17 -0
  251. package/frontend/build/server/chunks/1-hso3H4Ax.js +26 -0
  252. package/frontend/build/server/chunks/1-hso3H4Ax.js.map +17 -0
  253. package/frontend/build/server/chunks/2-BSZWXCWp.js +26 -0
  254. package/frontend/build/server/chunks/2-BSZWXCWp.js.map +17 -0
  255. package/frontend/build/server/chunks/3-BYumY9dv.js +26 -0
  256. package/frontend/build/server/chunks/3-BYumY9dv.js.map +17 -0
  257. package/frontend/build/server/chunks/4-2UUrCVtM.js +26 -0
  258. package/frontend/build/server/chunks/4-2UUrCVtM.js.map +17 -0
  259. package/frontend/build/server/chunks/5-C2_y_fwT.js +26 -0
  260. package/frontend/build/server/chunks/5-C2_y_fwT.js.map +17 -0
  261. package/frontend/build/server/chunks/Badge-CC4U7C0c.js +30 -0
  262. package/frontend/build/server/chunks/Badge-CC4U7C0c.js.map +17 -0
  263. package/frontend/build/server/chunks/Button-BLkPicwS.js +33 -0
  264. package/frontend/build/server/chunks/Button-BLkPicwS.js.map +17 -0
  265. package/frontend/build/server/chunks/_layout.svelte-Bfxcj9C6.js +183 -0
  266. package/frontend/build/server/chunks/_layout.svelte-Bfxcj9C6.js.map +17 -0
  267. package/frontend/build/server/chunks/_page.svelte-DEK6UvaI.js +45 -0
  268. package/frontend/build/server/chunks/_page.svelte-DEK6UvaI.js.map +17 -0
  269. package/frontend/build/server/chunks/_page.svelte-DScVdHOq.js +142 -0
  270. package/frontend/build/server/chunks/_page.svelte-DScVdHOq.js.map +17 -0
  271. package/frontend/build/server/chunks/_page.svelte-Ns7w2sZt.js +180 -0
  272. package/frontend/build/server/chunks/_page.svelte-Ns7w2sZt.js.map +17 -0
  273. package/frontend/build/server/chunks/_page.svelte-s6ZIOitT.js +165 -0
  274. package/frontend/build/server/chunks/_page.svelte-s6ZIOitT.js.map +17 -0
  275. package/frontend/build/server/chunks/attributes-BeaNKpgU.js +34 -0
  276. package/frontend/build/server/chunks/attributes-BeaNKpgU.js.map +17 -0
  277. package/frontend/build/server/chunks/client-C9IaEwNo.js +52 -0
  278. package/frontend/build/server/chunks/client-C9IaEwNo.js.map +17 -0
  279. package/frontend/build/server/chunks/error.svelte-HKBv5sQT.js +45 -0
  280. package/frontend/build/server/chunks/error.svelte-HKBv5sQT.js.map +17 -0
  281. package/frontend/build/server/chunks/escaping-CqgfEcN3.js +36 -0
  282. package/frontend/build/server/chunks/escaping-CqgfEcN3.js.map +17 -0
  283. package/frontend/build/server/chunks/exports-OxlCJ8yE.js +192 -0
  284. package/frontend/build/server/chunks/exports-OxlCJ8yE.js.map +17 -0
  285. package/frontend/build/server/chunks/index-CjHlq1kt.js +1076 -0
  286. package/frontend/build/server/chunks/index-CjHlq1kt.js.map +17 -0
  287. package/frontend/build/server/chunks/reports-D3ZeYSmi.js +56 -0
  288. package/frontend/build/server/chunks/reports-D3ZeYSmi.js.map +17 -0
  289. package/frontend/build/server/index.js +5015 -0
  290. package/frontend/build/server/index.js.map +17 -0
  291. package/frontend/build/server/manifest.js +84 -0
  292. package/frontend/build/server/manifest.js.map +17 -0
  293. package/frontend/build/shims.js +49 -0
  294. package/frontend/package-lock.json +2 -2
  295. package/frontend/package.json +1 -1
  296. package/package.json +1 -1
  297. package/.claude/settings.local.json +0 -29
  298. package/.husky/pre-commit +0 -2
  299. package/.prettierignore +0 -21
  300. package/.prettierrc +0 -15
  301. package/.vscode/settings.json +0 -10
  302. package/license-config.json +0 -37
@@ -0,0 +1,57 @@
1
+ /*
2
+ * This file is part of Plum.
3
+ *
4
+ * Plum is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * Plum is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with Plum. If not, see https://www.gnu.org/licenses/.
16
+ */
17
+
18
+ import { g as getContext } from "./index.js";
19
+ import "./client.js";
20
+ const getStores = () => {
21
+ const stores$1 = getContext("__svelte__");
22
+ return {
23
+ /** @type {typeof page} */
24
+ page: {
25
+ subscribe: stores$1.page.subscribe
26
+ },
27
+ /** @type {typeof navigating} */
28
+ navigating: {
29
+ subscribe: stores$1.navigating.subscribe
30
+ },
31
+ /** @type {typeof updated} */
32
+ updated: stores$1.updated
33
+ };
34
+ };
35
+ const page = {
36
+ subscribe(fn) {
37
+ const store = getStores().page;
38
+ return store.subscribe(fn);
39
+ }
40
+ };
41
+ function reportUrl(fileName) {
42
+ return `/reports/${encodeURIComponent(fileName)}`;
43
+ }
44
+ function parseReport(fileName) {
45
+ const match = fileName.match(
46
+ /(PASS|FAIL)_cucumber_report_(.+?)_\(([^)]+)\)(?:_runners_(\d+))?_(\d{4})_(\d{2})_(\d{2})T(\d{2})_(\d{2})_(\d{2})_\d{3}Z\.json/
47
+ );
48
+ if (!match) return null;
49
+ const [, status, triggerType, tags, runners = "1", year, month, day, hour, minute, second] = match;
50
+ const date = (/* @__PURE__ */ new Date(`${year}-${month}-${day}T${hour}:${minute}:${second}Z`)).toLocaleString();
51
+ return { fileName, status, triggerType, tags, runners: Number(runners), date };
52
+ }
53
+ export {
54
+ parseReport as a,
55
+ page as p,
56
+ reportUrl as r
57
+ };
@@ -0,0 +1,44 @@
1
+ /*
2
+ * This file is part of Plum.
3
+ *
4
+ * Plum is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * Plum is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with Plum. If not, see https://www.gnu.org/licenses/.
16
+ */
17
+
18
+ import { e as escape_html } from "../../chunks/escaping.js";
19
+ import "clsx";
20
+ import { g as getContext, p as pop, a as push } from "../../chunks/index.js";
21
+ import { s as stores } from "../../chunks/client.js";
22
+ ({
23
+ check: stores.updated.check
24
+ });
25
+ function context() {
26
+ return getContext("__request__");
27
+ }
28
+ const page$1 = {
29
+ get error() {
30
+ return context().page.error;
31
+ },
32
+ get status() {
33
+ return context().page.status;
34
+ }
35
+ };
36
+ const page = page$1;
37
+ function Error$1($$payload, $$props) {
38
+ push();
39
+ $$payload.out += `<h1>${escape_html(page.status)}</h1> <p>${escape_html(page.error?.message)}</p>`;
40
+ pop();
41
+ }
42
+ export {
43
+ Error$1 as default
44
+ };
@@ -0,0 +1,181 @@
1
+ /*
2
+ * This file is part of Plum.
3
+ *
4
+ * Plum is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * Plum is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with Plum. If not, see https://www.gnu.org/licenses/.
16
+ */
17
+
18
+ import { V as ensure_array_like, W as stringify, X as store_get, Y as unsubscribe_stores, p as pop, a as push, Z as slot, _ as fallback, $ as bind_props } from "../../chunks/index.js";
19
+ import { p as page, r as reportUrl } from "../../chunks/reports.js";
20
+ import { w as writable } from "../../chunks/exports.js";
21
+ import { a as attr } from "../../chunks/attributes.js";
22
+ import { e as escape_html } from "../../chunks/escaping.js";
23
+ import "socket.io-client";
24
+ import { B as Button } from "../../chunks/Button.js";
25
+ const initial = "light";
26
+ const theme = writable(initial);
27
+ theme.subscribe((val) => {
28
+ return;
29
+ });
30
+ function Nav($$payload, $$props) {
31
+ push();
32
+ var $$store_subs;
33
+ let menuOpen = false;
34
+ const links = [
35
+ { href: "/", label: "Run Tests" },
36
+ { href: "/reports", label: "Reports" },
37
+ { href: "/scheduled-tests", label: "Scheduled" }
38
+ ];
39
+ const each_array = ensure_array_like(links);
40
+ $$payload.out += `<nav class="nav svelte-6bgush"><div class="inner svelte-6bgush"><a href="/" class="brand svelte-6bgush"><span class="brand-serif svelte-6bgush">Pl</span><span class="brand-sans svelte-6bgush">um</span></a> <div class="links svelte-6bgush"><!--[-->`;
41
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
42
+ let link = each_array[$$index];
43
+ $$payload.out += `<a${attr("href", link.href)}${attr("class", `link svelte-6bgush ${stringify([
44
+ store_get($$store_subs ??= {}, "$page", page).url.pathname === link.href ? "active" : ""
45
+ ].filter(Boolean).join(" "))}`)}>${escape_html(link.label)}</a>`;
46
+ }
47
+ $$payload.out += `<!--]--></div> <div class="actions svelte-6bgush"><button class="theme-btn svelte-6bgush" aria-label="Toggle theme">`;
48
+ if (store_get($$store_subs ??= {}, "$theme", theme) === "light") {
49
+ $$payload.out += "<!--[-->";
50
+ $$payload.out += `<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path></svg>`;
51
+ } else {
52
+ $$payload.out += "<!--[!-->";
53
+ $$payload.out += `<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"></circle><line x1="12" y1="1" x2="12" y2="3"></line><line x1="12" y1="21" x2="12" y2="23"></line><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line><line x1="1" y1="12" x2="3" y2="12"></line><line x1="21" y1="12" x2="23" y2="12"></line><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line></svg>`;
54
+ }
55
+ $$payload.out += `<!--]--></button> <button class="hamburger svelte-6bgush"${attr("aria-label", "Open menu")}${attr("aria-expanded", menuOpen)}><span${attr("class", `svelte-6bgush ${stringify([""].filter(Boolean).join(" "))}`)}></span> <span${attr("class", `svelte-6bgush ${stringify([""].filter(Boolean).join(" "))}`)}></span> <span${attr("class", `svelte-6bgush ${stringify([""].filter(Boolean).join(" "))}`)}></span></button></div></div> `;
56
+ {
57
+ $$payload.out += "<!--[!-->";
58
+ }
59
+ $$payload.out += `<!--]--></nav>`;
60
+ if ($$store_subs) unsubscribe_stores($$store_subs);
61
+ pop();
62
+ }
63
+ function PageShell($$payload, $$props) {
64
+ $$payload.out += `<main class="shell svelte-28zx1m"><!---->`;
65
+ slot($$payload, $$props, "default", {});
66
+ $$payload.out += `<!----></main>`;
67
+ }
68
+ const runnerState = writable({
69
+ output: "Ready — select a test from the list.\n",
70
+ running: false,
71
+ testCompleted: false,
72
+ latestReport: null,
73
+ status: "idle",
74
+ // 'idle' | 'running' | 'pass' | 'fail'
75
+ lastRunId: ""
76
+ });
77
+ const runnerConfig = writable({
78
+ workers: 1,
79
+ testID: ""
80
+ });
81
+ const panelExpanded = writable(true);
82
+ function Terminal($$payload, $$props) {
83
+ push();
84
+ let output = fallback($$props["output"], "");
85
+ $$payload.out += `<div class="terminal-wrap svelte-olniy1"><div class="terminal-bar svelte-olniy1"><span class="dot red svelte-olniy1"></span> <span class="dot yellow svelte-olniy1"></span> <span class="dot green svelte-olniy1"></span></div> <pre class="terminal svelte-olniy1">${escape_html(output)}</pre></div>`;
86
+ bind_props($$props, { output });
87
+ pop();
88
+ }
89
+ function RunnerPanel($$payload, $$props) {
90
+ push();
91
+ var $$store_subs;
92
+ let state, cfg, workerCount, dots, statusColor, statusLabel;
93
+ const WORKER_OPTIONS = [1, 2, 4, 8];
94
+ state = store_get($$store_subs ??= {}, "$runnerState", runnerState);
95
+ cfg = store_get($$store_subs ??= {}, "$runnerConfig", runnerConfig);
96
+ workerCount = Math.min(cfg.workers, 4);
97
+ dots = Array.from({ length: workerCount });
98
+ statusColor = state.status === "pass" ? "var(--pass)" : state.status === "fail" ? "var(--fail)" : state.status === "running" ? "var(--accent)" : "var(--border)";
99
+ statusLabel = state.status === "running" ? "running" : state.status === "pass" ? "passed" : state.status === "fail" ? "failed" : "ready";
100
+ const each_array = ensure_array_like(dots);
101
+ $$payload.out += `<div${attr("class", `panel svelte-ynu3lh ${stringify([
102
+ store_get($$store_subs ??= {}, "$panelExpanded", panelExpanded) ? "expanded" : ""
103
+ ].filter(Boolean).join(" "))}`)}><div class="bar svelte-ynu3lh"><div class="bar-left svelte-ynu3lh"><span${attr("class", `status-dot svelte-ynu3lh ${stringify([state.running ? "pulse" : ""].filter(Boolean).join(" "))}`)}${attr("style", `background: ${stringify(statusColor)}`)}></span> <span class="status-label svelte-ynu3lh">${escape_html(statusLabel)}</span> `;
104
+ if (state.lastRunId) {
105
+ $$payload.out += "<!--[-->";
106
+ $$payload.out += `<span class="run-id svelte-ynu3lh">${escape_html(state.lastRunId || "(all)")}</span>`;
107
+ } else {
108
+ $$payload.out += "<!--[!-->";
109
+ }
110
+ $$payload.out += `<!--]--></div> <div class="bar-dots svelte-ynu3lh"${attr("title", `${stringify(cfg.workers)} worker${stringify(cfg.workers !== 1 ? "s" : "")}`)}><!--[-->`;
111
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
112
+ each_array[i];
113
+ $$payload.out += `<span${attr("class", `dot svelte-ynu3lh ${stringify([
114
+ state.running ? "running" : "",
115
+ state.status === "pass" ? "pass" : "",
116
+ state.status === "fail" ? "fail" : ""
117
+ ].filter(Boolean).join(" "))}`)}${attr("style", `animation-delay: ${stringify(i * 180)}ms`)}></span>`;
118
+ }
119
+ $$payload.out += `<!--]--></div> <button class="expand-btn svelte-ynu3lh"${attr("aria-label", store_get($$store_subs ??= {}, "$panelExpanded", panelExpanded) ? "Collapse panel" : "Expand panel")}><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"${attr("class", `svelte-ynu3lh ${stringify([
120
+ store_get($$store_subs ??= {}, "$panelExpanded", panelExpanded) ? "rotated" : ""
121
+ ].filter(Boolean).join(" "))}`)}><polyline points="18 15 12 9 6 15" class="svelte-ynu3lh"></polyline></svg></button></div> `;
122
+ if (store_get($$store_subs ??= {}, "$panelExpanded", panelExpanded)) {
123
+ $$payload.out += "<!--[-->";
124
+ const each_array_1 = ensure_array_like(WORKER_OPTIONS);
125
+ $$payload.out += `<div class="body svelte-ynu3lh"><div class="controls svelte-ynu3lh"><input type="text" class="field-input run-input svelte-ynu3lh"${attr("value", store_get($$store_subs ??= {}, "$runnerConfig", runnerConfig).testID)} placeholder="@test-1 or @suite-login or blank for all"${attr("disabled", state.running, true)}> <div class="workers-control svelte-ynu3lh"><!--[-->`;
126
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
127
+ let n = each_array_1[$$index_1];
128
+ $$payload.out += `<button${attr("class", `worker-btn svelte-ynu3lh ${stringify([cfg.workers === n ? "active" : ""].filter(Boolean).join(" "))}`)}>${escape_html(n === 1 ? "Off" : n)}</button>`;
129
+ }
130
+ $$payload.out += `<!--]--></div> `;
131
+ Button($$payload, {
132
+ disabled: state.running,
133
+ children: ($$payload2) => {
134
+ $$payload2.out += `<!---->${escape_html(state.running ? "Running…" : "Run")}`;
135
+ },
136
+ $$slots: { default: true }
137
+ });
138
+ $$payload.out += `<!----></div> `;
139
+ Terminal($$payload, { output: state.output });
140
+ $$payload.out += `<!----> `;
141
+ if (state.testCompleted && state.latestReport) {
142
+ $$payload.out += "<!--[-->";
143
+ $$payload.out += `<div class="report-row svelte-ynu3lh"><a${attr("href", reportUrl(state.latestReport))} target="_blank" rel="noopener noreferrer" class="svelte-ynu3lh">`;
144
+ Button($$payload, {
145
+ variant: "outline",
146
+ size: "sm",
147
+ children: ($$payload2) => {
148
+ $$payload2.out += `<!---->View Report →`;
149
+ },
150
+ $$slots: { default: true }
151
+ });
152
+ $$payload.out += `<!----></a></div>`;
153
+ } else {
154
+ $$payload.out += "<!--[!-->";
155
+ }
156
+ $$payload.out += `<!--]--></div>`;
157
+ } else {
158
+ $$payload.out += "<!--[!-->";
159
+ }
160
+ $$payload.out += `<!--]--></div>`;
161
+ if ($$store_subs) unsubscribe_stores($$store_subs);
162
+ pop();
163
+ }
164
+ function _layout($$payload, $$props) {
165
+ Nav($$payload);
166
+ $$payload.out += `<!----> `;
167
+ PageShell($$payload, {
168
+ children: ($$payload2) => {
169
+ $$payload2.out += `<!---->`;
170
+ slot($$payload2, $$props, "default", {});
171
+ $$payload2.out += `<!---->`;
172
+ },
173
+ $$slots: { default: true }
174
+ });
175
+ $$payload.out += `<!----> `;
176
+ RunnerPanel($$payload);
177
+ $$payload.out += `<!---->`;
178
+ }
179
+ export {
180
+ _layout as default
181
+ };
@@ -0,0 +1,164 @@
1
+ /*
2
+ * This file is part of Plum.
3
+ *
4
+ * Plum is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * Plum is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with Plum. If not, see https://www.gnu.org/licenses/.
16
+ */
17
+
18
+ import { a0 as current_component, V as ensure_array_like, W as stringify, p as pop, a as push } from "../../chunks/index.js";
19
+ import { a as attr } from "../../chunks/attributes.js";
20
+ import { e as escape_html } from "../../chunks/escaping.js";
21
+ function onDestroy(fn) {
22
+ var context = (
23
+ /** @type {Component} */
24
+ current_component
25
+ );
26
+ (context.d ??= []).push(fn);
27
+ }
28
+ function _page($$payload, $$props) {
29
+ push();
30
+ let q, filtered, totalTests, visibleTests;
31
+ let suites = [];
32
+ let search = "";
33
+ let expandedSteps = /* @__PURE__ */ new Set();
34
+ let copiedIds = /* @__PURE__ */ new Set();
35
+ const copyTimers = /* @__PURE__ */ new Map();
36
+ function suiteIds(suite) {
37
+ return Array.isArray(suite.suiteId) ? suite.suiteId : [suite.suiteId];
38
+ }
39
+ function testIds(test) {
40
+ return Array.isArray(test.id) ? test.id : [test.id];
41
+ }
42
+ function primaryId(test) {
43
+ return Array.isArray(test.id) ? test.id[0] : test.id;
44
+ }
45
+ onDestroy(() => {
46
+ for (const timer of copyTimers.values()) clearTimeout(timer);
47
+ });
48
+ q = search.trim().toLowerCase();
49
+ filtered = suites.map((suite) => {
50
+ if (!q) return suite;
51
+ const suiteMatches = suite.suiteName.toLowerCase().includes(q);
52
+ const matchedTests = suite.tests.filter((t) => t.testCase.toLowerCase().includes(q) || testIds(t).some((id) => id.toLowerCase().includes(q)));
53
+ if (!suiteMatches && matchedTests.length === 0) return null;
54
+ return {
55
+ ...suite,
56
+ tests: suiteMatches ? suite.tests : matchedTests
57
+ };
58
+ }).filter(Boolean);
59
+ totalTests = suites.reduce((n, s) => n + s.tests.length, 0);
60
+ visibleTests = filtered.reduce((n, s) => n + s.tests.length, 0);
61
+ $$payload.out += `<div class="page-header svelte-10529e9"><div class="header-top svelte-10529e9"><div class="svelte-10529e9"><h1 class="svelte-10529e9">Tests</h1> <p class="subtitle svelte-10529e9">`;
62
+ if (q) {
63
+ $$payload.out += "<!--[-->";
64
+ $$payload.out += `${escape_html(visibleTests)} of ${escape_html(totalTests)} tests`;
65
+ } else {
66
+ $$payload.out += "<!--[!-->";
67
+ $$payload.out += `${escape_html(suites.length)} suite${escape_html(suites.length !== 1 ? "s" : "")} · ${escape_html(totalTests)} test${escape_html(totalTests !== 1 ? "s" : "")}`;
68
+ }
69
+ $$payload.out += `<!--]--></p></div></div> <div class="search-row svelte-10529e9"><div class="search-wrap svelte-10529e9"><svg class="search-icon svelte-10529e9" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8" class="svelte-10529e9"></circle><line x1="21" y1="21" x2="16.65" y2="16.65" class="svelte-10529e9"></line></svg> <input type="text" class="search-input svelte-10529e9"${attr("value", search)} placeholder="Search suites or tests…"> `;
70
+ {
71
+ $$payload.out += "<!--[!-->";
72
+ }
73
+ $$payload.out += `<!--]--></div></div></div> `;
74
+ if (filtered.length === 0) {
75
+ $$payload.out += "<!--[-->";
76
+ $$payload.out += `<p class="empty svelte-10529e9">${escape_html(q ? `No tests matching "${search}"` : "No test suites found.")}</p>`;
77
+ } else {
78
+ $$payload.out += "<!--[!-->";
79
+ const each_array = ensure_array_like(filtered);
80
+ $$payload.out += `<div class="suites svelte-10529e9"><!--[-->`;
81
+ for (let si = 0, $$length = each_array.length; si < $$length; si++) {
82
+ let suite = each_array[si];
83
+ const each_array_1 = ensure_array_like(suiteIds(suite));
84
+ const each_array_2 = ensure_array_like(suite.tests);
85
+ $$payload.out += `<div class="suite svelte-10529e9"${attr("style", `animation-delay: ${stringify(si * 55)}ms`)}><div class="suite-header svelte-10529e9"><div class="suite-meta svelte-10529e9"><div class="suite-badges svelte-10529e9"><!--[-->`;
86
+ for (let $$index = 0, $$length2 = each_array_1.length; $$index < $$length2; $$index++) {
87
+ let id = each_array_1[$$index];
88
+ $$payload.out += `<button${attr("class", `id-pill svelte-10529e9 ${stringify([copiedIds.has(id) ? "copied" : ""].filter(Boolean).join(" "))}`)}${attr("title", copiedIds.has(id) ? `Copied ${id}` : `Copy ${id}`)}${attr("aria-label", copiedIds.has(id) ? `Copied ${id}` : `Copy ${id}`)}>${escape_html(id)}</button>`;
89
+ }
90
+ $$payload.out += `<!--]--></div> <span class="suite-name svelte-10529e9">${escape_html(suite.suiteName)}</span> <span class="suite-count svelte-10529e9">${escape_html(suite.tests.length)} test${escape_html(suite.tests.length !== 1 ? "s" : "")}</span></div> <button class="run-btn suite-run svelte-10529e9" title="Run suite"><svg width="11" height="11" viewBox="0 0 24 24" fill="currentColor" stroke="none" class="svelte-10529e9"><polygon points="5,3 19,12 5,21" class="svelte-10529e9"></polygon></svg> Run suite</button></div> <div class="tests svelte-10529e9"><!--[-->`;
91
+ for (let ti = 0, $$length2 = each_array_2.length; ti < $$length2; ti++) {
92
+ let test = each_array_2[ti];
93
+ const pid = primaryId(test);
94
+ const stepsOpen = expandedSteps.has(pid);
95
+ const each_array_3 = ensure_array_like(testIds(test));
96
+ $$payload.out += `<div class="test-row svelte-10529e9"${attr("style", `animation-delay: ${stringify((si * 4 + ti) * 30)}ms`)}><div class="test-main svelte-10529e9"><button class="run-icon-btn svelte-10529e9"${attr("title", `Run ${stringify(pid)}`)}${attr("aria-label", `Run ${stringify(test.testCase)}`)}><svg width="10" height="10" viewBox="0 0 24 24" fill="currentColor" stroke="none" class="svelte-10529e9"><polygon points="5,3 19,12 5,21" class="svelte-10529e9"></polygon></svg></button> <div class="test-ids svelte-10529e9"><!--[-->`;
97
+ for (let $$index_1 = 0, $$length3 = each_array_3.length; $$index_1 < $$length3; $$index_1++) {
98
+ let id = each_array_3[$$index_1];
99
+ $$payload.out += `<button${attr("class", `id-pill svelte-10529e9 ${stringify([copiedIds.has(id) ? "copied" : ""].filter(Boolean).join(" "))}`)}${attr("title", copiedIds.has(id) ? `Copied ${id}` : `Copy ${id}`)}${attr("aria-label", copiedIds.has(id) ? `Copied ${id}` : `Copy ${id}`)}>${escape_html(id)}</button>`;
100
+ }
101
+ $$payload.out += `<!--]--></div> <span class="test-name svelte-10529e9">${escape_html(test.testCase)} `;
102
+ if (test.type === "outline") {
103
+ $$payload.out += "<!--[-->";
104
+ $$payload.out += `<span class="outline-badge svelte-10529e9">outline</span>`;
105
+ } else {
106
+ $$payload.out += "<!--[!-->";
107
+ }
108
+ $$payload.out += `<!--]--></span> `;
109
+ if (test.steps?.length > 0) {
110
+ $$payload.out += "<!--[-->";
111
+ $$payload.out += `<button class="steps-toggle svelte-10529e9"${attr("aria-expanded", stepsOpen)}><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"${attr("class", `svelte-10529e9 ${stringify([stepsOpen ? "rotated" : ""].filter(Boolean).join(" "))}`)}><polyline points="9 18 15 12 9 6" class="svelte-10529e9"></polyline></svg> ${escape_html(stepsOpen ? "Hide" : "Steps")}</button>`;
112
+ } else {
113
+ $$payload.out += "<!--[!-->";
114
+ }
115
+ $$payload.out += `<!--]--></div> `;
116
+ if (stepsOpen && test.steps?.length > 0) {
117
+ $$payload.out += "<!--[-->";
118
+ const each_array_4 = ensure_array_like(test.steps);
119
+ $$payload.out += `<div class="steps svelte-10529e9"><ol class="step-list svelte-10529e9"><!--[-->`;
120
+ for (let $$index_2 = 0, $$length3 = each_array_4.length; $$index_2 < $$length3; $$index_2++) {
121
+ let step = each_array_4[$$index_2];
122
+ $$payload.out += `<li class="step svelte-10529e9">${escape_html(step)}</li>`;
123
+ }
124
+ $$payload.out += `<!--]--></ol> `;
125
+ if (test.examples) {
126
+ $$payload.out += "<!--[-->";
127
+ const each_array_5 = ensure_array_like(test.examples.headers);
128
+ const each_array_6 = ensure_array_like(test.examples.rows);
129
+ $$payload.out += `<div class="examples svelte-10529e9"><span class="examples-label svelte-10529e9">Examples</span> <div class="examples-table-wrap svelte-10529e9"><table class="examples-table svelte-10529e9"><thead class="svelte-10529e9"><tr class="svelte-10529e9"><!--[-->`;
130
+ for (let $$index_3 = 0, $$length3 = each_array_5.length; $$index_3 < $$length3; $$index_3++) {
131
+ let h = each_array_5[$$index_3];
132
+ $$payload.out += `<th class="svelte-10529e9">${escape_html(h)}</th>`;
133
+ }
134
+ $$payload.out += `<!--]--></tr></thead><tbody class="svelte-10529e9"><!--[-->`;
135
+ for (let $$index_5 = 0, $$length3 = each_array_6.length; $$index_5 < $$length3; $$index_5++) {
136
+ let row = each_array_6[$$index_5];
137
+ const each_array_7 = ensure_array_like(row);
138
+ $$payload.out += `<tr class="svelte-10529e9"><!--[-->`;
139
+ for (let $$index_4 = 0, $$length4 = each_array_7.length; $$index_4 < $$length4; $$index_4++) {
140
+ let cell = each_array_7[$$index_4];
141
+ $$payload.out += `<td class="svelte-10529e9">${escape_html(cell)}</td>`;
142
+ }
143
+ $$payload.out += `<!--]--></tr>`;
144
+ }
145
+ $$payload.out += `<!--]--></tbody></table></div></div>`;
146
+ } else {
147
+ $$payload.out += "<!--[!-->";
148
+ }
149
+ $$payload.out += `<!--]--></div>`;
150
+ } else {
151
+ $$payload.out += "<!--[!-->";
152
+ }
153
+ $$payload.out += `<!--]--></div>`;
154
+ }
155
+ $$payload.out += `<!--]--></div></div>`;
156
+ }
157
+ $$payload.out += `<!--]--></div>`;
158
+ }
159
+ $$payload.out += `<!--]-->`;
160
+ pop();
161
+ }
162
+ export {
163
+ _page as default
164
+ };
@@ -0,0 +1,141 @@
1
+ /*
2
+ * This file is part of Plum.
3
+ *
4
+ * Plum is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * Plum is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with Plum. If not, see https://www.gnu.org/licenses/.
16
+ */
17
+
18
+ import { _ as fallback, V as ensure_array_like, $ as bind_props, p as pop, a as push, W as stringify } from "../../../chunks/index.js";
19
+ import { B as Badge } from "../../../chunks/Badge.js";
20
+ import { a as attr } from "../../../chunks/attributes.js";
21
+ import { e as escape_html } from "../../../chunks/escaping.js";
22
+ function Pagination($$payload, $$props) {
23
+ push();
24
+ let current = fallback($$props["current"], 1);
25
+ let total = fallback($$props["total"], 1);
26
+ if (total > 1) {
27
+ $$payload.out += "<!--[-->";
28
+ const each_array = ensure_array_like(Array(total));
29
+ $$payload.out += `<div class="pagination svelte-tsubiy"><button class="arrow svelte-tsubiy"${attr("disabled", current === 1, true)} aria-label="Previous">←</button> <!--[-->`;
30
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
31
+ each_array[i];
32
+ $$payload.out += `<button${attr("class", `page svelte-tsubiy ${stringify([current === i + 1 ? "active" : ""].filter(Boolean).join(" "))}`)}>${escape_html(i + 1)}</button>`;
33
+ }
34
+ $$payload.out += `<!--]--> <button class="arrow svelte-tsubiy"${attr("disabled", current === total, true)} aria-label="Next">→</button></div>`;
35
+ } else {
36
+ $$payload.out += "<!--[!-->";
37
+ }
38
+ $$payload.out += `<!--]-->`;
39
+ bind_props($$props, { current, total });
40
+ pop();
41
+ }
42
+ function _page($$payload, $$props) {
43
+ push();
44
+ let totalPages, paginated, passCount, failCount, passRate, trend;
45
+ let reports = [];
46
+ let currentPage = 1;
47
+ const PER_PAGE = 15;
48
+ function triggerLabel(type) {
49
+ if (type === "manual-trigger") return "Manual";
50
+ if (type === "command-line-trigger" || type === "undefined") return "CLI";
51
+ return "Scheduled";
52
+ }
53
+ function triggerVariant(type) {
54
+ if (type === "manual-trigger") return "tag";
55
+ if (type === "command-line-trigger" || type === "undefined") return "neutral";
56
+ return "schedule";
57
+ }
58
+ totalPages = Math.ceil(reports.length / PER_PAGE);
59
+ paginated = reports.slice((currentPage - 1) * PER_PAGE, currentPage * PER_PAGE);
60
+ passCount = reports.filter((r) => r.status === "PASS").length;
61
+ failCount = reports.length - passCount;
62
+ passRate = reports.length ? Math.round(passCount / reports.length * 100) : 0;
63
+ trend = reports.slice(0, 12).reverse();
64
+ $$payload.out += `<div class="page-header svelte-wxbf05"><div class="header-top svelte-wxbf05"><div><h1 class="svelte-wxbf05">Reports</h1> <p class="subtitle svelte-wxbf05">${escape_html(reports.length)} run${escape_html(reports.length !== 1 ? "s" : "")} recorded</p></div> `;
65
+ if (reports.length > 0) {
66
+ $$payload.out += "<!--[-->";
67
+ $$payload.out += `<div class="rate-display svelte-wxbf05"><span${attr("class", `rate-number svelte-wxbf05 ${stringify([
68
+ passRate >= 80 ? "pass" : "",
69
+ passRate < 80 && passRate >= 50 ? "warn" : "",
70
+ passRate < 50 ? "fail" : ""
71
+ ].filter(Boolean).join(" "))}`)}>${escape_html(passRate)}%</span> <span class="rate-label svelte-wxbf05">passing</span></div>`;
72
+ } else {
73
+ $$payload.out += "<!--[!-->";
74
+ }
75
+ $$payload.out += `<!--]--></div> `;
76
+ if (reports.length > 0) {
77
+ $$payload.out += "<!--[-->";
78
+ const each_array = ensure_array_like(trend);
79
+ $$payload.out += `<div class="stats-bar svelte-wxbf05"><div class="pass-bar-track svelte-wxbf05"><div class="pass-bar-fill svelte-wxbf05"${attr("style", `width: ${stringify("0")}`)}></div></div> <div class="bar-legend svelte-wxbf05"><span class="legend-pass svelte-wxbf05">${escape_html(passCount)} passed</span> <span class="legend-fail svelte-wxbf05">${escape_html(failCount)} failed</span></div></div> <div class="trend-row svelte-wxbf05"><span class="trend-label svelte-wxbf05">Recent</span> <div class="trend-dots svelte-wxbf05"><!--[-->`;
80
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
81
+ let r = each_array[i];
82
+ $$payload.out += `<span${attr("class", `trend-dot svelte-wxbf05 ${stringify([
83
+ r.status === "PASS" ? "pass" : "",
84
+ r.status !== "PASS" ? "fail" : ""
85
+ ].filter(Boolean).join(" "))}`)}${attr("style", `animation-delay: ${stringify(i * 35)}ms`)}${attr("title", `${stringify(r.status)} · ${stringify(r.tags)} · ${stringify(r.date)}`)}></span>`;
86
+ }
87
+ $$payload.out += `<!--]--></div> <span class="trend-hint svelte-wxbf05">← older · newer →</span></div>`;
88
+ } else {
89
+ $$payload.out += "<!--[!-->";
90
+ }
91
+ $$payload.out += `<!--]--></div> `;
92
+ if (reports.length === 0) {
93
+ $$payload.out += "<!--[-->";
94
+ $$payload.out += `<p class="empty svelte-wxbf05">No reports yet. Run a test to generate one.</p>`;
95
+ } else {
96
+ $$payload.out += "<!--[!-->";
97
+ const each_array_1 = ensure_array_like(paginated);
98
+ $$payload.out += `<div class="report-list svelte-wxbf05"><!--[-->`;
99
+ for (let i = 0, $$length = each_array_1.length; i < $$length; i++) {
100
+ let report = each_array_1[i];
101
+ $$payload.out += `<a${attr("class", `report-item svelte-wxbf05 ${stringify([
102
+ report.status === "PASS" ? "is-pass" : "",
103
+ report.status !== "PASS" ? "is-fail" : ""
104
+ ].filter(Boolean).join(" "))}`)}${attr("href", `/reports/${stringify(encodeURIComponent(report.fileName))}`)}${attr("style", `animation-delay: ${stringify(i * 45)}ms`)}><div class="item-left svelte-wxbf05"><span${attr("class", `status-mark svelte-wxbf05 ${stringify([
105
+ report.status === "PASS" ? "pass" : "",
106
+ report.status !== "PASS" ? "fail" : ""
107
+ ].filter(Boolean).join(" "))}`)}>${escape_html(report.status === "PASS" ? "✓" : "✗")}</span> <div class="item-meta svelte-wxbf05"><span class="item-tags svelte-wxbf05">${escape_html(report.tags)}</span> <div class="item-badges svelte-wxbf05">`;
108
+ Badge($$payload, {
109
+ variant: triggerVariant(report.triggerType),
110
+ children: ($$payload2) => {
111
+ $$payload2.out += `<!---->${escape_html(triggerLabel(report.triggerType))}`;
112
+ },
113
+ $$slots: { default: true }
114
+ });
115
+ $$payload.out += `<!----> `;
116
+ Badge($$payload, {
117
+ variant: "neutral",
118
+ children: ($$payload2) => {
119
+ $$payload2.out += `<!---->${escape_html(report.runners)} runner${escape_html(report.runners !== 1 ? "s" : "")}`;
120
+ },
121
+ $$slots: { default: true }
122
+ });
123
+ $$payload.out += `<!----></div></div></div> <div class="item-right svelte-wxbf05"><span class="item-date svelte-wxbf05">${escape_html(report.date)}</span> <svg class="item-arrow svelte-wxbf05" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline></svg></div></a>`;
124
+ }
125
+ $$payload.out += `<!--]--></div> `;
126
+ if (totalPages > 1) {
127
+ $$payload.out += "<!--[-->";
128
+ $$payload.out += `<div class="pagination-wrap svelte-wxbf05">`;
129
+ Pagination($$payload, { current: currentPage, total: totalPages });
130
+ $$payload.out += `<!----></div>`;
131
+ } else {
132
+ $$payload.out += "<!--[!-->";
133
+ }
134
+ $$payload.out += `<!--]-->`;
135
+ }
136
+ $$payload.out += `<!--]-->`;
137
+ pop();
138
+ }
139
+ export {
140
+ _page as default
141
+ };
@@ -0,0 +1,42 @@
1
+ /*
2
+ * This file is part of Plum.
3
+ *
4
+ * Plum is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * Plum is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with Plum. If not, see https://www.gnu.org/licenses/.
16
+ */
17
+
18
+ import { X as store_get, Y as unsubscribe_stores, p as pop, a as push } from "../../../../chunks/index.js";
19
+ import { a as parseReport, p as page } from "../../../../chunks/reports.js";
20
+ /* empty css */
21
+ function _page($$payload, $$props) {
22
+ push();
23
+ var $$store_subs;
24
+ const fileName = decodeURIComponent(store_get($$store_subs ??= {}, "$page", page).params.slug);
25
+ const meta = parseReport(fileName);
26
+ meta?.status === "PASS";
27
+ $$payload.out += `<div class="back-row svelte-pys2u"><a href="/reports" class="back-link svelte-pys2u"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" class="svelte-pys2u"><line x1="19" y1="12" x2="5" y2="12" class="svelte-pys2u"></line><polyline points="12 19 5 12 12 5" class="svelte-pys2u"></polyline></svg> Reports</a></div> `;
28
+ {
29
+ $$payload.out += "<!--[!-->";
30
+ {
31
+ $$payload.out += "<!--[-->";
32
+ $$payload.out += `<div class="loading-state svelte-pys2u"><div class="loading-dots svelte-pys2u"><span class="svelte-pys2u"></span><span class="svelte-pys2u"></span><span class="svelte-pys2u"></span></div></div>`;
33
+ }
34
+ $$payload.out += `<!--]-->`;
35
+ }
36
+ $$payload.out += `<!--]-->`;
37
+ if ($$store_subs) unsubscribe_stores($$store_subs);
38
+ pop();
39
+ }
40
+ export {
41
+ _page as default
42
+ };