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,18 @@
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{a as i,t as n,b as Se,s as p,e as N}from"../chunks/DFJLQFic.js";import{i as We}from"../chunks/DTUE7kkY.js";import{l as Xe,o as Ye,m as h,Q as Ze,n as J,t as et,x as tt,A as e,y as st,z as y,v,B as r,C as s,D as u,G as K}from"../chunks/B0bn91RF.js";import{i as T}from"../chunks/CwBTqcbj.js";import{r as at,e as x,s as g,i as w,t as de}from"../chunks/Bt3-Z7H1.js";import{t as rt,s as lt}from"../chunks/B1kE5jmt.js";import{b as ot}from"../chunks/BKz6FZdB.js";import{r as it,t as vt}from"../chunks/IYPwzKs_.js";const nt="http://localhost:3001";async function ct(){const P=await fetch(`${nt}/tests`),{suites:U}=await P.json();return U.suites??[]}var dt=n('<button class="search-clear svelte-10529e9" aria-label="Clear search"><svg width="12" height="12" viewBox="0 0 14 14" fill="none" class="svelte-10529e9"><path d="M1 1l12 12M13 1L1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" class="svelte-10529e9"></path></svg></button>'),pt=n('<p class="empty svelte-10529e9"> </p>'),ut=n('<button class="id-pill svelte-10529e9"> </button>'),_t=n('<button class="id-pill svelte-10529e9"> </button>'),ht=n('<span class="outline-badge svelte-10529e9">outline</span>'),ft=n('<button class="steps-toggle svelte-10529e9"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" class="svelte-10529e9"><polyline points="9 18 15 12 9 6" class="svelte-10529e9"></polyline></svg> </button>'),mt=n('<li class="step svelte-10529e9"> </li>'),gt=n('<th class="svelte-10529e9"> </th>'),bt=n('<td class="svelte-10529e9"> </td>'),yt=n('<tr class="svelte-10529e9"></tr>'),xt=n('<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"></tr></thead><tbody class="svelte-10529e9"></tbody></table></div></div>'),wt=n('<div class="steps svelte-10529e9"><ol class="step-list svelte-10529e9"></ol> <!></div>'),kt=n('<div class="test-row svelte-10529e9"><div class="test-main svelte-10529e9"><button class="run-icon-btn svelte-10529e9"><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"></div> <span class="test-name svelte-10529e9"> <!></span> <!></div> <!></div>'),Ct=n('<div class="suite svelte-10529e9"><div class="suite-header svelte-10529e9"><div class="suite-meta svelte-10529e9"><div class="suite-badges svelte-10529e9"></div> <span class="suite-name svelte-10529e9"> </span> <span class="suite-count svelte-10529e9"> </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"></div></div>'),$t=n('<div class="suites svelte-10529e9"></div>'),It=n('<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"><!></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" placeholder="Search suites or tests…"> <!></div></div></div> <!>',1);function Dt(P,U){Xe(U,!1);const b=y(),D=y(),z=y(),pe=y();let k=y([]),C=y(""),A=y(new Set),_=y(new Set);const j=new Map;Ye(async()=>{try{h(k,await ct())}catch(t){console.error("Failed to fetch suites",t)}});function ue(t){return Array.isArray(t.suiteId)?t.suiteId:[t.suiteId]}function _e(t){return Array.isArray(t.id)?t.id:[t.id]}function Te(t){return Array.isArray(t.id)?t.id[0]:t.id}function Ae(t){e(A).has(t)?e(A).delete(t):e(A).add(t),h(A,e(A))}function he(t){it.update(a=>({...a,testID:t})),vt(t)}function Be(t){const a=ue(t)[0];he(a)}async function fe(t){await navigator.clipboard.writeText(t),e(_).add(t),h(_,e(_)),j.has(t)&&clearTimeout(j.get(t)),j.set(t,setTimeout(()=>{e(_).delete(t),h(_,e(_)),j.delete(t)},1400))}Ze(()=>{for(const t of j.values())clearTimeout(t)}),J(()=>e(C),()=>{h(b,e(C).trim().toLowerCase())}),J(()=>(e(k),e(b)),()=>{h(D,e(k).map(t=>{if(!e(b))return t;const a=t.suiteName.toLowerCase().includes(e(b)),B=t.tests.filter(f=>f.testCase.toLowerCase().includes(e(b))||_e(f).some(F=>F.toLowerCase().includes(e(b))));return!a&&B.length===0?null:{...t,tests:a?t.tests:B}}).filter(Boolean))}),J(()=>e(k),()=>{h(z,e(k).reduce((t,a)=>t+a.tests.length,0))}),J(()=>e(D),()=>{h(pe,e(D).reduce((t,a)=>t+a.tests.length,0))}),et(),We();var me=It(),V=tt(me),W=r(V),ge=r(W),be=v(r(ge),2),Le=r(be);{var Me=t=>{var a=Se();u(()=>p(a,`${e(pe)??""} of ${e(z)??""} tests`)),i(t,a)},Re=t=>{var a=Se();u(()=>p(a,`${e(k).length??""} suite${(e(k).length!==1?"s":"")??""} · ${e(z)??""} test${(e(z)!==1?"s":"")??""}`)),i(t,a)};T(Le,t=>{e(b)?t(Me):t(Re,!1)})}s(be),s(ge),s(W);var ye=v(W,2),xe=r(ye),X=v(r(xe),2);at(X);var Ne=v(X,2);{var De=t=>{var a=dt();N("click",a,()=>h(C,"")),i(t,a)};T(Ne,t=>{e(C)&&t(De)})}s(xe),s(ye),s(V);var je=v(V,2);{var qe=t=>{var a=pt(),B=r(a,!0);s(a),u(()=>p(B,e(b)?`No tests matching "${e(C)}"`:"No test suites found.")),i(t,a)},Ee=t=>{var a=$t();x(a,5,()=>e(D),w,(B,f,F)=>{var G=Ct();g(G,"style",`animation-delay: ${F*55}ms`);var Y=r(G),Z=r(Y),ee=r(Z);x(ee,5,()=>ue(e(f)),w,(se,o)=>{var m=ut(),L=r(m,!0);s(m),u(($,M)=>{g(m,"title",$),g(m,"aria-label",$),de(m,"copied",M),p(L,e(o))},[()=>e(_).has(e(o))?`Copied ${e(o)}`:`Copy ${e(o)}`,()=>e(_).has(e(o))],K),N("click",m,()=>fe(e(o))),i(se,m)}),s(ee);var te=v(ee,2),ze=r(te,!0);s(te);var we=v(te,2),Fe=r(we);s(we),s(Z);var Ge=v(Z,2);s(Y);var ke=v(Y,2);x(ke,5,()=>e(f).tests,w,(se,o,m)=>{var L=kt();const $=K(()=>Te(e(o))),M=K(()=>e(A).has(e($)));g(L,"style",`animation-delay: ${(F*4+m)*30}ms`);var ae=r(L),H=r(ae),re=v(H,2);x(re,5,()=>_e(e(o)),w,(d,l)=>{var c=_t(),q=r(c,!0);s(c),u((O,I)=>{g(c,"title",O),g(c,"aria-label",O),de(c,"copied",I),p(q,e(l))},[()=>e(_).has(e(l))?`Copied ${e(l)}`:`Copy ${e(l)}`,()=>e(_).has(e(l))],K),N("click",c,()=>fe(e(l))),i(d,c)}),s(re);var le=v(re,2),Ce=r(le),He=v(Ce);{var Oe=d=>{var l=ht();i(d,l)};T(He,d=>{e(o).type==="outline"&&d(Oe)})}s(le);var Qe=v(le,2);{var Je=d=>{var l=ft(),c=r(l),q=v(c);s(l),u(()=>{g(l,"aria-expanded",e(M)),de(c,"rotated",e(M)),p(q,` ${(e(M)?"Hide":"Steps")??""}`)}),N("click",l,()=>Ae(e($))),i(d,l)};T(Qe,d=>{var l;((l=e(o).steps)==null?void 0:l.length)>0&&d(Je)})}s(ae);var Ke=v(ae,2);{var Pe=d=>{var l=wt(),c=r(l);x(c,5,()=>e(o).steps,w,(I,E)=>{var R=mt(),Q=r(R,!0);s(R),u(()=>p(Q,e(E))),i(I,R)}),s(c);var q=v(c,2);{var O=I=>{var E=xt(),R=v(r(E),2),Q=r(R),oe=r(Q),$e=r(oe);x($e,5,()=>e(o).examples.headers,w,(ie,ve)=>{var S=gt(),ne=r(S,!0);s(S),u(()=>p(ne,e(ve))),i(ie,S)}),s($e),s(oe);var Ie=v(oe);x(Ie,5,()=>e(o).examples.rows,w,(ie,ve)=>{var S=yt();x(S,5,()=>e(ve),w,(ne,Ue)=>{var ce=bt(),Ve=r(ce,!0);s(ce),u(()=>p(Ve,e(Ue))),i(ne,ce)}),s(S),i(ie,S)}),s(Ie),s(Q),s(R),s(E),i(I,E)};T(q,I=>{e(o).examples&&I(O)})}s(l),rt(3,l,()=>lt,()=>({duration:180})),i(d,l)};T(Ke,d=>{var l;e(M)&&((l=e(o).steps)==null?void 0:l.length)>0&&d(Pe)})}s(L),u(()=>{g(H,"title",`Run ${e($)??""}`),g(H,"aria-label",`Run ${e(o).testCase??""}`),p(Ce,`${e(o).testCase??""} `)}),N("click",H,()=>he(e($))),i(se,L)}),s(ke),s(G),u(()=>{p(ze,e(f).suiteName),p(Fe,`${e(f).tests.length??""} test${(e(f).tests.length!==1?"s":"")??""}`)}),N("click",Ge,()=>Be(e(f))),i(B,G)}),s(a),i(t,a)};T(je,t=>{e(D).length===0?t(qe):t(Ee,!1)})}ot(X,()=>e(C),t=>h(C,t)),i(P,me),st()}export{Dt as component};
@@ -0,0 +1,18 @@
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{c as Pa,a as o,e as Y,t as p,s as b,b as ia}from"../chunks/DFJLQFic.js";import{i as oa}from"../chunks/DTUE7kkY.js";import{l as da,az as Aa,x as O,y as ca,B as s,v as i,D as w,C as t,o as ka,m,aA as Ca,n as E,t as Ra,z as x,A as a,F as I,G as Z}from"../chunks/B0bn91RF.js";import{i as T}from"../chunks/CwBTqcbj.js";import{e as aa,t as u,i as ea,s as L}from"../chunks/Bt3-Z7H1.js";import{a as Ba}from"../chunks/BpaMqo9O.js";import{B as la}from"../chunks/oc0we5Us.js";import{p as va}from"../chunks/Be4iUAB0.js";var Ma=p('<button class="page svelte-tsubiy"></button>'),Ea=p('<div class="pagination svelte-tsubiy"><button class="arrow svelte-tsubiy" aria-label="Previous">←</button> <!> <button class="arrow svelte-tsubiy" aria-label="Next">→</button></div>');function Na(Q,N){da(N,!1);let _=va(N,"current",8,1),A=va(N,"total",8,1);const h=Aa();function B(l){l<1||l>A()||h("change",l)}oa();var f=Pa(),q=O(f);{var r=l=>{var k=Ea(),M=s(k),U=i(M,2);aa(U,1,()=>Array(A()),ea,(j,H,C)=>{var $=Ma();$.textContent=C+1,w(()=>u($,"active",_()===C+1)),Y("click",$,()=>B(C+1)),o(j,$)});var V=i(U,2);t(k),w(()=>{M.disabled=_()===1,V.disabled=_()===A()}),Y("click",M,()=>B(_()-1)),Y("click",V,()=>B(_()+1)),o(l,k)};T(q,l=>{A()>1&&l(r)})}o(Q,f),ca()}var za=p('<div class="rate-display svelte-wxbf05"><span class="rate-number svelte-wxbf05"> </span> <span class="rate-label svelte-wxbf05">passing</span></div>'),Da=p('<span class="trend-dot svelte-wxbf05"></span>'),Fa=p('<div class="stats-bar svelte-wxbf05"><div class="pass-bar-track svelte-wxbf05"><div class="pass-bar-fill svelte-wxbf05"></div></div> <div class="bar-legend svelte-wxbf05"><span class="legend-pass svelte-wxbf05"> </span> <span class="legend-fail svelte-wxbf05"> </span></div></div> <div class="trend-row svelte-wxbf05"><span class="trend-label svelte-wxbf05">Recent</span> <div class="trend-dots svelte-wxbf05"></div> <span class="trend-hint svelte-wxbf05">← older · newer →</span></div>',1),Ga=p('<p class="empty svelte-wxbf05">No reports yet. Run a test to generate one.</p>'),Ia=p('<a class="report-item svelte-wxbf05"><div class="item-left svelte-wxbf05"><span class="status-mark svelte-wxbf05"> </span> <div class="item-meta svelte-wxbf05"><span class="item-tags svelte-wxbf05"> </span> <div class="item-badges svelte-wxbf05"><!> <!></div></div></div> <div class="item-right svelte-wxbf05"><span class="item-date svelte-wxbf05"> </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>'),La=p('<div class="pagination-wrap svelte-wxbf05"><!></div>'),Ta=p('<div class="report-list svelte-wxbf05"></div> <!>',1),qa=p('<div class="page-header svelte-wxbf05"><div class="header-top svelte-wxbf05"><div><h1 class="svelte-wxbf05">Reports</h1> <p class="subtitle svelte-wxbf05"> </p></div> <!></div> <!></div> <!>',1);function Wa(Q,N){da(N,!1);const _=x(),A=x(),h=x(),B=x(),f=x(),q=x();let r=x([]),l=x(1);const k=15;let M=x(!1);function U(e){return e==="manual-trigger"?"Manual":e==="command-line-trigger"||e==="undefined"?"CLI":"Scheduled"}function V(e){return e==="manual-trigger"?"tag":e==="command-line-trigger"||e==="undefined"?"neutral":"schedule"}ka(async()=>{try{m(r,await Ba()),await Ca(),m(M,!0)}catch(e){console.error("Failed to fetch reports",e)}}),E(()=>a(r),()=>{m(_,Math.ceil(a(r).length/k))}),E(()=>(a(r),a(l)),()=>{m(A,a(r).slice((a(l)-1)*k,a(l)*k))}),E(()=>a(r),()=>{m(h,a(r).filter(e=>e.status==="PASS").length)}),E(()=>(a(r),a(h)),()=>{m(B,a(r).length-a(h))}),E(()=>(a(r),a(h)),()=>{m(f,a(r).length?Math.round(a(h)/a(r).length*100):0)}),E(()=>a(r),()=>{m(q,a(r).slice(0,12).reverse())}),Ra(),oa();var j=qa(),H=O(j),C=s(H),$=s(C),ta=i(s($),2),fa=s(ta);t(ta),t($);var ua=i($,2);{var pa=e=>{var c=za(),v=s(c),R=s(v);t(v),I(2),t(c),w(()=>{u(v,"pass",a(f)>=80),u(v,"warn",a(f)<80&&a(f)>=50),u(v,"fail",a(f)<50),b(R,`${a(f)??""}%`)}),o(e,c)};T(ua,e=>{a(r).length>0&&e(pa)})}t(C);var _a=i(C,2);{var ga=e=>{var c=Fa(),v=O(c),R=s(v),W=s(R);t(R);var y=i(R,2),n=s(y),z=s(n);t(n);var d=i(n,2),D=s(d);t(d),t(y),t(v);var S=i(v,2),J=i(s(S),2);aa(J,5,()=>a(q),ea,(K,g,X)=>{var P=Da();L(P,"style",`animation-delay: ${X*35}ms`),w(()=>{L(P,"title",`${a(g).status??""} · ${a(g).tags??""} · ${a(g).date??""}`),u(P,"pass",a(g).status==="PASS"),u(P,"fail",a(g).status!=="PASS")}),o(K,P)}),t(J),I(2),t(S),w(()=>{L(W,"style",`width: ${(a(M)?a(f)+"%":"0")??""}`),b(z,`${a(h)??""} passed`),b(D,`${a(B)??""} failed`)}),o(e,c)};T(_a,e=>{a(r).length>0&&e(ga)})}t(H);var ba=i(H,2);{var ma=e=>{var c=Ga();o(e,c)},xa=e=>{var c=Ta(),v=O(c);aa(v,5,()=>a(A),ea,(y,n,z)=>{var d=Ia();L(d,"style",`animation-delay: ${z*45}ms`);var D=s(d),S=s(D),J=s(S,!0);t(S);var K=i(S,2),g=s(K),X=s(g,!0);t(g);var P=i(g,2),sa=s(P);const wa=Z(()=>V(a(n).triggerType));la(sa,{get variant(){return a(wa)},children:(F,ya)=>{I();var G=ia();w(Sa=>b(G,Sa),[()=>U(a(n).triggerType)],Z),o(F,G)},$$slots:{default:!0}});var ha=i(sa,2);la(ha,{variant:"neutral",children:(F,ya)=>{I();var G=ia();w(()=>b(G,`${a(n).runners??""} runner${(a(n).runners!==1?"s":"")??""}`)),o(F,G)},$$slots:{default:!0}}),t(P),t(K),t(D);var ra=i(D,2),na=s(ra),$a=s(na,!0);t(na),I(2),t(ra),t(d),w(F=>{L(d,"href",`/reports/${F??""}`),u(d,"is-pass",a(n).status==="PASS"),u(d,"is-fail",a(n).status!=="PASS"),u(S,"pass",a(n).status==="PASS"),u(S,"fail",a(n).status!=="PASS"),b(J,a(n).status==="PASS"?"✓":"✗"),b(X,a(n).tags),b($a,a(n).date)},[()=>encodeURIComponent(a(n).fileName)],Z),o(y,d)}),t(v);var R=i(v,2);{var W=y=>{var n=La(),z=s(n);Na(z,{get current(){return a(l)},get total(){return a(_)},$$events:{change:d=>m(l,d.detail)}}),t(n),o(y,n)};T(R,y=>{a(_)>1&&y(W)})}o(e,c)};T(ba,e=>{a(r).length===0?e(ma):e(xa,!1)})}w(()=>b(fa,`${a(r).length??""} run${(a(r).length!==1?"s":"")??""} recorded`)),o(Q,j),ca()}export{Wa as component};
@@ -0,0 +1,19 @@
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{a as v,t as d,s as l,c as Cs,b as G,e as Ga}from"../chunks/DFJLQFic.js";import{i as Ia}from"../chunks/DTUE7kkY.js";import{l as La,o as qa,m as M,n as E,t as za,v as n,x as H,y as Na,z as B,A as s,B as r,C as a,D as y,F as Y,G as I}from"../chunks/B0bn91RF.js";import{i as m}from"../chunks/CwBTqcbj.js";import{e as Z,s as Ss,i as ss,t as $,a as Ua}from"../chunks/Bt3-Z7H1.js";import{t as ja,s as Ea}from"../chunks/B1kE5jmt.js";import{s as Ha,a as Ja}from"../chunks/Be4iUAB0.js";import{p as Ka}from"../chunks/CJ8q7g9Y.js";import{p as Oa,f as Qa}from"../chunks/BpaMqo9O.js";import{B as Va}from"../chunks/oc0we5Us.js";var Wa=d('<div class="error-state svelte-pys2u"> </div>'),Xa=d('<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>'),Ya=d('<p class="header-meta svelte-pys2u"><span class="mono svelte-pys2u"> </span> · <!> </p>'),Za=d('<div class="stat svelte-pys2u"><span class="stat-num fail-color svelte-pys2u"> </span> <span class="stat-label svelte-pys2u">failed</span></div>'),se=d('<div class="stat svelte-pys2u"><span class="stat-num muted-color svelte-pys2u"> </span> <span class="stat-label svelte-pys2u">skipped</span></div>'),ae=d('<div class="stat svelte-pys2u"><span class="stat-num svelte-pys2u"> </span> <span class="stat-label svelte-pys2u"> </span></div>'),ee=d('<span class="scenario-count svelte-pys2u"> </span>'),te=d('<span class="tag-chip svelte-pys2u"> </span>'),re=d('<div class="example-header svelte-pys2u"><span class="scenario-status-dot svelte-pys2u"></span> <span class="svelte-pys2u"></span> <span class="scenario-duration svelte-pys2u"> </span></div>'),ne=d('<pre class="step-error svelte-pys2u"> </pre>'),ve=d('<details class="screenshot-wrap svelte-pys2u"><summary class="screenshot-toggle svelte-pys2u">Screenshot</summary> <img class="screenshot svelte-pys2u" alt="Failure screenshot"></details>'),le=d('<div class="step svelte-pys2u"><div class="step-row svelte-pys2u"><span class="step-status-icon svelte-pys2u"><!></span> <span> </span> <span class="step-name svelte-pys2u"> </span> <span class="step-duration svelte-pys2u"> </span></div> <!> <!></div>'),ie=d("<!> <!>",1),oe=d('<div class="steps svelte-pys2u"></div>'),pe=d('<div class="scenario svelte-pys2u"><button class="scenario-header svelte-pys2u"><span class="scenario-status-dot svelte-pys2u"></span> <span class="scenario-name svelte-pys2u"> <!></span> <div class="scenario-tags svelte-pys2u"></div> <span class="scenario-duration svelte-pys2u"> </span> <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" class="chevron svelte-pys2u"><polyline points="9 18 15 12 9 6" class="svelte-pys2u"></polyline></svg></button> <!></div>'),ue=d('<div class="feature svelte-pys2u"><div class="feature-header svelte-pys2u"><!> <h2 class="feature-name svelte-pys2u"> </h2> <span class="feature-file svelte-pys2u"> </span></div> <div class="scenarios svelte-pys2u"></div></div>'),de=d('<div class="report-header svelte-pys2u"><div class="header-main svelte-pys2u"><div class="header-status svelte-pys2u"><span class="status-icon svelte-pys2u"> </span> <div class="svelte-pys2u"><h1 class="svelte-pys2u"> </h1> <!></div></div> <div class="header-stats svelte-pys2u"><div class="stat svelte-pys2u"><span class="stat-num pass-color svelte-pys2u"> </span> <span class="stat-label svelte-pys2u">passed</span></div> <!> <!> <div class="stat svelte-pys2u"><span class="stat-num svelte-pys2u"> </span> <span class="stat-label svelte-pys2u">total</span></div> <!></div></div></div> <!>',1),ce=d('<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> <!>',1);function $e(Os,Qs){La(Qs,!1);const[Vs,Ws]=Ha(),Xs=()=>Ja(Ka,"$page",Vs),Ts=B(),is=B(),os=B(),Ms=B(),J=B(),Bs=B(),Fs=decodeURIComponent(Xs().params.slug),g=Oa(Fs);let x=B(null),ps=B(null),L=B(new Set);qa(async()=>{try{M(x,await Qa(Fs))}catch{M(ps,"Could not load report.")}});function Ys(t){s(L).has(t)?s(L).delete(t):s(L).add(t),M(L,s(L))}function as(t){return t>=1e3?(t/1e3).toFixed(2)+"s":t+"ms"}function Zs(t){const e=t.toLowerCase();return e==="given"?"kw-given":e==="when"?"kw-when":e==="then"?"kw-then":"kw-and"}function Ds(t){return t.tags.find(e=>/^@test[\w-]*/i.test(e))}function sa(t){const e=Ds(t);return e?[e]:t.tags.filter(o=>o!==(g==null?void 0:g.tags)&&!o.includes("suite"))}function aa(t){const e={failed:3,pending:2,skipped:1,passed:0};return t.reduce((o,K)=>(e[K.status]??0)>(e[o]??0)?K.status:o,"passed")}function ea(t){const e=new Map;for(const o of t){const q=Ds(o)||`${o.keyword}:${o.name}`;e.has(q)||e.set(q,{key:q,name:o.name,tags:sa(o),scenarios:[],duration:0,status:o.status});const w=e.get(q);w.scenarios.push(o),w.duration+=o.duration,w.status=aa(w.scenarios)}return Array.from(e.values())}E(()=>s(x),()=>{var t;M(Ts,((t=s(x))==null?void 0:t.features.flatMap(e=>e.scenarios).filter(e=>e.status==="passed").length)??0)}),E(()=>s(x),()=>{var t;M(is,((t=s(x))==null?void 0:t.features.flatMap(e=>e.scenarios).filter(e=>e.status==="failed").length)??0)}),E(()=>s(x),()=>{var t;M(os,((t=s(x))==null?void 0:t.features.flatMap(e=>e.scenarios).filter(e=>e.status==="skipped"||e.status==="pending").length)??0)}),E(()=>s(x),()=>{var t;M(Ms,((t=s(x))==null?void 0:t.features.flatMap(e=>e.scenarios).reduce((e,o)=>e+o.duration,0))??0)}),E(()=>{},()=>{M(J,(g==null?void 0:g.status)==="PASS")}),E(()=>s(x),()=>{var t;M(Bs,((t=s(x))==null?void 0:t.features.map(e=>({...e,scenarioGroups:ea(e.scenarios)})))??[])}),za(),Ia();var Ps=ce(),ta=n(H(Ps),2);{var ra=t=>{var e=Wa(),o=r(e,!0);a(e),y(()=>l(o,s(ps))),v(t,e)},na=t=>{var e=Cs(),o=H(e);{var K=w=>{var es=Xa();v(w,es)},q=w=>{var es=de(),O=H(es),Rs=r(O),us=r(Rs),ds=r(us),va=r(ds,!0);a(ds);var As=n(ds,2),cs=r(As),la=r(cs,!0);a(cs);var ia=n(cs,2);{var oa=u=>{var i=Ya(),c=r(i),k=r(c,!0);a(c);var T=n(c,2);{var z=F=>{var R=G("Manual");v(F,R)},ys=F=>{var R=Cs(),ms=H(R);{var ts=p=>{var D=G("CLI");v(p,D)},V=p=>{var D=G("Scheduled");v(p,D)};m(ms,p=>{g.triggerType==="undefined"?p(ts):p(V,!1)},!0)}v(F,R)};m(T,F=>{g.triggerType==="manual-trigger"?F(z):F(ys,!1)})}var Q=n(T);a(i),y(()=>{l(k,g.tags),l(Q,` ·
19
+ ${g.date??""}`)}),v(u,i)};m(ia,u=>{g&&u(oa)})}a(As),a(us);var Gs=n(us,2),_s=r(Gs),Is=r(_s),pa=r(Is,!0);a(Is),Y(2),a(_s);var Ls=n(_s,2);{var ua=u=>{var i=Za(),c=r(i),k=r(c,!0);a(c),Y(2),a(i),y(()=>l(k,s(is))),v(u,i)};m(Ls,u=>{s(is)>0&&u(ua)})}var qs=n(Ls,2);{var da=u=>{var i=se(),c=r(i),k=r(c,!0);a(c),Y(2),a(i),y(()=>l(k,s(os))),v(u,i)};m(qs,u=>{s(os)>0&&u(da)})}var fs=n(qs,2),zs=r(fs),ca=r(zs,!0);a(zs),Y(2),a(fs);var _a=n(fs,2);{var fa=u=>{var i=ae(),c=r(i),k=r(c,!0);a(c);var T=n(c,2),z=r(T);a(T),a(i),y(()=>{l(k,g.runners),l(z,`runner${(g.runners!==1?"s":"")??""}`)}),v(u,i)};m(_a,u=>{g&&u(fa)})}a(Gs),a(Rs),a(O);var ya=n(O,2);Z(ya,1,()=>s(Bs),ss,(u,i,c)=>{var k=ue();Ss(k,"style",`animation-delay: ${c*60}ms`);var T=r(k),z=r(T);const ys=I(()=>s(i).status==="passed"?"pass":"fail");Va(z,{get variant(){return s(ys)},children:(V,p)=>{Y();var D=G();y(()=>l(D,s(i).status)),v(V,D)},$$slots:{default:!0}});var Q=n(z,2),F=r(Q,!0);a(Q);var R=n(Q,2),ms=r(R,!0);a(R),a(T);var ts=n(T,2);Z(ts,5,()=>s(i).scenarioGroups,ss,(V,p,D)=>{var rs=pe();const Ns=I(()=>`${c}-${s(p).key}`),Us=I(()=>s(L).has(s(Ns)));Ss(rs,"style",`animation-delay: ${(c*5+D)*40}ms`);var ns=r(rs),vs=r(ns),gs=n(vs,2),js=r(gs),ma=n(js);{var ga=b=>{var C=ee(),A=r(C);a(C),y(()=>l(A,`${s(p).scenarios.length??""} cases`)),v(b,C)};m(ma,b=>{s(p).scenarios.length>1&&b(ga)})}a(gs);var hs=n(gs,2);Z(hs,5,()=>s(p).tags,ss,(b,C)=>{var A=te(),P=r(A,!0);a(A),y(()=>l(P,s(C))),v(b,A)}),a(hs);var xs=n(hs,2),ha=r(xs,!0);a(xs);var xa=n(xs,2);a(ns);var ka=n(ns,2);{var wa=b=>{var C=oe();Z(C,5,()=>s(p).scenarios,ss,(A,P,ba)=>{var Es=ie(),Hs=H(Es);{var $a=W=>{var _=re(),S=r(_),N=n(S,2);N.textContent=`Case ${ba+1}`;var U=n(N,2),ks=r(U,!0);a(U),a(_),y(ws=>{$(S,"pass",s(P).status==="passed"),$(S,"fail",s(P).status==="failed"),$(S,"skip",s(P).status==="skipped"||s(P).status==="pending"),l(ks,ws)},[()=>as(s(P).duration)],I),v(W,_)};m(Hs,W=>{s(p).scenarios.length>1&&W($a)})}var Ca=n(Hs,2);Z(Ca,1,()=>s(P).steps,ss,(W,_)=>{var S=le(),N=r(S),U=r(N),ks=r(U);{var ws=f=>{var h=G("✓");v(f,h)},Sa=f=>{var h=Cs(),X=H(h);{var Ra=j=>{var $s=G("✗");v(j,$s)},Aa=j=>{var $s=G("−");v(j,$s)};m(X,j=>{s(_).status==="failed"?j(Ra):j(Aa,!1)},!0)}v(f,h)};m(ks,f=>{s(_).status==="passed"?f(ws):f(Sa,!1)})}a(U);var ls=n(U,2),Ta=r(ls,!0);a(ls);var bs=n(ls,2),Ma=r(bs,!0);a(bs);var Js=n(bs,2),Ba=r(Js,!0);a(Js),a(N);var Ks=n(N,2);{var Fa=f=>{var h=ne(),X=r(h,!0);a(h),y(()=>l(X,s(_).error)),v(f,h)};m(Ks,f=>{s(_).error&&f(Fa)})}var Da=n(Ks,2);{var Pa=f=>{var h=ve(),X=n(r(h),2);a(h),y(()=>Ss(X,"src",`data:image/png;base64,${s(_).screenshot??""}`)),v(f,h)};m(Da,f=>{s(_).screenshot&&f(Pa)})}a(S),y((f,h)=>{$(S,"step-fail",s(_).status==="failed"),$(S,"step-skip",s(_).status==="skipped"||s(_).status==="pending"),Ua(ls,`kw ${f??""} svelte-pys2u`),l(Ta,s(_).keyword),l(Ma,s(_).name),l(Ba,h)},[()=>Zs(s(_).keyword),()=>as(s(_).duration)],I),v(W,S)}),v(A,Es)}),a(C),ja(3,C,()=>Ea,()=>({duration:200})),v(b,C)};m(ka,b=>{s(Us)&&b(wa)})}a(rs),y(b=>{$(vs,"pass",s(p).status==="passed"),$(vs,"fail",s(p).status==="failed"),$(vs,"skip",s(p).status==="skipped"||s(p).status==="pending"),l(js,`${s(p).name??""} `),l(ha,b),$(xa,"rotated",s(Us))},[()=>as(s(p).duration)],I),Ga("click",ns,()=>Ys(s(Ns))),v(V,rs)}),a(ts),a(k),y(()=>{l(F,s(i).name),l(ms,s(i).uri)}),v(u,k)}),y(u=>{$(O,"pass",s(J)),$(O,"fail",!s(J)),l(va,s(J)?"✓":"✗"),l(la,s(J)?"Passed":"Failed"),l(pa,s(Ts)),l(ca,u)},[()=>as(s(Ms))],I),v(w,es)};m(o,w=>{s(x)?w(q,!1):w(K)},!0)}v(t,e)};m(ta,t=>{s(ps)?t(ra):t(na,!1)})}v(Os,Ps),Na(),Ws()}export{$e as component};
@@ -0,0 +1,18 @@
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{l as Me,c as qe,e as K,a as f,s as C,t as S,b as F}from"../chunks/DFJLQFic.js";import{i as Je}from"../chunks/DTUE7kkY.js";import{e as xe,x as ie,aK as Oe,B as o,C as s,v as i,D as T,l as Ae,o as Be,m as n,y as je,z as J,A as e,aL as Le,F as B,aM as ne,G as he}from"../chunks/B0bn91RF.js";import{i as Z}from"../chunks/CwBTqcbj.js";import{s as we,r as me,e as ge,i as be,a as ze}from"../chunks/Bt3-Z7H1.js";import{t as de,a as Fe,f as Ie,b as Re}from"../chunks/B1kE5jmt.js";import{b as ye}from"../chunks/BKz6FZdB.js";import{i as Ue,p as $e}from"../chunks/Be4iUAB0.js";import{B as R}from"../chunks/DBk3zeq4.js";import{B as Ge}from"../chunks/oc0we5Us.js";import{s as Ke}from"../chunks/rVEKg0Ak.js";function Xe(t){return function(...r){var u=r[0];return u.preventDefault(),t==null?void 0:t.apply(this,r)}}function Ee(t,r,u){if(t.multiple)return Ve(t,r);for(var v of t.options){var d=X(v);if(Ue(d,r)){v.selected=!0;return}}(!u||r!==void 0)&&(t.selectedIndex=-1)}function He(t,r){xe(()=>{var u=new MutationObserver(()=>{var v=t.__value;Ee(t,v)});return u.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),()=>{u.disconnect()}})}function Qe(t,r,u=r){var v=!0;Me(t,"change",d=>{var _=d?"[selected]":":checked",y;if(t.multiple)y=[].map.call(t.querySelectorAll(_),X);else{var k=t.querySelector(_)??t.querySelector("option:not([disabled])");y=k&&X(k)}u(y)}),xe(()=>{var d=r();if(Ee(t,d,v),v&&d===void 0){var _=t.querySelector(":checked");_!==null&&(d=X(_),u(d))}t.__value=d,v=!1}),He(t)}function Ve(t,r){for(var u of t.options)u.selected=~r.indexOf(X(u))}function X(t){return"__value"in t?t.__value:t.value}const H="http://localhost:3001";async function We(){const t=await fetch(`${H}/schedules`),{schedules:r}=await t.json();return r??[]}async function le(){const t=await fetch(`${H}/cron-jobs`),{cronJobs:r}=await t.json();return r??[]}async function Ye({taskName:t,cronExpression:r,tags:u,isEditing:v,editTaskName:d}){const _=u.replace(/\sOR\s/gi,j=>j.toLowerCase()),y=v?`${H}/cron-jobs/${d}`:`${H}/cron-jobs`;return(await fetch(y,{method:v?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cronExpression:r,taskName:t,tags:_})})).json()}async function Ze(t){return(await fetch(`${H}/cron-jobs/${t}`,{method:"DELETE"})).json()}function et(t){const r=t-1;return r*r*r+1}var tt=S('<div class="backdrop svelte-aus6t7" role="presentation"><div class="panel svelte-aus6t7" role="dialog" aria-modal="true"><div class="header svelte-aus6t7"><h3 class="title svelte-aus6t7"> </h3> <button class="close-btn svelte-aus6t7" aria-label="Close"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M1 1l12 12M13 1L1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></path></svg></button></div> <div class="body svelte-aus6t7"><!></div></div></div>');function ke(t,r){let u=$e(r,"open",12,!1),v=$e(r,"title",8,"");function d(){u(!1)}function _(g){g.target===g.currentTarget&&d()}function y(g){g.key==="Escape"&&d()}var k=qe();K("keydown",Oe,y);var x=ie(k);{var j=g=>{var l=tt(),b=o(l),O=o(b),U=o(O),ee=o(U,!0);s(U);var te=i(U,2);s(O);var Q=i(O,2),ae=o(Q);Ke(ae,r,"default",{}),s(Q),s(b),s(l),T(()=>{we(b,"aria-label",v()),C(ee,v())}),K("click",te,d),de(3,b,()=>Fe,()=>({start:.96,duration:260,easing:et})),K("click",l,_),K("keydown",l,se=>se.key==="Escape"&&d()),de(3,l,()=>Ie,()=>({duration:200})),f(g,l)};Z(x,g=>{u()&&g(j)})}f(t,k)}var at=S("<option> </option>"),st=S('<p class="form-error svelte-1ugkbyh"> </p>'),rt=S('<form class="modal-form svelte-1ugkbyh"><div class="field"><div class="field-label"><span>Task Name</span> <span class="field-hint"> </span></div> <input type="text" class="field-input" placeholder="nightly-login-suite" required></div> <div class="field"><div class="field-label"><span>Schedule</span></div> <select class="field-input" required><option disabled selected>Select a schedule</option><!></select></div> <div class="field"><div class="field-label"><span>Tags</span> <span class="field-hint">Multiple: @test-1 or @test-2</span></div> <input type="text" class="field-input" placeholder="@suite-login" required></div> <!> <!></form>'),ot=S('<p class="confirm-text svelte-1ugkbyh">Are you sure you want to delete <strong class="svelte-1ugkbyh"> </strong>? This cannot be undone.</p> <div class="confirm-actions svelte-1ugkbyh"><!> <!></div>',1),nt=S("<div> </div>"),lt=S('<p class="empty svelte-1ugkbyh">No scheduled tests yet. Create one to get started.</p>'),it=S('<tr class="job-row svelte-1ugkbyh"><td class="job-name svelte-1ugkbyh"> </td><td><!></td><td><span class="tag-text svelte-1ugkbyh"> </span></td><td class="actions-cell svelte-1ugkbyh"><!> <!></td></tr>'),dt=S('<div class="table-wrap svelte-1ugkbyh"><table class="data-table"><thead><tr><th>Name</th><th>Schedule</th><th>Tags</th><th>Actions</th></tr></thead><tbody></tbody></table></div>'),vt=S('<!> <!> <div class="page-header svelte-1ugkbyh"><div class="header-row svelte-1ugkbyh"><div><h1 class="svelte-1ugkbyh">Scheduled Tests</h1> <p class="subtitle svelte-1ugkbyh">Manage recurring test runs via cron jobs</p></div> <!></div></div> <!> <div class="card" style="padding: 0; overflow: hidden;"><!></div>',1);function kt(t,r){Ae(r,!1);const u=/^(\*|([0-5]?[0-9])) (\*|([01]?[0-9]|2[0-3])) (\*|([01]?[0-9]|3[01])) (\*|([1-9]|1[0-2])) (\*|[0-6])$/;let v=J([]),d=J([]),_=J(null),y=J(!1),k=J(!1),x=J(!1),j="",g=J(""),l=J({taskName:"",cronExpression:"",tags:""}),b=J("");function O(a,c){n(_,{type:a,message:c}),setTimeout(()=>n(_,null),4e3)}function U(){n(x,!1),j="",n(l,{taskName:"",cronExpression:"",tags:""}),n(b,""),n(y,!0)}function ee(a){n(x,!0),j=a.taskName,n(l,{taskName:a.taskName,cronExpression:a.cronExpression,tags:a.tags}),n(b,""),n(y,!0)}function te(a){n(g,a),n(k,!0)}async function Q(){if(!e(l).taskName||!e(l).cronExpression||!e(l).tags){n(b,"All fields are required.");return}if(!u.test(e(l).cronExpression)){n(b,"Invalid cron expression.");return}n(b,"");try{(await Ye({...e(l),isEditing:e(x),editTaskName:j})).message?(O("success",`${e(x)?"Updated":"Added"}: ${e(l).taskName}`),n(y,!1),n(v,await le())):n(b,"Failed to save. Please try again.")}catch{n(b,"Network error.")}}async function ae(){try{(await Ze(e(g))).message?(O("success",`Deleted: ${e(g)}`),n(v,await le())):O("error","Could not delete cron job.")}catch{O("error","Network error.")}n(k,!1),n(g,"")}function se(a){var c;return((c=e(d).find(p=>p.value===a))==null?void 0:c.label)??a}Be(async()=>{await(async a=>(n(v,a[0]),n(d,a[1])))(await Promise.all([le(),We()]))}),Je();var ve=vt(),ue=ie(ve);const Ne=he(()=>e(x)?"Edit Cron Job":"New Cron Job");ke(ue,{get title(){return e(Ne)},get open(){return e(y)},set open(a){n(y,a)},children:(a,c)=>{var p=rt(),E=o(p),A=o(E),N=i(o(A),2),I=o(N,!0);s(N),s(A);var w=i(A,2);me(w),s(E);var P=i(E,2),D=i(o(P),2);T(()=>{e(l),Le(()=>{e(d)})});var M=o(D);M.value=((M.__value="")==null,"");var L=i(M);ge(L,1,()=>e(d),be,(h,m)=>{var $=at(),q={},oe=o($,!0);s($),T(()=>{q!==(q=e(m).value)&&($.value=($.__value=e(m).value)==null?"":e(m).value),C(oe,e(m).label)}),f(h,$)}),s(D),s(P);var z=i(P,2),G=i(o(z),2);me(G),s(z);var V=i(z,2);{var W=h=>{var m=st(),$=o(m,!0);s(m),T(()=>C($,e(b))),f(h,m)};Z(V,h=>{e(b)&&h(W)})}var Y=i(V,2);R(Y,{type:"submit",size:"md",children:(h,m)=>{B();var $=F();T(()=>C($,e(x)?"Save Changes":"Add Cron Job")),f(h,$)},$$slots:{default:!0}}),s(p),T(()=>{C(I,e(x)?"Name is the ID — cannot be changed":"Use a unique, meaningful name"),w.disabled=e(x)}),ye(w,()=>e(l).taskName,h=>ne(l,e(l).taskName=h)),Qe(D,()=>e(l).cronExpression,h=>ne(l,e(l).cronExpression=h)),ye(G,()=>e(l).tags,h=>ne(l,e(l).tags=h)),K("submit",p,Xe(Q)),f(a,p)},$$slots:{default:!0},$$legacy:!0});var ce=i(ue,2);ke(ce,{title:"Delete Cron Job",get open(){return e(k)},set open(a){n(k,a)},children:(a,c)=>{var p=ot(),E=ie(p),A=i(o(E)),N=o(A,!0);s(A),B(),s(E);var I=i(E,2),w=o(I);R(w,{variant:"danger",$$events:{click:ae},children:(D,M)=>{B();var L=F("Delete");f(D,L)},$$slots:{default:!0}});var P=i(w,2);R(P,{variant:"ghost",$$events:{click:()=>n(k,!1)},children:(D,M)=>{B();var L=F("Cancel");f(D,L)},$$slots:{default:!0}}),s(I),T(()=>C(N,e(g))),f(a,p)},$$slots:{default:!0},$$legacy:!0});var re=i(ce,2),fe=o(re),Ce=i(o(fe),2);R(Ce,{$$events:{click:U},children:(a,c)=>{B();var p=F("+ New Job");f(a,p)},$$slots:{default:!0}}),s(fe),s(re);var pe=i(re,2);{var Te=a=>{var c=nt(),p=o(c,!0);s(c),T(()=>{ze(c,`toast alert alert-${e(_).type??""} svelte-1ugkbyh`),C(p,e(_).message)}),de(3,c,()=>Re,()=>({y:-8,duration:240})),f(a,c)};Z(pe,a=>{e(_)&&a(Te)})}var _e=i(pe,2),Se=o(_e);{var Pe=a=>{var c=lt();f(a,c)},De=a=>{var c=dt(),p=o(c),E=i(o(p));ge(E,5,()=>e(v),be,(A,N,I)=>{var w=it();we(w,"style",`animation-delay: ${I*45}ms`);var P=o(w),D=o(P,!0);s(P);var M=i(P),L=o(M);Ge(L,{variant:"schedule",children:(m,$)=>{B();var q=F();T(oe=>C(q,oe),[()=>se(e(N).cronExpression)],he),f(m,q)},$$slots:{default:!0}}),s(M);var z=i(M),G=o(z),V=o(G,!0);s(G),s(z);var W=i(z),Y=o(W);R(Y,{variant:"ghost",size:"sm",$$events:{click:()=>ee(e(N))},children:(m,$)=>{B();var q=F("Edit");f(m,q)},$$slots:{default:!0}});var h=i(Y,2);R(h,{variant:"danger",size:"sm",$$events:{click:()=>te(e(N).taskName)},children:(m,$)=>{B();var q=F("Delete");f(m,q)},$$slots:{default:!0}}),s(W),s(w),T(()=>{C(D,e(N).taskName),C(V,e(N).tags)}),f(A,w)}),s(E),s(p),s(c),f(a,c)};Z(Se,a=>{e(v).length===0?a(Pe):a(De,!1)})}s(_e),f(t,ve),je()}export{kt as component};
@@ -0,0 +1 @@
1
+ {"version":"1781425198782"}
@@ -0,0 +1,111 @@
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 process from 'node:process';
19
+
20
+ /* global "" */
21
+
22
+ const expected = new Set([
23
+ 'SOCKET_PATH',
24
+ 'HOST',
25
+ 'PORT',
26
+ 'ORIGIN',
27
+ 'XFF_DEPTH',
28
+ 'ADDRESS_HEADER',
29
+ 'PROTOCOL_HEADER',
30
+ 'HOST_HEADER',
31
+ 'PORT_HEADER',
32
+ 'BODY_SIZE_LIMIT',
33
+ 'SHUTDOWN_TIMEOUT',
34
+ 'IDLE_TIMEOUT',
35
+ 'KEEP_ALIVE_TIMEOUT',
36
+ 'HEADERS_TIMEOUT'
37
+ ]);
38
+
39
+ const expected_unprefixed = new Set(['LISTEN_PID', 'LISTEN_FDS']);
40
+
41
+ if ("") {
42
+ for (const name in process.env) {
43
+ if (name.startsWith("")) {
44
+ const unprefixed = name.slice("".length);
45
+ if (!expected.has(unprefixed)) {
46
+ throw new Error(
47
+ `You should change envPrefix (${""}) to avoid conflicts with existing environment variables — unexpectedly saw ${name}`
48
+ );
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ /**
55
+ * @param {string} name
56
+ * @param {any} fallback
57
+ */
58
+ function env(name, fallback) {
59
+ const prefix = expected_unprefixed.has(name) ? '' : "";
60
+ const prefixed = prefix + name;
61
+ return prefixed in process.env ? process.env[prefixed] : fallback;
62
+ }
63
+
64
+ const integer_regexp = /^\d+$/;
65
+
66
+ /**
67
+ * Throw a consistently-structured parsing error for environment variables.
68
+ * @param {string} name
69
+ * @param {any} value
70
+ * @param {string} description
71
+ * @returns {never}
72
+ */
73
+ function parsing_error(name, value, description) {
74
+ throw new Error(
75
+ `Invalid value for environment variable ${name}: ${JSON.stringify(value)} (${description})`
76
+ );
77
+ }
78
+
79
+ /**
80
+ * Check the environment for a timeout value (non-negative integer) in seconds.
81
+ * @param {string} name
82
+ * @param {number} [fallback]
83
+ * @returns {number | undefined}
84
+ */
85
+ function timeout_env(name, fallback) {
86
+ const raw = env(name, fallback);
87
+ if (!raw) {
88
+ return fallback;
89
+ }
90
+
91
+ if (!integer_regexp.test(raw)) {
92
+ parsing_error(name, raw, 'should be a non-negative integer');
93
+ }
94
+
95
+ const parsed = Number.parseInt(raw, 10);
96
+
97
+ // We don't technically need to check `Number.isNaN` because the value already passed the regexp test.
98
+ // However, just in case there's some new codepath introduced somewhere down the line, it's probably good
99
+ // to stick this in here.
100
+ if (Number.isNaN(parsed)) {
101
+ parsing_error(name, raw, 'should be a non-negative integer');
102
+ }
103
+
104
+ if (parsed < 0) {
105
+ parsing_error(name, raw, 'should be a non-negative integer');
106
+ }
107
+
108
+ return parsed;
109
+ }
110
+
111
+ export { env, timeout_env };