plum-e2e 1.1.1 → 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 (334) hide show
  1. package/README.md +142 -70
  2. package/backend/Dockerfile +4 -2
  3. package/backend/_scaffold/utils/browser.ts +1 -0
  4. package/backend/app.js +4 -2
  5. package/backend/config/scripts/generate-report.js +38 -30
  6. package/{.prettierignore → backend/entrypoint.sh} +7 -6
  7. package/backend/package-lock.json +453 -10
  8. package/backend/package.json +5 -2
  9. package/backend/prisma/migrations/20260614000000_init/migration.sql +35 -0
  10. package/backend/prisma/migrations/20260614000001_add_project/migration.sql +8 -0
  11. package/backend/prisma/migrations/migration_lock.toml +3 -0
  12. package/backend/prisma/schema.prisma +53 -0
  13. package/backend/routes/backup.routes.js +50 -0
  14. package/backend/routes/cron.routes.js +9 -60
  15. package/backend/routes/reports.routes.js +39 -6
  16. package/backend/routes/settings.routes.js +43 -0
  17. package/backend/server.js +52 -1
  18. package/backend/services/backupService.js +88 -0
  19. package/backend/services/cronService.js +68 -78
  20. package/backend/{routes/schedules.routes.js → services/prisma.js} +3 -13
  21. package/backend/services/reportService.js +48 -20
  22. package/backend/services/settingsService.js +36 -0
  23. package/bin/plum.js +216 -34
  24. package/docker-compose.yml +24 -0
  25. package/frontend/.svelte-kit/adapter-node/.vite/manifest.json +190 -0
  26. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Badge.DLLowvEA.css +17 -0
  27. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Button.cBruH0aD.css +17 -0
  28. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.D7eM-6MV.css +17 -0
  29. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BVnUajEa.css +17 -0
  30. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CGnCsn5q.css +17 -0
  31. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DBhBrHFz.css +17 -0
  32. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DOqo0UR4.css +17 -0
  33. package/frontend/.svelte-kit/adapter-node/chunks/Badge.js +30 -0
  34. package/frontend/.svelte-kit/adapter-node/chunks/Button.js +32 -0
  35. package/frontend/.svelte-kit/adapter-node/chunks/attributes.js +34 -0
  36. package/frontend/.svelte-kit/adapter-node/chunks/client.js +59 -0
  37. package/{backend/services/scheduleService.js → frontend/.svelte-kit/adapter-node/chunks/equality.js} +13 -16
  38. package/frontend/.svelte-kit/adapter-node/chunks/escaping.js +36 -0
  39. package/frontend/.svelte-kit/adapter-node/chunks/exports.js +247 -0
  40. package/frontend/.svelte-kit/adapter-node/chunks/index.js +1135 -0
  41. package/frontend/.svelte-kit/adapter-node/chunks/internal.js +695 -0
  42. package/frontend/.svelte-kit/adapter-node/chunks/reports.js +57 -0
  43. package/frontend/.svelte-kit/adapter-node/entries/fallbacks/error.svelte.js +44 -0
  44. package/frontend/.svelte-kit/adapter-node/entries/pages/_layout.svelte.js +181 -0
  45. package/frontend/.svelte-kit/adapter-node/entries/pages/_page.svelte.js +164 -0
  46. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_page.svelte.js +141 -0
  47. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_slug_/_page.svelte.js +42 -0
  48. package/frontend/.svelte-kit/adapter-node/entries/pages/scheduled-tests/_page.svelte.js +179 -0
  49. package/frontend/.svelte-kit/adapter-node/index.js +3144 -0
  50. package/frontend/.svelte-kit/adapter-node/internal.js +30 -0
  51. package/frontend/.svelte-kit/adapter-node/manifest-full.js +77 -0
  52. package/frontend/.svelte-kit/adapter-node/manifest.js +81 -0
  53. package/frontend/.svelte-kit/adapter-node/nodes/0.js +25 -0
  54. package/frontend/.svelte-kit/adapter-node/nodes/1.js +25 -0
  55. package/frontend/.svelte-kit/adapter-node/nodes/2.js +25 -0
  56. package/frontend/.svelte-kit/adapter-node/nodes/3.js +25 -0
  57. package/frontend/.svelte-kit/adapter-node/nodes/4.js +25 -0
  58. package/frontend/.svelte-kit/adapter-node/nodes/5.js +25 -0
  59. package/frontend/.svelte-kit/ambient.d.ts +240 -0
  60. package/frontend/.svelte-kit/generated/client/app.js +51 -0
  61. package/frontend/.svelte-kit/generated/client/matchers.js +18 -0
  62. package/frontend/.svelte-kit/generated/client/nodes/0.js +18 -0
  63. package/frontend/.svelte-kit/generated/client/nodes/1.js +18 -0
  64. package/frontend/.svelte-kit/generated/client/nodes/2.js +18 -0
  65. package/frontend/.svelte-kit/generated/client/nodes/3.js +18 -0
  66. package/frontend/.svelte-kit/generated/client/nodes/4.js +18 -0
  67. package/frontend/.svelte-kit/generated/client/nodes/5.js +18 -0
  68. package/frontend/.svelte-kit/generated/client-optimized/app.js +51 -0
  69. package/frontend/.svelte-kit/generated/client-optimized/matchers.js +18 -0
  70. package/frontend/.svelte-kit/generated/client-optimized/nodes/0.js +18 -0
  71. package/frontend/.svelte-kit/generated/client-optimized/nodes/1.js +18 -0
  72. package/frontend/.svelte-kit/generated/client-optimized/nodes/2.js +18 -0
  73. package/frontend/.svelte-kit/generated/client-optimized/nodes/3.js +18 -0
  74. package/frontend/.svelte-kit/generated/client-optimized/nodes/4.js +18 -0
  75. package/frontend/.svelte-kit/generated/client-optimized/nodes/5.js +18 -0
  76. package/frontend/.svelte-kit/generated/root.js +20 -0
  77. package/frontend/.svelte-kit/generated/root.svelte +83 -0
  78. package/frontend/.svelte-kit/generated/server/internal.js +65 -0
  79. package/frontend/.svelte-kit/non-ambient.d.ts +42 -0
  80. package/frontend/.svelte-kit/output/client/.vite/manifest.json +289 -0
  81. package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.CnXRuPt4.css +17 -0
  82. package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.CGnCsn5q.css +17 -0
  83. package/frontend/.svelte-kit/output/client/_app/immutable/assets/3.BVnUajEa.css +17 -0
  84. package/frontend/.svelte-kit/output/client/_app/immutable/assets/4.DBhBrHFz.css +17 -0
  85. package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.D93VAB-w.css +17 -0
  86. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Badge.DLLowvEA.css +17 -0
  87. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Button.cBruH0aD.css +17 -0
  88. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.D7eM-6MV.css +17 -0
  89. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BVnUajEa.css +17 -0
  90. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CGnCsn5q.css +17 -0
  91. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DBhBrHFz.css +17 -0
  92. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DOqo0UR4.css +17 -0
  93. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B0bn91RF.js +18 -0
  94. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B1kE5jmt.js +23 -0
  95. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BKz6FZdB.js +18 -0
  96. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Be4iUAB0.js +18 -0
  97. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BpaMqo9O.js +18 -0
  98. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Bt3-Z7H1.js +18 -0
  99. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CHV2KnPr.js +18 -0
  100. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CJ8q7g9Y.js +18 -0
  101. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Cit9MuSg.js +20 -0
  102. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CwBTqcbj.js +18 -0
  103. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DBk3zeq4.js +18 -0
  104. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DFJLQFic.js +18 -0
  105. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DTUE7kkY.js +18 -0
  106. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/IYPwzKs_.js +20 -0
  107. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/oc0we5Us.js +18 -0
  108. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/rVEKg0Ak.js +18 -0
  109. package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.C2MbX06K.js +19 -0
  110. package/frontend/.svelte-kit/output/client/_app/immutable/entry/start.GiBry-lw.js +18 -0
  111. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.BsCYK-Tn.js +21 -0
  112. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/1.N4gjrCnX.js +18 -0
  113. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.D9yQNzK8.js +18 -0
  114. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/3.CBC5WvNb.js +18 -0
  115. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/4.BU6UZHSE.js +19 -0
  116. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.Dzzfrntl.js +18 -0
  117. package/frontend/.svelte-kit/output/client/_app/version.json +1 -0
  118. package/frontend/.svelte-kit/output/client/favicon.png +0 -0
  119. package/frontend/.svelte-kit/output/server/.vite/manifest.json +190 -0
  120. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Badge.DLLowvEA.css +17 -0
  121. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Button.cBruH0aD.css +17 -0
  122. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.D7eM-6MV.css +17 -0
  123. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BVnUajEa.css +17 -0
  124. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CGnCsn5q.css +17 -0
  125. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DBhBrHFz.css +17 -0
  126. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DOqo0UR4.css +17 -0
  127. package/frontend/.svelte-kit/output/server/chunks/Badge.js +30 -0
  128. package/frontend/.svelte-kit/output/server/chunks/Button.js +32 -0
  129. package/frontend/.svelte-kit/output/server/chunks/attributes.js +34 -0
  130. package/frontend/.svelte-kit/output/server/chunks/client.js +59 -0
  131. package/frontend/.svelte-kit/output/server/chunks/equality.js +31 -0
  132. package/frontend/.svelte-kit/output/server/chunks/escaping.js +36 -0
  133. package/frontend/.svelte-kit/output/server/chunks/exports.js +247 -0
  134. package/frontend/.svelte-kit/output/server/chunks/index.js +1135 -0
  135. package/frontend/.svelte-kit/output/server/chunks/internal.js +695 -0
  136. package/frontend/.svelte-kit/output/server/chunks/reports.js +57 -0
  137. package/frontend/.svelte-kit/output/server/entries/fallbacks/error.svelte.js +44 -0
  138. package/frontend/.svelte-kit/output/server/entries/pages/_layout.svelte.js +181 -0
  139. package/frontend/.svelte-kit/output/server/entries/pages/_page.svelte.js +164 -0
  140. package/frontend/.svelte-kit/output/server/entries/pages/reports/_page.svelte.js +141 -0
  141. package/frontend/.svelte-kit/output/server/entries/pages/reports/_slug_/_page.svelte.js +42 -0
  142. package/frontend/.svelte-kit/output/server/entries/pages/scheduled-tests/_page.svelte.js +179 -0
  143. package/frontend/.svelte-kit/output/server/index.js +3144 -0
  144. package/frontend/.svelte-kit/output/server/internal.js +30 -0
  145. package/frontend/.svelte-kit/output/server/manifest-full.js +77 -0
  146. package/frontend/.svelte-kit/output/server/manifest.js +77 -0
  147. package/frontend/.svelte-kit/output/server/nodes/0.js +25 -0
  148. package/frontend/.svelte-kit/output/server/nodes/1.js +25 -0
  149. package/frontend/.svelte-kit/output/server/nodes/2.js +25 -0
  150. package/frontend/.svelte-kit/output/server/nodes/3.js +25 -0
  151. package/frontend/.svelte-kit/output/server/nodes/4.js +25 -0
  152. package/frontend/.svelte-kit/output/server/nodes/5.js +25 -0
  153. package/frontend/.svelte-kit/tsconfig.json +49 -0
  154. package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css +17 -0
  155. package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css.br +0 -0
  156. package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css.gz +0 -0
  157. package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css +17 -0
  158. package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css.br +0 -0
  159. package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css.gz +0 -0
  160. package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css +17 -0
  161. package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css.br +0 -0
  162. package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css.gz +0 -0
  163. package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css +17 -0
  164. package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css.br +0 -0
  165. package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css.gz +0 -0
  166. package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css +17 -0
  167. package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css.br +0 -0
  168. package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css.gz +0 -0
  169. package/frontend/build/client/_app/immutable/assets/Badge.DLLowvEA.css +17 -0
  170. package/frontend/build/client/_app/immutable/assets/Badge.DLLowvEA.css.br +0 -0
  171. package/frontend/build/client/_app/immutable/assets/Badge.DLLowvEA.css.gz +0 -0
  172. package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css +17 -0
  173. package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css.br +0 -0
  174. package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css.gz +0 -0
  175. package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css +17 -0
  176. package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css.br +0 -0
  177. package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css.gz +0 -0
  178. package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css +17 -0
  179. package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css.br +0 -0
  180. package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css.gz +0 -0
  181. package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css +17 -0
  182. package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css.br +0 -0
  183. package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css.gz +0 -0
  184. package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css +17 -0
  185. package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css.br +0 -0
  186. package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css.gz +0 -0
  187. package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css +17 -0
  188. package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css.br +0 -0
  189. package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css.gz +0 -0
  190. package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js +18 -0
  191. package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js.br +0 -0
  192. package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js.gz +0 -0
  193. package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js +23 -0
  194. package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js.br +0 -0
  195. package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js.gz +0 -0
  196. package/frontend/build/client/_app/immutable/chunks/BKz6FZdB.js +18 -0
  197. package/frontend/build/client/_app/immutable/chunks/BKz6FZdB.js.br +0 -0
  198. package/frontend/build/client/_app/immutable/chunks/BKz6FZdB.js.gz +0 -0
  199. package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js +18 -0
  200. package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js.br +0 -0
  201. package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js.gz +0 -0
  202. package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js +18 -0
  203. package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js.br +0 -0
  204. package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js.gz +0 -0
  205. package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js +18 -0
  206. package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js.br +0 -0
  207. package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js.gz +0 -0
  208. package/frontend/build/client/_app/immutable/chunks/CHV2KnPr.js +18 -0
  209. package/frontend/build/client/_app/immutable/chunks/CHV2KnPr.js.br +18 -0
  210. package/frontend/build/client/_app/immutable/chunks/CHV2KnPr.js.gz +0 -0
  211. package/frontend/build/client/_app/immutable/chunks/CJ8q7g9Y.js +18 -0
  212. package/{resources/comments-format.text → frontend/build/client/_app/immutable/chunks/CJ8q7g9Y.js.br} +0 -0
  213. package/frontend/build/client/_app/immutable/chunks/CJ8q7g9Y.js.gz +0 -0
  214. package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js +20 -0
  215. package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js.br +0 -0
  216. package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js.gz +0 -0
  217. package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js +18 -0
  218. package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js.br +0 -0
  219. package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js.gz +0 -0
  220. package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js +18 -0
  221. package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js.br +0 -0
  222. package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js.gz +0 -0
  223. package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js +18 -0
  224. package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js.br +0 -0
  225. package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js.gz +0 -0
  226. package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js +18 -0
  227. package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js.br +0 -0
  228. package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js.gz +0 -0
  229. package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js +20 -0
  230. package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js.br +0 -0
  231. package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js.gz +0 -0
  232. package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js +18 -0
  233. package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js.br +0 -0
  234. package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js.gz +0 -0
  235. package/frontend/build/client/_app/immutable/chunks/rVEKg0Ak.js +18 -0
  236. package/frontend/build/client/_app/immutable/chunks/rVEKg0Ak.js.br +0 -0
  237. package/frontend/build/client/_app/immutable/chunks/rVEKg0Ak.js.gz +0 -0
  238. package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js +19 -0
  239. package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js.br +0 -0
  240. package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js.gz +0 -0
  241. package/frontend/build/client/_app/immutable/entry/start.GiBry-lw.js +18 -0
  242. package/frontend/build/client/_app/immutable/entry/start.GiBry-lw.js.br +18 -0
  243. package/frontend/build/client/_app/immutable/entry/start.GiBry-lw.js.gz +0 -0
  244. package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js +21 -0
  245. package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js.br +0 -0
  246. package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js.gz +0 -0
  247. package/frontend/build/client/_app/immutable/nodes/1.N4gjrCnX.js +18 -0
  248. package/frontend/build/client/_app/immutable/nodes/1.N4gjrCnX.js.br +0 -0
  249. package/frontend/build/client/_app/immutable/nodes/1.N4gjrCnX.js.gz +0 -0
  250. package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js +18 -0
  251. package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js.br +0 -0
  252. package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js.gz +0 -0
  253. package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js +18 -0
  254. package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js.br +0 -0
  255. package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js.gz +0 -0
  256. package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js +19 -0
  257. package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js.br +0 -0
  258. package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js.gz +0 -0
  259. package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js +18 -0
  260. package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js.br +0 -0
  261. package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js.gz +0 -0
  262. package/frontend/build/client/_app/version.json +1 -0
  263. package/frontend/build/client/_app/version.json.br +0 -0
  264. package/frontend/build/client/_app/version.json.gz +0 -0
  265. package/frontend/build/client/favicon.png +0 -0
  266. package/frontend/build/env.js +111 -0
  267. package/frontend/build/handler.js +1511 -0
  268. package/frontend/build/index.js +362 -0
  269. package/frontend/build/server/chunks/0-BFfqmlsS.js +26 -0
  270. package/frontend/build/server/chunks/0-BFfqmlsS.js.map +17 -0
  271. package/frontend/build/server/chunks/1-hso3H4Ax.js +26 -0
  272. package/frontend/build/server/chunks/1-hso3H4Ax.js.map +17 -0
  273. package/frontend/build/server/chunks/2-BSZWXCWp.js +26 -0
  274. package/frontend/build/server/chunks/2-BSZWXCWp.js.map +17 -0
  275. package/frontend/build/server/chunks/3-BYumY9dv.js +26 -0
  276. package/frontend/build/server/chunks/3-BYumY9dv.js.map +17 -0
  277. package/frontend/build/server/chunks/4-2UUrCVtM.js +26 -0
  278. package/frontend/build/server/chunks/4-2UUrCVtM.js.map +17 -0
  279. package/frontend/build/server/chunks/5-C2_y_fwT.js +26 -0
  280. package/frontend/build/server/chunks/5-C2_y_fwT.js.map +17 -0
  281. package/frontend/build/server/chunks/Badge-CC4U7C0c.js +30 -0
  282. package/frontend/build/server/chunks/Badge-CC4U7C0c.js.map +17 -0
  283. package/frontend/build/server/chunks/Button-BLkPicwS.js +33 -0
  284. package/frontend/build/server/chunks/Button-BLkPicwS.js.map +17 -0
  285. package/frontend/build/server/chunks/_layout.svelte-Bfxcj9C6.js +183 -0
  286. package/frontend/build/server/chunks/_layout.svelte-Bfxcj9C6.js.map +17 -0
  287. package/frontend/build/server/chunks/_page.svelte-DEK6UvaI.js +45 -0
  288. package/frontend/build/server/chunks/_page.svelte-DEK6UvaI.js.map +17 -0
  289. package/frontend/build/server/chunks/_page.svelte-DScVdHOq.js +142 -0
  290. package/frontend/build/server/chunks/_page.svelte-DScVdHOq.js.map +17 -0
  291. package/frontend/build/server/chunks/_page.svelte-Ns7w2sZt.js +180 -0
  292. package/frontend/build/server/chunks/_page.svelte-Ns7w2sZt.js.map +17 -0
  293. package/frontend/build/server/chunks/_page.svelte-s6ZIOitT.js +165 -0
  294. package/frontend/build/server/chunks/_page.svelte-s6ZIOitT.js.map +17 -0
  295. package/frontend/build/server/chunks/attributes-BeaNKpgU.js +34 -0
  296. package/frontend/build/server/chunks/attributes-BeaNKpgU.js.map +17 -0
  297. package/frontend/build/server/chunks/client-C9IaEwNo.js +52 -0
  298. package/frontend/build/server/chunks/client-C9IaEwNo.js.map +17 -0
  299. package/frontend/build/server/chunks/error.svelte-HKBv5sQT.js +45 -0
  300. package/frontend/build/server/chunks/error.svelte-HKBv5sQT.js.map +17 -0
  301. package/frontend/build/server/chunks/escaping-CqgfEcN3.js +36 -0
  302. package/frontend/build/server/chunks/escaping-CqgfEcN3.js.map +17 -0
  303. package/frontend/build/server/chunks/exports-OxlCJ8yE.js +192 -0
  304. package/frontend/build/server/chunks/exports-OxlCJ8yE.js.map +17 -0
  305. package/frontend/build/server/chunks/index-CjHlq1kt.js +1076 -0
  306. package/frontend/build/server/chunks/index-CjHlq1kt.js.map +17 -0
  307. package/frontend/build/server/chunks/reports-D3ZeYSmi.js +56 -0
  308. package/frontend/build/server/chunks/reports-D3ZeYSmi.js.map +17 -0
  309. package/frontend/build/server/index.js +5015 -0
  310. package/frontend/build/server/index.js.map +17 -0
  311. package/frontend/build/server/manifest.js +84 -0
  312. package/frontend/build/server/manifest.js.map +17 -0
  313. package/frontend/build/shims.js +49 -0
  314. package/frontend/package-lock.json +2 -2
  315. package/frontend/package.json +1 -1
  316. package/frontend/src/lib/api/reports.js +38 -27
  317. package/frontend/src/lib/api/schedules.js +9 -25
  318. package/frontend/src/lib/api/settings.js +48 -0
  319. package/frontend/src/lib/components/layout/Nav.svelte +2 -1
  320. package/frontend/src/lib/components/layout/RunnerPanel.svelte +160 -21
  321. package/frontend/src/lib/components/ui/Terminal.svelte +2 -2
  322. package/frontend/src/lib/stores/runner.js +9 -0
  323. package/frontend/src/routes/+page.svelte +10 -3
  324. package/frontend/src/routes/reports/+page.svelte +342 -51
  325. package/frontend/src/routes/reports/[slug]/+page.svelte +2 -0
  326. package/frontend/src/routes/scheduled-tests/+page.svelte +247 -11
  327. package/frontend/src/routes/settings/+page.svelte +410 -0
  328. package/package.json +6 -2
  329. package/.claude/settings.local.json +0 -27
  330. package/.husky/pre-commit +0 -2
  331. package/.prettierrc +0 -15
  332. package/.vscode/settings.json +0 -10
  333. package/backend/config/scripts/create-settings.js +0 -53
  334. package/license-config.json +0 -37
@@ -0,0 +1,410 @@
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
+ <script>
19
+ import { onMount } from 'svelte';
20
+ import { fly } from 'svelte/transition';
21
+ import { fetchProject, saveProject, exportBackup, importBackup } from '$lib/api/settings';
22
+ import Button from '$lib/components/ui/Button.svelte';
23
+
24
+ let project = { name: '', logoUrl: '' };
25
+ let projectSaving = false;
26
+ let toast = null;
27
+
28
+ let importFile = null;
29
+ let importing = false;
30
+ let exporting = false;
31
+ let fileInput;
32
+
33
+ function showToast(type, message) {
34
+ toast = { type, message };
35
+ setTimeout(() => (toast = null), 4000);
36
+ }
37
+
38
+ onMount(async () => {
39
+ try {
40
+ project = await fetchProject();
41
+ } catch {}
42
+ });
43
+
44
+ async function handleSaveProject() {
45
+ projectSaving = true;
46
+ try {
47
+ await saveProject(project);
48
+ showToast('success', 'Project settings saved.');
49
+ } catch {
50
+ showToast('error', 'Failed to save project settings.');
51
+ } finally {
52
+ projectSaving = false;
53
+ }
54
+ }
55
+
56
+ async function handleExport() {
57
+ exporting = true;
58
+ try {
59
+ const data = await exportBackup();
60
+ const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
61
+ const url = URL.createObjectURL(blob);
62
+ const a = document.createElement('a');
63
+ a.href = url;
64
+ a.download = `plum-backup-${new Date().toISOString().slice(0, 10)}.json`;
65
+ a.click();
66
+ URL.revokeObjectURL(url);
67
+ showToast('success', 'Backup downloaded.');
68
+ } catch {
69
+ showToast('error', 'Export failed.');
70
+ } finally {
71
+ exporting = false;
72
+ }
73
+ }
74
+
75
+ async function handleImport() {
76
+ if (!importFile) return;
77
+ importing = true;
78
+ try {
79
+ const text = await importFile.text();
80
+ const data = JSON.parse(text);
81
+ const result = await importBackup(data);
82
+ if (result.error) throw new Error(result.error);
83
+ showToast('success', 'Import successful. Cron jobs have been re-scheduled.');
84
+ // Refresh project settings in case they were part of the backup
85
+ project = await fetchProject();
86
+ importFile = null;
87
+ if (fileInput) fileInput.value = '';
88
+ } catch (e) {
89
+ showToast('error', e.message || 'Import failed. Check the file format.');
90
+ } finally {
91
+ importing = false;
92
+ }
93
+ }
94
+
95
+ function handleFileChange(e) {
96
+ importFile = e.target.files[0] ?? null;
97
+ }
98
+ </script>
99
+
100
+ <svelte:head><title>Settings — Plum</title></svelte:head>
101
+
102
+ {#if toast}
103
+ <div class="toast alert alert-{toast.type}" transition:fly={{ y: -8, duration: 240 }}>
104
+ {toast.message}
105
+ </div>
106
+ {/if}
107
+
108
+ <div class="page-header">
109
+ <h1>Settings</h1>
110
+ <p class="subtitle">Configure your project and manage data backups</p>
111
+ </div>
112
+
113
+ <!-- Project section -->
114
+ <section class="settings-section">
115
+ <div class="section-header">
116
+ <h2 class="section-title">Project</h2>
117
+ <p class="section-desc">Identity information shown across the UI</p>
118
+ </div>
119
+
120
+ <div class="card settings-card">
121
+ <div class="field">
122
+ <label class="field-label" for="project-name">Project Name</label>
123
+ <input
124
+ id="project-name"
125
+ type="text"
126
+ class="field-input"
127
+ bind:value={project.name}
128
+ placeholder="My Test Suite"
129
+ />
130
+ </div>
131
+
132
+ <div class="field">
133
+ <label class="field-label" for="project-logo">
134
+ <span>Logo URL</span>
135
+ <span class="field-hint">Direct link to an image (PNG, SVG, JPG)</span>
136
+ </label>
137
+ <input
138
+ id="project-logo"
139
+ type="url"
140
+ class="field-input"
141
+ bind:value={project.logoUrl}
142
+ placeholder="https://example.com/logo.png"
143
+ />
144
+ </div>
145
+
146
+ {#if project.logoUrl}
147
+ <div class="logo-preview">
148
+ <span class="preview-label">Preview</span>
149
+ <img
150
+ src={project.logoUrl}
151
+ alt="Project logo preview"
152
+ class="logo-img"
153
+ on:error={(e) => (e.target.style.display = 'none')}
154
+ />
155
+ </div>
156
+ {/if}
157
+
158
+ <div class="card-footer">
159
+ <Button on:click={handleSaveProject} disabled={projectSaving}>
160
+ {projectSaving ? 'Saving…' : 'Save Project'}
161
+ </Button>
162
+ </div>
163
+ </div>
164
+ </section>
165
+
166
+ <!-- Backup section -->
167
+ <section class="settings-section">
168
+ <div class="section-header">
169
+ <h2 class="section-title">Backup</h2>
170
+ <p class="section-desc">
171
+ Export all scheduled tests, report history, and project settings to a JSON file. Import to
172
+ restore after a data loss or migration.
173
+ </p>
174
+ </div>
175
+
176
+ <div class="card settings-card">
177
+ <div class="backup-row">
178
+ <div class="backup-block">
179
+ <p class="backup-block-title">Export</p>
180
+ <p class="backup-block-desc">
181
+ Downloads a <code>.json</code> file containing all cron jobs, report metadata, and project
182
+ settings. Report detail files (the actual test output) are stored on disk and not included.
183
+ </p>
184
+ <Button on:click={handleExport} disabled={exporting}>
185
+ {exporting ? 'Exporting…' : 'Export Backup'}
186
+ </Button>
187
+ </div>
188
+
189
+ <div class="backup-divider"></div>
190
+
191
+ <div class="backup-block">
192
+ <p class="backup-block-title">Import</p>
193
+ <p class="backup-block-desc">
194
+ Restores cron jobs, report metadata, and project settings from a previously exported
195
+ backup. Existing records with the same identifier are overwritten.
196
+ </p>
197
+ <div class="import-row">
198
+ <label class="file-label">
199
+ <input
200
+ bind:this={fileInput}
201
+ type="file"
202
+ accept=".json"
203
+ class="file-input-hidden"
204
+ on:change={handleFileChange}
205
+ />
206
+ <span class="file-btn">{importFile ? importFile.name : 'Choose file…'}</span>
207
+ </label>
208
+ <Button on:click={handleImport} disabled={!importFile || importing}>
209
+ {importing ? 'Importing…' : 'Import'}
210
+ </Button>
211
+ </div>
212
+ </div>
213
+ </div>
214
+ </div>
215
+ </section>
216
+
217
+ <style>
218
+ .page-header {
219
+ margin-bottom: 2rem;
220
+ padding-bottom: 1.5rem;
221
+ border-bottom: 1px solid var(--border);
222
+ }
223
+
224
+ .page-header h1 {
225
+ font-size: 2.5rem;
226
+ margin-bottom: 0.375rem;
227
+ }
228
+
229
+ .subtitle {
230
+ color: var(--text-muted);
231
+ font-size: 0.9375rem;
232
+ }
233
+
234
+ .toast {
235
+ margin-bottom: 1.25rem;
236
+ border-radius: var(--radius-md);
237
+ }
238
+
239
+ /* Sections */
240
+ .settings-section {
241
+ margin-bottom: 2.5rem;
242
+ }
243
+
244
+ .section-header {
245
+ margin-bottom: 1rem;
246
+ }
247
+
248
+ .section-title {
249
+ font-size: 1rem;
250
+ font-weight: 500;
251
+ color: var(--text);
252
+ margin-bottom: 0.25rem;
253
+ }
254
+
255
+ .section-desc {
256
+ font-size: 0.875rem;
257
+ color: var(--text-muted);
258
+ line-height: 1.5;
259
+ }
260
+
261
+ .settings-card {
262
+ display: flex;
263
+ flex-direction: column;
264
+ gap: 1.25rem;
265
+ }
266
+
267
+ /* Fields */
268
+ .field {
269
+ display: flex;
270
+ flex-direction: column;
271
+ gap: 0.375rem;
272
+ }
273
+
274
+ .field-label {
275
+ display: flex;
276
+ align-items: baseline;
277
+ gap: 0.5rem;
278
+ font-size: 0.8125rem;
279
+ font-weight: 500;
280
+ color: var(--text);
281
+ }
282
+
283
+ .field-hint {
284
+ font-size: 0.75rem;
285
+ font-weight: 400;
286
+ color: var(--text-muted);
287
+ }
288
+
289
+ /* Logo preview */
290
+ .logo-preview {
291
+ display: flex;
292
+ flex-direction: column;
293
+ gap: 0.5rem;
294
+ }
295
+
296
+ .preview-label {
297
+ font-size: 0.75rem;
298
+ color: var(--text-muted);
299
+ font-weight: 500;
300
+ text-transform: uppercase;
301
+ letter-spacing: 0.06em;
302
+ }
303
+
304
+ .logo-img {
305
+ max-height: 56px;
306
+ max-width: 200px;
307
+ object-fit: contain;
308
+ border-radius: var(--radius-sm);
309
+ }
310
+
311
+ .card-footer {
312
+ padding-top: 0.25rem;
313
+ border-top: 1px solid var(--border);
314
+ }
315
+
316
+ /* Backup layout */
317
+ .backup-row {
318
+ display: flex;
319
+ gap: 2rem;
320
+ }
321
+
322
+ .backup-block {
323
+ flex: 1;
324
+ display: flex;
325
+ flex-direction: column;
326
+ gap: 0.875rem;
327
+ }
328
+
329
+ .backup-divider {
330
+ width: 1px;
331
+ background: var(--border);
332
+ flex-shrink: 0;
333
+ }
334
+
335
+ .backup-block-title {
336
+ font-size: 0.875rem;
337
+ font-weight: 500;
338
+ color: var(--text);
339
+ }
340
+
341
+ .backup-block-desc {
342
+ font-size: 0.8125rem;
343
+ color: var(--text-muted);
344
+ line-height: 1.6;
345
+ }
346
+
347
+ .backup-block-desc code {
348
+ font-family: 'JetBrains Mono', monospace;
349
+ font-size: 0.78rem;
350
+ background: var(--bg-subtle);
351
+ padding: 0.1em 0.3em;
352
+ border-radius: 3px;
353
+ }
354
+
355
+ /* File input */
356
+ .import-row {
357
+ display: flex;
358
+ align-items: center;
359
+ gap: 0.625rem;
360
+ }
361
+
362
+ .file-label {
363
+ cursor: pointer;
364
+ }
365
+
366
+ .file-input-hidden {
367
+ position: absolute;
368
+ width: 1px;
369
+ height: 1px;
370
+ opacity: 0;
371
+ pointer-events: none;
372
+ }
373
+
374
+ .file-btn {
375
+ display: inline-flex;
376
+ align-items: center;
377
+ height: 34px;
378
+ padding: 0 0.875rem;
379
+ font-size: 0.8125rem;
380
+ font-family: inherit;
381
+ color: var(--text-muted);
382
+ background: var(--bg-elevated);
383
+ border: 1px solid var(--border);
384
+ border-radius: var(--radius-sm);
385
+ cursor: pointer;
386
+ white-space: nowrap;
387
+ max-width: 180px;
388
+ overflow: hidden;
389
+ text-overflow: ellipsis;
390
+ transition:
391
+ background var(--duration-fast),
392
+ border-color var(--duration-fast);
393
+ }
394
+
395
+ .file-label:hover .file-btn {
396
+ border-color: var(--text-muted);
397
+ background: var(--bg-subtle);
398
+ }
399
+
400
+ @media (max-width: 640px) {
401
+ .backup-row {
402
+ flex-direction: column;
403
+ }
404
+
405
+ .backup-divider {
406
+ width: 100%;
407
+ height: 1px;
408
+ }
409
+ }
410
+ </style>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plum-e2e",
3
- "version": "1.1.1",
3
+ "version": "1.2.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/silverlunah/plum.git"
@@ -24,11 +24,15 @@
24
24
  "devDependencies": {
25
25
  "husky": "^9.1.7",
26
26
  "license-check-and-add": "^4.0.5",
27
+ "lint-staged": "^17.0.7",
27
28
  "prettier": "^3.5.1",
28
29
  "prettier-plugin-svelte": "^3.3.3"
29
30
  },
30
31
  "dependencies": {
31
32
  "fs-extra": "^11.3.0"
32
33
  },
33
- "type": "module"
34
+ "type": "module",
35
+ "lint-staged": {
36
+ "*.{js,ts,svelte,json,md,css,html}": "prettier --write"
37
+ }
34
38
  }
@@ -1,27 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(git checkout:*)",
5
- "Bash(git add:*)",
6
- "Bash(git commit -m ':*)",
7
- "Bash(git push:*)",
8
- "Bash(gh pr:*)",
9
- "Bash(node:*)",
10
- "Bash(curl *)",
11
- "Bash(git pull *)",
12
- "Bash(npm install *)",
13
- "Bash(code --list-extensions)",
14
- "Bash(git branch *)",
15
- "Bash(git commit -m ' *)",
16
- "mcp__ide__getDiagnostics",
17
- "Bash(git rm *)",
18
- "Bash(npm test *)",
19
- "Bash(npm run *)",
20
- "Bash(git *)",
21
- "Bash(python3 -c \"import sys; print\\(sys.stdin.read\\(\\)[:200]\\)\")",
22
- "Bash(python3 -c ' *)",
23
- "Bash(grep -rl \"^<!--$\" /Users/silverlunah/Projects/plum/frontend/src --include=\"*.svelte\")",
24
- "Bash(python3 *)"
25
- ]
26
- }
27
- }
package/.husky/pre-commit DELETED
@@ -1,2 +0,0 @@
1
- npm run format
2
- npm run add-license
package/.prettierrc DELETED
@@ -1,15 +0,0 @@
1
- {
2
- "useTabs": true,
3
- "singleQuote": true,
4
- "trailingComma": "none",
5
- "printWidth": 100,
6
- "plugins": ["prettier-plugin-svelte"],
7
- "overrides": [
8
- {
9
- "files": "*.svelte",
10
- "options": {
11
- "parser": "svelte"
12
- }
13
- }
14
- ]
15
- }
@@ -1,10 +0,0 @@
1
- {
2
- "cucumber.glue": [
3
- "backend/tests/step_definitions/**/*.ts",
4
- "backend/_scaffold/step_definitions/**/*.ts"
5
- ],
6
- "cucumber.features": [
7
- "backend/tests/features/**/*.feature",
8
- "backend/_scaffold/features/**/*.feature"
9
- ]
10
- }
@@ -1,53 +0,0 @@
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
- const fs = require('fs');
19
- const path = require('path');
20
- const fse = require('fs-extra');
21
- const pc = require('picocolors');
22
-
23
- const settingsFilePath = path.join(process.cwd(), 'config', 'settings.json');
24
- const scaffoldFolderPath = path.join(process.cwd(), '_scaffold');
25
- const userTestsFolderPath = path.join(process.cwd(), 'tests');
26
-
27
- if (!fs.existsSync(settingsFilePath)) {
28
- const settingsContent = JSON.stringify(
29
- {
30
- reportsHistory: 20,
31
- cronJobSchedules: [
32
- { label: 'Every minute', value: '* * * * *' },
33
- { label: 'Every hour', value: '0 * * * *' },
34
- { label: 'Every midnight', value: '0 0 * * *' },
35
- { label: 'Every Sunday', value: '0 0 * * 0' }
36
- ]
37
- },
38
- null,
39
- 2
40
- );
41
- fs.writeFileSync(settingsFilePath, settingsContent, 'utf8');
42
- console.log(pc.green('✓') + ' settings.json created with default values.');
43
- } else {
44
- console.log(pc.yellow('⚠') + ' settings.json already exists. Skipping creation.');
45
- }
46
-
47
- if (!fs.existsSync(userTestsFolderPath)) {
48
- console.log(pc.cyan('↳') + ' tests/ not found. Creating from scaffold...');
49
- fse.copySync(scaffoldFolderPath, userTestsFolderPath);
50
- console.log(pc.green('✓') + ' tests/ created from scaffold.');
51
- } else {
52
- console.log(pc.yellow('⚠') + ' tests/ already exists. Skipping creation.');
53
- }
@@ -1,37 +0,0 @@
1
- {
2
- "license": "./resources/gpl-3.0-license.txt",
3
- "ignoreDefaultIgnores": false,
4
- "licenseFormats": {
5
- "js|ts": {
6
- "prepend": "/*",
7
- "append": " */\n",
8
- "eachLine": {
9
- "prepend": " * "
10
- }
11
- },
12
- "svelte": {
13
- "prepend": "<!--",
14
- "append": " -->\n",
15
- "eachLine": {
16
- "prepend": " * "
17
- }
18
- },
19
- "dotfile|^Dockerfile|yml|yaml|prettierignore|gitignore|env|example": {
20
- "prepend": "#",
21
- "append": "#\n",
22
- "eachLine": {
23
- "prepend": "# "
24
- }
25
- }
26
- },
27
- "trailingWhitespace": "TRIM",
28
- "ignore": [
29
- "**/backend/tests/**",
30
- "**/backend/_scaffold/**",
31
- "**/.prettierrc",
32
- "**/.husky",
33
- "**/*.md",
34
- "**/backend/config/settings.json",
35
- "**/backend/config/cronjobs.json"
36
- ]
37
- }