plum-e2e 2.5.14 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/backend/constants/triggers.js +3 -1
- package/backend/lib/screenshotPoller.js +43 -0
- package/backend/mcp/server.js +8 -1
- package/backend/prisma/migrations/20260713090000_add_report_duration/migration.sql +2 -0
- package/backend/prisma/schema.prisma +1 -0
- package/backend/routes/trigger.routes.js +51 -4
- package/backend/server.js +1 -0
- package/backend/services/cronService.js +119 -29
- package/backend/services/reportService.js +10 -4
- package/backend/websockets/socketHandler.js +6 -24
- package/frontend/.svelte-kit/adapter-node/.vite/manifest.json +312 -37
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/BackLink.CvWWuO3h.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Badge.D1SV0Gv7.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/ConfirmModal.CdhOYVBb.css +18 -0
- package/frontend/.svelte-kit/{output/client/_app/immutable/chunks/rVEKg0Ak.js → adapter-node/_app/immutable/assets/EmptyState.BdO1q9cJ.css} +1 -1
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Pagination.DZmi2Po-.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Toast.DENwYn3g.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.BuhMvMUj.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.0Eln51hV.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.5IJAEAjc.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BJ-I1gHO.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BR3wgXcZ.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BZfe6nWe.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Bhof07Eg.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Bj_a_5lv.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CBHi6pzT.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CFnbmY-D.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CrXpMrqh.css +18 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page._h2o67kg.css +18 -0
- package/frontend/.svelte-kit/adapter-node/chunks/BackLink.js +29 -0
- package/frontend/.svelte-kit/adapter-node/chunks/Badge.js +3 -3
- package/frontend/.svelte-kit/adapter-node/chunks/Button.js +4 -3
- package/frontend/.svelte-kit/adapter-node/chunks/ConfirmModal.js +74 -0
- package/frontend/.svelte-kit/adapter-node/chunks/EmptyState.js +34 -0
- package/frontend/.svelte-kit/adapter-node/chunks/Toast.js +36 -0
- package/frontend/.svelte-kit/adapter-node/chunks/auth.js +61 -0
- package/frontend/.svelte-kit/adapter-node/chunks/client.js +9 -2
- package/frontend/.svelte-kit/adapter-node/chunks/constants.js +41 -0
- package/frontend/.svelte-kit/adapter-node/chunks/exports.js +7 -65
- package/frontend/.svelte-kit/adapter-node/chunks/format.js +51 -0
- package/frontend/.svelte-kit/adapter-node/chunks/index-server.js +31 -0
- package/frontend/.svelte-kit/adapter-node/chunks/index.js +71 -50
- package/frontend/.svelte-kit/adapter-node/chunks/index2.js +76 -0
- package/frontend/.svelte-kit/adapter-node/chunks/internal.js +3 -4
- package/frontend/.svelte-kit/adapter-node/chunks/reports.js +16 -33
- package/frontend/.svelte-kit/adapter-node/chunks/runner.js +45 -0
- package/frontend/.svelte-kit/adapter-node/chunks/stores.js +43 -0
- package/frontend/{build/client/_app/immutable/chunks/rVEKg0Ak.js → .svelte-kit/adapter-node/chunks/theme.js} +9 -1
- package/frontend/.svelte-kit/{output/client/_app/immutable/entry/start.GiBry-lw.js → adapter-node/entries/pages/_layout.js} +4 -1
- package/frontend/.svelte-kit/adapter-node/entries/pages/_layout.svelte.js +10 -154
- package/frontend/.svelte-kit/adapter-node/entries/pages/_page.svelte.js +46 -28
- package/frontend/.svelte-kit/adapter-node/entries/pages/login/_page.svelte.js +40 -0
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_id_/_page.svelte.js +62 -0
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_page.svelte.js +167 -89
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/live/_page.svelte.js +257 -0
- package/frontend/.svelte-kit/adapter-node/entries/pages/scheduled-tests/_page.svelte.js +91 -52
- package/frontend/.svelte-kit/adapter-node/entries/pages/settings/_page.svelte.js +562 -0
- package/frontend/.svelte-kit/adapter-node/entries/pages/setup/_page.svelte.js +40 -0
- package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/_page.svelte.js +421 -0
- package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/runs/_id_/_page.svelte.js +62 -0
- package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/suites/_id_/_page.svelte.js +198 -0
- package/frontend/.svelte-kit/adapter-node/index.js +2 -1
- package/frontend/.svelte-kit/adapter-node/manifest-full.js +64 -8
- package/frontend/.svelte-kit/adapter-node/manifest.js +64 -8
- package/frontend/.svelte-kit/adapter-node/nodes/0.js +5 -3
- package/frontend/.svelte-kit/adapter-node/nodes/1.js +1 -1
- package/frontend/.svelte-kit/adapter-node/nodes/10.js +25 -0
- package/frontend/.svelte-kit/adapter-node/nodes/11.js +25 -0
- package/frontend/.svelte-kit/adapter-node/nodes/12.js +25 -0
- package/frontend/.svelte-kit/adapter-node/nodes/2.js +2 -2
- package/frontend/.svelte-kit/adapter-node/nodes/3.js +3 -3
- package/frontend/.svelte-kit/adapter-node/nodes/4.js +3 -3
- package/frontend/.svelte-kit/adapter-node/nodes/5.js +3 -3
- package/frontend/.svelte-kit/adapter-node/nodes/6.js +25 -0
- package/frontend/.svelte-kit/adapter-node/nodes/7.js +25 -0
- package/frontend/.svelte-kit/adapter-node/nodes/8.js +25 -0
- package/frontend/.svelte-kit/adapter-node/nodes/9.js +25 -0
- package/frontend/.svelte-kit/ambient.d.ts +4 -0
- package/frontend/.svelte-kit/generated/client-optimized/app.js +18 -4
- package/frontend/.svelte-kit/generated/client-optimized/nodes/0.js +2 -0
- package/frontend/.svelte-kit/generated/client-optimized/nodes/10.js +18 -0
- package/frontend/.svelte-kit/generated/client-optimized/nodes/11.js +18 -0
- package/frontend/.svelte-kit/generated/client-optimized/nodes/12.js +18 -0
- package/frontend/.svelte-kit/generated/client-optimized/nodes/3.js +1 -1
- package/frontend/.svelte-kit/generated/client-optimized/nodes/4.js +1 -1
- package/frontend/.svelte-kit/generated/client-optimized/nodes/5.js +1 -1
- package/frontend/.svelte-kit/generated/client-optimized/nodes/6.js +18 -0
- package/frontend/.svelte-kit/generated/client-optimized/nodes/7.js +18 -0
- package/frontend/.svelte-kit/generated/client-optimized/nodes/8.js +18 -0
- package/frontend/.svelte-kit/generated/client-optimized/nodes/9.js +18 -0
- package/frontend/.svelte-kit/generated/server/internal.js +1 -1
- package/frontend/.svelte-kit/output/client/.vite/manifest.json +486 -155
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.BhSG-jZH.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/10.CdaQUS6U.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/11.BJ-I1gHO.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/12.Bj_a_5lv.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.CrXpMrqh.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/3.BR3wgXcZ.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/4.0Eln51hV.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.DFV9OgAu.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/6.CFnbmY-D.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/7.CBHi6pzT.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/8.Bhof07Eg.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/9._h2o67kg.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/BackLink.CvWWuO3h.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Badge.D1SV0Gv7.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Button.FOWXxvc7.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/ConfirmModal.CdhOYVBb.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/ConfirmModal.DmxkcwXv.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/EmptyState.BdO1q9cJ.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Pagination.DZmi2Po-.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Toast.DENwYn3g.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.BuhMvMUj.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.0Eln51hV.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.5IJAEAjc.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BJ-I1gHO.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BR3wgXcZ.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BZfe6nWe.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Bhof07Eg.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Bj_a_5lv.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CBHi6pzT.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CFnbmY-D.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CrXpMrqh.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page._h2o67kg.css +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B0pefNHY.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BFEiffAL.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{CJ8q7g9Y.js → BFgtfHj2.js} +1 -1
- package/frontend/.svelte-kit/{adapter-node/chunks/equality.js → output/client/_app/immutable/chunks/BIRVeCLU.js} +1 -14
- package/frontend/.svelte-kit/output/{server/chunks/equality.js → client/_app/immutable/chunks/BKCNyxZ2.js} +1 -14
- package/frontend/{build/client/_app/immutable/chunks/CHV2KnPr.js → .svelte-kit/output/client/_app/immutable/chunks/BLAiBE__.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BVMec-1T.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BeO8veBd.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Bfc47y5P.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BgNaeXAp.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BkKmeUbA.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C3SY6-sX.js +19 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C4eeChIU.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C67QNx7Z.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CVV6HrFb.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CstKKb9b.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CxTX_lpP.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CyQ_oBw2.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{CwBTqcbj.js → DGryW1Vp.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{BKz6FZdB.js → DIx44H9N.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DP6QP4L6.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DmRbbcS3.js +23 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/IFIFk6zi.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/KJdjlibc.js +20 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/ll-VsEGv.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/raHbXn_9.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/uFRI_bmR.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.Dz_CBZcR.js +19 -0
- package/frontend/{build/client/_app/immutable/entry/start.GiBry-lw.js → .svelte-kit/output/client/_app/immutable/entry/start.MMlC62np.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.CKD9Qja6.js +23 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{1.N4gjrCnX.js → 1.Dbck5ct8.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/10.BfmGpmC1.js +19 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/11.C7l9HPom.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.Iu9bcGdC.js +19 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.BqQhRvYh.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/3.BZRTKadS.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/4.BfKoPKdM.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.B4a2uCWn.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/6.CI508CMS.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/7.3x_eiof1.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/8.BfUuob4H.js +29 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/9.BZhCKRJe.js +18 -0
- package/frontend/.svelte-kit/output/client/_app/version.json +1 -1
- package/frontend/.svelte-kit/output/client/favicon-32x32.png +0 -0
- package/frontend/.svelte-kit/output/client/favicon.ico +0 -0
- package/frontend/.svelte-kit/output/server/.vite/manifest.json +312 -37
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/BackLink.CvWWuO3h.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Badge.D1SV0Gv7.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/ConfirmModal.CdhOYVBb.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/EmptyState.BdO1q9cJ.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Pagination.DZmi2Po-.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Toast.DENwYn3g.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.BuhMvMUj.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.0Eln51hV.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.5IJAEAjc.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BJ-I1gHO.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BR3wgXcZ.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BZfe6nWe.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bhof07Eg.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bj_a_5lv.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CBHi6pzT.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CFnbmY-D.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CrXpMrqh.css +18 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page._h2o67kg.css +18 -0
- package/frontend/.svelte-kit/output/server/chunks/BackLink.js +29 -0
- package/frontend/.svelte-kit/output/server/chunks/Badge.js +3 -3
- package/frontend/.svelte-kit/output/server/chunks/Button.js +4 -3
- package/frontend/.svelte-kit/output/server/chunks/ConfirmModal.js +74 -0
- package/frontend/.svelte-kit/output/server/chunks/EmptyState.js +34 -0
- package/frontend/.svelte-kit/output/server/chunks/Toast.js +36 -0
- package/frontend/.svelte-kit/output/server/chunks/auth.js +61 -0
- package/frontend/.svelte-kit/output/server/chunks/client.js +9 -2
- package/frontend/.svelte-kit/output/server/chunks/constants.js +41 -0
- package/frontend/.svelte-kit/output/server/chunks/exports.js +7 -65
- package/frontend/.svelte-kit/output/server/chunks/format.js +51 -0
- package/frontend/.svelte-kit/output/server/chunks/index-server.js +31 -0
- package/frontend/.svelte-kit/output/server/chunks/index.js +71 -50
- package/frontend/.svelte-kit/output/server/chunks/index2.js +76 -0
- package/frontend/.svelte-kit/output/server/chunks/internal.js +3 -4
- package/frontend/.svelte-kit/output/server/chunks/reports.js +16 -33
- package/frontend/.svelte-kit/output/server/chunks/runner.js +45 -0
- package/frontend/.svelte-kit/output/server/chunks/stores.js +43 -0
- package/frontend/.svelte-kit/output/server/chunks/theme.js +26 -0
- package/frontend/.svelte-kit/output/server/entries/pages/_layout.js +21 -0
- package/frontend/.svelte-kit/output/server/entries/pages/_layout.svelte.js +10 -154
- package/frontend/.svelte-kit/output/server/entries/pages/_page.svelte.js +46 -28
- package/frontend/.svelte-kit/output/server/entries/pages/login/_page.svelte.js +40 -0
- package/frontend/.svelte-kit/output/server/entries/pages/reports/_id_/_page.svelte.js +62 -0
- package/frontend/.svelte-kit/output/server/entries/pages/reports/_page.svelte.js +167 -89
- package/frontend/.svelte-kit/output/server/entries/pages/reports/live/_page.svelte.js +257 -0
- package/frontend/.svelte-kit/output/server/entries/pages/scheduled-tests/_page.svelte.js +91 -52
- package/frontend/.svelte-kit/output/server/entries/pages/settings/_page.svelte.js +562 -0
- package/frontend/.svelte-kit/output/server/entries/pages/setup/_page.svelte.js +40 -0
- package/frontend/.svelte-kit/output/server/entries/pages/test-repository/_page.svelte.js +421 -0
- package/frontend/.svelte-kit/output/server/entries/pages/test-repository/runs/_id_/_page.svelte.js +62 -0
- package/frontend/.svelte-kit/output/server/entries/pages/test-repository/suites/_id_/_page.svelte.js +198 -0
- package/frontend/.svelte-kit/output/server/index.js +2 -1
- package/frontend/.svelte-kit/output/server/manifest-full.js +64 -8
- package/frontend/.svelte-kit/output/server/manifest.js +64 -8
- package/frontend/.svelte-kit/output/server/nodes/0.js +5 -3
- package/frontend/.svelte-kit/output/server/nodes/1.js +1 -1
- package/frontend/.svelte-kit/output/server/nodes/10.js +25 -0
- package/frontend/.svelte-kit/output/server/nodes/11.js +25 -0
- package/frontend/.svelte-kit/output/server/nodes/12.js +25 -0
- package/frontend/.svelte-kit/output/server/nodes/2.js +2 -2
- package/frontend/.svelte-kit/output/server/nodes/3.js +3 -3
- package/frontend/.svelte-kit/output/server/nodes/4.js +3 -3
- package/frontend/.svelte-kit/output/server/nodes/5.js +3 -3
- package/frontend/.svelte-kit/output/server/nodes/6.js +25 -0
- package/frontend/.svelte-kit/output/server/nodes/7.js +25 -0
- package/frontend/.svelte-kit/output/server/nodes/8.js +25 -0
- package/frontend/.svelte-kit/output/server/nodes/9.js +25 -0
- package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css +18 -0
- package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css +18 -0
- package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/11.BJ-I1gHO.css +18 -0
- package/frontend/build/client/_app/immutable/assets/11.BJ-I1gHO.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/11.BJ-I1gHO.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css +18 -0
- package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css +18 -0
- package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css +18 -0
- package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css +18 -0
- package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css +18 -0
- package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css +18 -0
- package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css +18 -0
- package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/8.Bhof07Eg.css +18 -0
- package/frontend/build/client/_app/immutable/assets/8.Bhof07Eg.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/8.Bhof07Eg.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css +18 -0
- package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css +18 -0
- package/frontend/build/client/_app/immutable/{chunks/rVEKg0Ak.js.br → assets/BackLink.CvWWuO3h.css.br} +0 -0
- package/frontend/build/client/_app/immutable/{chunks/rVEKg0Ak.js.gz → assets/BackLink.CvWWuO3h.css.gz} +0 -0
- package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css +18 -0
- package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/{Badge.DLLowvEA.css.gz → Badge.D1SV0Gv7.css.gz} +0 -0
- package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css +18 -0
- package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.CdhOYVBb.css +18 -0
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.CdhOYVBb.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.CdhOYVBb.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.DmxkcwXv.css +18 -0
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.DmxkcwXv.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.DmxkcwXv.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/EmptyState.BdO1q9cJ.css +18 -0
- package/frontend/build/client/_app/immutable/{chunks/CJ8q7g9Y.js.br → assets/EmptyState.BdO1q9cJ.css.br} +0 -0
- package/frontend/build/client/_app/immutable/assets/EmptyState.BdO1q9cJ.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css +18 -0
- package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css +18 -0
- package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BJ-I1gHO.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_page.BJ-I1gHO.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BJ-I1gHO.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Bhof07Eg.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_page.Bhof07Eg.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Bhof07Eg.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css +18 -0
- package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/B0pefNHY.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/B0pefNHY.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/B0pefNHY.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BFEiffAL.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/BFEiffAL.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BFEiffAL.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{CJ8q7g9Y.js → BFgtfHj2.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/BFgtfHj2.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/{CJ8q7g9Y.js.gz → BFgtfHj2.js.gz} +0 -0
- package/frontend/build/client/_app/immutable/chunks/BIRVeCLU.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/{CHV2KnPr.js.gz → BIRVeCLU.js.br} +0 -0
- package/frontend/build/client/_app/immutable/chunks/BIRVeCLU.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/oc0we5Us.js → build/client/_app/immutable/chunks/BKCNyxZ2.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/BKCNyxZ2.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BKCNyxZ2.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/CHV2KnPr.js → build/client/_app/immutable/chunks/BLAiBE__.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/{CHV2KnPr.js.br → BLAiBE__.js.br} +2 -2
- package/frontend/build/client/_app/immutable/{assets/Badge.DLLowvEA.css.br → chunks/BLAiBE__.js.gz} +0 -0
- package/frontend/build/client/_app/immutable/chunks/BVMec-1T.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/BVMec-1T.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BVMec-1T.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BeO8veBd.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/BeO8veBd.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BeO8veBd.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BgNaeXAp.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/BgNaeXAp.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BgNaeXAp.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BkKmeUbA.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/BkKmeUbA.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BkKmeUbA.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/C3SY6-sX.js +19 -0
- package/frontend/build/client/_app/immutable/chunks/C3SY6-sX.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C3SY6-sX.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/C4eeChIU.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/C4eeChIU.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C4eeChIU.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/C67QNx7Z.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/C67QNx7Z.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C67QNx7Z.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CVV6HrFb.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/CVV6HrFb.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CVV6HrFb.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CstKKb9b.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/CstKKb9b.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CstKKb9b.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CxTX_lpP.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/CxTX_lpP.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CxTX_lpP.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CyQ_oBw2.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/CyQ_oBw2.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CyQ_oBw2.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DGryW1Vp.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/DGryW1Vp.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DGryW1Vp.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DIx44H9N.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/DIx44H9N.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DIx44H9N.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DP6QP4L6.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/DP6QP4L6.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DP6QP4L6.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DmRbbcS3.js +23 -0
- package/frontend/build/client/_app/immutable/chunks/DmRbbcS3.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DmRbbcS3.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/IFIFk6zi.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/IFIFk6zi.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/IFIFk6zi.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/KJdjlibc.js +20 -0
- package/frontend/build/client/_app/immutable/chunks/KJdjlibc.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/KJdjlibc.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/ll-VsEGv.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/ll-VsEGv.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/ll-VsEGv.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/raHbXn_9.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/raHbXn_9.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/raHbXn_9.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/uFRI_bmR.js +18 -0
- package/frontend/build/client/_app/immutable/chunks/uFRI_bmR.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/uFRI_bmR.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/app.Dz_CBZcR.js +19 -0
- package/frontend/build/client/_app/immutable/entry/app.Dz_CBZcR.js.br +0 -0
- package/frontend/build/client/_app/immutable/entry/app.Dz_CBZcR.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/start.MMlC62np.js +18 -0
- package/frontend/build/client/_app/immutable/entry/{start.GiBry-lw.js.br → start.MMlC62np.js.br} +1 -1
- package/frontend/build/client/_app/immutable/entry/{start.GiBry-lw.js.gz → start.MMlC62np.js.gz} +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.CKD9Qja6.js +23 -0
- package/frontend/build/client/_app/immutable/nodes/0.CKD9Qja6.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.CKD9Qja6.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{1.N4gjrCnX.js → 1.Dbck5ct8.js} +1 -1
- package/frontend/build/client/_app/immutable/nodes/1.Dbck5ct8.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.Dbck5ct8.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/10.BfmGpmC1.js +19 -0
- package/frontend/build/client/_app/immutable/nodes/10.BfmGpmC1.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/10.BfmGpmC1.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/11.C7l9HPom.js +18 -0
- package/frontend/build/client/_app/immutable/nodes/11.C7l9HPom.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/11.C7l9HPom.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.Iu9bcGdC.js +19 -0
- package/frontend/build/client/_app/immutable/nodes/12.Iu9bcGdC.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.Iu9bcGdC.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.BqQhRvYh.js +18 -0
- package/frontend/build/client/_app/immutable/nodes/2.BqQhRvYh.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.BqQhRvYh.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.BZRTKadS.js +18 -0
- package/frontend/build/client/_app/immutable/nodes/3.BZRTKadS.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.BZRTKadS.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.BfKoPKdM.js +18 -0
- package/frontend/build/client/_app/immutable/nodes/4.BfKoPKdM.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.BfKoPKdM.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.B4a2uCWn.js +18 -0
- package/frontend/build/client/_app/immutable/nodes/5.B4a2uCWn.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.B4a2uCWn.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.CI508CMS.js +18 -0
- package/frontend/build/client/_app/immutable/nodes/6.CI508CMS.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.CI508CMS.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/7.3x_eiof1.js +18 -0
- package/frontend/build/client/_app/immutable/nodes/7.3x_eiof1.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/7.3x_eiof1.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/8.BfUuob4H.js +29 -0
- package/frontend/build/client/_app/immutable/nodes/8.BfUuob4H.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/8.BfUuob4H.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/9.BZhCKRJe.js +18 -0
- package/frontend/build/client/_app/immutable/nodes/9.BZhCKRJe.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/9.BZhCKRJe.js.gz +0 -0
- package/frontend/build/client/_app/version.json +1 -1
- package/frontend/build/client/_app/version.json.br +0 -0
- package/frontend/build/client/_app/version.json.gz +0 -0
- package/frontend/build/client/favicon-32x32.png +0 -0
- package/frontend/build/client/favicon.ico +0 -0
- package/frontend/build/server/chunks/0-Dzas6zkl.js +34 -0
- package/frontend/build/server/chunks/0-Dzas6zkl.js.map +17 -0
- package/frontend/build/server/chunks/{1-hso3H4Ax.js → 1-B4EsP8yr.js} +3 -3
- package/frontend/build/server/chunks/{1-hso3H4Ax.js.map → 1-B4EsP8yr.js.map} +1 -1
- package/frontend/build/server/chunks/10-UhDQZ5BY.js +26 -0
- package/frontend/build/server/chunks/10-UhDQZ5BY.js.map +17 -0
- package/frontend/build/server/chunks/11-mTH3nQlX.js +26 -0
- package/frontend/build/server/chunks/11-mTH3nQlX.js.map +17 -0
- package/frontend/build/server/chunks/12-9mg6kp53.js +26 -0
- package/frontend/build/server/chunks/12-9mg6kp53.js.map +17 -0
- package/frontend/build/server/chunks/{4-2UUrCVtM.js → 2-Bkz8H7CT.js} +5 -5
- package/frontend/build/server/chunks/2-Bkz8H7CT.js.map +17 -0
- package/frontend/build/server/chunks/{3-BYumY9dv.js → 3-DDtaiqu7.js} +4 -4
- package/frontend/build/server/chunks/3-DDtaiqu7.js.map +17 -0
- package/frontend/build/server/chunks/4-DbdkTAvS.js +26 -0
- package/frontend/build/server/chunks/4-DbdkTAvS.js.map +17 -0
- package/frontend/build/server/chunks/{5-C2_y_fwT.js → 5-CK5hY2WF.js} +4 -4
- package/frontend/build/server/chunks/5-CK5hY2WF.js.map +17 -0
- package/frontend/build/server/chunks/6-Cps9fL3Z.js +26 -0
- package/frontend/build/server/chunks/6-Cps9fL3Z.js.map +17 -0
- package/frontend/build/server/chunks/7-CgUpbaJD.js +26 -0
- package/frontend/build/server/chunks/7-CgUpbaJD.js.map +17 -0
- package/frontend/build/server/chunks/8-dilaVKYo.js +26 -0
- package/frontend/build/server/chunks/8-dilaVKYo.js.map +17 -0
- package/frontend/build/server/chunks/{2-BSZWXCWp.js → 9-CUJxgoIN.js} +5 -5
- package/frontend/build/server/chunks/9-CUJxgoIN.js.map +17 -0
- package/frontend/build/server/chunks/BackLink-KxZNqsaq.js +30 -0
- package/frontend/build/server/chunks/BackLink-KxZNqsaq.js.map +17 -0
- package/frontend/build/server/chunks/{Badge-CC4U7C0c.js → Badge-B5V-z6pI.js} +4 -4
- package/frontend/build/server/chunks/Badge-B5V-z6pI.js.map +17 -0
- package/frontend/build/server/chunks/{Button-BLkPicwS.js → Button-CuacyA7Y.js} +4 -4
- package/frontend/build/server/chunks/Button-CuacyA7Y.js.map +17 -0
- package/frontend/build/server/chunks/ConfirmModal-DBtnLLsU.js +73 -0
- package/frontend/build/server/chunks/ConfirmModal-DBtnLLsU.js.map +17 -0
- package/frontend/build/server/chunks/EmptyState-B74-VZ15.js +34 -0
- package/frontend/build/server/chunks/EmptyState-B74-VZ15.js.map +17 -0
- package/frontend/build/server/chunks/Toast-DDF2wi_5.js +37 -0
- package/frontend/build/server/chunks/Toast-DDF2wi_5.js.map +17 -0
- package/frontend/build/server/chunks/_layout.svelte-DoJXDbP1.js +39 -0
- package/frontend/build/server/chunks/_layout.svelte-DoJXDbP1.js.map +17 -0
- package/frontend/build/server/chunks/_page.svelte-BETENC2e.js +67 -0
- package/frontend/build/server/chunks/_page.svelte-BETENC2e.js.map +17 -0
- package/frontend/build/server/chunks/_page.svelte-C0vstY93.js +219 -0
- package/frontend/build/server/chunks/_page.svelte-C0vstY93.js.map +17 -0
- package/frontend/build/server/chunks/_page.svelte-CC27sZag.js +421 -0
- package/frontend/build/server/chunks/_page.svelte-CC27sZag.js.map +17 -0
- package/frontend/build/server/chunks/{_page.svelte-s6ZIOitT.js → _page.svelte-CYkOPxn2.js} +47 -29
- package/frontend/build/server/chunks/_page.svelte-CYkOPxn2.js.map +17 -0
- package/frontend/build/server/chunks/_page.svelte-CperUuP9.js +564 -0
- package/frontend/build/server/chunks/_page.svelte-CperUuP9.js.map +17 -0
- package/frontend/build/server/chunks/_page.svelte-CwrCf0C8.js +65 -0
- package/frontend/build/server/chunks/_page.svelte-CwrCf0C8.js.map +17 -0
- package/frontend/build/server/chunks/_page.svelte-DALHRFEX.js +43 -0
- package/frontend/build/server/chunks/_page.svelte-DALHRFEX.js.map +17 -0
- package/frontend/build/server/chunks/_page.svelte-DNNyBx4y.js +43 -0
- package/frontend/build/server/chunks/_page.svelte-DNNyBx4y.js.map +17 -0
- package/frontend/build/server/chunks/_page.svelte-DqWsUJRp.js +199 -0
- package/frontend/build/server/chunks/_page.svelte-DqWsUJRp.js.map +17 -0
- package/frontend/build/server/chunks/_page.svelte-LcJmR5du.js +219 -0
- package/frontend/build/server/chunks/_page.svelte-LcJmR5du.js.map +17 -0
- package/frontend/build/server/chunks/_page.svelte-gnktnXKP.js +259 -0
- package/frontend/build/server/chunks/_page.svelte-gnktnXKP.js.map +17 -0
- package/frontend/build/server/chunks/auth-rlH-cIzn.js +62 -0
- package/frontend/build/server/chunks/auth-rlH-cIzn.js.map +17 -0
- package/frontend/build/server/chunks/{client-C9IaEwNo.js → client-DyII78e0.js} +9 -4
- package/frontend/build/server/chunks/client-DyII78e0.js.map +17 -0
- package/frontend/build/server/chunks/constants-Drz-Vo39.js +35 -0
- package/frontend/build/server/chunks/constants-Drz-Vo39.js.map +17 -0
- package/frontend/build/server/chunks/{error.svelte-HKBv5sQT.js → error.svelte-BDW3iP1O.js} +4 -4
- package/frontend/build/server/chunks/{error.svelte-HKBv5sQT.js.map → error.svelte-BDW3iP1O.js.map} +1 -1
- package/frontend/build/server/chunks/{exports-OxlCJ8yE.js → exports-D0QHgeSL.js} +2 -67
- package/frontend/build/server/chunks/exports-D0QHgeSL.js.map +17 -0
- package/frontend/build/server/chunks/format-D26ZQccb.js +49 -0
- package/frontend/build/server/chunks/format-D26ZQccb.js.map +17 -0
- package/frontend/build/server/chunks/index-server-Dr2Nvcmu.js +31 -0
- package/frontend/build/{client/_app/immutable/chunks/BKz6FZdB.js.br → server/chunks/index-server-Dr2Nvcmu.js.map} +0 -0
- package/frontend/build/server/chunks/{index-CjHlq1kt.js → index2-DG8XHU5D.js} +81 -10
- package/frontend/build/server/chunks/index2-DG8XHU5D.js.map +17 -0
- package/frontend/build/server/chunks/reports-Bgi7V5N7.js +40 -0
- package/frontend/build/server/chunks/reports-Bgi7V5N7.js.map +17 -0
- package/frontend/build/server/chunks/runner-D18Ml_vF.js +42 -0
- package/frontend/build/server/chunks/runner-D18Ml_vF.js.map +17 -0
- package/frontend/build/server/chunks/{reports-D3ZeYSmi.js → stores-DlkXV308.js} +4 -16
- package/frontend/build/server/chunks/stores-DlkXV308.js.map +17 -0
- package/frontend/build/server/chunks/theme-D_NKm6iI.js +27 -0
- package/frontend/build/server/chunks/theme-D_NKm6iI.js.map +17 -0
- package/frontend/build/server/index.js +4 -4
- package/frontend/build/server/index.js.map +1 -1
- package/frontend/build/server/manifest.js +69 -13
- package/frontend/build/server/manifest.js.map +1 -1
- package/frontend/src/lib/components/layout/RunnerPanel.svelte +108 -21
- package/frontend/src/lib/components/ui/Badge.svelte +6 -1
- package/frontend/src/lib/constants.js +2 -1
- package/frontend/src/lib/stores/runner.js +5 -2
- package/frontend/src/lib/styles/tokens.css +4 -0
- package/frontend/src/lib/utils/format.js +3 -0
- package/frontend/src/routes/reports/[id]/+page.svelte +5 -1
- package/frontend/src/routes/reports/live/+page.svelte +38 -17
- package/frontend/src/routes/scheduled-tests/+page.svelte +2 -2
- package/frontend/src/routes/settings/+page.svelte +50 -1
- package/package.json +1 -1
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Badge.DLLowvEA.css +0 -34
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Button.cBruH0aD.css +0 -34
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.D7eM-6MV.css +0 -34
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BVnUajEa.css +0 -34
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CGnCsn5q.css +0 -34
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DBhBrHFz.css +0 -34
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DOqo0UR4.css +0 -34
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_slug_/_page.svelte.js +0 -42
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.CnXRuPt4.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.CGnCsn5q.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/3.BVnUajEa.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/4.DBhBrHFz.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.D93VAB-w.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Badge.DLLowvEA.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Button.cBruH0aD.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.D7eM-6MV.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BVnUajEa.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CGnCsn5q.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DBhBrHFz.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DOqo0UR4.css +0 -34
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B0bn91RF.js +0 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B1kE5jmt.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Be4iUAB0.js +0 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BpaMqo9O.js +0 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Bt3-Z7H1.js +0 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Cit9MuSg.js +0 -20
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DBk3zeq4.js +0 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DFJLQFic.js +0 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DTUE7kkY.js +0 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/IYPwzKs_.js +0 -20
- package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.C2MbX06K.js +0 -19
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.BsCYK-Tn.js +0 -21
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.D9yQNzK8.js +0 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/3.CBC5WvNb.js +0 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/4.BU6UZHSE.js +0 -19
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.Dzzfrntl.js +0 -18
- package/frontend/.svelte-kit/output/client/favicon.png +0 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Badge.DLLowvEA.css +0 -34
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Button.cBruH0aD.css +0 -34
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.D7eM-6MV.css +0 -34
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BVnUajEa.css +0 -34
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CGnCsn5q.css +0 -34
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DBhBrHFz.css +0 -34
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DOqo0UR4.css +0 -34
- package/frontend/.svelte-kit/output/server/entries/pages/reports/_slug_/_page.svelte.js +0 -42
- package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css +0 -34
- package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/0.CnXRuPt4.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css +0 -34
- package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/2.CGnCsn5q.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css +0 -34
- package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/3.BVnUajEa.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css +0 -34
- package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/4.DBhBrHFz.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css +0 -34
- package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/5.D93VAB-w.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Badge.DLLowvEA.css +0 -34
- package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css +0 -34
- package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Button.cBruH0aD.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css +0 -34
- package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_layout.D7eM-6MV.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css +0 -34
- package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BVnUajEa.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css +0 -34
- package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CGnCsn5q.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css +0 -34
- package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.DBhBrHFz.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css +0 -34
- package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.DOqo0UR4.css.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js +0 -18
- package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/B0bn91RF.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js +0 -23
- package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/B1kE5jmt.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BKz6FZdB.js +0 -18
- package/frontend/build/client/_app/immutable/chunks/BKz6FZdB.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js +0 -18
- package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Be4iUAB0.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js +0 -18
- package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BpaMqo9O.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js +0 -18
- package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Bt3-Z7H1.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js +0 -20
- package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Cit9MuSg.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js +0 -18
- package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CwBTqcbj.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js +0 -18
- package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DBk3zeq4.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js +0 -18
- package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DFJLQFic.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js +0 -18
- package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DTUE7kkY.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js +0 -20
- package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/IYPwzKs_.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js +0 -18
- package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/oc0we5Us.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js +0 -19
- package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js.br +0 -0
- package/frontend/build/client/_app/immutable/entry/app.C2MbX06K.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js +0 -21
- package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.BsCYK-Tn.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.N4gjrCnX.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.N4gjrCnX.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js +0 -18
- package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.D9yQNzK8.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js +0 -18
- package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.CBC5WvNb.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js +0 -19
- package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.BU6UZHSE.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js +0 -18
- package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.Dzzfrntl.js.gz +0 -0
- package/frontend/build/client/favicon.png +0 -0
- package/frontend/build/server/chunks/0-BFfqmlsS.js +0 -26
- package/frontend/build/server/chunks/0-BFfqmlsS.js.map +0 -17
- package/frontend/build/server/chunks/2-BSZWXCWp.js.map +0 -17
- package/frontend/build/server/chunks/3-BYumY9dv.js.map +0 -17
- package/frontend/build/server/chunks/4-2UUrCVtM.js.map +0 -17
- package/frontend/build/server/chunks/5-C2_y_fwT.js.map +0 -17
- package/frontend/build/server/chunks/Badge-CC4U7C0c.js.map +0 -17
- package/frontend/build/server/chunks/Button-BLkPicwS.js.map +0 -17
- package/frontend/build/server/chunks/_layout.svelte-Bfxcj9C6.js +0 -183
- package/frontend/build/server/chunks/_layout.svelte-Bfxcj9C6.js.map +0 -17
- package/frontend/build/server/chunks/_page.svelte-DEK6UvaI.js +0 -45
- package/frontend/build/server/chunks/_page.svelte-DEK6UvaI.js.map +0 -17
- package/frontend/build/server/chunks/_page.svelte-DScVdHOq.js +0 -142
- package/frontend/build/server/chunks/_page.svelte-DScVdHOq.js.map +0 -17
- package/frontend/build/server/chunks/_page.svelte-Ns7w2sZt.js +0 -180
- package/frontend/build/server/chunks/_page.svelte-Ns7w2sZt.js.map +0 -17
- package/frontend/build/server/chunks/_page.svelte-s6ZIOitT.js.map +0 -17
- package/frontend/build/server/chunks/client-C9IaEwNo.js.map +0 -17
- package/frontend/build/server/chunks/exports-OxlCJ8yE.js.map +0 -17
- package/frontend/build/server/chunks/index-CjHlq1kt.js.map +0 -17
- package/frontend/build/server/chunks/reports-D3ZeYSmi.js.map +0 -17
|
@@ -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{h as O,a as f,t as b,s as A,e as y}from"../chunks/ll-VsEGv.js";import{i as Q}from"../chunks/DGryW1Vp.js";import{p as R,o as T,s as l,t as $,d as U,$ as V,m as c,k as i,c as e,n as r,j as o}from"../chunks/C67QNx7Z.js";import{i as C,s as W,a as X}from"../chunks/CVV6HrFb.js";import{s as Y,r as K}from"../chunks/CstKKb9b.js";import{b as L}from"../chunks/raHbXn_9.js";import{g as Z}from"../chunks/KJdjlibc.js";import{a as aa}from"../chunks/DIx44H9N.js";import{c as ea,l as sa}from"../chunks/BVMec-1T.js";import{t as ta}from"../chunks/uFRI_bmR.js";var la=b('<p class="checking svelte-cliau1">Checking server…</p>'),ia=b('<p class="error svelte-cliau1"> </p>'),ra=b('<div class="card svelte-cliau1"><div class="brand svelte-cliau1"><span class="brand-serif svelte-cliau1">Pl</span><span class="brand-sans svelte-cliau1">um</span></div> <h1 class="title svelte-cliau1">Sign in</h1> <p class="subtitle svelte-cliau1">Access your test workspace</p> <div class="fields svelte-cliau1"><div class="field svelte-cliau1"><label class="label svelte-cliau1" for="email">Email</label> <input id="email" type="email" class="input svelte-cliau1" placeholder="jane@example.com" autocomplete="email"></div> <div class="field svelte-cliau1"><label class="label svelte-cliau1" for="password">Password</label> <input id="password" type="password" class="input svelte-cliau1" placeholder="••••••••" autocomplete="current-password"></div></div> <!> <button class="submit-btn svelte-cliau1"> </button></div>'),oa=b('<div class="page svelte-cliau1"><!></div>');function _a(M,N){R(N,!1);const[q,z]=W(),B=()=>X(ta,"$theme",q);let n=c(""),p=c(""),v=c(""),u=c(!1),S=c(!0);T(async()=>{try{if(await ea()){Z("/setup");return}}catch{}l(S,!1)});async function x(){l(v,""),l(u,!0);try{const{token:a,user:s}=await sa({email:e(n),password:e(p)});aa.login(a,s),window.location.href="/"}catch(a){l(v,a.message||"Login failed")}finally{l(u,!1)}}function P(a){a.key==="Enter"&&x()}Q();var d=oa();O(a=>{V.title="Sign in — Plum"});var D=i(d);{var F=a=>{var s=la();f(a,s)},G=a=>{var s=ra(),h=o(i(s),6),_=i(h),g=o(i(_),2);K(g),r(_);var j=o(_,2),w=o(i(j),2);K(w),r(j),r(h);var E=o(h,2);{var H=t=>{var k=ia(),J=i(k,!0);r(k),$(()=>A(J,e(v))),f(t,k)};C(E,t=>{e(v)&&t(H)})}var m=o(E,2),I=i(m,!0);r(m),r(s),$(()=>{m.disabled=e(u)||!e(n)||!e(p),A(I,e(u)?"Signing in…":"Sign in")}),L(g,()=>e(n),t=>l(n,t)),y("keydown",g,P),L(w,()=>e(p),t=>l(p,t)),y("keydown",w,P),y("click",m,x),f(a,s)};C(D,a=>{e(S)?a(F):a(G,!1)})}r(d),$(()=>Y(d,"data-theme",B())),f(M,d),U(),z()}export{_a as component};
|
|
Binary file
|
|
Binary file
|
|
@@ -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{h as Xe,a as m,c as Ye,t as P,b as J,s as w,e as K}from"../chunks/ll-VsEGv.js";import{i as Ze}from"../chunks/DGryW1Vp.js";import{p as et,o as tt,l as B,b as at,f as Q,t as k,d as st,c as e,s as n,A as lt,$ as rt,y as it,m as v,z as O,j as o,k as l,n as s,v as q}from"../chunks/C67QNx7Z.js";import{i as A,s as nt,a as ot}from"../chunks/CVV6HrFb.js";import{t as b,e as we,i as ye}from"../chunks/DmRbbcS3.js";import{R as F,s as G,r as ke,c as be}from"../chunks/CstKKb9b.js";import{f as $e,d as vt,a as dt,r as ct}from"../chunks/CxTX_lpP.js";import{a as pt}from"../chunks/C3SY6-sX.js";import{s as xe,t as mt,i as gt,a as ft}from"../chunks/B0pefNHY.js";import{B as Se}from"../chunks/BIRVeCLU.js";import{P as ut}from"../chunks/DP6QP4L6.js";import{C as _t}from"../chunks/IFIFk6zi.js";import{E as ht}from"../chunks/BKCNyxZ2.js";var wt=P('<div class="rate-display svelte-wkly2m"><span class="rate-number svelte-wkly2m"> </span> <span class="rate-label svelte-wkly2m">passing</span></div>'),yt=P('<span class="trend-dot svelte-wkly2m"></span>'),kt=P('<div class="stats-bar svelte-wkly2m"><div class="pass-bar-track svelte-wkly2m"><div class="pass-bar-fill svelte-wkly2m"></div></div> <div class="bar-legend svelte-wkly2m"><span class="legend-pass svelte-wkly2m"> </span> <span class="legend-fail svelte-wkly2m"> </span></div></div> <div class="trend-row svelte-wkly2m"><span class="trend-label svelte-wkly2m">Recent</span> <div class="trend-dots svelte-wkly2m"></div> <span class="trend-hint svelte-wkly2m">← older · newer →</span></div>',1),bt=P('<button class="btn-delete-selected svelte-wkly2m"> </button>'),$t=P('<div class="report-row svelte-wkly2m"><label class="row-check-wrap svelte-wkly2m" title="Select"><input type="checkbox" class="checkbox svelte-wkly2m"></label> <a class="report-item svelte-wkly2m"><div class="item-left svelte-wkly2m"><span class="status-mark svelte-wkly2m"> </span> <div class="item-meta svelte-wkly2m"><span class="item-tags svelte-wkly2m"> </span> <div class="item-badges svelte-wkly2m"><!> <!></div></div></div> <div class="item-right svelte-wkly2m"><span class="item-date svelte-wkly2m"> </span> <svg class="item-arrow svelte-wkly2m" 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> <button class="row-delete-btn svelte-wkly2m" title="Delete report"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6l-1 14H6L5 6"></path><path d="M10 11v6M14 11v6"></path><path d="M9 6V4h6v2"></path></svg></button></div>'),xt=P('<div class="pagination-wrap svelte-wkly2m"><!></div>'),St=P('<div class="list-header svelte-wkly2m"><label class="select-all-wrap svelte-wkly2m" title="Select all on this page"><input type="checkbox" class="checkbox svelte-wkly2m"></label> <!></div> <div class="report-list svelte-wkly2m"></div> <!>',1),Pt=P('<!> <div class="page-header svelte-wkly2m"><div class="header-top svelte-wkly2m"><div><h1 class="svelte-wkly2m">Reports</h1> <p class="subtitle svelte-wkly2m"> </p></div> <!></div> <!></div> <!>',1);function qt(Pe,Re){et(Re,!1);const[De,Me]=nt(),ie=()=>ot(pt,"$reportsVersion",De),W=v(),R=v(),ne=v(),H=v(),X=v();let D=v([]),_=v(0),N=v(0),oe=v(0),Y=v([]),C=v(1),ve=v(!1),d=v(new Set),g=v({open:!1,targets:[]}),Z=v(!1);async function U(){try{let t=await $e({page:e(C),limit:F});t.reports.length===0&&e(C)>1&&(n(C,Math.max(1,Math.ceil(t.total/F))),t=await $e({page:e(C),limit:F})),n(D,t.reports),n(_,t.total),n(N,t.passCount),n(oe,t.failCount),n(Y,t.trend),n(d,new Set),await lt(),n(ve,!0)}catch(t){console.error("Failed to fetch reports",t)}}function Ae(t){n(C,t),U()}tt(U);function Ce(t,i){i.preventDefault(),i.stopPropagation();const r=new Set(e(d));r.has(t)?r.delete(t):r.add(t),n(d,r)}function Te(t){if(t.stopPropagation(),e(H)){const i=new Set(e(d));e(D).forEach(r=>i.delete(r.id)),n(d,i)}else{const i=new Set(e(d));e(D).forEach(r=>i.add(r.id)),n(d,i)}}function de(t){n(g,{open:!0,targets:t})}function Ee(t,i){i.preventDefault(),i.stopPropagation(),de([t])}async function Be(){n(Z,!0);try{e(g).targets.length===1?await vt(e(g).targets[0]):await dt([...e(g).targets]),n(g,{open:!1,targets:[]}),await U()}catch(t){console.error("Delete failed",t)}finally{n(Z,!1)}}B(()=>(e(_),F),()=>{n(W,Math.ceil(e(_)/F))}),B(()=>(e(_),e(N)),()=>{n(R,e(_)?Math.round(e(N)/e(_)*100):0)}),B(()=>e(Y),()=>{n(ne,[...e(Y)].reverse())}),B(()=>(e(D),e(d)),()=>{n(H,e(D).length>0&&e(D).every(t=>e(d).has(t.id)))}),B(()=>e(d),()=>{n(X,e(d).size>0)}),B(()=>ie(),()=>{ie()&&U()}),at(),Ze();var ce=Pt();Xe(t=>{rt.title="Reports — Plum"});var pe=Q(ce);const Ve=O(()=>e(g).targets.length===1?"Delete report?":`Delete ${e(g).targets.length} reports?`);_t(pe,{get title(){return e(Ve)},confirmLabel:"Delete",get loading(){return e(Z)},get open(){return e(g).open},set open(t){it(g,e(g).open=t)},$$events:{confirm:Be},children:(t,i)=>{var r=Ye(),h=Q(r);{var x=f=>{var y=J("This will permanently remove the report and its data file.");m(f,y)},T=f=>{var y=J();k(()=>w(y,`This will permanently remove ${e(g).targets.length??""} reports and their data files.`)),m(f,y)};A(h,f=>{e(g).targets.length===1?f(x):f(T,!1)})}m(t,r)},$$slots:{default:!0},$$legacy:!0});var ee=o(pe,2),te=l(ee),ae=l(te),me=o(l(ae),2),ze=l(me);s(me),s(ae);var Le=o(ae,2);{var je=t=>{var i=wt(),r=l(i),h=l(r);s(r),q(2),s(i),k(()=>{b(r,"pass",e(R)>=80),b(r,"warn",e(R)<80&&e(R)>=50),b(r,"fail",e(R)<50),w(h,`${e(R)??""}%`)}),m(t,i)};A(Le,t=>{e(_)>0&&t(je)})}s(te);var Oe=o(te,2);{var qe=t=>{var i=kt(),r=Q(i),h=l(r),x=l(h);s(h);var T=o(h,2),f=l(T),y=l(f);s(f);var I=o(f,2),se=l(I);s(I),s(T),s(r);var u=o(r,2),a=o(l(u),2);we(a,5,()=>e(ne),ye,(M,p,V)=>{var $=yt();k(S=>{G($,"style",S),G($,"title",`${e(p).status??""} · ${e(p).tags??""} · ${e(p).date??""}`),b($,"pass",e(p).status==="PASS"),b($,"fail",e(p).status!=="PASS")},[()=>xe(V,35)],O),m(M,$)}),s(a),q(2),s(u),k(()=>{G(x,"style",`width: ${(e(ve)?e(R)+"%":"0")??""}`),w(y,`${e(N)??""} passed`),w(se,`${e(oe)??""} failed`)}),m(t,i)};A(Oe,t=>{e(_)>0&&t(qe)})}s(ee);var Fe=o(ee,2);{var Ge=t=>{ht(t,{message:"No reports yet. Run a test to generate one."})},He=t=>{var i=St(),r=Q(i),h=l(r),x=l(h);ke(x),s(h);var T=o(h,2);{var f=u=>{var a=bt(),M=l(a);s(a),k(()=>w(M,`Delete (${e(d).size??""})`)),K("click",a,()=>de([...e(d)])),m(u,a)};A(T,u=>{e(X)&&u(f)})}s(r);var y=o(r,2);we(y,5,()=>e(D),ye,(u,a,M)=>{var p=$t(),V=l(p),$=l(V);ke($),s(V);var S=o(V,2),le=l(S),z=l(le),Ne=l(z,!0);s(z);var ge=o(z,2),re=l(ge),Ue=l(re,!0);s(re);var fe=o(re,2),ue=l(fe);const Ie=O(()=>ft(e(a).triggerType));Se(ue,{get variant(){return e(Ie)},children:(c,L)=>{q();var j=J();k(E=>w(j,E),[()=>mt(e(a).triggerType)],O),m(c,j)},$$slots:{default:!0}});var Je=o(ue,2);{var Ke=c=>{Se(c,{variant:"neutral",children:(L,j)=>{q();var E=J();k(()=>w(E,e(a).browser)),m(L,E)},$$slots:{default:!0}})};A(Je,c=>{e(a).browser&&e(a).browser!=="chromium"&&c(Ke)})}s(fe),s(ge),s(le);var _e=o(le,2),he=l(_e),Qe=l(he,!0);s(he),q(2),s(_e),s(S);var We=o(S,2);s(p),k((c,L,j,E)=>{G(p,"style",c),b(p,"is-selected",L),be($,L),G(S,"href",j),b(S,"is-pass",e(a).status==="PASS"),b(S,"is-fail",e(a).status!=="PASS"),b(z,"pass",e(a).status==="PASS"),b(z,"fail",e(a).status!=="PASS"),w(Ne,e(a).status==="PASS"?"✓":"✗"),w(Ue,E),w(Qe,e(a).date)},[()=>xe(M),()=>e(d).has(e(a).id),()=>ct(e(a).id),()=>{var c;return((c=e(a).testRun)==null?void 0:c.title)??(gt(e(a).triggerType)?e(a).triggerType:e(a).tags)}],O),K("change",$,c=>Ce(e(a).id,c)),K("click",We,c=>Ee(e(a).id,c)),m(u,p)}),s(y);var I=o(y,2);{var se=u=>{var a=xt(),M=l(a);ut(M,{get current(){return e(C)},get total(){return e(W)},$$events:{change:p=>Ae(p.detail)}}),s(a),m(u,a)};A(I,u=>{e(W)>1&&u(se)})}k(()=>{be(x,e(H)),x.indeterminate=e(X)&&!e(H)}),K("change",x,Te),m(t,i)};A(Fe,t=>{e(_)===0?t(Ge):t(He,!1)})}k(()=>w(ze,`${e(_)??""} run${(e(_)!==1?"s":"")??""} recorded`)),m(Pe,ce),st(),Me()}export{qt as component};
|
|
Binary file
|
|
Binary file
|
|
@@ -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 l,t as o,s as n,b as Ze,c as Ee,n as pe,e as F,h as $t}from"../chunks/ll-VsEGv.js";import{i as Zs}from"../chunks/DGryW1Vp.js";import{t as d,k as t,n as s,p as et,l as H,s as u,al as Tt,b as st,c as e,d as tt,m as x,f as te,an as zt,o as Dt,as as At,$ as Et,j as a,ar as ys,z as M,v as Ae}from"../chunks/C67QNx7Z.js";import{i as _,s as Ft,a as Ht}from"../chunks/CVV6HrFb.js";import{t as q,a as Gs,d as Nt,e as xe,i as we,c as Gt}from"../chunks/DmRbbcS3.js";import{s as I,i as Kt,r as Ot,g as Ut}from"../chunks/CstKKb9b.js";import{s as Ks}from"../chunks/Bfc47y5P.js";import{b as Vt}from"../chunks/C4eeChIU.js";import{p as Wt}from"../chunks/BFgtfHj2.js";import{b as Yt,s as Os}from"../chunks/CxTX_lpP.js";import{k as Jt,p as Qt,g as Us,f as Vs,s as Ws,b as Xe,c as Xt,d as Ys,t as Zt,i as ea}from"../chunks/B0pefNHY.js";import{B as sa}from"../chunks/BIRVeCLU.js";import{B as ta}from"../chunks/CyQ_oBw2.js";import{p as be}from"../chunks/BeO8veBd.js";var aa=o('<span class="status-dot svelte-eg9xrn"></span>');function Js(N,L){let g=be(L,"status",8,"passed");var p=aa();d(()=>{q(p,"pass",g()==="passed"),q(p,"fail",g()==="failed"),q(p,"skip",g()!=="passed"&&g()!=="failed")}),l(N,p)}var ra=o('<span class="tag-chip svelte-foe7v9"> </span>');function la(N,L){let g=be(L,"tag",8,"");var p=ra(),B=t(p,!0);s(p),d(()=>n(B,g())),l(N,p)}var ca=o('<span class="kw svelte-3mvi7i"> </span>');function Qs(N,L){et(L,!1);const g=x();let p=be(L,"keyword",8,"");H(()=>Tt(p()),()=>{u(g,Jt(p()))}),st(),Zs();var B=ca(),S=t(B,!0);s(B),d(()=>{q(B,"kw-given",e(g)==="kw-given"),q(B,"kw-when",e(g)==="kw-when"),q(B,"kw-then",e(g)==="kw-then"),q(B,"kw-and",e(g)==="kw-and"),n(S,p())}),l(N,B),tt()}var na=o('<span class="step-status-icon svelte-9zpq1y"><!></span>');function Xs(N,L){let g=be(L,"status",8,"passed");var p=na(),B=t(p);{var S=w=>{var k=Ze("✓");l(w,k)},K=w=>{var k=Ee(),b=te(k);{var de=A=>{var z=Ze("✗");l(A,z)},ae=A=>{var z=Ze("−");l(A,z)};_(b,A=>{g()==="failed"?A(de):A(ae,!1)},!0)}l(w,k)};_(B,w=>{g()==="passed"?w(S):w(K,!1)})}s(p),d(()=>{q(p,"icon-pass",g()==="passed"),q(p,"icon-fail",g()==="failed"),q(p,"icon-skip",g()!=="passed"&&g()!=="failed")}),l(N,p)}var oa=pe('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2c0 4.5-5 7-5 12a5 5 0 0 0 10 0c0-5-5-7.5-5-12z"></path><path d="M12 9c0 2.5-2.5 4-2.5 7a2.5 2.5 0 0 0 5 0c0-3-2.5-4.5-2.5-7z"></path></svg>'),va=pe('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><polygon points="12,5.5 14.5,12 12,10.5 9.5,12" fill="currentColor" stroke="none"></polygon><polygon points="12,18.5 9.5,12 12,13.5 14.5,12" fill="currentColor" stroke="none" opacity="0.35"></polygon></svg>'),ia=pe('<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="4"></circle><line x1="21.17" y1="8" x2="12" y2="8"></line><line x1="3.95" y1="6.06" x2="8.54" y2="14"></line><line x1="10.88" y1="21.94" x2="15.46" y2="14"></line></svg>');function pa(N,L){let g=be(L,"browser",8,"chromium"),p=be(L,"size",8,11);var B=Ee(),S=te(B);{var K=k=>{var b=oa();d(()=>{I(b,"width",p()),I(b,"height",p())}),l(k,b)},w=k=>{var b=Ee(),de=te(b);{var ae=z=>{var O=va();d(()=>{I(O,"width",p()),I(O,"height",p())}),l(z,O)},A=z=>{var O=ia();d(()=>{I(O,"width",p()),I(O,"height",p())}),l(z,O)};_(de,z=>{g()==="webkit"?z(ae):z(A,!1)},!0)}l(k,b)};_(S,k=>{g()==="firefox"?k(K):k(w,!1)})}l(N,B)}var da=o('<div class="error-state svelte-1cdcqpr"> </div>'),ua=o('<div class="loading-state svelte-1cdcqpr"><div class="loading-dots svelte-1cdcqpr"><span class="svelte-1cdcqpr"></span><span class="svelte-1cdcqpr"></span><span class="svelte-1cdcqpr"></span></div></div>'),_a=pe('<svg width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-1cdcqpr"><polyline points="20 6 9 17 4 12" class="svelte-1cdcqpr"></polyline></svg>'),ga=pe('<svg width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-1cdcqpr"><line x1="18" y1="6" x2="6" y2="18" class="svelte-1cdcqpr"></line><line x1="6" y1="6" x2="18" y2="18" class="svelte-1cdcqpr"></line></svg>'),ha=o('<span class="run-name-badge svelte-1cdcqpr"> </span>'),fa=o('<span class="run-name-badge svelte-1cdcqpr"> </span>'),qa=o('<div class="stat svelte-1cdcqpr"><span class="stat-num fail-color svelte-1cdcqpr"> </span> <span class="stat-label svelte-1cdcqpr"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-1cdcqpr"><line x1="18" y1="6" x2="6" y2="18" class="svelte-1cdcqpr"></line><line x1="6" y1="6" x2="18" y2="18" class="svelte-1cdcqpr"></line></svg> failed</span></div>'),ya=o('<div class="stat svelte-1cdcqpr"><span class="stat-num muted-color svelte-1cdcqpr"> </span> <span class="stat-label svelte-1cdcqpr"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" class="svelte-1cdcqpr"><line x1="5" y1="12" x2="19" y2="12" class="svelte-1cdcqpr"></line></svg> skipped</span></div>'),ka=o('<span class="log-runner-count svelte-1cdcqpr"> </span>'),ma=o('<button class="log-tab svelte-1cdcqpr"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" class="svelte-1cdcqpr"><rect x="2" y="3" width="20" height="14" rx="2" class="svelte-1cdcqpr"></rect><path d="M8 21h8M12 17v4" class="svelte-1cdcqpr"></path></svg> </button>'),xa=o('<div class="log-tabs svelte-1cdcqpr"></div>'),wa=o('<details class="logs-section svelte-1cdcqpr"><summary class="logs-summary svelte-1cdcqpr"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-1cdcqpr"><polyline points="4 17 10 11 4 5" class="svelte-1cdcqpr"></polyline><line x1="12" y1="19" x2="20" y2="19" class="svelte-1cdcqpr"></line></svg> Run Logs <!></summary> <!> <pre class="logs-body svelte-1cdcqpr"> </pre></details>'),ba=o('<span class="suite-tag svelte-1cdcqpr"> </span>'),Ca=o('<span class="scenario-count svelte-1cdcqpr"> </span>'),Ba=o('<button class="replay-btn svelte-1cdcqpr" title="Watch replay"><svg width="11" height="11" viewBox="0 0 24 24" fill="currentColor" stroke="none" class="svelte-1cdcqpr"><polygon points="5,3 19,12 5,21" class="svelte-1cdcqpr"></polygon></svg> Replay</button>'),Sa=o('<button class="replay-btn replay-btn-sm svelte-1cdcqpr"><svg width="9" height="9" viewBox="0 0 24 24" fill="currentColor" stroke="none" class="svelte-1cdcqpr"><polygon points="5,3 19,12 5,21" class="svelte-1cdcqpr"></polygon></svg> Replay</button>'),Pa=o('<div class="example-header svelte-1cdcqpr"><!> <span class="svelte-1cdcqpr"></span> <span class="scenario-duration svelte-1cdcqpr"> </span> <!></div>'),Ra=o('<pre class="step-error svelte-1cdcqpr"> </pre>'),ja=o('<details class="screenshot-wrap svelte-1cdcqpr"><summary class="screenshot-toggle svelte-1cdcqpr">Screenshot</summary> <img class="screenshot svelte-1cdcqpr" alt="Step screenshot"></details>'),Ma=o('<div class="step svelte-1cdcqpr"><div class="step-row svelte-1cdcqpr"><!> <!> <span class="step-name svelte-1cdcqpr"> </span> <span class="step-duration svelte-1cdcqpr"> </span></div> <!> <!></div>'),Ia=o("<!> <!>",1),La=o('<div class="steps svelte-1cdcqpr"></div>'),$a=o('<div class="scenario svelte-1cdcqpr"><div class="scenario-row svelte-1cdcqpr"><button class="scenario-header svelte-1cdcqpr"><!> <span class="scenario-name svelte-1cdcqpr"> <!></span> <div class="scenario-tags svelte-1cdcqpr"></div> <span class="scenario-duration svelte-1cdcqpr"> </span> <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" class="chevron svelte-1cdcqpr"><polyline points="9 18 15 12 9 6" class="svelte-1cdcqpr"></polyline></svg></button> <!></div> <!></div>'),Ta=o('<div class="feature svelte-1cdcqpr"><div class="feature-header svelte-1cdcqpr"><h2 class="feature-name svelte-1cdcqpr"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feature-icon svelte-1cdcqpr"><path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z" class="svelte-1cdcqpr"></path><polyline points="14 2 14 8 20 8" class="svelte-1cdcqpr"></polyline></svg> <!></h2> <div class="feature-right svelte-1cdcqpr"><span class="feature-file svelte-1cdcqpr"> </span> <!></div></div> <div class="scenarios svelte-1cdcqpr"></div></div>'),za=o('<div class="report-header svelte-1cdcqpr"><div class="header-main svelte-1cdcqpr"><div class="header-status svelte-1cdcqpr"><div class="status-icon-wrap svelte-1cdcqpr"><!></div> <div class="svelte-1cdcqpr"><div class="h1-row svelte-1cdcqpr"><h1 class="svelte-1cdcqpr"> </h1> <!></div> <div class="header-meta svelte-1cdcqpr"><span class="mono svelte-1cdcqpr"> </span> <span class="meta-sep svelte-1cdcqpr">·</span> <span class="svelte-1cdcqpr"> </span> <span class="meta-sep svelte-1cdcqpr">·</span> <span class="svelte-1cdcqpr"> </span> <span class="meta-sep svelte-1cdcqpr">·</span> <span class="browser-pill svelte-1cdcqpr"><!> </span></div></div></div> <div class="header-stats svelte-1cdcqpr"><div class="stat svelte-1cdcqpr"><span class="stat-num pass-color svelte-1cdcqpr"> </span> <span class="stat-label svelte-1cdcqpr"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-1cdcqpr"><polyline points="20 6 9 17 4 12" class="svelte-1cdcqpr"></polyline></svg> passed</span></div> <!> <!> <div class="stat svelte-1cdcqpr"><span class="stat-num svelte-1cdcqpr"> </span> <span class="stat-label svelte-1cdcqpr"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-1cdcqpr"><circle cx="12" cy="12" r="10" class="svelte-1cdcqpr"></circle><polyline points="12 6 12 12 16 14" class="svelte-1cdcqpr"></polyline></svg> duration</span></div> <div class="stat svelte-1cdcqpr"><span class="stat-num svelte-1cdcqpr"> </span> <span class="stat-label svelte-1cdcqpr"><svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" class="svelte-1cdcqpr"><rect x="2" y="3" width="20" height="14" rx="2" class="svelte-1cdcqpr"></rect><path d="M8 21h8M12 17v4" class="svelte-1cdcqpr"></path></svg> </span></div></div></div></div> <!> <!>',1),Da=o('<img class="replay-screenshot svelte-1cdcqpr">'),Aa=o('<div class="replay-no-screenshot svelte-1cdcqpr">No screenshot captured for this step</div>'),Ea=pe('<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" stroke="none" class="svelte-1cdcqpr"><rect x="6" y="4" width="4" height="16" rx="1" class="svelte-1cdcqpr"></rect><rect x="14" y="4" width="4" height="16" rx="1" class="svelte-1cdcqpr"></rect></svg>'),Fa=pe('<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" stroke="none" class="svelte-1cdcqpr"><polygon points="5,3 19,12 5,21" class="svelte-1cdcqpr"></polygon></svg>'),Ha=o('<div class="replay-overlay svelte-1cdcqpr"><div class="replay-modal svelte-1cdcqpr"><div class="replay-modal-header svelte-1cdcqpr"><span class="replay-modal-title svelte-1cdcqpr"> </span> <button class="replay-close svelte-1cdcqpr"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" class="svelte-1cdcqpr"><line x1="18" y1="6" x2="6" y2="18" class="svelte-1cdcqpr"></line><line x1="6" y1="6" x2="18" y2="18" class="svelte-1cdcqpr"></line></svg></button></div> <div class="replay-screenshot-area svelte-1cdcqpr"><!></div> <div class="replay-timeline svelte-1cdcqpr"><input type="range" class="replay-slider svelte-1cdcqpr" min="0"></div> <div class="replay-step-info svelte-1cdcqpr"><!> <!> <span class="replay-step-name svelte-1cdcqpr"> </span></div> <div class="replay-nav svelte-1cdcqpr"><button class="replay-nav-btn svelte-1cdcqpr"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" class="svelte-1cdcqpr"><polyline points="15 18 9 12 15 6" class="svelte-1cdcqpr"></polyline></svg></button> <button class="replay-play-btn svelte-1cdcqpr"><!></button> <button class="replay-nav-btn svelte-1cdcqpr"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" class="svelte-1cdcqpr"><polyline points="9 18 15 12 9 6" class="svelte-1cdcqpr"></polyline></svg></button> <span class="replay-counter svelte-1cdcqpr"> </span></div></div></div>'),Na=o("<!> <!> <!>",1);function ar(N,L){et(L,!1);const[g,p]=Ft(),B=()=>Ht(Wt,"$page",g),S=x(),K=x(),w=x(),k=x(),b=x(),de=x(),ae=x(),A=x(),z=x(),O=x(),at=parseInt(B().params.id,10);let h=x(null),es=x(null),ue=x(new Set),Fe=x(!1),re=x(null),C=x(0),Ce=x(!1),_e=null;zt(()=>{_e&&clearInterval(_e)});function ks(){u(Ce,!0),_e=setInterval(()=>{var r,f;e(C)<(((f=(r=e(re))==null?void 0:r.steps)==null?void 0:f.length)??0)-1?ys(C):le()},Kt)}function le(){u(Ce,!1),_e&&(clearInterval(_e),_e=null)}function ms(r){le(),u(re,r),u(C,0),u(Fe,!0),ks()}function ss(){le(),u(Fe,!1),u(re,null)}function xs(){e(Ce)?le():(e(C)>=e(S).length-1&&u(C,0),ks())}function ws(){le(),e(C)>0&&ys(C,-1)}function bs(){le(),e(C)<e(S).length-1&&ys(C)}function rt(r){e(Fe)&&(r.key==="ArrowRight"?bs():r.key==="ArrowLeft"?ws():r.key===" "?(r.preventDefault(),xs()):r.key==="Escape"&&ss())}Dt(async()=>{try{u(h,await Yt(at))}catch{u(es,"Could not load report.")}});function lt(r){e(ue).has(r)?e(ue).delete(r):e(ue).add(r),u(ue,e(ue))}let He=x(0);H(()=>e(re),()=>{var r;u(S,((r=e(re))==null?void 0:r.steps)??[])}),H(()=>(e(S),e(C)),()=>{u(K,e(S)[e(C)]??null)}),H(()=>e(h),()=>{var r;u(w,Qt(((r=e(h))==null?void 0:r.logs)??null))}),H(()=>e(w),()=>{e(w)&&u(He,0)}),H(()=>e(h),()=>{var r;u(k,((r=e(h))==null?void 0:r.status)==="PASS")}),H(()=>e(h),()=>{var r;u(b,((r=e(h))==null?void 0:r.features.flatMap(f=>f.scenarios))??[])}),H(()=>e(b),()=>{u(de,e(b).filter(r=>r.status==="passed").length)}),H(()=>e(b),()=>{u(ae,e(b).filter(r=>r.status==="failed").length)}),H(()=>e(b),()=>{u(A,e(b).filter(r=>r.status==="skipped"||r.status==="pending").length)}),H(()=>(e(h),e(b)),()=>{var r;u(z,((r=e(h))==null?void 0:r.duration)??e(b).reduce((f,V)=>f+V.duration,0))}),H(()=>(e(h),Us),()=>{var r;u(O,((r=e(h))==null?void 0:r.features.map(f=>({...f,scenarioGroups:Us(f.scenarios)})))??[])}),st(),Zs();var Cs=Na();F("keydown",At,rt),$t(r=>{Et.title="Report — Plum"});var Bs=te(Cs);ta(Bs,{href:"/reports",label:"Reports"});var Ss=a(Bs,2);{var ct=r=>{var f=da(),V=t(f,!0);s(f),d(()=>n(V,e(es))),l(r,f)},nt=r=>{var f=Ee(),V=te(f);{var Be=X=>{var ge=ua();l(X,ge)},Se=X=>{var ge=za(),W=te(ge),Ne=t(W),Pe=t(Ne),ce=t(Pe),Re=t(ce);{var ne=i=>{var c=_a();l(i,c)},je=i=>{var c=ga();l(i,c)};_(Re,i=>{e(k)?i(ne):i(je,!1)})}s(ce);var Me=a(ce,2),Ie=t(Me),he=t(Ie),ts=t(he,!0);s(he);var Ge=a(he,2);{var as=i=>{var c=ha(),m=t(c,!0);s(c),d(()=>n(m,e(h).testRun.title)),l(i,c)},Ke=i=>{var c=Ee(),m=te(c);{var T=J=>{var U=fa(),qe=t(U,!0);s(U),d(()=>n(qe,e(h).triggerType)),l(J,U)};_(m,J=>{ea(e(h).triggerType)&&J(T)},!0)}l(i,c)};_(Ge,i=>{var c;(c=e(h).testRun)!=null&&c.title?i(as):i(Ke,!1)})}s(Ie);var fe=a(Ie,2),Y=t(fe),rs=t(Y,!0);s(Y);var Le=a(Y,4),ls=t(Le,!0);s(Le);var oe=a(Le,4),Oe=t(oe,!0);s(oe);var Ue=a(oe,4),v=t(Ue);const $=M(()=>e(h).browser??"chromium");pa(v,{get browser(){return e($)}});var cs=a(v);s(Ue),s(fe),s(Me),s(Pe);var Ps=a(Pe,2),ns=t(Ps),Rs=t(ns),it=t(Rs,!0);s(Rs),Ae(2),s(ns);var js=a(ns,2);{var pt=i=>{var c=qa(),m=t(c),T=t(m,!0);s(m),Ae(2),s(c),d(()=>n(T,e(ae))),l(i,c)};_(js,i=>{e(ae)>0&&i(pt)})}var Ms=a(js,2);{var dt=i=>{var c=ya(),m=t(c),T=t(m,!0);s(m),Ae(2),s(c),d(()=>n(T,e(A))),l(i,c)};_(Ms,i=>{e(A)>0&&i(dt)})}var os=a(Ms,2),Is=t(os),ut=t(Is,!0);s(Is),Ae(2),s(os);var Ls=a(os,2),vs=t(Ls),_t=t(vs,!0);s(vs);var $s=a(vs,2),gt=a(t($s));s($s),s(Ls),s(Ps),s(Ne),s(W);var Ts=a(W,2);{var ht=i=>{var c=wa(),m=t(c),T=a(t(m),2);{var J=D=>{var E=ka(),$e=t(E);s(E),d(()=>n($e,`${e(w).length??""} runners`)),l(D,E)};_(T,D=>{e(w).length>1&&D(J)})}s(m);var U=a(m,2);{var qe=D=>{var E=xa();xe(E,5,()=>e(w),we,($e,ps,We)=>{var Z=ma(),G=a(t(Z));s(Z),d(()=>{q(Z,"log-tab-active",e(He)===We),n(G,` ${e(ps).name??""}`)}),F("click",Z,Ks(()=>u(He,We))),l($e,Z)}),s(E),l(D,E)};_(U,D=>{e(w).length>1&&D(qe)})}var Ve=a(U,2),is=t(Ve,!0);s(Ve),s(c),d(()=>{var D;return n(is,((D=e(w)[e(He)])==null?void 0:D.content)??"")}),l(i,c)};_(Ts,i=>{e(w).length>0&&i(ht)})}var ft=a(Ts,2);xe(ft,1,()=>e(O),we,(i,c,m)=>{var T=Ta(),J=t(T),U=t(J),qe=a(t(U)),Ve=a(qe);{var is=G=>{var y=ba(),ye=t(y,!0);s(y),d(ve=>n(ye,ve),[()=>Vs(e(c))],M),l(G,y)};_(Ve,G=>{Vs(e(c))&&G(is)})}s(U);var D=a(U,2),E=t(D),$e=t(E,!0);s(E);var ps=a(E,2);const We=M(()=>e(c).status==="passed"?"pass":"fail");sa(ps,{get variant(){return e(We)},children:(G,y)=>{Ae();var ye=Ze();d(()=>n(ye,e(c).status)),l(G,ye)},$$slots:{default:!0}}),s(D),s(J);var Z=a(J,2);xe(Z,5,()=>e(c).scenarioGroups,we,(G,y,ye)=>{var ve=$a();const zs=M(()=>`${m}-${e(y).key}`),Ds=M(()=>e(ue).has(e(zs))),qt=M(()=>e(y).scenarios.some(Ys));var ds=t(ve),Ye=t(ds),As=t(Ye);Js(As,{get status(){return e(y).status}});var us=a(As,2),Es=t(us),yt=a(Es);{var kt=P=>{var R=Ca(),hs=t(R);s(R),d(()=>n(hs,`${e(y).scenarios.length??""} cases`)),l(P,R)};_(yt,P=>{e(y).scenarios.length>1&&P(kt)})}s(us);var _s=a(us,2);xe(_s,5,()=>e(y).tags,we,(P,R)=>{la(P,{get tag(){return e(R)}})}),s(_s);var gs=a(_s,2),mt=t(gs,!0);s(gs);var xt=a(gs,2);s(Ye);var wt=a(Ye,2);{var bt=P=>{var R=Ba();F("click",R,()=>ms(e(y).scenarios[0])),l(P,R)};_(wt,P=>{e(qt)&&e(y).scenarios.length===1&&P(bt)})}s(ds);var Ct=a(ds,2);{var Bt=P=>{var R=La();xe(R,5,()=>e(y).scenarios,we,(hs,Te,St)=>{var Fs=Ia(),Hs=te(Fs);{var Pt=ze=>{var j=Pa(),ee=t(j);Js(ee,{get status(){return e(Te).status}});var ke=a(ee,2);ke.textContent=`Case ${St+1}`;var me=a(ke,2),Je=t(me,!0);s(me);var De=a(me,2);{var fs=se=>{var Qe=Sa();F("click",Qe,()=>ms(e(Te))),l(se,Qe)};_(De,se=>{Ys(e(Te))&&se(fs)})}s(j),d(se=>n(Je,se),[()=>Xe(e(Te).duration)],M),l(ze,j)};_(Hs,ze=>{e(y).scenarios.length>1&&ze(Pt)})}var Rt=a(Hs,2);xe(Rt,1,()=>e(Te).steps,we,(ze,j)=>{var ee=Ma(),ke=t(ee),me=t(ke);Xs(me,{get status(){return e(j).status}});var Je=a(me,2);Qs(Je,{get keyword(){return e(j).keyword}});var De=a(Je,2),fs=t(De,!0);s(De);var se=a(De,2),Qe=t(se,!0);s(se),s(ke);var Ns=a(ke,2);{var jt=Q=>{var ie=Ra(),qs=t(ie,!0);s(ie),d(()=>n(qs,e(j).error)),l(Q,ie)};_(Ns,Q=>{e(j).error&&Q(jt)})}var Mt=a(Ns,2);{var It=Q=>{var ie=ja(),qs=a(t(ie),2);s(ie),d(Lt=>I(qs,"src",Lt),[()=>Os(e(j).screenshot)],M),l(Q,ie)};_(Mt,Q=>{e(j).screenshot&&Q(It)})}s(ee),d(Q=>{q(ee,"step-fail",e(j).status==="failed"),q(ee,"step-skip",e(j).status==="skipped"||e(j).status==="pending"),n(fs,e(j).name),n(Qe,Q)},[()=>Xe(e(j).duration)],M),l(ze,ee)}),l(hs,Fs)}),s(R),Gs(3,R,()=>Gt,()=>({duration:200})),l(P,R)};_(Ct,P=>{e(Ds)&&P(Bt)})}s(ve),d((P,R)=>{I(ve,"style",P),q(ve,"scenario-fail",e(y).status==="failed"),n(Es,`${e(y).name??""} `),n(mt,R),q(xt,"rotated",e(Ds))},[()=>Ws(m*5+ye,40),()=>Xe(e(y).duration)],M),F("click",Ye,()=>lt(e(zs))),l(G,ve)}),s(Z),s(T),d((G,y)=>{I(T,"style",G),q(T,"feature-pass",e(c).status==="passed"),q(T,"feature-fail",e(c).status!=="passed"),n(qe,` ${e(c).name??""} `),I(E,"title",e(c).uri),n($e,y)},[()=>Ws(m,60),()=>Xt(e(c).uri)],M),l(i,T)}),d((i,c,m)=>{q(W,"pass",e(k)),q(W,"fail",!e(k)),q(ce,"pass-bg",e(k)),q(ce,"fail-bg",!e(k)),n(ts,e(k)?"Passed":"Failed"),n(rs,e(h).tags),n(ls,i),n(Oe,c),n(cs,` ${e(h).browser??"chromium"}`),n(it,e(de)),n(ut,m),n(_t,e(h).runners),n(gt,` runner${(e(h).runners!==1?"s":"")??""}`)},[()=>Zt(e(h).triggerType),()=>new Date(e(h).createdAt).toLocaleString(),()=>Xe(e(z))],M),l(X,ge)};_(V,X=>{e(h)?X(Se,!1):X(Be)},!0)}l(r,f)};_(Ss,r=>{e(es)?r(ct):r(nt,!1)})}var ot=a(Ss,2);{var vt=r=>{var f=Ha(),V=t(f),Be=t(V),Se=t(Be),X=t(Se,!0);s(Se);var ge=a(Se,2);s(Be);var W=a(Be,2),Ne=t(W);{var Pe=v=>{var $=Da();d(cs=>{I($,"src",cs),I($,"alt",`Step ${e(C)+1} screenshot`)},[()=>Os(e(K).screenshot)],M),l(v,$)},ce=v=>{var $=Aa();l(v,$)};_(Ne,v=>{var $;($=e(K))!=null&&$.screenshot?v(Pe):v(ce,!1)})}s(W);var Re=a(W,2),ne=t(Re);Ot(ne),s(Re);var je=a(Re,2),Me=t(je);const Ie=M(()=>{var v;return((v=e(K))==null?void 0:v.status)??"skipped"});Xs(Me,{get status(){return e(Ie)}});var he=a(Me,2);const ts=M(()=>{var v;return((v=e(K))==null?void 0:v.keyword)??""});Qs(he,{get keyword(){return e(ts)}});var Ge=a(he,2),as=t(Ge,!0);s(Ge),s(je);var Ke=a(je,2),fe=t(Ke),Y=a(fe,2),rs=t(Y);{var Le=v=>{var $=Ea();l(v,$)},ls=v=>{var $=Fa();l(v,$)};_(rs,v=>{e(Ce)?v(Le):v(ls,!1)})}s(Y);var oe=a(Y,2),Oe=a(oe,2),Ue=t(Oe);s(Oe),s(Ke),s(V),s(f),d(()=>{var v;n(X,e(re).name),I(ne,"max",e(S).length-1),Ut(ne,e(C)),I(ne,"style",`--fill: ${(e(S).length>1?e(C)/(e(S).length-1)*100:0)??""}%`),n(as,(v=e(K))==null?void 0:v.name),fe.disabled=e(C)===0,I(Y,"title",e(Ce)?"Pause":"Play"),oe.disabled=e(C)===e(S).length-1,n(Ue,`${e(C)+1} / ${e(S).length??""}`)}),F("click",ge,ss),F("input",ne,v=>{le(),u(C,Number(v.target.value))}),F("click",fe,ws),F("click",Y,xs),F("click",oe,bs),F("click",V,Ks(function(v){Vt.call(this,L,v)})),Gs(3,f,()=>Nt,()=>({duration:150})),F("click",f,ss),l(r,f)};_(ot,r=>{e(Fe)&&e(re)&&r(vt)})}l(N,Cs),tt(),p()}export{ar as component};
|
|
Binary file
|
|
Binary file
|
|
@@ -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{h as tt,a as n,t as p,c as ne,s as f,e as fe,b as le,n as Ne}from"../chunks/ll-VsEGv.js";import{i as st}from"../chunks/DGryW1Vp.js";import{h as Te,a2 as at,a as rt,ao as nt,ap as lt,a1 as vt,aa as ot,a9 as it,ab as ct,U as dt,p as pt,aq as gt,an as ut,l as I,b as _t,f as C,d as ft,$ as ht,c as e,y as Be,s as x,ar as mt,j as c,m as R,k as l,n as r,t as _,z as bt,v as Y}from"../chunks/C67QNx7Z.js";import{i as m,s as wt,a as he}from"../chunks/CVV6HrFb.js";import{e as Le,t as L,a as me,f as kt,i as xt,d as $e}from"../chunks/DmRbbcS3.js";import{e as be,s as we,f as yt}from"../chunks/CstKKb9b.js";import{b as je}from"../chunks/BLAiBE__.js";import{g as ve}from"../chunks/KJdjlibc.js";import{p as Rt}from"../chunks/BFgtfHj2.js";import{d as St,e as It,f as Ct}from"../chunks/C3SY6-sX.js";import{r as ke}from"../chunks/CxTX_lpP.js";import{t as Tt}from"../chunks/B0pefNHY.js";import{B as Bt}from"../chunks/CyQ_oBw2.js";import{B as Ee}from"../chunks/BIRVeCLU.js";function Ae(oe,ie,z){Te&&at();var ee=oe,G=dt,$,te=rt()?nt:lt;vt(()=>{te(G,G=ie())&&($&&ot($),$=it(()=>z(ee)))}),Te&&(ee=ct)}var Lt=p('<div class="idle-state svelte-4v9t4g"><div class="idle-icon svelte-4v9t4g"><svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-4v9t4g"><circle cx="12" cy="12" r="10" class="svelte-4v9t4g"></circle><polyline points="12 6 12 12 16 14" class="svelte-4v9t4g"></polyline></svg></div> <h2 class="svelte-4v9t4g">No tests currently running</h2> <p class="svelte-4v9t4g">Start a test from the panel below, then come back here to watch it live.</p> <a href="/reports" class="idle-link svelte-4v9t4g">View past reports →</a></div>'),$t=p('<a class="cron-task-chip svelte-4v9t4g"> </a>'),jt=p('<div class="cron-running-state svelte-4v9t4g"><div class="cron-running-icon svelte-4v9t4g"><span class="cron-pulse-dot svelte-4v9t4g"></span></div> <h2 class="svelte-4v9t4g"> </h2> <div class="cron-task-list svelte-4v9t4g"></div> <p class="svelte-4v9t4g">Select a run above, or wait — the report opens automatically when it finishes.</p></div>'),Et=p('<span class="live-badge svelte-4v9t4g"><span class="live-dot svelte-4v9t4g"></span>Live</span>'),At=p('<span class="run-title-label svelte-4v9t4g"> </span> <span class="run-sep svelte-4v9t4g">·</span>',1),Nt=p('<span class="run-sep svelte-4v9t4g">·</span> <span class="run-detail svelte-4v9t4g"> </span>',1),Pt=p('<div class="run-info svelte-4v9t4g"><!> <span class="run-tag-label svelte-4v9t4g"> </span> <span class="run-sep svelte-4v9t4g">·</span> <span class="run-detail svelte-4v9t4g"> </span> <span class="run-sep svelte-4v9t4g">·</span> <span class="run-detail svelte-4v9t4g"> </span> <!></div>'),qt=p('<button class="cancel-btn svelte-4v9t4g"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-4v9t4g"><rect x="3" y="3" width="18" height="18" rx="2" class="svelte-4v9t4g"></rect><line x1="9" y1="9" x2="15" y2="15" class="svelte-4v9t4g"></line><line x1="15" y1="9" x2="9" y2="15" class="svelte-4v9t4g"></line></svg> Cancel run</button>'),Dt=Ne('<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-4v9t4g"><polyline points="20 6 9 17 4 12" class="svelte-4v9t4g"></polyline></svg> All tests passed',1),Ut=Ne('<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-4v9t4g"><line x1="18" y1="6" x2="6" y2="18" class="svelte-4v9t4g"></line><line x1="6" y1="6" x2="18" y2="18" class="svelte-4v9t4g"></line></svg> Some tests failed',1),Mt=p('<div class="completion-bar svelte-4v9t4g"><div class="completion-left svelte-4v9t4g"><!></div> <div class="completion-right svelte-4v9t4g"><span class="redirect-hint svelte-4v9t4g"> </span> <button class="view-now-btn svelte-4v9t4g">View Report Now <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svelte-4v9t4g"><line x1="5" y1="12" x2="19" y2="12" class="svelte-4v9t4g"></line><polyline points="12 5 19 12 12 19" class="svelte-4v9t4g"></polyline></svg></button></div></div>'),Ft=p('<span class="tab-count svelte-4v9t4g"> </span>'),Ht=p('<button class="lane-tab svelte-4v9t4g"><span class="tab-dot svelte-4v9t4g"></span> <!></button>'),Vt=p('<div class="lane-tabs svelte-4v9t4g"></div>'),Yt=p('<img class="live-shot svelte-4v9t4g" alt="Live browser view">'),zt=p('<!> <div class="step-overlay svelte-4v9t4g"><span class="step-keyword svelte-4v9t4g">Step</span> <span class="step-name svelte-4v9t4g"> </span></div>',1),Gt=p('<div class="awaiting-state svelte-4v9t4g"><svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" opacity="0.25" class="svelte-4v9t4g"><rect x="2" y="5" width="20" height="14" rx="2" class="svelte-4v9t4g"></rect><circle cx="12" cy="12" r="3" class="svelte-4v9t4g"></circle></svg> <span class="svelte-4v9t4g"> </span></div>'),Ot=p('<img class="live-shot svelte-4v9t4g" alt="Live browser view">'),Zt=p('<!> <div class="step-overlay svelte-4v9t4g"><span class="step-keyword svelte-4v9t4g">Step</span> <span class="step-name svelte-4v9t4g"> </span></div>',1),Jt=p('<div class="awaiting-state svelte-4v9t4g"><svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" opacity="0.25" class="svelte-4v9t4g"><rect x="2" y="5" width="20" height="14" rx="2" class="svelte-4v9t4g"></rect><circle cx="12" cy="12" r="3" class="svelte-4v9t4g"></circle></svg> <span class="svelte-4v9t4g"> </span></div>'),Kt=p('<pre class="terminal svelte-4v9t4g"> </pre>'),Qt=p('<pre class="terminal svelte-4v9t4g"> </pre>'),Wt=p('<div class="run-header svelte-4v9t4g"><div class="header-left svelte-4v9t4g"><!> <!></div> <!></div> <!> <!> <div class="run-view svelte-4v9t4g"><div class="screenshot-panel svelte-4v9t4g"><!></div> <div class="terminal-panel svelte-4v9t4g"><div class="terminal-bar svelte-4v9t4g"><span class="dot red svelte-4v9t4g"></span> <span class="dot yellow svelte-4v9t4g"></span> <span class="dot green svelte-4v9t4g"></span> <span class="terminal-label svelte-4v9t4g"><!></span></div> <!></div></div>',1),Xt=p("<!> <!>",1);function us(oe,ie){pt(ie,!1);const[z,ee]=wt(),G=()=>he(Rt,"$page",z),$=()=>he(St,"$backgroundRuns",z),te=()=>he(It,"$runnerState",z),A=R(),t=R(),q=R(),T=R(),D=R(),xe=R(),j=R(),Pe={output:"",running:!1,testCompleted:!1,latestReportId:null,status:"idle",lanes:[],currentRun:null,latestScreenshot:null};let U=R(),M=R(),N=R(null),O=R(be/1e3),P=R(null),E=R(null);gt(()=>{e(U)&&Be(U,e(U).scrollTop=e(U).scrollHeight),e(M)&&Be(M,e(M).scrollTop=e(M).scrollHeight)}),ut(()=>{e(N)&&clearTimeout(e(N)),e(P)&&clearInterval(e(P))});function qe(){e(N)&&clearTimeout(e(N)),e(P)&&clearInterval(e(P)),ve(ke(e(t).latestReportId))}I(()=>G(),()=>{x(A,G().url.searchParams.get("run"))}),I(()=>(e(A),$(),te()),()=>{x(t,e(A)?$()[e(A)]??Pe:te())}),I(()=>e(t),()=>{x(q,e(t).lanes.length>0)}),I(()=>$(),()=>{x(T,Object.entries($()).filter(([,y])=>y.running))}),I(()=>(e(A),e(t),e(T)),()=>{x(D,!e(A)&&!e(t).running&&!e(t).testCompleted&&e(T).length>0)}),I(()=>(e(t),e(D)),()=>{x(xe,!e(t).running&&!e(t).testCompleted&&!e(D))}),I(()=>(e(D),e(T),ve),()=>{e(D)&&e(T).length===1&&ve(`/reports/live?run=${e(T)[0][0]}`)}),I(()=>(e(t),e(E)),()=>{e(t).lanes.length===0?x(E,null):e(t).lanes.find(y=>y.id===e(E))||x(E,e(t).lanes[0].id)}),I(()=>(e(t),e(E)),()=>{x(j,e(t).lanes.find(y=>y.id===e(E))??null)}),I(()=>(e(t),e(N),e(O),e(P),ke),()=>{e(t).testCompleted&&e(t).latestReportId&&!e(N)&&(x(O,be/1e3),x(P,setInterval(()=>{mt(O,-1),e(O)<=0&&clearInterval(e(P))},1e3)),x(N,setTimeout(()=>ve(ke(e(t).latestReportId)),be)))}),_t(),st();var ye=Xt();tt(y=>{ht.title="Live Run — Plum"});var Re=C(ye);Bt(Re,{href:"/reports",label:"Reports"});var De=c(Re,2);{var Ue=y=>{var se=Lt();n(y,se)},Me=y=>{var se=ne(),Fe=C(se);{var He=F=>{var H=jt(),B=c(l(H),2),Z=l(B);r(B);var J=c(B,2);Le(J,5,()=>e(T),([K,Q])=>K,(K,Q)=>{let ce=()=>e(Q)[0],ae=()=>e(Q)[1];var V=$t(),de=l(V);r(V),_(re=>{we(V,"href",`/reports/live?run=${ce()??""}`),f(de,`${ae().label??""} · ${re??""}`)},[()=>Tt(ae().kind)],bt),n(K,V)}),r(J),Y(2),r(H),_(()=>f(Z,`${(e(T).length===1?"A run":`${e(T).length} runs`)??""} in progress`)),n(F,H)},Ve=F=>{var H=Wt(),B=C(H),Z=l(B),J=l(Z);{var K=a=>{var s=Et();n(a,s)},Q=a=>{var s=ne(),d=C(s);{var i=o=>{Ee(o,{variant:"pass",children:(v,g)=>{Y();var u=le("Passed");n(v,u)},$$slots:{default:!0}})},h=o=>{Ee(o,{variant:"fail",children:(v,g)=>{Y();var u=le("Failed");n(v,u)},$$slots:{default:!0}})};m(d,o=>{e(t).status==="pass"?o(i):o(h,!1)},!0)}n(a,s)};m(J,a=>{e(t).running?a(K):a(Q,!1)})}var ce=c(J,2);{var ae=a=>{var s=Pt(),d=l(s);{var i=k=>{var W=At(),X=C(W),_e=l(X,!0);r(X),Y(2),_(()=>f(_e,e(t).currentRun.runTitle)),n(k,W)};m(d,k=>{e(t).currentRun.runTitle&&k(i)})}var h=c(d,2),o=l(h,!0);r(h);var v=c(h,4),g=l(v);r(v);var u=c(v,4),b=l(u,!0);r(u);var w=c(u,2);{var S=k=>{var W=Nt(),X=c(C(W),2),_e=l(X);r(X),_(()=>f(_e,`${e(t).lanes.length??""} runners`)),n(k,W)};m(w,k=>{e(t).lanes.length>1&&k(S)})}r(s),_(()=>{f(o,e(t).currentRun.tag||yt),f(g,`${e(t).currentRun.workers??""} worker${(e(t).currentRun.workers!==1?"s":"")??""}`),f(b,e(t).currentRun.browser)}),n(a,s)};m(ce,a=>{e(t).currentRun&&a(ae)})}r(Z);var V=c(Z,2);{var de=a=>{var s=qt();fe("click",s,function(...d){var i;(i=Ct)==null||i.apply(this,d)}),n(a,s)};m(V,a=>{e(t).running&&!e(A)&&a(de)})}r(B);var re=c(B,2);{var Ye=a=>{var s=Mt(),d=l(s),i=l(d);{var h=w=>{var S=Dt();Y(),n(w,S)},o=w=>{var S=Ut();Y(),n(w,S)};m(i,w=>{e(t).status==="pass"?w(h):w(o,!1)})}r(d);var v=c(d,2),g=l(v),u=l(g);r(g);var b=c(g,2);r(v),r(s),_(()=>{L(s,"pass-bar",e(t).status==="pass"),L(s,"fail-bar",e(t).status==="fail"),f(u,`Redirecting in ${e(O)??""}s…`)}),fe("click",b,qe),me(3,s,()=>kt,()=>({y:-8,duration:250})),n(a,s)};m(re,a=>{e(t).testCompleted&&e(t).latestReportId&&a(Ye)})}var Se=c(re,2);{var ze=a=>{var s=Vt();Le(s,5,()=>e(t).lanes,xt,(d,i)=>{var h=Ht(),o=l(h),v=c(o),g=c(v);{var u=b=>{var w=Ft(),S=l(w,!0);r(w),_(()=>f(S,e(i).testCount)),n(b,w)};m(g,b=>{e(i).testCount&&b(u)})}r(h),_(()=>{L(h,"active",e(E)===e(i).id),L(o,"tab-dot-running",e(i).status==="running"),L(o,"tab-dot-done",e(i).status==="done"),L(o,"tab-dot-error",e(i).status==="error"),f(v,` ${e(i).name??""} `)}),fe("click",h,()=>x(E,e(i).id)),n(d,h)}),r(s),n(a,s)};m(Se,a=>{e(q)&&a(ze)})}var pe=c(Se,2),ge=l(pe),Ge=l(ge);{var Oe=a=>{var s=ne(),d=C(s);{var i=o=>{var v=zt(),g=C(v);Ae(g,()=>e(j).latestScreenshot.data,S=>{var k=Yt();_(()=>we(k,"src",`data:image/jpeg;base64,${e(j).latestScreenshot.data??""}`)),me(1,k,()=>$e,()=>({duration:120})),n(S,k)});var u=c(g,2),b=c(l(u),2),w=l(b,!0);r(b),r(u),_(()=>f(w,e(j).latestScreenshot.stepName)),n(o,v)},h=o=>{var v=Gt(),g=c(l(v),2),u=l(g,!0);r(g),r(v),_(()=>{var b;return f(u,((b=e(j))==null?void 0:b.status)==="running"?"Awaiting stream...":"No stream...")}),n(o,v)};m(d,o=>{var v;(v=e(j))!=null&&v.latestScreenshot?o(i):o(h,!1)})}n(a,s)},Ze=a=>{var s=ne(),d=C(s);{var i=o=>{var v=Zt(),g=C(v);Ae(g,()=>e(t).latestScreenshot.data,S=>{var k=Ot();_(()=>we(k,"src",`data:image/jpeg;base64,${e(t).latestScreenshot.data??""}`)),me(1,k,()=>$e,()=>({duration:120})),n(S,k)});var u=c(g,2),b=c(l(u),2),w=l(b,!0);r(b),r(u),_(()=>f(w,e(t).latestScreenshot.stepName)),n(o,v)},h=o=>{var v=Jt(),g=c(l(v),2),u=l(g,!0);r(g),r(v),_(()=>f(u,e(t).running?"Awaiting stream...":"No stream")),n(o,v)};m(d,o=>{e(t).latestScreenshot?o(i):o(h,!1)},!0)}n(a,s)};m(Ge,a=>{e(q)?a(Oe):a(Ze,!1)})}r(ge);var Ie=c(ge,2),ue=l(Ie),Ce=c(l(ue),6),Je=l(Ce);{var Ke=a=>{var s=le();_(()=>{var d;return f(s,((d=e(j))==null?void 0:d.name)??"Runner")}),n(a,s)},Qe=a=>{var s=le();_(()=>f(s,e(t).running?"Running…":"Finished")),n(a,s)};m(Je,a=>{e(q)?a(Ke):a(Qe,!1)})}r(Ce),r(ue);var We=c(ue,2);{var Xe=a=>{var s=Kt(),d=l(s,!0);r(s),je(s,i=>x(M,i),()=>e(M)),_(()=>{var i;return f(d,((i=e(j))==null?void 0:i.logs)||"(waiting for output…)")}),n(a,s)},et=a=>{var s=Qt(),d=l(s,!0);r(s),je(s,i=>x(U,i),()=>e(U)),_(()=>f(d,e(t).output)),n(a,s)};m(We,a=>{e(q)?a(Xe):a(et,!1)})}r(Ie),r(pe),_(()=>{L(B,"header-pass",e(t).status==="pass"),L(B,"header-fail",e(t).status==="fail"),L(pe,"no-top-radius",e(q))}),n(F,H)};m(Fe,F=>{e(D)?F(He):F(Ve,!1)},!0)}n(y,se)};m(De,y=>{e(xe)?y(Ue):y(Me,!1)})}n(oe,ye),ft(),ee()}export{us as component};
|
|
Binary file
|
|
Binary file
|
|
@@ -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{h as ds,a as m,s as y,e as z,t as E,b as G,c as us}from"../chunks/ll-VsEGv.js";import{i as fs}from"../chunks/DGryW1Vp.js";import{p as ms,o as bs,s as o,f as Se,d as ps,m as D,$ as hs,t as I,z as H,c as e,y as J,j as r,k as n,n as t,x as _s,v as W}from"../chunks/C67QNx7Z.js";import{i as A,s as gs,a as ks}from"../chunks/CVV6HrFb.js";import{e as Ne,i as Ce,t as ce}from"../chunks/DmRbbcS3.js";import{A as de,c as Ye,b as ys,r as Z,B as $s,s as ge}from"../chunks/CstKKb9b.js";import{b as Ae,a as Ke}from"../chunks/raHbXn_9.js";import{T as xs,B as Te,b as ws}from"../chunks/BkKmeUbA.js";import{p as Es}from"../chunks/Bfc47y5P.js";import{f as Ss,a as Ns}from"../chunks/BgNaeXAp.js";import{d as Cs}from"../chunks/C3SY6-sX.js";import{s as Ts}from"../chunks/B0pefNHY.js";import{B as Is}from"../chunks/BIRVeCLU.js";import{M as Ps,C as Rs}from"../chunks/IFIFk6zi.js";import{E as Ds}from"../chunks/BKCNyxZ2.js";async function Oe(){const U=await fetch(`${de}/cron-jobs`),{cronJobs:O}=await U.json();return O??[]}async function Us({taskName:U,cronExpression:O,tags:ke,workers:Ie,browser:Pe,runnerIds:ue,notifyDiscord:j,notifySlack:Re,isEditing:ee,editTaskName:M}){const se=ke.replace(/\sOR\s/gi,ae=>ae.toLowerCase()),X=ee?`${de}/cron-jobs/${encodeURIComponent(M)}`:`${de}/cron-jobs`;return(await fetch(X,{method:ee?"PUT":"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cronExpression:O,taskName:U,tags:se,workers:Ie,browser:Pe,runnerIds:ue,notifyDiscord:j??!1,notifySlack:Re??!1})})).json()}async function Ms(U,O){return(await fetch(`${de}/cron-jobs/${encodeURIComponent(U)}/toggle`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:O})})).json()}async function Js(U){return(await fetch(`${de}/cron-jobs/${encodeURIComponent(U)}/run`,{method:"POST"})).json()}async function Ws(U){return(await fetch(`${de}/cron-jobs/${encodeURIComponent(U)}`,{method:"DELETE"})).json()}var As=E('<option class="svelte-13v7bmf"> </option>'),Os=E('<p class="cron-desc svelte-13v7bmf"> </p>'),Bs=E('<input type="text" class="field-input cron-input svelte-13v7bmf" placeholder="0 9 * * 1-5" spellcheck="false"> <!>',1),qs=E('<button type="button" class="seg-btn svelte-13v7bmf"><span class="seg-num svelte-13v7bmf"> </span></button>'),zs=E('<label class="runner-check-option svelte-13v7bmf"><input type="checkbox" class="svelte-13v7bmf"> <span class="runner-check-dot remote svelte-13v7bmf"></span> <span class="svelte-13v7bmf"> </span> <span class="runner-check-hint svelte-13v7bmf"> </span></label>'),Ls=E('<label class="notify-check-option svelte-13v7bmf"><input type="checkbox" class="svelte-13v7bmf"> <span class="svelte-13v7bmf">Discord</span></label>'),Fs=E('<label class="notify-check-option svelte-13v7bmf"><input type="checkbox" class="svelte-13v7bmf"> <span class="svelte-13v7bmf">Slack</span></label>'),Gs=E('<div class="field svelte-13v7bmf"><div class="field-label svelte-13v7bmf"><span class="svelte-13v7bmf">Notifications</span></div> <div class="notify-checks svelte-13v7bmf"><!> <!></div></div>'),Hs=E('<p class="form-error svelte-13v7bmf"> </p>'),Xs=E('<form class="modal-form svelte-13v7bmf"><div class="field svelte-13v7bmf"><div class="field-label svelte-13v7bmf"><span class="svelte-13v7bmf">Task Name</span> <span class="field-hint svelte-13v7bmf">Use a unique, meaningful name</span></div> <input type="text" class="field-input svelte-13v7bmf" placeholder="nightly-login-suite" required></div> <div class="field svelte-13v7bmf"><div class="field-label svelte-13v7bmf"><span class="svelte-13v7bmf">Schedule</span></div> <select class="field-input svelte-13v7bmf" required><option disabled class="svelte-13v7bmf">Select a schedule</option><!><option class="svelte-13v7bmf">Custom…</option></select> <!></div> <div class="field svelte-13v7bmf"><div class="field-label svelte-13v7bmf"><span class="svelte-13v7bmf">Tags</span> <span class="field-hint svelte-13v7bmf">Multiple: @test-1 or @test-2. Leave blank to run all tests</span></div> <input type="text" class="field-input svelte-13v7bmf" placeholder="@suite-login (optional)"></div> <div class="field svelte-13v7bmf"><div class="field-label svelte-13v7bmf"><span class="svelte-13v7bmf">Workers</span> <span class="field-hint svelte-13v7bmf">Parallel workers for this job</span></div> <div class="stepper svelte-13v7bmf"><button type="button" class="step-btn svelte-13v7bmf">−</button> <span class="step-val svelte-13v7bmf"> </span> <button type="button" class="step-btn svelte-13v7bmf">+</button></div></div> <div class="field svelte-13v7bmf"><div class="field-label svelte-13v7bmf"><span class="svelte-13v7bmf">Browser</span></div> <div class="seg-control svelte-13v7bmf"></div></div> <div class="field svelte-13v7bmf"><div class="field-label svelte-13v7bmf"><span class="svelte-13v7bmf">Runners</span> <span class="field-hint svelte-13v7bmf">Select one or more nodes</span></div> <div class="runner-checks svelte-13v7bmf"><label class="runner-check-option svelte-13v7bmf"><input type="checkbox" class="svelte-13v7bmf"> <span class="runner-check-dot built-in svelte-13v7bmf"></span> <span class="svelte-13v7bmf">Built-in</span> <span class="runner-check-hint svelte-13v7bmf">this server</span></label> <!></div></div> <!> <!> <!></form>'),Ys=E('Are you sure you want to delete <strong class="svelte-13v7bmf"> </strong>? This cannot be undone.',1),Ks=E('<span class="running-dot svelte-13v7bmf" title="Running now"></span>'),Qs=E('<tr class="job-row svelte-13v7bmf"><td class="td-toggle svelte-13v7bmf"><button class="toggle-btn svelte-13v7bmf"><span class="toggle-knob svelte-13v7bmf"></span></button></td><td class="td-run svelte-13v7bmf"><button class="run-icon-btn svelte-13v7bmf"><svg width="10" height="10" viewBox="0 0 24 24" fill="currentColor" stroke="none" class="svelte-13v7bmf"><polygon points="5,3 19,12 5,21" class="svelte-13v7bmf"></polygon></svg></button></td><td class="job-name svelte-13v7bmf"><!> </td><td class="svelte-13v7bmf"><!></td><td class="svelte-13v7bmf"><span class="tag-text svelte-13v7bmf"> </span></td><td class="svelte-13v7bmf"><span class="workers-badge svelte-13v7bmf"> </span></td><td class="svelte-13v7bmf"><span class="browser-badge svelte-13v7bmf"> </span></td><td class="svelte-13v7bmf"><span class="runner-badge svelte-13v7bmf"><!></span></td><td class="actions-cell svelte-13v7bmf"><!> <!></td></tr>'),Vs=E('<div class="table-wrap svelte-13v7bmf"><table class="data-table svelte-13v7bmf"><thead class="svelte-13v7bmf"><tr class="svelte-13v7bmf"><th class="th-toggle svelte-13v7bmf"></th><th class="th-run svelte-13v7bmf"></th><th class="svelte-13v7bmf">Name</th><th class="svelte-13v7bmf">Schedule</th><th class="svelte-13v7bmf">Tags</th><th class="svelte-13v7bmf">Workers</th><th class="svelte-13v7bmf">Browser</th><th class="svelte-13v7bmf">Runner</th><th class="svelte-13v7bmf">Actions</th></tr></thead><tbody class="svelte-13v7bmf"></tbody></table></div>'),Zs=E('<!> <!> <!> <div class="page-header svelte-13v7bmf"><div class="header-row svelte-13v7bmf"><div class="svelte-13v7bmf"><h1 class="svelte-13v7bmf">Scheduled Tests</h1> <p class="subtitle svelte-13v7bmf">Manage recurring test runs via cron jobs</p></div> <!></div></div> <div class="card svelte-13v7bmf" style="padding: 0; overflow: hidden;"><!></div>',1);function mt(U,O){ms(O,!1);const[ke,Ie]=gs(),Pe=()=>ks(Cs,"$backgroundRuns",ke),ue=/^(\*|([0-5]?[0-9])|\*\/[0-9]+) (\*|([01]?[0-9]|2[0-3])) (\*|([01]?[0-9]|3[01])) (\*|([1-9]|1[0-2])) (\*|[0-6](-[0-6])?)$/,j="__custom__",Re=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],ee=[{label:"Every minute",value:"* * * * *"},{label:"Every hour",value:"0 * * * *"},{label:"Every midnight",value:"0 0 * * *"},{label:"Every Sunday",value:"0 0 * * 0"}];let M=D([]),se=D([]),X=D({discordWebhookUrl:"",slackWebhookUrl:"",notifyPublicUrl:""}),ye=D(null),te=D(!1),ae=D(!1),ne=D(!1),De="",fe=D(""),a=D({taskName:"",cronExpression:"",tags:"",workers:1,browser:"chromium",runnerIds:["built-in"],notifyDiscord:!1,notifySlack:!1}),me=D(""),be=D(!1),B=D("");function Qe(s){if(!s)return"";const f=s.trim().split(/\s+/);if(f.length!==5)return"";const[c,_,g,l,$]=f,S=(R,F)=>{const re=R>=12?"PM":"AM";return`${R%12||12}:${String(F).padStart(2,"0")} ${re}`},N=R=>/^\d+$/.test(R),x=N(_)?+_:null,p=N(c)?+c:null;if(s==="* * * * *")return"Every minute";const L=c.match(/^\*\/(\d+)$/);if(L&&_==="*"&&g==="*"&&l==="*"&&$==="*")return`Every ${L[1]} minutes`;if(p!==null&&_==="*"&&g==="*"&&l==="*"&&$==="*")return`Every hour at :${String(p).padStart(2,"0")}`;if(p!==null&&x!==null&&g==="*"&&l==="*"&&$==="1-5")return`Weekdays at ${S(x,p)}`;if(p!==null&&x!==null&&g==="*"&&l==="*"&&$==="*")return`Daily at ${S(x,p)}`;if(p!==null&&x!==null&&g==="*"&&l==="*"&&/^\d$/.test($))return`Every ${Re[+$]} at ${S(x,p)}`;const P=N(g)?+g:null;return p!==null&&x!==null&&P!==null&&l==="*"&&$==="*"?`Monthly on the ${P}${P===1?"st":P===2?"nd":P===3?"rd":"th"} at ${S(x,p)}`:""}function Y(s,f){o(ye,{type:s,message:f}),setTimeout(()=>o(ye,null),ys)}function Ve(s){s.target.value===j?(o(be,!0),J(a,e(a).cronExpression="")):(o(be,!1),J(a,e(a).cronExpression=s.target.value))}function Be(s){const f=e(a).runnerIds;f.includes(s)&&f.length===1||J(a,e(a).runnerIds=f.includes(s)?f.filter(c=>c!==s):[...f,s])}function qe(s){J(a,e(a).workers=Math.max(1,Math.min(10,(e(a).workers||1)+s)))}function Ze(){o(ne,!1),De="",o(a,{taskName:"",cronExpression:"",tags:"",workers:1,browser:"chromium",runnerIds:["built-in"],notifyDiscord:!1,notifySlack:!1}),o(me,""),o(be,!1),o(B,""),o(te,!0)}function je(s){o(ne,!0),De=s.taskName;const f=new Set(["built-in",...e(se).map(l=>l.id)]),_=(s.runnerIds?s.runnerIds.split(",").map(l=>l.trim()):["built-in"]).filter(l=>f.has(l));o(a,{taskName:s.taskName,cronExpression:s.cronExpression,tags:s.tags,workers:s.workers??1,browser:s.browser??"chromium",runnerIds:_.length>0?_:["built-in"],notifyDiscord:s.notifyDiscord??!1,notifySlack:s.notifySlack??!1});const g=ee.some(l=>l.value===s.cronExpression);o(be,!g),o(me,g?s.cronExpression:j),o(B,""),o(te,!0)}async function es(){if(!e(a).taskName||!e(a).cronExpression){o(B,"All fields are required.");return}if(!ue.test(e(a).cronExpression)){o(B,"Invalid cron expression.");return}o(B,"");try{(await Us({...e(a),isEditing:e(ne),editTaskName:De})).message?(Y("success",`${e(ne)?"Updated":"Added"}: ${e(a).taskName}`),o(te,!1),o(M,await Oe())):o(B,"Failed to save. Please try again.")}catch{o(B,"Network error.")}}async function ss(s){const f=!s.enabled;o(M,e(M).map(c=>c.taskName===s.taskName?{...c,enabled:f}:c));try{await Ms(s.taskName,f)}catch{o(M,e(M).map(c=>c.taskName===s.taskName?{...c,enabled:!f}:c)),Y("error","Could not update schedule.")}}async function ts(s){try{await Js(s),Y("success",`Started: ${s}`)}catch{Y("error","Could not trigger run.")}}async function as(){try{(await Ws(e(fe))).message?(Y("success",`Deleted: ${e(fe)}`),o(M,await Oe())):Y("error","Could not delete cron job.")}catch{Y("error","Network error.")}o(ae,!1),o(fe,"")}function ns(s){var f;return((f=ee.find(c=>c.value===s))==null?void 0:f.label)??s}bs(async()=>{await(async s=>(o(M,s[0]),o(se,s[1]),o(X,s[2])))(await Promise.all([Oe(),Ss().catch(()=>[]),Ns().catch(()=>({discordWebhookUrl:"",slackWebhookUrl:"",notifyPublicUrl:""}))]))}),fs();var ze=Zs();ds(s=>{hs.title="Scheduled Tests — Plum"});var Le=Se(ze);const rs=H(()=>e(ne)?"Edit Cron Job":"New Cron Job");Ps(Le,{get title(){return e(rs)},get open(){return e(te)},set open(s){o(te,s)},children:(s,f)=>{var c=Xs(),_=n(c),g=r(n(_),2);Z(g),t(_);var l=r(_,2),$=r(n(l),2);I(()=>{e(me),_s(()=>{})});var S=n($);S.value=((S.__value="")==null,"");var N=r(S);Ne(N,1,()=>ee,Ce,(d,u)=>{var i=As(),k={},v=n(i,!0);t(i),I(()=>{k!==(k=e(u).value)&&(i.value=(i.__value=e(u).value)==null?"":e(u).value),y(v,e(u).label)}),m(d,i)});var x=r(N);x.value=(x.__value=j)==null?"":j,t($);var p=r($,2);{var L=d=>{var u=Bs(),i=Se(u);Z(i);var k=r(i,2);{var v=b=>{var h=Os(),w=n(h,!0);t(h),I((T,C)=>{ce(h,"cron-invalid",T),y(w,C)},[()=>!ue.test(e(a).cronExpression),()=>ue.test(e(a).cronExpression)?Qe(e(a).cronExpression)||e(a).cronExpression:"Invalid cron expression"],H),m(b,h)};A(k,b=>{e(a).cronExpression&&b(v)})}Ae(i,()=>e(a).cronExpression,b=>J(a,e(a).cronExpression=b)),m(d,u)};A(p,d=>{e(be)&&d(L)})}t(l);var P=r(l,2),R=r(n(P),2);Z(R),t(P);var F=r(P,2),re=r(n(F),2),pe=n(re),K=r(pe,2),Me=n(K,!0);t(K);var le=r(K,2);t(re),t(F);var oe=r(F,2),$e=r(n(oe),2);Ne($e,5,()=>$s,Ce,(d,u)=>{var i=qs(),k=n(i),v=n(k,!0);t(k),t(i),I(()=>{ce(i,"active",e(a).browser===e(u).id),y(v,e(u).label)}),z("click",i,()=>J(a,e(a).browser=e(u).id)),m(d,i)}),t($e),t(oe);var Q=r(oe,2),ve=r(n(Q),2),he=n(ve),V=n(he);Z(V),W(6),t(he);var xe=r(he,2);Ne(xe,1,()=>e(se),Ce,(d,u)=>{var i=zs(),k=n(i);Z(k);var v=r(k,4),b=n(v,!0);t(v);var h=r(v,2),w=n(h,!0);t(h),t(i),I(T=>{Ye(k,T),y(b,e(u).name),y(w,e(u).url)},[()=>e(a).runnerIds.includes(e(u).id)],H),z("change",k,()=>Be(e(u).id)),m(d,i)}),t(ve),t(Q);var we=r(Q,2);{var _e=d=>{var u=Gs(),i=r(n(u),2),k=n(i);{var v=w=>{var T=Ls(),C=n(T);Z(C),W(2),t(T),Ke(C,()=>e(a).notifyDiscord,q=>J(a,e(a).notifyDiscord=q)),m(w,T)};A(k,w=>{e(X).discordWebhookUrl&&w(v)})}var b=r(k,2);{var h=w=>{var T=Fs(),C=n(T);Z(C),W(2),t(T),Ke(C,()=>e(a).notifySlack,q=>J(a,e(a).notifySlack=q)),m(w,T)};A(b,w=>{e(X).slackWebhookUrl&&w(h)})}t(i),t(u),m(d,u)};A(we,d=>{(e(X).discordWebhookUrl||e(X).slackWebhookUrl)&&d(_e)})}var ie=r(we,2);{var Je=d=>{var u=Hs(),i=n(u,!0);t(u),I(()=>y(i,e(B))),m(d,u)};A(ie,d=>{e(B)&&d(Je)})}var We=r(ie,2);Te(We,{type:"submit",size:"md",children:(d,u)=>{W();var i=G();I(()=>y(i,e(ne)?"Save Changes":"Add Cron Job")),m(d,i)},$$slots:{default:!0}}),t(c),I(d=>{pe.disabled=e(a).workers<=1,y(Me,e(a).workers),le.disabled=e(a).workers>=10,Ye(V,d)},[()=>e(a).runnerIds.includes("built-in")],H),Ae(g,()=>e(a).taskName,d=>J(a,e(a).taskName=d)),ws($,()=>e(me),d=>o(me,d)),z("change",$,Ve),Ae(R,()=>e(a).tags,d=>J(a,e(a).tags=d)),z("click",pe,()=>qe(-1)),z("click",le,()=>qe(1)),z("change",V,()=>Be("built-in")),z("submit",c,Es(es)),m(s,c)},$$slots:{default:!0},$$legacy:!0});var Fe=r(Le,2);Rs(Fe,{title:"Delete Cron Job",get open(){return e(ae)},set open(s){o(ae,s)},$$events:{confirm:as},children:(s,f)=>{W();var c=Ys(),_=r(Se(c)),g=n(_,!0);t(_),W(),I(()=>y(g,e(fe))),m(s,c)},$$slots:{default:!0},$$legacy:!0});var Ge=r(Fe,2);xs(Ge,{get toast(){return e(ye)}});var Ue=r(Ge,2),He=n(Ue),ls=r(n(He),2);Te(ls,{$$events:{click:Ze},children:(s,f)=>{W();var c=G("+ New Job");m(s,c)},$$slots:{default:!0}}),t(He),t(Ue);var Xe=r(Ue,2),os=n(Xe);{var vs=s=>{Ds(s,{message:"No scheduled tests yet. Create one to get started.",size:"sm"})},is=s=>{var f=Vs(),c=n(f),_=r(n(c));Ne(_,5,()=>e(M),Ce,(g,l,$)=>{var S=Qs();const N=H(()=>e(l).runnerIds?e(l).runnerIds.split(",").map(v=>v.trim()):["built-in"]);var x=n(S),p=n(x);t(x);var L=r(x),P=n(L);t(L);var R=r(L),F=n(R);{var re=v=>{var b=Ks();m(v,b)};A(F,v=>{var b;(b=Pe()[e(l).taskName])!=null&&b.running&&v(re)})}var pe=r(F);t(R);var K=r(R),Me=n(K);Is(Me,{variant:"schedule",children:(v,b)=>{W();var h=G();I(w=>y(h,w),[()=>ns(e(l).cronExpression)],H),m(v,h)},$$slots:{default:!0}}),t(K);var le=r(K),oe=n(le),$e=n(oe,!0);t(oe),t(le);var Q=r(le),ve=n(Q),he=n(ve);t(ve),t(Q);var V=r(Q),xe=n(V),we=n(xe,!0);t(xe),t(V);var _e=r(V),ie=n(_e),Je=n(ie);{var We=v=>{var b=G("built-in");m(v,b)},d=v=>{var b=us(),h=Se(b);{var w=C=>{var q=G();I(Ee=>y(q,Ee),[()=>{var Ee;return((Ee=e(se).find(cs=>cs.id===e(N)[0]))==null?void 0:Ee.name)??e(N)[0]}],H),m(C,q)},T=C=>{var q=G();I(()=>y(q,`${e(N).length??""} nodes`)),m(C,q)};A(h,C=>{e(N).length===1?C(w):C(T,!1)},!0)}m(v,b)};A(Je,v=>{e(N).length===1&&e(N)[0]==="built-in"?v(We):v(d,!1)})}t(ie),t(_e);var u=r(_e),i=n(u);Te(i,{variant:"ghost",size:"sm",$$events:{click:()=>je(e(l))},children:(v,b)=>{W();var h=G("Edit");m(v,h)},$$slots:{default:!0}});var k=r(i,2);Te(k,{variant:"danger",size:"sm",$$events:{click:()=>{o(fe,e(l).taskName),o(ae,!0)}},children:(v,b)=>{W();var h=G("Delete");m(v,h)},$$slots:{default:!0}}),t(u),t(S),I(v=>{ge(S,"style",v),ce(S,"disabled",!e(l).enabled),ge(p,"title",e(l).enabled?"Disable schedule":"Enable schedule"),ge(p,"aria-label",e(l).enabled?"Disable schedule":"Enable schedule"),ge(p,"aria-pressed",e(l).enabled),ce(p,"on",e(l).enabled),ge(P,"title",`Run ${e(l).taskName??""} now`),y(pe,` ${e(l).taskName??""}`),y($e,e(l).tags),ce(ve,"multi",e(l).workers>1),y(he,`×${e(l).workers??""}`),y(we,e(l).browser??"chromium"),ce(ie,"multi-node",e(N).length>1)},[()=>Ts($)],H),z("click",p,()=>ss(e(l))),z("click",P,()=>ts(e(l).taskName)),m(g,S)}),t(_),t(c),t(f),m(s,f)};A(os,s=>{e(M).length===0?s(vs):s(is,!1)})}t(Xe),m(U,ze),ps(),Ie()}export{mt as component};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,29 @@
|
|
|
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{h as As,a as i,t as _,s as p,e as Me,b as O,c as we,n as tt}from"../chunks/ll-VsEGv.js";import{i as Is}from"../chunks/DGryW1Vp.js";import{p as Ts,m as o,o as js,s as l,c as e,l as ka,b as Bs,f as ve,d as Ms,$ as Ls,j as a,k as s,n as t,t as c,x as Za,v as j,y as k,z as ca}from"../chunks/C67QNx7Z.js";import{i as P,s as Ks,a as kt}from"../chunks/CVV6HrFb.js";import{e as ya,i as Qa,t as da,a as Se,f as Pe,s as Ns}from"../chunks/DmRbbcS3.js";import{A as wa,r as R,s as te,b as Fs,B as Kt,g as Os}from"../chunks/CstKKb9b.js";import{b as I}from"../chunks/raHbXn_9.js";import{T as Ds,B as z,b as et}from"../chunks/BkKmeUbA.js";import{b as Ws}from"../chunks/BLAiBE__.js";import{g as zs}from"../chunks/KJdjlibc.js";import{b as Nt,f as Gs,a as Hs,c as Js,d as Ft,p as qs,s as Vs,e as Ot,u as Xs,g as Ys,h as Zs,i as Qs,j as el,k as al,l as tl,t as sl,m as ll,r as rl}from"../chunks/BgNaeXAp.js";import{n as il,o as nl,p as ol}from"../chunks/BFEiffAL.js";import{u as cl,a as dl}from"../chunks/BVMec-1T.js";import{a as at}from"../chunks/DIx44H9N.js";import{g as yt}from"../chunks/C3SY6-sX.js";import{t as Dt}from"../chunks/uFRI_bmR.js";import{C as vl}from"../chunks/IFIFk6zi.js";import{B as pl}from"../chunks/BIRVeCLU.js";function wt(){return{"Content-Type":"application/json",Authorization:`Bearer ${at.getToken()}`}}async function ul(){const We=await fetch(`${wa}/users`,{headers:wt()});if(!We.ok)throw new Error("Failed to fetch users");return(await We.json()).users}async function fl({name:We,email:ea,password:aa,role:st="user"}){const se=await fetch(`${wa}/users`,{method:"POST",headers:wt(),body:JSON.stringify({name:We,email:ea,password:aa,role:st})}),xa=await se.json();if(!se.ok)throw new Error(xa.error??"Failed to create user");return xa.user}async function _l(We){const ea=await fetch(`${wa}/users/${We}`,{method:"DELETE",headers:wt()});if(!ea.ok){const aa=await ea.json();throw new Error(aa.error??"Failed to delete user")}}var bl=_('<button class="sidebar-item svelte-9l533f"> </button>'),gl=_('<div class="logo-preview svelte-9l533f"><span class="preview-label svelte-9l533f">Preview</span> <img alt="Project logo preview" class="logo-img svelte-9l533f"></div>'),ml=_("<option> </option>"),hl=_('<div class="content-section svelte-9l533f"><div class="content-header svelte-9l533f"><h2 class="svelte-9l533f">Project</h2> <p class="content-desc svelte-9l533f">Identity information shown across the UI</p></div> <div class="card settings-card svelte-9l533f"><div class="field"><label class="field-label svelte-9l533f" for="project-name">Project Name</label> <input id="project-name" type="text" class="field-input" placeholder="My Test Suite"></div> <div class="field"><label class="field-label svelte-9l533f" for="project-logo"><span>Logo URL</span> <span class="field-hint svelte-9l533f">Direct link to an image (PNG, SVG, JPG)</span></label> <input id="project-logo" type="url" class="field-input" placeholder="https://example.com/logo.png"></div> <!> <div class="field"><label class="field-label svelte-9l533f" for="project-timezone"><span>Timezone</span> <span class="field-hint svelte-9l533f">Used to schedule cron jobs and backups</span></label> <select id="project-timezone" class="field-input"></select></div> <div class="toggle-row svelte-9l533f"><div class="toggle-info svelte-9l533f"><span class="toggle-label svelte-9l533f">Dark mode</span> <span class="toggle-desc svelte-9l533f">Switch between light and dark appearance</span></div> <button class="toggle-switch svelte-9l533f" role="switch"><span class="toggle-thumb svelte-9l533f"></span></button></div> <div class="card-footer svelte-9l533f"><!></div></div></div>'),kl=_("<option> </option>"),yl=_('<p class="form-error svelte-9l533f"> </p>'),wl=_('<div class="runner-card editing svelte-9l533f"><div class="runner-form-fields svelte-9l533f"><div class="field"><label class="field-label svelte-9l533f">Name</label> <input type="text" class="field-input" placeholder="staging-node"></div> <div class="field"><label class="field-label svelte-9l533f">URL <span class="field-hint svelte-9l533f">Use <code>host.docker.internal</code> for local nodes</span></label> <input type="url" class="field-input" placeholder="http://host.docker.internal:3002"></div> <div class="field"><label class="field-label svelte-9l533f">Token</label> <input type="text" class="field-input" placeholder="secret-token" spellcheck="false" autocomplete="off"></div> <div class="field"><label class="field-label svelte-9l533f">Browser</label> <select class="field-input"></select></div></div> <!> <div class="runner-form-actions svelte-9l533f"><!> <!></div></div>'),xl=_('<span class="ping-badge ok svelte-9l533f"> </span>'),$l=_('<span class="ping-badge fail svelte-9l533f">unreachable</span>'),Sl=_('<span class="ping-badge pinging svelte-9l533f">pinging…</span>'),Pl=_('<div class="runner-card svelte-9l533f"><div class="runner-card-header svelte-9l533f"><svg class="runner-card-icon svelte-9l533f" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><rect x="2" y="3" width="20" height="14" rx="2"></rect><path d="M8 21h8M12 17v4"></path></svg> <span class="runner-card-name svelte-9l533f"> </span> <span class="runner-browser-pill svelte-9l533f"> </span> <!></div> <p class="runner-card-url svelte-9l533f"> </p> <div class="runner-card-actions svelte-9l533f"><!> <!></div></div>'),Cl=_('<div class="runner-cards svelte-9l533f"></div>'),Rl=_("<option> </option>"),Ul=_('<p class="form-error svelte-9l533f"> </p>'),El=_('<div class="runner-form svelte-9l533f"><p class="runner-form-title svelte-9l533f">Add runner</p> <div class="runner-form-fields svelte-9l533f"><div class="field"><label class="field-label svelte-9l533f" for="rn-name">Name</label> <input id="rn-name" type="text" class="field-input" placeholder="staging-node"></div> <div class="field"><label class="field-label svelte-9l533f" for="rn-url">URL <span class="field-hint svelte-9l533f">Use <code>host.docker.internal</code> for local nodes</span></label> <input id="rn-url" type="url" class="field-input" placeholder="http://host.docker.internal:3002"></div> <div class="field"><label class="field-label svelte-9l533f" for="rn-token">Token</label> <input id="rn-token" type="text" class="field-input" placeholder="secret-token" spellcheck="false" autocomplete="off"></div> <div class="field"><label class="field-label svelte-9l533f" for="rn-browser">Browser</label> <select id="rn-browser" class="field-input"></select></div></div> <!> <div class="runner-form-actions svelte-9l533f"><!> <!></div></div>'),Al=_('<div class="card-footer svelte-9l533f"><!></div>'),Il=_('<div class="content-section svelte-9l533f"><div class="content-header svelte-9l533f"><h2 class="svelte-9l533f">Runners</h2> <p class="content-desc svelte-9l533f">Register self-hosted runner nodes to distribute tests across machines.</p></div> <div class="card settings-card svelte-9l533f"><div class="toggle-row svelte-9l533f"><div class="toggle-info svelte-9l533f"><span class="toggle-label svelte-9l533f">Built-in runner</span> <span class="toggle-desc svelte-9l533f">Use this server to run tests locally. Disable to route all runs to external nodes.</span></div> <button class="toggle-switch svelte-9l533f" role="switch"><span class="toggle-thumb svelte-9l533f"></span></button></div> <!> <!></div></div>'),Tl=_('<div class="content-section svelte-9l533f"><div class="content-header svelte-9l533f"><h2 class="svelte-9l533f">Test Repository</h2> <p class="content-desc svelte-9l533f">Configure ID prefixes for test suites and cases.</p></div> <div class="card settings-card svelte-9l533f"><div class="field-row svelte-9l533f"><div class="field"><label class="field-label svelte-9l533f" for="tc-prefix">Test Case prefix</label> <input id="tc-prefix" type="text" class="field-input mono svelte-9l533f" placeholder="TC" maxlength="10"></div> <div class="field"><label class="field-label svelte-9l533f" for="ts-prefix">Test Suite prefix</label> <input id="ts-prefix" type="text" class="field-input mono svelte-9l533f" placeholder="TS" maxlength="10"></div></div> <p class="content-desc svelte-9l533f">Examples: <code class="code-sample svelte-9l533f"> </code>, <code class="code-sample svelte-9l533f"> </code></p> <div class="card-footer svelte-9l533f"><!></div></div> <div class="content-header svelte-9l533f" style="margin-top: 1rem"><h2 class="svelte-9l533f">Migrate IDs</h2> <p class="content-desc svelte-9l533f">Rename all existing test IDs to use a new prefix. Cucumber tags in code are <strong>not</strong> affected — you manage those separately.</p></div> <div class="card settings-card svelte-9l533f"><div class="field-row svelte-9l533f"><div class="field"><label class="field-label svelte-9l533f" for="mig-tc">New case prefix</label> <input id="mig-tc" type="text" class="field-input mono svelte-9l533f" maxlength="10"></div> <div class="field"><label class="field-label svelte-9l533f" for="mig-ts">New suite prefix</label> <input id="mig-ts" type="text" class="field-input mono svelte-9l533f" maxlength="10"></div></div> <div class="card-footer svelte-9l533f"><!></div></div></div>'),jl=_(`<div class="content-section svelte-9l533f"><div class="content-header svelte-9l533f"><h2 class="svelte-9l533f">Integrations</h2> <p class="content-desc svelte-9l533f">Connect Discord and Slack to receive run notifications with pass/fail results and report
|
|
19
|
+
links.</p></div> <div class="card settings-card svelte-9l533f"><p class="card-title">Webhooks</p> <div class="field"><label class="field-label svelte-9l533f" for="discord-url"><span>Discord Webhook URL</span> <span class="field-hint svelte-9l533f">Leave blank to disable Discord notifications</span></label> <input id="discord-url" type="url" class="field-input" placeholder="https://discord.com/api/webhooks/…"></div> <div class="field"><label class="field-label svelte-9l533f" for="slack-url"><span>Slack Webhook URL</span> <span class="field-hint svelte-9l533f">Leave blank to disable Slack notifications</span></label> <input id="slack-url" type="url" class="field-input" placeholder="https://hooks.slack.com/services/…"></div> <div class="field"><label class="field-label svelte-9l533f" for="public-url"><span>Public URL</span> <span class="field-hint svelte-9l533f">Base URL of this Plum instance, used to link reports in notifications</span></label> <input id="public-url" type="url" class="field-input" placeholder="https://plum.yourcompany.com"></div> <!></div> <div class="card settings-card svelte-9l533f"><p class="card-title">CI / External Triggers</p> <p class="content-desc svelte-9l533f">Trigger a Plum run from GitHub Actions (e.g. on a pull request, against its preview
|
|
20
|
+
deployment) or any other external script by calling <code class="code-sample svelte-9l533f"></code> with an <code class="code-sample svelte-9l533f">Authorization: ApiKey …</code> header. Generate a key on the <button class="link-btn svelte-9l533f">MCP tab</button> and store it as a repo secret — never commit it directly. Runs triggered this way show up
|
|
21
|
+
in Reports tagged <!>.</p> <pre class="mcp-snippet svelte-9l533f"> </pre> <div class="card-footer svelte-9l533f"><!></div></div></div>`),Bl=_('<p class="content-desc svelte-9l533f">No key generated yet.</p> <div class="card-footer svelte-9l533f"><!></div>',1),Ml=tt('<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94"></path><path d="M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19"></path><line x1="1" y1="1" x2="23" y2="23"></line></svg>'),Ll=tt('<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path><circle cx="12" cy="12" r="3"></circle></svg>'),Kl=tt('<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>'),Nl=tt('<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>'),Fl=_('<div class="mcp-key-row svelte-9l533f"><input class="field-input mcp-key-input svelte-9l533f" readonly="" spellcheck="false" autocomplete="off"> <button class="icon-btn svelte-9l533f"><!></button> <button class="icon-btn svelte-9l533f" title="Copy key"><!></button></div> <p class="mcp-regen-note svelte-9l533f">Regenerating invalidates the existing key immediately.</p> <div class="card-footer svelte-9l533f"><!></div>',1),Ol=_(`<div class="card settings-card svelte-9l533f"><p class="card-title">Config Snippet</p> <p class="content-desc svelte-9l533f">Add this to your MCP client's config file (e.g. <code class="code-sample svelte-9l533f">claude_desktop_config.json</code>, Cursor MCP settings,
|
|
22
|
+
etc.).</p> <pre class="mcp-snippet svelte-9l533f"> </pre> <div class="card-footer svelte-9l533f"><!></div></div>`),Dl=_(`<div class="content-section svelte-9l533f"><div class="content-header svelte-9l533f"><h2 class="svelte-9l533f">MCP Integration</h2> <p class="content-desc svelte-9l533f">Generate an API key for any MCP-compatible AI client — Claude, Cursor, Windsurf, and
|
|
23
|
+
others.</p></div> <div class="card settings-card svelte-9l533f"><p class="card-title">API Key</p> <!></div> <!></div>`),Wl=_('<p class="form-error svelte-9l533f"> </p>'),zl=_('<p class="form-error svelte-9l533f"> </p>'),Gl=_('<div class="content-section svelte-9l533f"><div class="content-header svelte-9l533f"><h2 class="svelte-9l533f">Account</h2> <p class="content-desc svelte-9l533f">Manage your profile, credentials and session.</p></div> <div class="card settings-card svelte-9l533f"><p class="card-title">Profile</p> <div class="field"><label class="field-label svelte-9l533f" for="profile-name">Name</label> <input id="profile-name" type="text" class="field-input"></div> <div class="field"><label class="field-label svelte-9l533f" for="profile-email">Email</label> <input id="profile-email" type="email" class="field-input"></div> <!> <div class="card-footer svelte-9l533f"><!></div></div> <div class="card settings-card svelte-9l533f"><p class="card-title">Change password</p> <div class="field"><label class="field-label svelte-9l533f" for="pw-current">Current password</label> <input id="pw-current" type="password" class="field-input" autocomplete="current-password"></div> <div class="field"><label class="field-label svelte-9l533f" for="pw-new">New password</label> <input id="pw-new" type="password" class="field-input" autocomplete="new-password"></div> <div class="field"><label class="field-label svelte-9l533f" for="pw-confirm">Confirm new password</label> <input id="pw-confirm" type="password" class="field-input" autocomplete="new-password"></div> <!> <div class="card-footer svelte-9l533f"><!></div></div> <div class="card settings-card svelte-9l533f"><div class="card-footer svelte-9l533f"><!></div></div></div>'),Hl=_("Remove <strong> </strong>? They will lose access immediately.",1),Jl=_('<p class="form-error svelte-9l533f"> </p>'),ql=_('<button class="icon-btn danger svelte-9l533f" title="Remove user"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"></path><path d="M10 11v6M14 11v6"></path><path d="M9 6V4h6v2"></path></svg></button>'),Vl=_('<span class="you-chip svelte-9l533f">you</span>'),Xl=_('<div class="user-row svelte-9l533f"><div class="user-info svelte-9l533f"><span class="user-name svelte-9l533f"> </span> <span class="user-email svelte-9l533f"> </span></div> <span> </span> <!></div>'),Yl=_('<div class="users-table svelte-9l533f"></div>'),Zl=_('<div class="content-section svelte-9l533f"><div class="content-header svelte-9l533f"><h2 class="svelte-9l533f">Users</h2> <p class="content-desc svelte-9l533f">Add and manage who can access Plum.</p></div> <!> <div class="card settings-card svelte-9l533f"><p class="card-title">Add User</p> <div class="field-row svelte-9l533f"><div class="field"><label class="field-label svelte-9l533f" for="u-name">Name</label> <input id="u-name" type="text" class="field-input" placeholder="Jane Smith"></div> <div class="field"><label class="field-label svelte-9l533f" for="u-email">Email</label> <input id="u-email" type="email" class="field-input" placeholder="jane@example.com"></div></div> <div class="field-row svelte-9l533f"><div class="field"><label class="field-label svelte-9l533f" for="u-pw">Password</label> <input id="u-pw" type="password" class="field-input" autocomplete="new-password"></div> <div class="field"><label class="field-label svelte-9l533f" for="u-role">Role</label> <select id="u-role" class="field-input"><option>User</option><option>Admin</option></select></div></div> <!> <div class="card-footer svelte-9l533f"><!></div></div> <!></div>'),Ql=_('<p class="s3-test-result svelte-9l533f"> </p>'),er=_('<p class="backup-block-desc svelte-9l533f">Configure S3 storage above to enable scheduled backups.</p>'),ar=_('<span class="status-success svelte-9l533f"> </span>'),tr=_('<span class="status-error svelte-9l533f"> </span>'),sr=_("<span> </span>"),lr=_('<p class="backup-last-run svelte-9l533f"> <!></p>'),rr=_('<div class="field"><label class="field-label backup-toggle-label svelte-9l533f" for="backup-enabled"><span>Enable scheduled backup</span> <button id="backup-enabled" class="toggle-btn svelte-9l533f" role="switch"><span class="toggle-thumb svelte-9l533f"></span></button></label></div> <div class="field"><label class="field-label svelte-9l533f" for="backup-cron"><span>Cron Expression</span> <span class="field-hint svelte-9l533f">5-field cron — e.g. <code>0 2 * * *</code> = daily at 2 AM. <a href="https://crontab.guru" target="_blank" rel="noopener noreferrer">Test at crontab.guru ↗</a></span></label> <input id="backup-cron" type="text" class="field-input field-input-mono svelte-9l533f" placeholder="0 2 * * *"></div> <!> <div class="backup-actions svelte-9l533f"><!> <!></div>',1),ir=_(`<div class="content-section svelte-9l533f"><div class="content-header svelte-9l533f"><h2 class="svelte-9l533f">Backup</h2> <p class="content-desc svelte-9l533f">Export your test cases, schedules, users, and project settings. Automate uploads to any
|
|
24
|
+
S3-compatible storage — Cloudflare R2, Backblaze B2, AWS S3, or MinIO.</p></div> <div class="card settings-card svelte-9l533f"><p class="card-title">Manual Backup</p> <div class="backup-row svelte-9l533f"><div class="backup-block svelte-9l533f"><p class="backup-block-title svelte-9l533f">Export</p> <p class="backup-block-desc svelte-9l533f">Downloads a <code class="svelte-9l533f">.json</code> file with all cron jobs, test cases, test runs, users,
|
|
25
|
+
runners, and project settings.</p> <!></div> <div class="backup-divider svelte-9l533f"></div> <div class="backup-block svelte-9l533f"><p class="backup-block-title svelte-9l533f">Import</p> <p class="backup-block-desc svelte-9l533f">Restores all data from a previously exported backup. Existing records are
|
|
26
|
+
overwritten. Cron jobs are re-scheduled after import.</p> <div class="import-row svelte-9l533f"><label class="file-label svelte-9l533f"><input type="file" accept=".json" class="file-input-hidden svelte-9l533f"> <span class="file-btn svelte-9l533f"> </span></label> <!></div></div></div> <p class="backup-disclaimer svelte-9l533f">Reports are not included in backups. To back up report history, run <code>pg_dump</code> directly on the PostgreSQL volume.</p></div> <div class="card settings-card svelte-9l533f"><p class="card-title">S3 Storage</p> <p class="backup-block-desc svelte-9l533f" style="margin-bottom: 1.25rem;">Works with any S3-compatible provider — Cloudflare R2, Backblaze B2, AWS S3, or MinIO.
|
|
27
|
+
Leave <strong>Endpoint URL</strong> empty for AWS S3.</p> <div class="field-row svelte-9l533f"><div class="field"><label class="field-label svelte-9l533f" for="s3-endpoint"><span>Endpoint URL</span> <span class="field-hint svelte-9l533f">Leave blank for AWS S3</span></label> <input id="s3-endpoint" type="url" class="field-input" placeholder="https://account.r2.cloudflarestorage.com"></div> <div class="field"><label class="field-label svelte-9l533f" for="s3-region"><span>Region</span> <span class="field-hint svelte-9l533f">Use <code>auto</code> for Cloudflare R2</span></label> <input id="s3-region" type="text" class="field-input" placeholder="us-east-1"></div></div> <div class="field-row svelte-9l533f"><div class="field"><label class="field-label svelte-9l533f" for="s3-bucket"><span>Bucket</span></label> <input id="s3-bucket" type="text" class="field-input" placeholder="my-plum-backups"></div> <div class="field"><label class="field-label svelte-9l533f" for="s3-prefix"><span>Path Prefix</span> <span class="field-hint svelte-9l533f">Optional folder inside the bucket</span></label> <input id="s3-prefix" type="text" class="field-input" placeholder="plum/"></div></div> <div class="field-row svelte-9l533f"><div class="field"><label class="field-label svelte-9l533f" for="s3-access-key"><span>Access Key ID</span></label> <input id="s3-access-key" type="text" class="field-input" placeholder="AKIAIOSFODNN7EXAMPLE" autocomplete="off"></div> <div class="field"><label class="field-label svelte-9l533f" for="s3-secret-key"><span>Secret Access Key</span> <span class="field-hint svelte-9l533f"> </span></label> <input id="s3-secret-key" type="password" class="field-input" autocomplete="new-password"></div></div> <div class="backup-actions svelte-9l533f"><!> <!></div> <!></div> <div class="card settings-card svelte-9l533f"><p class="card-title">Scheduled Backup</p> <!></div></div>`),nr=_('<!> <div class="page-header svelte-9l533f"><h1 class="svelte-9l533f">Settings</h1></div> <div class="settings-layout svelte-9l533f"><aside class="settings-sidebar svelte-9l533f"><nav class="svelte-9l533f"></nav></aside> <div class="settings-content svelte-9l533f"><!></div></div>',1);function Pr(We,ea){Ts(ea,!1);const[aa,st]=Ks(),se=()=>kt(at,"$auth",aa),xa=()=>kt(Dt,"$theme",aa),xt=()=>kt(yt,"$builtInEnabled",aa),lt=o(),rt=o(),it=o(),$t=o();let pe=o(typeof sessionStorage<"u"&&sessionStorage.getItem("plum:settings:section")||"project");function St(r){l(pe,r);try{sessionStorage.setItem("plum:settings:section",r)}catch{}}let ue=o({name:"",logoUrl:"",timezone:"UTC"}),Ia=o(!1),nt=o(null);const Wt=(()=>{try{return Intl.supportedValuesOf("timeZone")}catch{return["UTC"]}})();let le=o({testCasePrefix:"TC",testSuitePrefix:"TS"}),Ta=o(!1),Le=o({testCasePrefix:"",testSuitePrefix:""}),ja=o(!1),xe=o({name:"",email:""}),Ba=o(!1),Ma=o(""),ta=o([]),ee=o({name:"",email:"",password:"",role:"user"}),La=o(!1),$a=o(""),va=o(null),Ka=o(!1),re=o({currentPassword:"",newPassword:"",confirmPassword:""}),Na=o(!1),pa=o(""),sa=o(null),Fa=o(!1),Oa=o(!1),Sa=o(),ke=o({discordWebhookUrl:"",slackWebhookUrl:"",notifyPublicUrl:""}),Da=o(!1),ua=o(""),Wa=o(!1),fa=o(!1),_a=o(!1),ot=o(!1),ct=o(!1),dt=o(!1),y=o({backupEnabled:!1,backupCron:"0 2 * * *",backupS3Endpoint:"",backupS3Region:"",backupS3Bucket:"",backupS3AccessKey:"",backupS3SecretKey:"",backupS3Prefix:""}),ba=o(!1),ga=o(!1),za=o(!1),Ga=o(!1),la=o(null),Ha=o(""),Pa=o(null),ze=o(""),ye=o([]),Y=o({name:"",url:"",token:"",browser:"chromium"}),ra=o(""),Ca=o(!1),Ja=o(!1),Ce=o({}),qa=o(null),Z=o({name:"",url:"",token:"",browser:"chromium"}),Ge=o(""),Ra=o(!1);function L(r,n){l(nt,{type:r,message:n}),setTimeout(()=>l(nt,null),Fs)}let vt=o(!1);js(async()=>{var r;try{const n=localStorage.getItem("plum:builtInEnabled");n!==null&&yt.set(n!=="false")}catch{}try{l(ue,await Nt())}catch{}try{l(ye,await Gs()),l(vt,!0)}catch{}try{l(le,await il()),l(Le,{testCasePrefix:e(le).testCasePrefix,testSuitePrefix:e(le).testSuitePrefix})}catch{}try{l(ke,await Hs())}catch{}try{const n=await Js();l(Wa,n.mcpKeySet),l(ua,n.mcpKey)}catch{}try{const n=await Ft();l(ga,n.backupS3SecretKeySet),l(Pa,n.backupLastRunAt),l(ze,n.backupLastStatus),l(y,{backupEnabled:n.backupEnabled,backupCron:n.backupCron,backupS3Endpoint:n.backupS3Endpoint,backupS3Region:n.backupS3Region,backupS3Bucket:n.backupS3Bucket,backupS3AccessKey:n.backupS3AccessKey,backupS3SecretKey:"",backupS3Prefix:n.backupS3Prefix})}catch{}if(se().user&&l(xe,{name:se().user.name,email:se().user.email}),((r=se().user)==null?void 0:r.role)==="admin")try{l(ta,await ul())}catch{}});async function zt(){e(ye).length!==0&&(l(Ce,Object.fromEntries(e(ye).map(r=>[r.id,{loading:!0}]))),await Promise.all(e(ye).map(async r=>{try{const n=await qs(r.id);l(Ce,{...e(Ce),[r.id]:{...n,loading:!1}})}catch{l(Ce,{...e(Ce),[r.id]:{ok:!1,error:"Network error",loading:!1}})}})))}function Gt(){yt.update(r=>{const n=!r;try{localStorage.setItem("plum:builtInEnabled",String(n))}catch{}return n})}function Ht(){Dt.update(r=>r==="light"?"dark":"light")}async function Jt(){if(!e(Y).name||!e(Y).url||!e(Y).token){l(ra,"Name, URL and token are required.");return}l(ra,""),l(Ca,!0);try{const r=await Ot(e(Y).url,e(Y).token);if(!r.ok){l(ra,`Cannot reach this runner — ${r.error??"check the URL and token"}.`);return}const{runner:n}=await Zs(e(Y));l(ye,[...e(ye),n]),l(Ce,{...e(Ce),[n.id]:{ok:!0,latency:r.latency,loading:!1}}),l(Y,{name:"",url:"",token:"",browser:"chromium"}),l(Ja,!1),L("success",`Runner "${n.name}" added.`)}catch{l(ra,"Failed to add runner.")}finally{l(Ca,!1)}}async function qt(r,n){try{await Ys(r),l(ye,e(ye).filter(D=>D.id!==r)),L("success",`Runner "${n}" removed.`)}catch{L("error","Failed to remove runner.")}}function Vt(r){l(qa,r.id),l(Z,{name:r.name,url:r.url,token:r.token,browser:r.browser}),l(Ge,"")}async function Xt(r){if(!e(Z).name||!e(Z).url||!e(Z).token){l(Ge,"Name, URL and token are required.");return}l(Ge,""),l(Ra,!0);try{const n=await Ot(e(Z).url,e(Z).token);if(!n.ok){l(Ge,`Cannot reach this runner — ${n.error??"check the URL and token"}.`);return}const{runner:D}=await Xs(r,e(Z));l(ye,e(ye).map(fe=>fe.id===r?D:fe)),l(Ce,{...e(Ce),[r]:{ok:!0,latency:n.latency,loading:!1}}),l(qa,null),L("success",`Runner "${D.name}" updated.`)}catch{l(Ge,"Failed to update runner.")}finally{l(Ra,!1)}}async function Yt(){l(Ia,!0);try{await Vs(e(ue)),L("success","Project settings saved.")}catch{L("error","Failed to save project settings.")}finally{l(Ia,!1)}}async function Zt(){l(Oa,!0);try{const r=await al(),n=new Blob([JSON.stringify(r,null,2)],{type:"application/json"}),D=URL.createObjectURL(n),fe=document.createElement("a");fe.href=D,fe.download=`plum-backup-${new Date().toISOString().slice(0,10)}.json`,fe.click(),URL.revokeObjectURL(D),L("success","Backup downloaded.")}catch{L("error","Export failed.")}finally{l(Oa,!1)}}async function Qt(){if(e(sa)){l(Fa,!0);try{const r=await e(sa).text(),n=JSON.parse(r),D=await tl(n);if(D.error)throw new Error(D.error);L("success","Import successful. Cron jobs have been re-scheduled."),l(ue,await Nt()),l(sa,null),e(Sa)&&k(Sa,e(Sa).value="")}catch(r){L("error",r.message||"Import failed. Check the file format.")}finally{l(Fa,!1)}}}function es(r){l(sa,r.target.files[0]??null)}async function as(){l(Ta,!0);try{l(le,await nl(e(le))),L("success","Prefixes saved.")}catch{L("error","Failed to save prefixes.")}finally{l(Ta,!1)}}async function ts(){l(ja,!0);try{await ol(e(Le)),l(le,{...e(le),...e(Le)}),L("success","Prefix migration complete. All IDs updated.")}catch{L("error","Migration failed.")}finally{l(ja,!1)}}async function ss(){l(Ma,""),l(Ba,!0);try{const{user:r}=await cl({token:se().token,name:e(xe).name,email:e(xe).email});at.login(se().token,{...se().user,...r}),L("success","Profile updated.")}catch(r){l(Ma,r.message)}finally{l(Ba,!1)}}async function ls(){if(l($a,""),!e(ee).name||!e(ee).email||!e(ee).password){l($a,"Name, email and password are required.");return}l(La,!0);try{const r=await fl(e(ee));l(ta,[...e(ta),r]),l(ee,{name:"",email:"",password:"",role:"user"}),L("success",`User "${r.name}" added.`)}catch(r){l($a,r.message)}finally{l(La,!1)}}async function rs(r,n){try{await _l(r),l(ta,e(ta).filter(D=>D.id!==r)),L("success",`User "${n}" removed.`)}catch(D){L("error",D.message)}l(va,null),l(Ka,!1)}async function is(){if(l(pa,""),e(re).newPassword!==e(re).confirmPassword){l(pa,"Passwords do not match.");return}if(e(re).newPassword.length<8){l(pa,"Password must be at least 8 characters.");return}l(Na,!0);try{await dl({token:se().token,currentPassword:e(re).currentPassword,newPassword:e(re).newPassword}),l(re,{currentPassword:"",newPassword:"",confirmPassword:""}),L("success","Password changed.")}catch(r){l(pa,r.message)}finally{l(Na,!1)}}function ns(){at.logout(),zs("/login")}async function Pt(){l(_a,!0);try{const r=await el();l(ua,r.mcpKey),l(Wa,!0),l(fa,!0),L("success","MCP key generated.")}catch{L("error","Failed to generate MCP key.")}finally{l(_a,!1)}}function os(){navigator.clipboard.writeText(e(ua)).then(()=>{l(ot,!0),setTimeout(()=>l(ot,!1),1500)})}function cs(){navigator.clipboard.writeText(e(rt)).then(()=>{l(ct,!0),setTimeout(()=>l(ct,!1),1500)})}function ds(){navigator.clipboard.writeText(e(it)).then(()=>{l(dt,!0),setTimeout(()=>l(dt,!1),1500)})}async function vs(){l(Da,!0);try{l(ke,await Qs(e(ke))),L("success","Integration settings saved.")}catch{L("error","Failed to save integration settings.")}finally{l(Da,!1)}}async function Ct(){l(ba,!0);try{const r={...e(y)};r.backupS3SecretKey||delete r.backupS3SecretKey;const n=await ll(r);if(n.error)throw new Error(n.error);e(y).backupS3SecretKey&&l(ga,!0),l(y,{...e(y),backupS3SecretKey:""}),L("success","Backup configuration saved.")}catch(r){L("error",r.message||"Failed to save backup configuration.")}finally{l(ba,!1)}}async function ps(){l(za,!0),l(la,null),l(Ha,"");try{const r=await sl(e(y));if(r.error)throw new Error(r.error);l(la,"success"),l(Ha,"Connection successful.")}catch(r){l(la,"error"),l(Ha,r.message||"Connection failed.")}finally{l(za,!1)}}async function us(){l(Ga,!0);try{const r=await rl();if(r.error)throw new Error(r.error);l(Pa,r.lastRunAt),l(ze,r.lastStatus??""),L("success","Backup uploaded to S3 successfully.")}catch(r){L("error",r.message||"Backup failed. Check your S3 configuration.");const n=await Ft().catch(()=>null);n&&(l(Pa,n.backupLastRunAt),l(ze,n.backupLastStatus))}finally{l(Ga,!1)}}const fs=new Set(["project","runners","repository","integrations","mcp","users","backup"]);ka(()=>(se(),e(pe)),()=>{se().user&&se().user.role!=="admin"&&fs.has(e(pe))&&l(pe,"account")}),ka(()=>(e(pe),e(vt)),()=>{e(pe)==="runners"&&e(vt)&&zt()}),ka(()=>(e(y),e(ga)),()=>{l(lt,!!(e(y).backupS3Bucket&&e(y).backupS3AccessKey&&e(ga)))}),ka(()=>e(ua),()=>{l(rt,JSON.stringify({mcpServers:{plum:{command:"plum",args:["mcp"],env:{PLUM_API_URL:"http://localhost:3001",PLUM_API_KEY:e(ua)}}}},null,2))}),ka(()=>wa,()=>{l(it,["- name: Run Plum tests"," run: |",` curl -X POST ${wa}/trigger \\`,' -H "Authorization: ApiKey ${{ secrets.PLUM_API_KEY }}" \\',' -H "Content-Type: application/json" \\',` -d '{"tag": "@smoke", "baseUrl": "https://your-pr-preview-url"}'`].join(`
|
|
28
|
+
`))}),ka(()=>se(),()=>{var r;l($t,((r=se().user)==null?void 0:r.role)==="admin"?[{id:"project",label:"Project"},{id:"runners",label:"Runners"},{id:"repository",label:"Repository"},{id:"integrations",label:"Integrations"},{id:"mcp",label:"MCP"},{id:"account",label:"Account"},{id:"users",label:"Users"},{id:"backup",label:"Backup"}]:[{id:"account",label:"Account"}])}),Bs(),Is();var Rt=nr();As(r=>{Ls.title="Settings — Plum"});var Ut=ve(Rt);Ds(Ut,{get toast(){return e(nt)}});var Et=a(Ut,4),pt=s(Et),At=s(pt);ya(At,5,()=>e($t),Qa,(r,n)=>{var D=bl(),fe=s(D,!0);t(D),c(()=>{da(D,"active",e(pe)===e(n).id),p(fe,e(n).label)}),Me("click",D,()=>St(e(n).id)),i(r,D)}),t(At),t(pt);var It=a(pt,2),_s=s(It);{var bs=r=>{var n=hl(),D=a(s(n),2),fe=s(D),Va=a(s(fe),2);R(Va),t(fe);var Re=a(fe,2),Ue=a(s(Re),2);R(Ue),t(Re);var ia=a(Re,2);{var na=w=>{var x=gl(),U=a(s(x),2);t(x),c(()=>te(U,"src",e(ue).logoUrl)),Me("error",U,m=>m.target.style.display="none"),i(w,x)};P(ia,w=>{e(ue).logoUrl&&w(na)})}var Ke=a(ia,2),ge=a(s(Ke),2);c(()=>{e(ue),Za(()=>{})}),ya(ge,5,()=>Wt,Qa,(w,x)=>{var U=ml(),m={},ie=s(U,!0);t(U),c(()=>{m!==(m=e(x))&&(U.value=(U.__value=e(x))==null?"":e(x)),p(ie,e(x))}),i(w,U)}),t(ge),t(Ke);var me=a(Ke,2),$e=a(s(me),2);t(me);var Ee=a(me,2),Ne=s(Ee);z(Ne,{get disabled(){return e(Ia)},$$events:{click:Yt},children:(w,x)=>{j();var U=O();c(()=>p(U,e(Ia)?"Saving…":"Save Project")),i(w,U)},$$slots:{default:!0}}),t(Ee),t(D),t(n),c(()=>{te($e,"aria-checked",xa()==="dark"),da($e,"on",xa()==="dark")}),I(Va,()=>e(ue).name,w=>k(ue,e(ue).name=w)),I(Ue,()=>e(ue).logoUrl,w=>k(ue,e(ue).logoUrl=w)),et(ge,()=>e(ue).timezone,w=>k(ue,e(ue).timezone=w)),Me("click",$e,Ht),Se(3,n,()=>Pe,()=>({y:6,duration:180})),i(r,n)},gs=r=>{var n=we(),D=ve(n);{var fe=Re=>{var Ue=Il(),ia=a(s(Ue),2),na=s(ia),Ke=a(s(na),2);t(na);var ge=a(na,2);{var me=w=>{var x=Cl();ya(x,5,()=>e(ye),U=>U.id,(U,m)=>{var ie=we();const W=ca(()=>e(Ce)[e(m).id]);var ae=ve(ie);{var ne=oe=>{var B=wl(),M=s(B),G=s(M),C=s(G),E=a(C,2);R(E),t(G);var h=a(G,2),v=s(h),g=a(v,2);R(g),t(h);var u=a(h,2),b=s(u),A=a(b,2);R(A),t(u);var T=a(u,2),ce=s(T),Q=a(ce,2);c(()=>{e(Z),Za(()=>{e(m)})}),ya(Q,5,()=>Kt,Qa,(f,J)=>{var V=kl(),He={},Ae=s(V,!0);t(V),c(()=>{He!==(He=e(J).id)&&(V.value=(V.__value=e(J).id)==null?"":e(J).id),p(Ae,e(J).label)}),i(f,V)}),t(Q),t(T),t(M);var H=a(M,2);{var q=f=>{var J=yl(),V=s(J,!0);t(J),c(()=>p(V,e(Ge))),i(f,J)};P(H,f=>{e(Ge)&&f(q)})}var X=a(H,2),$=s(X);z($,{get disabled(){return e(Ra)},$$events:{click:()=>Xt(e(m).id)},children:(f,J)=>{j();var V=O();c(()=>p(V,e(Ra)?"Checking…":"Save")),i(f,V)},$$slots:{default:!0}});var K=a($,2);z(K,{variant:"ghost",get disabled(){return e(Ra)},$$events:{click:()=>{l(qa,null),l(Ge,"")}},children:(f,J)=>{j();var V=O("Cancel");i(f,V)},$$slots:{default:!0}}),t(X),t(B),c(()=>{te(C,"for",`edit-name-${e(m).id??""}`),te(E,"id",`edit-name-${e(m).id??""}`),te(v,"for",`edit-url-${e(m).id??""}`),te(g,"id",`edit-url-${e(m).id??""}`),te(b,"for",`edit-token-${e(m).id??""}`),te(A,"id",`edit-token-${e(m).id??""}`),te(ce,"for",`edit-browser-${e(m).id??""}`),te(Q,"id",`edit-browser-${e(m).id??""}`)}),I(E,()=>e(Z).name,f=>k(Z,e(Z).name=f)),I(g,()=>e(Z).url,f=>k(Z,e(Z).url=f)),I(A,()=>e(Z).token,f=>k(Z,e(Z).token=f)),et(Q,()=>e(Z).browser,f=>k(Z,e(Z).browser=f)),Se(3,B,()=>Pe,()=>({y:-4,duration:180})),i(oe,B)},_e=oe=>{var B=Pl(),M=s(B),G=a(s(M),2),C=s(G,!0);t(G);var E=a(G,2),h=s(E,!0);t(E);var v=a(E,2);{var g=H=>{var q=we(),X=ve(q);{var $=f=>{var J=xl(),V=s(J);t(J),c(()=>p(V,`${e(W).latency??""}ms`)),i(f,J)},K=f=>{var J=$l();c(()=>te(J,"title",e(W).error)),i(f,J)};P(X,f=>{e(W).ok?f($):f(K,!1)})}i(H,q)},u=H=>{var q=we(),X=ve(q);{var $=K=>{var f=Sl();i(K,f)};P(X,K=>{var f;(f=e(W))!=null&&f.loading&&K($)},!0)}i(H,q)};P(v,H=>{e(W)&&!e(W).loading?H(g):H(u,!1)})}t(M);var b=a(M,2),A=s(b,!0);t(b);var T=a(b,2),ce=s(T);z(ce,{variant:"ghost",size:"sm",$$events:{click:()=>Vt(e(m))},children:(H,q)=>{j();var X=O("Edit");i(H,X)},$$slots:{default:!0}});var Q=a(ce,2);z(Q,{variant:"danger",size:"sm",$$events:{click:()=>qt(e(m).id,e(m).name)},children:(H,q)=>{j();var X=O("Remove");i(H,X)},$$slots:{default:!0}}),t(T),t(B),c(()=>{p(C,e(m).name),p(h,e(m).browser),p(A,e(m).url)}),Se(3,B,()=>Pe,()=>({y:-4,duration:180})),i(oe,B)};P(ae,oe=>{e(qa)===e(m).id?oe(ne):oe(_e,!1)})}i(U,ie)}),t(x),i(w,x)};P(ge,w=>{e(ye).length>0&&w(me)})}var $e=a(ge,2);{var Ee=w=>{var x=El(),U=a(s(x),2),m=s(U),ie=a(s(m),2);R(ie),t(m);var W=a(m,2),ae=a(s(W),2);R(ae),t(W);var ne=a(W,2),_e=a(s(ne),2);R(_e),t(ne);var oe=a(ne,2),B=a(s(oe),2);c(()=>{e(Y),Za(()=>{})}),ya(B,5,()=>Kt,Qa,(v,g)=>{var u=Rl(),b={},A=s(u,!0);t(u),c(()=>{b!==(b=e(g).id)&&(u.value=(u.__value=e(g).id)==null?"":e(g).id),p(A,e(g).label)}),i(v,u)}),t(B),t(oe),t(U);var M=a(U,2);{var G=v=>{var g=Ul(),u=s(g,!0);t(g),c(()=>p(u,e(ra))),i(v,g)};P(M,v=>{e(ra)&&v(G)})}var C=a(M,2),E=s(C);z(E,{get disabled(){return e(Ca)},$$events:{click:Jt},children:(v,g)=>{j();var u=O();c(()=>p(u,e(Ca)?"Checking…":"Add Runner")),i(v,u)},$$slots:{default:!0}});var h=a(E,2);z(h,{variant:"ghost",get disabled(){return e(Ca)},$$events:{click:()=>{l(Ja,!1),l(ra,"")}},children:(v,g)=>{j();var u=O("Cancel");i(v,u)},$$slots:{default:!0}}),t(C),t(x),I(ie,()=>e(Y).name,v=>k(Y,e(Y).name=v)),I(ae,()=>e(Y).url,v=>k(Y,e(Y).url=v)),I(_e,()=>e(Y).token,v=>k(Y,e(Y).token=v)),et(B,()=>e(Y).browser,v=>k(Y,e(Y).browser=v)),Se(3,x,()=>Pe,()=>({y:-6,duration:200})),i(w,x)},Ne=w=>{var x=Al(),U=s(x);z(U,{variant:"ghost",$$events:{click:()=>l(Ja,!0)},children:(m,ie)=>{j();var W=O("+ Add Runner");i(m,W)},$$slots:{default:!0}}),t(x),i(w,x)};P($e,w=>{e(Ja)?w(Ee):w(Ne,!1)})}t(ia),t(Ue),c(()=>{te(Ke,"aria-checked",xt()),da(Ke,"on",xt())}),Me("click",Ke,Gt),Se(3,Ue,()=>Pe,()=>({y:6,duration:180})),i(Re,Ue)},Va=Re=>{var Ue=we(),ia=ve(Ue);{var na=ge=>{var me=Tl(),$e=a(s(me),2),Ee=s($e),Ne=s(Ee),w=a(s(Ne),2);R(w),t(Ne);var x=a(Ne,2),U=a(s(x),2);R(U),t(x),t(Ee);var m=a(Ee,2),ie=a(s(m)),W=s(ie);t(ie);var ae=a(ie,2),ne=s(ae);t(ae),t(m);var _e=a(m,2),oe=s(_e);z(oe,{get disabled(){return e(Ta)},$$events:{click:as},children:(u,b)=>{j();var A=O();c(()=>p(A,e(Ta)?"Saving…":"Save Prefixes")),i(u,A)},$$slots:{default:!0}}),t(_e),t($e);var B=a($e,4),M=s(B),G=s(M),C=a(s(G),2);R(C),t(G);var E=a(G,2),h=a(s(E),2);R(h),t(E),t(M);var v=a(M,2),g=s(v);z(g,{variant:"ghost",get disabled(){return e(ja)},$$events:{click:ts},children:(u,b)=>{j();var A=O();c(()=>p(A,e(ja)?"Migrating…":"Run Migration")),i(u,A)},$$slots:{default:!0}}),t(v),t(B),t(me),c(()=>{p(W,`${e(le).testCasePrefix||"TC"}-001`),p(ne,`${e(le).testSuitePrefix||"TS"}-001`),te(C,"placeholder",e(le).testCasePrefix),te(h,"placeholder",e(le).testSuitePrefix)}),I(w,()=>e(le).testCasePrefix,u=>k(le,e(le).testCasePrefix=u)),I(U,()=>e(le).testSuitePrefix,u=>k(le,e(le).testSuitePrefix=u)),I(C,()=>e(Le).testCasePrefix,u=>k(Le,e(Le).testCasePrefix=u)),I(h,()=>e(Le).testSuitePrefix,u=>k(Le,e(Le).testSuitePrefix=u)),Se(3,me,()=>Pe,()=>({y:6,duration:180})),i(ge,me)},Ke=ge=>{var me=we(),$e=ve(me);{var Ee=w=>{var x=jl(),U=a(s(x),2),m=a(s(U),2),ie=a(s(m),2);R(ie),t(m);var W=a(m,2),ae=a(s(W),2);R(ae),t(W);var ne=a(W,2),_e=a(s(ne),2);R(_e),t(ne);var oe=a(ne,2);z(oe,{get disabled(){return e(Da)},$$events:{click:vs},children:(b,A)=>{j();var T=O();c(()=>p(T,e(Da)?"Saving…":"Save Integrations")),i(b,T)},$$slots:{default:!0}}),t(U);var B=a(U,2),M=a(s(B),2),G=a(s(M));G.textContent=`POST ${wa}/trigger`;var C=a(G,4),E=a(C,2);pl(E,{variant:"external",children:(b,A)=>{j();var T=O("External");i(b,T)},$$slots:{default:!0}}),j(),t(M);var h=a(M,2),v=s(h,!0);t(h);var g=a(h,2),u=s(g);z(u,{variant:"ghost",$$events:{click:ds},children:(b,A)=>{j();var T=O();c(()=>p(T,e(dt)?"Copied!":"Copy Workflow Step")),i(b,T)},$$slots:{default:!0}}),t(g),t(B),t(x),c(()=>p(v,e(it))),I(ie,()=>e(ke).discordWebhookUrl,b=>k(ke,e(ke).discordWebhookUrl=b)),I(ae,()=>e(ke).slackWebhookUrl,b=>k(ke,e(ke).slackWebhookUrl=b)),I(_e,()=>e(ke).notifyPublicUrl,b=>k(ke,e(ke).notifyPublicUrl=b)),Me("click",C,()=>St("mcp")),Se(3,x,()=>Pe,()=>({y:6,duration:180})),i(w,x)},Ne=w=>{var x=we(),U=ve(x);{var m=W=>{var ae=Dl(),ne=a(s(ae),2),_e=a(s(ne),2);{var oe=C=>{var E=Bl(),h=a(ve(E),2),v=s(h);z(v,{get disabled(){return e(_a)},$$events:{click:Pt},children:(g,u)=>{j();var b=O();c(()=>p(b,e(_a)?"Generating…":"Generate Key")),i(g,b)},$$slots:{default:!0}}),t(h),i(C,E)},B=C=>{var E=Fl(),h=ve(E),v=s(h);R(v);var g=a(v,2),u=s(g);{var b=$=>{var K=Ml();i($,K)},A=$=>{var K=Ll();i($,K)};P(u,$=>{e(fa)?$(b):$(A,!1)})}t(g);var T=a(g,2),ce=s(T);{var Q=$=>{var K=Kl();i($,K)},H=$=>{var K=Nl();i($,K)};P(ce,$=>{e(ot)?$(Q):$(H,!1)})}t(T),t(h);var q=a(h,4),X=s(q);z(X,{variant:"ghost",get disabled(){return e(_a)},$$events:{click:Pt},children:($,K)=>{j();var f=O();c(()=>p(f,e(_a)?"Generating…":"Regenerate Key")),i($,f)},$$slots:{default:!0}}),t(q),c(()=>{te(v,"type",e(fa)?"text":"password"),Os(v,e(ua)),te(g,"title",e(fa)?"Hide key":"Show key")}),Me("click",g,()=>l(fa,!e(fa))),Me("click",T,os),i(C,E)};P(_e,C=>{e(Wa)?C(B,!1):C(oe)})}t(ne);var M=a(ne,2);{var G=C=>{var E=Ol(),h=a(s(E),4),v=s(h,!0);t(h);var g=a(h,2),u=s(g);z(u,{variant:"ghost",$$events:{click:cs},children:(b,A)=>{j();var T=O();c(()=>p(T,e(ct)?"Copied!":"Copy Config")),i(b,T)},$$slots:{default:!0}}),t(g),t(E),c(()=>p(v,e(rt))),i(C,E)};P(M,C=>{e(Wa)&&C(G)})}t(ae),Se(3,ae,()=>Pe,()=>({y:6,duration:180})),i(W,ae)},ie=W=>{var ae=we(),ne=ve(ae);{var _e=B=>{var M=Gl(),G=a(s(M),2),C=a(s(G),2),E=a(s(C),2);R(E),t(C);var h=a(C,2),v=a(s(h),2);R(v),t(h);var g=a(h,2);{var u=d=>{var F=Wl(),N=s(F,!0);t(F),c(()=>p(N,e(Ma))),i(d,F)};P(g,d=>{e(Ma)&&d(u)})}var b=a(g,2),A=s(b);const T=ca(()=>e(Ba)||!e(xe).name||!e(xe).email);z(A,{get disabled(){return e(T)},$$events:{click:ss},children:(d,F)=>{j();var N=O();c(()=>p(N,e(Ba)?"Saving…":"Save Profile")),i(d,N)},$$slots:{default:!0}}),t(b),t(G);var ce=a(G,2),Q=a(s(ce),2),H=a(s(Q),2);R(H),t(Q);var q=a(Q,2),X=a(s(q),2);R(X),t(q);var $=a(q,2),K=a(s($),2);R(K),t($);var f=a($,2);{var J=d=>{var F=zl(),N=s(F,!0);t(F),c(()=>p(N,e(pa))),i(d,F)};P(f,d=>{e(pa)&&d(J)})}var V=a(f,2),He=s(V);const Ae=ca(()=>e(Na)||!e(re).currentPassword||!e(re).newPassword);z(He,{get disabled(){return e(Ae)},$$events:{click:is},children:(d,F)=>{j();var N=O();c(()=>p(N,e(Na)?"Saving…":"Change Password")),i(d,N)},$$slots:{default:!0}}),t(V),t(ce);var Je=a(ce,2),qe=s(Je),ma=s(qe);z(ma,{variant:"danger",size:"sm",$$events:{click:ns},children:(d,F)=>{j();var N=O("Sign out");i(d,N)},$$slots:{default:!0}}),t(qe),t(Je),t(M),I(E,()=>e(xe).name,d=>k(xe,e(xe).name=d)),I(v,()=>e(xe).email,d=>k(xe,e(xe).email=d)),I(H,()=>e(re).currentPassword,d=>k(re,e(re).currentPassword=d)),I(X,()=>e(re).newPassword,d=>k(re,e(re).newPassword=d)),I(K,()=>e(re).confirmPassword,d=>k(re,e(re).confirmPassword=d)),Se(3,M,()=>Pe,()=>({y:6,duration:180})),i(B,M)},oe=B=>{var M=we(),G=ve(M);{var C=h=>{var v=Zl(),g=a(s(v),2);vl(g,{title:"Remove User",confirmLabel:"Remove",get open(){return e(Ka)},set open(d){l(Ka,d)},$$events:{confirm:()=>{var d,F;return rs((d=e(va))==null?void 0:d.id,(F=e(va))==null?void 0:F.name)}},children:(d,F)=>{var N=we(),he=ve(N);{var Ve=Ie=>{var Fe=Hl(),Xe=a(ve(Fe)),Ye=s(Xe,!0);t(Xe),j(),c(()=>p(Ye,e(va).name)),i(Ie,Fe)};P(he,Ie=>{e(va)&&Ie(Ve)})}i(d,N)},$$slots:{default:!0},$$legacy:!0});var u=a(g,2),b=a(s(u),2),A=s(b),T=a(s(A),2);R(T),t(A);var ce=a(A,2),Q=a(s(ce),2);R(Q),t(ce),t(b);var H=a(b,2),q=s(H),X=a(s(q),2);R(X),t(q);var $=a(q,2),K=a(s($),2);c(()=>{e(ee),Za(()=>{})});var f=s(K);f.value=(f.__value="user")==null?"":"user";var J=a(f);J.value=(J.__value="admin")==null?"":"admin",t(K),t($),t(H);var V=a(H,2);{var He=d=>{var F=Jl(),N=s(F,!0);t(F),c(()=>p(N,e($a))),i(d,F)};P(V,d=>{e($a)&&d(He)})}var Ae=a(V,2),Je=s(Ae);z(Je,{get disabled(){return e(La)},$$events:{click:ls},children:(d,F)=>{j();var N=O();c(()=>p(N,e(La)?"Adding…":"Add User")),i(d,N)},$$slots:{default:!0}}),t(Ae),t(u);var qe=a(u,2);{var ma=d=>{var F=Yl();ya(F,5,()=>e(ta),N=>N.id,(N,he)=>{var Ve=Xl(),Ie=s(Ve),Fe=s(Ie),Xe=s(Fe,!0);t(Fe);var Ye=a(Fe,2),Xa=s(Ye,!0);t(Ye),t(Ie);var oa=a(Ie,2),Ua=s(oa,!0);t(oa);var Ya=a(oa,2);{var ut=Te=>{var je=ql();Me("click",je,()=>{l(va,{id:e(he).id,name:e(he).name}),l(Ka,!0)}),i(Te,je)},Ea=Te=>{var je=Vl();i(Te,je)};P(Ya,Te=>{var je;e(he).id!==((je=se().user)==null?void 0:je.id)?Te(ut):Te(Ea,!1)})}t(Ve),c(()=>{p(Xe,e(he).name),p(Xa,e(he).email),Ns(oa,`role-chip ${e(he).role??""} svelte-9l533f`),p(Ua,e(he).role)}),i(N,Ve)}),t(F),i(d,F)};P(qe,d=>{e(ta).length>0&&d(ma)})}t(v),I(T,()=>e(ee).name,d=>k(ee,e(ee).name=d)),I(Q,()=>e(ee).email,d=>k(ee,e(ee).email=d)),I(X,()=>e(ee).password,d=>k(ee,e(ee).password=d)),et(K,()=>e(ee).role,d=>k(ee,e(ee).role=d)),Se(3,v,()=>Pe,()=>({y:6,duration:180})),i(h,v)},E=h=>{var v=we(),g=ve(v);{var u=b=>{var A=ir(),T=a(s(A),2),ce=a(s(T),2),Q=s(ce),H=a(s(Q),4);z(H,{get disabled(){return e(Oa)},$$events:{click:Zt},children:(S,be)=>{j();var de=O();c(()=>p(de,e(Oa)?"Exporting…":"Export JSON")),i(S,de)},$$slots:{default:!0}}),t(Q);var q=a(Q,4),X=a(s(q),4),$=s(X),K=s($);Ws(K,S=>l(Sa,S),()=>e(Sa));var f=a(K,2),J=s(f,!0);t(f),t($);var V=a($,2);const He=ca(()=>!e(sa)||e(Fa));z(V,{get disabled(){return e(He)},$$events:{click:Qt},children:(S,be)=>{j();var de=O();c(()=>p(de,e(Fa)?"Importing…":"Import")),i(S,de)},$$slots:{default:!0}}),t(X),t(q),t(ce),j(2),t(T);var Ae=a(T,2),Je=a(s(Ae),4),qe=s(Je),ma=a(s(qe),2);R(ma),t(qe);var d=a(qe,2),F=a(s(d),2);R(F),t(d),t(Je);var N=a(Je,2),he=s(N),Ve=a(s(he),2);R(Ve),t(he);var Ie=a(he,2),Fe=a(s(Ie),2);R(Fe),t(Ie),t(N);var Xe=a(N,2),Ye=s(Xe),Xa=a(s(Ye),2);R(Xa),t(Ye);var oa=a(Ye,2),Ua=s(oa),Ya=a(s(Ua),2),ut=s(Ya,!0);t(Ya),t(Ua);var Ea=a(Ua,2);R(Ea),t(oa),t(Xe);var Te=a(Xe,2),je=s(Te);z(je,{variant:"ghost",get disabled(){return e(za)},$$events:{click:ps},children:(S,be)=>{j();var de=O();c(()=>p(de,e(za)?"Testing…":"Test Connection")),i(S,de)},$$slots:{default:!0}});var ms=a(je,2);z(ms,{get disabled(){return e(ba)},$$events:{click:Ct},children:(S,be)=>{j();var de=O();c(()=>p(de,e(ba)?"Saving…":"Save S3 Config")),i(S,de)},$$slots:{default:!0}}),t(Te);var hs=a(Te,2);{var ks=S=>{var be=Ql(),de=s(be);t(be),c(()=>{da(be,"s3-test-success",e(la)==="success"),da(be,"s3-test-error",e(la)==="error"),p(de,`${(e(la)==="success"?"✓":"✗")??""}
|
|
29
|
+
${e(Ha)??""}`)}),i(S,be)};P(hs,S=>{e(la)&&S(ks)})}t(Ae);var ft=a(Ae,2),ys=a(s(ft),2);{var ws=S=>{var be=er();i(S,be)},xs=S=>{var be=rr(),de=ve(be),Tt=s(de),_t=a(s(Tt),2);t(Tt),t(de);var bt=a(de,2),jt=a(s(bt),2);R(jt),t(bt);var Bt=a(bt,2);{var $s=Oe=>{var Aa=lr(),Ze=s(Aa),Ps=a(Ze);{var Cs=Qe=>{var De=ar(),gt=s(De);t(De),c(mt=>p(gt,`uploaded to ${mt??""}`),[()=>e(ze).replace("success:","")],ca),i(Qe,De)},Rs=Qe=>{var De=we(),gt=ve(De);{var mt=ha=>{var Be=tr(),ht=s(Be,!0);t(Be),c(Es=>p(ht,Es),[()=>e(ze).replace("error:","")],ca),i(ha,Be)},Us=ha=>{var Be=sr(),ht=s(Be,!0);t(Be),c(()=>p(ht,e(ze))),i(ha,Be)};P(gt,ha=>{var Be;(Be=e(ze))!=null&&Be.startsWith("error:")?ha(mt):ha(Us,!1)},!0)}i(Qe,De)};P(Ps,Qe=>{var De;(De=e(ze))!=null&&De.startsWith("success:")?Qe(Cs):Qe(Rs,!1)})}t(Aa),c(Qe=>p(Ze,`Last backup: ${Qe??""} — `),[()=>new Date(e(Pa)).toLocaleString()],ca),i(Oe,Aa)};P(Bt,Oe=>{e(Pa)&&Oe($s)})}var Mt=a(Bt,2),Lt=s(Mt);z(Lt,{variant:"ghost",get disabled(){return e(Ga)},$$events:{click:us},children:(Oe,Aa)=>{j();var Ze=O();c(()=>p(Ze,e(Ga)?"Uploading…":"Upload to S3 Now")),i(Oe,Ze)},$$slots:{default:!0}});var Ss=a(Lt,2);z(Ss,{get disabled(){return e(ba)},$$events:{click:Ct},children:(Oe,Aa)=>{j();var Ze=O();c(()=>p(Ze,e(ba)?"Saving…":"Save Schedule")),i(Oe,Ze)},$$slots:{default:!0}}),t(Mt),c(()=>{te(_t,"aria-checked",e(y).backupEnabled),da(_t,"active",e(y).backupEnabled)}),Me("click",_t,()=>k(y,e(y).backupEnabled=!e(y).backupEnabled)),I(jt,()=>e(y).backupCron,Oe=>k(y,e(y).backupCron=Oe)),i(S,be)};P(ys,S=>{e(lt)?S(xs,!1):S(ws)})}t(ft),t(A),c(()=>{p(J,e(sa)?e(sa).name:"Choose file…"),p(ut,e(ga)?"A key is already saved — leave blank to keep it":"Required"),te(Ea,"placeholder",e(ga)?"••••••••":"Enter secret key"),da(ft,"card-disabled",!e(lt))}),Me("change",K,es),I(ma,()=>e(y).backupS3Endpoint,S=>k(y,e(y).backupS3Endpoint=S)),I(F,()=>e(y).backupS3Region,S=>k(y,e(y).backupS3Region=S)),I(Ve,()=>e(y).backupS3Bucket,S=>k(y,e(y).backupS3Bucket=S)),I(Fe,()=>e(y).backupS3Prefix,S=>k(y,e(y).backupS3Prefix=S)),I(Xa,()=>e(y).backupS3AccessKey,S=>k(y,e(y).backupS3AccessKey=S)),I(Ea,()=>e(y).backupS3SecretKey,S=>k(y,e(y).backupS3SecretKey=S)),Se(3,A,()=>Pe,()=>({y:6,duration:180})),i(b,A)};P(g,b=>{e(pe)==="backup"&&b(u)},!0)}i(h,v)};P(G,h=>{e(pe)==="users"?h(C):h(E,!1)},!0)}i(B,M)};P(ne,B=>{e(pe)==="account"?B(_e):B(oe,!1)},!0)}i(W,ae)};P(U,W=>{e(pe)==="mcp"?W(m):W(ie,!1)},!0)}i(w,x)};P($e,w=>{e(pe)==="integrations"?w(Ee):w(Ne,!1)},!0)}i(ge,me)};P(ia,ge=>{e(pe)==="repository"?ge(na):ge(Ke,!1)},!0)}i(Re,Ue)};P(D,Re=>{e(pe)==="runners"?Re(fe):Re(Va,!1)},!0)}i(r,n)};P(_s,r=>{e(pe)==="project"?r(bs):r(gs,!1)})}t(It),t(Et),i(We,Rt),Ms(),st()}export{Pr as component};
|
|
Binary file
|
|
Binary file
|
|
@@ -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{h as L,a as b,t as h,s as A,e as O}from"../chunks/ll-VsEGv.js";import{i as Q}from"../chunks/DGryW1Vp.js";import{p as R,o as T,s as a,t as k,d as U,$ as V,m as d,k as l,c as e,n as r,j as i}from"../chunks/C67QNx7Z.js";import{i as E,s as X,a as Z}from"../chunks/CVV6HrFb.js";import{s as ee,r as $}from"../chunks/CstKKb9b.js";import{b as x}from"../chunks/raHbXn_9.js";import{g as se}from"../chunks/KJdjlibc.js";import{c as ae,s as te,l as le}from"../chunks/BVMec-1T.js";import{a as re}from"../chunks/DIx44H9N.js";import{t as ie}from"../chunks/uFRI_bmR.js";var oe=h('<p class="checking svelte-1fbs494">Checking server…</p>'),ne=h('<p class="error svelte-1fbs494"> </p>'),ce=h('<div class="card svelte-1fbs494"><div class="brand svelte-1fbs494"><span class="brand-serif svelte-1fbs494">Pl</span><span class="brand-sans svelte-1fbs494">um</span></div> <div class="heading svelte-1fbs494"><h1 class="title svelte-1fbs494">Welcome to Plum</h1> <p class="subtitle svelte-1fbs494">Create your first account to get started.</p></div> <div class="fields svelte-1fbs494"><div class="field svelte-1fbs494"><label class="label svelte-1fbs494" for="name">Your name</label> <input id="name" type="text" class="input svelte-1fbs494" placeholder="Jane Smith" autocomplete="name"></div> <div class="field svelte-1fbs494"><label class="label svelte-1fbs494" for="email">Email</label> <input id="email" type="email" class="input svelte-1fbs494" placeholder="jane@example.com" autocomplete="email"></div> <div class="field svelte-1fbs494"><label class="label svelte-1fbs494" for="password">Password</label> <input id="password" type="password" class="input svelte-1fbs494" placeholder="Min. 8 characters" autocomplete="new-password"></div></div> <!> <button class="submit-btn svelte-1fbs494"> </button></div>'),ve=h('<div class="page svelte-1fbs494"><!></div>');function ye(J,N){R(N,!1);const[W,Y]=X(),z=()=>Z(ie,"$theme",W);let p=d(""),c=d(""),o=d(""),v=d(""),f=d(!1),P=d(!0);T(async()=>{try{await ae()||se("/login")}catch{}a(P,!1)});async function B(){if(!e(p)||!e(c)||!e(o)){a(v,"All fields are required.");return}if(e(o).length<8){a(v,"Password must be at least 8 characters.");return}a(v,""),a(f,!0);try{await te({name:e(p),email:e(c),password:e(o)});const{token:s,user:n}=await le({email:e(c),password:e(o)});re.login(s,n),window.location.href="/"}catch(s){a(v,s.message||"Setup failed")}finally{a(f,!1)}}Q();var m=ve();L(s=>{V.title="Setup — Plum"});var D=l(m);{var F=s=>{var n=oe();b(s,n)},G=s=>{var n=ce(),_=i(l(n),4),g=l(_),S=i(l(g),2);$(S),r(g);var w=i(g,2),C=i(l(w),2);$(C),r(w);var j=i(w,2),M=i(l(j),2);$(M),r(j),r(_);var q=i(_,2);{var H=t=>{var y=ne(),K=l(y,!0);r(y),k(()=>A(K,e(v))),b(t,y)};E(q,t=>{e(v)&&t(H)})}var u=i(q,2),I=l(u,!0);r(u),r(n),k(()=>{u.disabled=e(f)||!e(p)||!e(c)||!e(o),A(I,e(f)?"Creating account…":"Create account")}),x(S,()=>e(p),t=>a(p,t)),x(C,()=>e(c),t=>a(c,t)),x(M,()=>e(o),t=>a(o,t)),O("click",u,B),b(s,n)};E(D,s=>{e(P)?s(F):s(G,!1)})}r(m),k(()=>ee(m,"data-theme",z())),b(J,m),U(),Y()}export{ye as component};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"
|
|
1
|
+
{"version":"1783932324326"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,34 @@
|
|
|
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 ssr = false;
|
|
19
|
+
|
|
20
|
+
var _layout = /*#__PURE__*/Object.freeze({
|
|
21
|
+
__proto__: null,
|
|
22
|
+
ssr: ssr
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const index = 0;
|
|
26
|
+
let component_cache;
|
|
27
|
+
const component = async () => component_cache ??= (await import('./_layout.svelte-DoJXDbP1.js')).default;
|
|
28
|
+
const universal_id = "src/routes/+layout.js";
|
|
29
|
+
const imports = ["_app/immutable/nodes/0.CKD9Qja6.js","_app/immutable/chunks/ll-VsEGv.js","_app/immutable/chunks/C67QNx7Z.js","_app/immutable/chunks/DGryW1Vp.js","_app/immutable/chunks/CVV6HrFb.js","_app/immutable/chunks/DmRbbcS3.js","_app/immutable/chunks/KJdjlibc.js","_app/immutable/chunks/BFgtfHj2.js","_app/immutable/chunks/CstKKb9b.js","_app/immutable/chunks/DIx44H9N.js","_app/immutable/chunks/BgNaeXAp.js","_app/immutable/chunks/C3SY6-sX.js","_app/immutable/chunks/CxTX_lpP.js","_app/immutable/chunks/BFEiffAL.js","_app/immutable/chunks/B0pefNHY.js","_app/immutable/chunks/IFIFk6zi.js","_app/immutable/chunks/BeO8veBd.js","_app/immutable/chunks/BIRVeCLU.js","_app/immutable/chunks/BVMec-1T.js"];
|
|
30
|
+
const stylesheets = ["_app/immutable/assets/0.BhSG-jZH.css","_app/immutable/assets/ConfirmModal.DmxkcwXv.css","_app/immutable/assets/Badge.D1SV0Gv7.css"];
|
|
31
|
+
const fonts = [];
|
|
32
|
+
|
|
33
|
+
export { component, fonts, imports, index, stylesheets, _layout as universal, universal_id };
|
|
34
|
+
//# sourceMappingURL=0-Dzas6zkl.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
{"version":3,"file":"0-Dzas6zkl.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/_layout.js","../../../.svelte-kit/adapter-node/nodes/0.js"],"sourcesContent":["const ssr = false;\nexport {\n ssr\n};\n","import * as universal from '../entries/pages/_layout.js';\n\nexport const index = 0;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js')).default;\nexport { universal };\nexport const universal_id = \"src/routes/+layout.js\";\nexport const imports = [\"_app/immutable/nodes/0.CKD9Qja6.js\",\"_app/immutable/chunks/ll-VsEGv.js\",\"_app/immutable/chunks/C67QNx7Z.js\",\"_app/immutable/chunks/DGryW1Vp.js\",\"_app/immutable/chunks/CVV6HrFb.js\",\"_app/immutable/chunks/DmRbbcS3.js\",\"_app/immutable/chunks/KJdjlibc.js\",\"_app/immutable/chunks/BFgtfHj2.js\",\"_app/immutable/chunks/CstKKb9b.js\",\"_app/immutable/chunks/DIx44H9N.js\",\"_app/immutable/chunks/BgNaeXAp.js\",\"_app/immutable/chunks/C3SY6-sX.js\",\"_app/immutable/chunks/CxTX_lpP.js\",\"_app/immutable/chunks/BFEiffAL.js\",\"_app/immutable/chunks/B0pefNHY.js\",\"_app/immutable/chunks/IFIFk6zi.js\",\"_app/immutable/chunks/BeO8veBd.js\",\"_app/immutable/chunks/BIRVeCLU.js\",\"_app/immutable/chunks/BVMec-1T.js\"];\nexport const stylesheets = [\"_app/immutable/assets/0.BhSG-jZH.css\",\"_app/immutable/assets/ConfirmModal.DmxkcwXv.css\",\"_app/immutable/assets/Badge.D1SV0Gv7.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":"AAAA,MAAM,GAAG,GAAG,KAAK;;;;;;;ACEL,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,8BAAoC,CAAC,EAAE;AAElG,MAAC,YAAY,GAAG;AAChB,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC;AACxrB,MAAC,WAAW,GAAG,CAAC,sCAAsC,CAAC,iDAAiD,CAAC,0CAA0C;AACnJ,MAAC,KAAK,GAAG;;;;"}
|