@reddoorla/maintenance 0.94.1 → 0.95.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -0
- package/dist/{announce-PGT4SZZB.js → announce-CLQYX5I4.js} +4 -4
- package/dist/{blux-NXQLMS4W.js → blux-4KNXUP2K.js} +1 -1
- package/dist/{bump-deps-6OR7LL4E.js → bump-deps-C5G2EFBB.js} +6 -6
- package/dist/{chunk-LS6QPANO.js → chunk-2LYOAB2E.js} +2 -2
- package/dist/{chunk-KQB2BX4V.js → chunk-2ZAZ7ETT.js} +2 -2
- package/dist/{chunk-XTK5VIQB.js → chunk-AVEQUR44.js} +48 -1
- package/dist/chunk-AVEQUR44.js.map +1 -0
- package/dist/{chunk-B6NUZ2ZX.js → chunk-BCKEP5S6.js} +2 -2
- package/dist/{chunk-DMPHP7UP.js → chunk-BI2VI6EM.js} +2 -2
- package/dist/{chunk-5FCBYK6L.js → chunk-BVEDKMNG.js} +10 -10
- package/dist/{chunk-OCNSIBMP.js → chunk-C3IQQKXL.js} +26 -1
- package/dist/{chunk-OCNSIBMP.js.map → chunk-C3IQQKXL.js.map} +1 -1
- package/dist/{chunk-PPIZHDJL.js → chunk-CJ2RMTT7.js} +2 -2
- package/dist/{chunk-7CJ3DVZW.js → chunk-CWXTNPNZ.js} +2 -2
- package/dist/{chunk-TGUESYGF.js → chunk-DFKBTBO3.js} +2 -2
- package/dist/{chunk-WHWVYL7B.js → chunk-FSGICFXB.js} +7 -32
- package/dist/chunk-FSGICFXB.js.map +1 -0
- package/dist/{chunk-3HS6LPFX.js → chunk-FUWFLAWQ.js} +4 -4
- package/dist/{chunk-4AIYWWKV.js → chunk-KJRVMMM3.js} +2 -2
- package/dist/{chunk-TCF6S7AD.js → chunk-LM2NHRCJ.js} +2 -2
- package/dist/{chunk-AEUABPAJ.js → chunk-R5IMFAFR.js} +2 -2
- package/dist/{chunk-NTLSMJHW.js → chunk-S7RYFUIK.js} +2 -2
- package/dist/{chunk-MLT4QY5X.js → chunk-SLFG7Y76.js} +1 -1
- package/dist/chunk-SLFG7Y76.js.map +1 -0
- package/dist/{chunk-REJCSA4H.js → chunk-TR3HFH6J.js} +4 -3
- package/dist/chunk-TR3HFH6J.js.map +1 -0
- package/dist/{chunk-22GKJO5F.js → chunk-VSGMCCGQ.js} +2 -2
- package/dist/{chunk-4R3YAQNV.js → chunk-WSJ7RO54.js} +2 -2
- package/dist/chunk-XPJQXSC4.js +112 -0
- package/dist/chunk-XPJQXSC4.js.map +1 -0
- package/dist/chunk-ZCL7C5LH.js +2698 -0
- package/dist/chunk-ZCL7C5LH.js.map +1 -0
- package/dist/{chunk-ZTPPCHDB.js → chunk-ZQV7UQNE.js} +2 -2
- package/dist/cli/bin.js +39 -26
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/audit.d.ts +1 -1
- package/dist/cli/commands/audit.js +8 -8
- package/dist/client-G2WGWPCA.js +11 -0
- package/dist/configs/eslint.js +27 -1
- package/dist/configs/eslint.js.map +1 -1
- package/dist/{convert-to-pnpm-3RVGUBBR.js → convert-to-pnpm-YTFREUJK.js} +6 -6
- package/dist/{db-FL7ZBF6H.js → db-XKZYDCKM.js} +9 -9
- package/dist/{digest-TZ3QQOSF.js → digest-7UBGUBRK.js} +14 -14
- package/dist/{digest-collectors-EHFY2OQC.js → digest-collectors-DJFN5ZDK.js} +8 -8
- package/dist/{ensure-site-WIDO6LGU.js → ensure-site-OAAE5YE2.js} +2 -2
- package/dist/{forms-notify-target-2LWF5C5B.js → forms-notify-target-UC6PF3AE.js} +2 -2
- package/dist/{github-signals-GAHNOAHS.js → github-signals-TX5FPYP6.js} +5 -5
- package/dist/{header-image-YN3AQRY3.js → header-image-PSPT7CUM.js} +2 -2
- package/dist/{health-endpoint-XLNBWVHK.js → health-endpoint-KVCJYWET.js} +6 -6
- package/dist/{health-mirror-EB76EERV.js → health-mirror-XJAKA3EY.js} +3 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +31 -29
- package/dist/index.js.map +1 -1
- package/dist/{init-YCLSGIEP.js → init-FFE4FCO2.js} +13 -13
- package/dist/{launch-FSHDTXSM.js → launch-UD36AHUN.js} +221 -7
- package/dist/launch-UD36AHUN.js.map +1 -0
- package/dist/match-harness-QRG6XZAR.js +70 -0
- package/dist/match-harness-QRG6XZAR.js.map +1 -0
- package/dist/migrate-Y7R4CESL.js +7 -0
- package/dist/{onboard-NKE6GZKL.js → onboard-TM2KESGF.js} +6 -6
- package/dist/{orchestrate-MWXENQOS.js → orchestrate-HYVQPRCE.js} +6 -6
- package/dist/{pipeline-MATFYQRC.js → pipeline-YROAY6DT.js} +2 -2
- package/dist/{preflight-4VQP7JJL.js → preflight-RYIP54NY.js} +7 -7
- package/dist/{prismic-ci-DM352L2Q.js → prismic-ci-6GKKZGB5.js} +13 -11
- package/dist/prismic-ci-6GKKZGB5.js.map +1 -0
- package/dist/{prismic-models-Q32ARSYS.js → prismic-models-P6FWWVRS.js} +5 -5
- package/dist/prospect/types.d.ts +1 -1
- package/dist/{prospect-audit-MT6RGMOY.js → prospect-audit-PRHU53HS.js} +5 -5
- package/dist/{prospect-audits-RVYEA4KH.js → prospect-audits-R3LWF6U7.js} +10 -4
- package/dist/recipes/sync-configs.d.ts +1 -1
- package/dist/recipes/sync-configs.js +4 -4
- package/dist/{render-JE5P26H5.js → render-YGNGTX3W.js} +2 -2
- package/dist/render-from-row-IFSBHWDH.js +1 -1
- package/dist/{report-6FFHGUUS.js → report-LQS4ECTM.js} +12 -12
- package/dist/{report-mirror-IP64R7B3.js → report-mirror-HDTOJE64.js} +3 -3
- package/dist/{schema-2V7BGYVT.js → schema-A4WCPIF4.js} +1 -1
- package/dist/{schema-2V7BGYVT.js.map → schema-A4WCPIF4.js.map} +1 -1
- package/dist/{self-updating-5DVDIEHB.js → self-updating-MWXIZLL7.js} +6 -6
- package/dist/{selftest-LJYXBIO5.js → selftest-VXTHRPRN.js} +9 -9
- package/dist/{site-mirror-UKHREAD6.js → site-mirror-WON4FTJ2.js} +3 -3
- package/dist/{smoke-suite-NUTC7IUK.js → smoke-suite-7DGITCTZ.js} +6 -6
- package/dist/{submissions-5GKJPCIH.js → submissions-OVZPVBYG.js} +2 -2
- package/dist/{svelte-codemods-U4NIT6CV.js → svelte-codemods-WSV2FGNG.js} +6 -6
- package/dist/{sync-configs-S2JYY6QU.js → sync-configs-RRIHNLIJ.js} +7 -7
- package/dist/{types-OIQZ5hWN.d.ts → types-D_bpy89i.d.ts} +1 -1
- package/dist/{upgrade-YFZCMUPE.js → upgrade-VTD6V4HS.js} +6 -6
- package/dist/util/git.d.ts +46 -1
- package/dist/util/git.js +7 -1
- package/package.json +1 -1
- package/dist/chunk-7MKT4I5T.js +0 -62
- package/dist/chunk-7MKT4I5T.js.map +0 -1
- package/dist/chunk-MLT4QY5X.js.map +0 -1
- package/dist/chunk-REJCSA4H.js.map +0 -1
- package/dist/chunk-WHWVYL7B.js.map +0 -1
- package/dist/chunk-XTK5VIQB.js.map +0 -1
- package/dist/client-M2V6FHH5.js +0 -11
- package/dist/launch-FSHDTXSM.js.map +0 -1
- package/dist/migrate-K4JETR36.js +0 -7
- package/dist/prismic-ci-DM352L2Q.js.map +0 -1
- /package/dist/{announce-PGT4SZZB.js.map → announce-CLQYX5I4.js.map} +0 -0
- /package/dist/{blux-NXQLMS4W.js.map → blux-4KNXUP2K.js.map} +0 -0
- /package/dist/{bump-deps-6OR7LL4E.js.map → bump-deps-C5G2EFBB.js.map} +0 -0
- /package/dist/{chunk-LS6QPANO.js.map → chunk-2LYOAB2E.js.map} +0 -0
- /package/dist/{chunk-KQB2BX4V.js.map → chunk-2ZAZ7ETT.js.map} +0 -0
- /package/dist/{chunk-B6NUZ2ZX.js.map → chunk-BCKEP5S6.js.map} +0 -0
- /package/dist/{chunk-DMPHP7UP.js.map → chunk-BI2VI6EM.js.map} +0 -0
- /package/dist/{chunk-5FCBYK6L.js.map → chunk-BVEDKMNG.js.map} +0 -0
- /package/dist/{chunk-PPIZHDJL.js.map → chunk-CJ2RMTT7.js.map} +0 -0
- /package/dist/{chunk-7CJ3DVZW.js.map → chunk-CWXTNPNZ.js.map} +0 -0
- /package/dist/{chunk-TGUESYGF.js.map → chunk-DFKBTBO3.js.map} +0 -0
- /package/dist/{chunk-3HS6LPFX.js.map → chunk-FUWFLAWQ.js.map} +0 -0
- /package/dist/{chunk-4AIYWWKV.js.map → chunk-KJRVMMM3.js.map} +0 -0
- /package/dist/{chunk-TCF6S7AD.js.map → chunk-LM2NHRCJ.js.map} +0 -0
- /package/dist/{chunk-AEUABPAJ.js.map → chunk-R5IMFAFR.js.map} +0 -0
- /package/dist/{chunk-NTLSMJHW.js.map → chunk-S7RYFUIK.js.map} +0 -0
- /package/dist/{chunk-22GKJO5F.js.map → chunk-VSGMCCGQ.js.map} +0 -0
- /package/dist/{chunk-4R3YAQNV.js.map → chunk-WSJ7RO54.js.map} +0 -0
- /package/dist/{chunk-ZTPPCHDB.js.map → chunk-ZQV7UQNE.js.map} +0 -0
- /package/dist/{client-M2V6FHH5.js.map → client-G2WGWPCA.js.map} +0 -0
- /package/dist/{convert-to-pnpm-3RVGUBBR.js.map → convert-to-pnpm-YTFREUJK.js.map} +0 -0
- /package/dist/{db-FL7ZBF6H.js.map → db-XKZYDCKM.js.map} +0 -0
- /package/dist/{digest-TZ3QQOSF.js.map → digest-7UBGUBRK.js.map} +0 -0
- /package/dist/{digest-collectors-EHFY2OQC.js.map → digest-collectors-DJFN5ZDK.js.map} +0 -0
- /package/dist/{ensure-site-WIDO6LGU.js.map → ensure-site-OAAE5YE2.js.map} +0 -0
- /package/dist/{forms-notify-target-2LWF5C5B.js.map → forms-notify-target-UC6PF3AE.js.map} +0 -0
- /package/dist/{github-signals-GAHNOAHS.js.map → github-signals-TX5FPYP6.js.map} +0 -0
- /package/dist/{header-image-YN3AQRY3.js.map → header-image-PSPT7CUM.js.map} +0 -0
- /package/dist/{health-endpoint-XLNBWVHK.js.map → health-endpoint-KVCJYWET.js.map} +0 -0
- /package/dist/{health-mirror-EB76EERV.js.map → health-mirror-XJAKA3EY.js.map} +0 -0
- /package/dist/{init-YCLSGIEP.js.map → init-FFE4FCO2.js.map} +0 -0
- /package/dist/{migrate-K4JETR36.js.map → migrate-Y7R4CESL.js.map} +0 -0
- /package/dist/{onboard-NKE6GZKL.js.map → onboard-TM2KESGF.js.map} +0 -0
- /package/dist/{orchestrate-MWXENQOS.js.map → orchestrate-HYVQPRCE.js.map} +0 -0
- /package/dist/{pipeline-MATFYQRC.js.map → pipeline-YROAY6DT.js.map} +0 -0
- /package/dist/{preflight-4VQP7JJL.js.map → preflight-RYIP54NY.js.map} +0 -0
- /package/dist/{prismic-models-Q32ARSYS.js.map → prismic-models-P6FWWVRS.js.map} +0 -0
- /package/dist/{prospect-audit-MT6RGMOY.js.map → prospect-audit-PRHU53HS.js.map} +0 -0
- /package/dist/{prospect-audits-RVYEA4KH.js.map → prospect-audits-R3LWF6U7.js.map} +0 -0
- /package/dist/{render-JE5P26H5.js.map → render-YGNGTX3W.js.map} +0 -0
- /package/dist/{report-6FFHGUUS.js.map → report-LQS4ECTM.js.map} +0 -0
- /package/dist/{report-mirror-IP64R7B3.js.map → report-mirror-HDTOJE64.js.map} +0 -0
- /package/dist/{self-updating-5DVDIEHB.js.map → self-updating-MWXIZLL7.js.map} +0 -0
- /package/dist/{selftest-LJYXBIO5.js.map → selftest-VXTHRPRN.js.map} +0 -0
- /package/dist/{site-mirror-UKHREAD6.js.map → site-mirror-WON4FTJ2.js.map} +0 -0
- /package/dist/{smoke-suite-NUTC7IUK.js.map → smoke-suite-7DGITCTZ.js.map} +0 -0
- /package/dist/{submissions-5GKJPCIH.js.map → submissions-OVZPVBYG.js.map} +0 -0
- /package/dist/{svelte-codemods-U4NIT6CV.js.map → svelte-codemods-WSV2FGNG.js.map} +0 -0
- /package/dist/{sync-configs-S2JYY6QU.js.map → sync-configs-RRIHNLIJ.js.map} +0 -0
- /package/dist/{upgrade-YFZCMUPE.js.map → upgrade-VTD6V4HS.js.map} +0 -0
|
@@ -2,23 +2,23 @@ import {
|
|
|
2
2
|
appendSkipNotice,
|
|
3
3
|
fleetWorkdir,
|
|
4
4
|
prepareFleetSites
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-LM2NHRCJ.js";
|
|
6
6
|
import {
|
|
7
7
|
resolveSites
|
|
8
8
|
} from "./chunk-Z2K4JPQ3.js";
|
|
9
9
|
import {
|
|
10
10
|
init
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-BVEDKMNG.js";
|
|
12
|
+
import "./chunk-S7RYFUIK.js";
|
|
13
|
+
import "./chunk-CWXTNPNZ.js";
|
|
14
|
+
import "./chunk-2LYOAB2E.js";
|
|
14
15
|
import "./chunk-J7SZQUCW.js";
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-WSJ7RO54.js";
|
|
17
|
+
import "./chunk-DFKBTBO3.js";
|
|
17
18
|
import "./chunk-R53VL3RI.js";
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-MLT4QY5X.js";
|
|
19
|
+
import "./chunk-FUWFLAWQ.js";
|
|
20
|
+
import "./chunk-ZQV7UQNE.js";
|
|
21
|
+
import "./chunk-SLFG7Y76.js";
|
|
22
22
|
import "./chunk-OTGB6YQO.js";
|
|
23
23
|
import "./chunk-TO7DJYLZ.js";
|
|
24
24
|
import "./chunk-LKGVSM2O.js";
|
|
@@ -31,11 +31,11 @@ import "./chunk-PTDMVGKL.js";
|
|
|
31
31
|
import "./chunk-LBYOLBW7.js";
|
|
32
32
|
import "./chunk-A3WDWNN5.js";
|
|
33
33
|
import "./chunk-2OP4JKIQ.js";
|
|
34
|
+
import "./chunk-RARREDQE.js";
|
|
34
35
|
import {
|
|
35
36
|
siteLabel
|
|
36
37
|
} from "./chunk-XXTZBPUY.js";
|
|
37
|
-
import "./chunk-
|
|
38
|
-
import "./chunk-XTK5VIQB.js";
|
|
38
|
+
import "./chunk-AVEQUR44.js";
|
|
39
39
|
import "./chunk-NMAWXBJA.js";
|
|
40
40
|
import "./chunk-YLYXW5PH.js";
|
|
41
41
|
|
|
@@ -110,4 +110,4 @@ async function runInitCommand(site, opts) {
|
|
|
110
110
|
export {
|
|
111
111
|
runInitCommand
|
|
112
112
|
};
|
|
113
|
-
//# sourceMappingURL=init-
|
|
113
|
+
//# sourceMappingURL=init-FFE4FCO2.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-5EEMTJMT.js";
|
|
4
4
|
import {
|
|
5
5
|
selfUpdating
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-FSGICFXB.js";
|
|
7
7
|
import "./chunk-MNDIED4M.js";
|
|
8
8
|
import {
|
|
9
9
|
hasRealScores,
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
listWebsites,
|
|
40
40
|
siteSlug
|
|
41
41
|
} from "./chunk-3Z6X3BHU.js";
|
|
42
|
-
import "./chunk-
|
|
42
|
+
import "./chunk-SLFG7Y76.js";
|
|
43
43
|
import {
|
|
44
44
|
runAudits
|
|
45
45
|
} from "./chunk-TO7DJYLZ.js";
|
|
@@ -53,11 +53,11 @@ import "./chunk-PTDMVGKL.js";
|
|
|
53
53
|
import "./chunk-LBYOLBW7.js";
|
|
54
54
|
import "./chunk-A3WDWNN5.js";
|
|
55
55
|
import "./chunk-2OP4JKIQ.js";
|
|
56
|
+
import "./chunk-RARREDQE.js";
|
|
56
57
|
import {
|
|
57
58
|
siteLabel
|
|
58
59
|
} from "./chunk-XXTZBPUY.js";
|
|
59
|
-
import "./chunk-
|
|
60
|
-
import "./chunk-XTK5VIQB.js";
|
|
60
|
+
import "./chunk-AVEQUR44.js";
|
|
61
61
|
import "./chunk-6VAL7XJT.js";
|
|
62
62
|
import "./chunk-NMAWXBJA.js";
|
|
63
63
|
import "./chunk-YLYXW5PH.js";
|
|
@@ -66,13 +66,177 @@ import "./chunk-YLYXW5PH.js";
|
|
|
66
66
|
import { resolve } from "path";
|
|
67
67
|
|
|
68
68
|
// src/recipes/launch.ts
|
|
69
|
+
import { existsSync } from "fs";
|
|
70
|
+
import { readFile } from "fs/promises";
|
|
71
|
+
import { join } from "path";
|
|
72
|
+
var SITE_404_MARKER = /<h1[^>]*>\s*404\s*<\/h1>/i;
|
|
73
|
+
var UNGUARDED_TWIN_MARKER = /no (matching )?assembly for/i;
|
|
74
|
+
var MATCH_ROUTE_DIR = "src/routes/dev/match";
|
|
75
|
+
var CHECKOUT_MARKER = "src/routes";
|
|
76
|
+
var MATCH_GUARD_FILES = [
|
|
77
|
+
"src/routes/dev/+layout.server.ts",
|
|
78
|
+
"src/routes/dev/match/+layout.server.ts",
|
|
79
|
+
"src/routes/dev/match/[uid]/+page.server.ts"
|
|
80
|
+
];
|
|
81
|
+
function stripComments(source) {
|
|
82
|
+
let out = "";
|
|
83
|
+
for (let i = 0; i < source.length; ) {
|
|
84
|
+
const ch = source[i];
|
|
85
|
+
const next = source[i + 1];
|
|
86
|
+
if (ch === "/" && next === "/") {
|
|
87
|
+
while (i < source.length && source[i] !== "\n") i++;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (ch === "/" && next === "*") {
|
|
91
|
+
i += 2;
|
|
92
|
+
while (i < source.length && !(source[i] === "*" && source[i + 1] === "/")) i++;
|
|
93
|
+
i += 2;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (ch === '"' || ch === "'" || ch === "`") {
|
|
97
|
+
out += ch;
|
|
98
|
+
i++;
|
|
99
|
+
while (i < source.length) {
|
|
100
|
+
if (source[i] === "\\") {
|
|
101
|
+
out += source.slice(i, i + 2);
|
|
102
|
+
i += 2;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
out += source[i];
|
|
106
|
+
i++;
|
|
107
|
+
if (source[i - 1] === ch) break;
|
|
108
|
+
}
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
out += ch;
|
|
112
|
+
i++;
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
function maskLiterals(code) {
|
|
117
|
+
let out = "";
|
|
118
|
+
for (let i = 0; i < code.length; ) {
|
|
119
|
+
const ch = code[i];
|
|
120
|
+
if (ch !== '"' && ch !== "'" && ch !== "`") {
|
|
121
|
+
out += ch;
|
|
122
|
+
i++;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
out += ch;
|
|
126
|
+
i++;
|
|
127
|
+
while (i < code.length) {
|
|
128
|
+
const c = code[i];
|
|
129
|
+
if (c === "\\") {
|
|
130
|
+
out += " ";
|
|
131
|
+
i += 2;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
i++;
|
|
135
|
+
if (c === ch) {
|
|
136
|
+
out += c;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
out += c === "\n" ? "\n" : " ";
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
function consequentAt(code, from) {
|
|
145
|
+
let i = from;
|
|
146
|
+
while (i < code.length && /\s/.test(code[i])) i++;
|
|
147
|
+
const start = i;
|
|
148
|
+
if (code[i] === "{") {
|
|
149
|
+
let depth2 = 0;
|
|
150
|
+
for (; i < code.length; i++) {
|
|
151
|
+
if (code[i] === "{") depth2++;
|
|
152
|
+
else if (code[i] === "}" && --depth2 === 0) return code.slice(start, i + 1);
|
|
153
|
+
}
|
|
154
|
+
return code.slice(start);
|
|
155
|
+
}
|
|
156
|
+
let depth = 0;
|
|
157
|
+
for (; i < code.length; i++) {
|
|
158
|
+
const ch = code[i];
|
|
159
|
+
if (ch === "(" || ch === "[" || ch === "{") depth++;
|
|
160
|
+
else if (ch === ")" || ch === "]" || ch === "}") {
|
|
161
|
+
if (depth === 0) return code.slice(start, i);
|
|
162
|
+
depth--;
|
|
163
|
+
} else if (depth === 0 && (ch === ";" || ch === "\n")) return code.slice(start, i);
|
|
164
|
+
}
|
|
165
|
+
return code.slice(start);
|
|
166
|
+
}
|
|
167
|
+
var REFUSAL = /\berror\s*\(\s*404|\bthrow\b/;
|
|
168
|
+
function carriesGuard(source) {
|
|
169
|
+
const code = stripComments(source);
|
|
170
|
+
if (!code.includes("$app/environment")) return false;
|
|
171
|
+
const masked = maskLiterals(code);
|
|
172
|
+
const guards = /if\s*\(\s*!\s*dev\s*\)/g;
|
|
173
|
+
for (let m = guards.exec(masked); m; m = guards.exec(masked)) {
|
|
174
|
+
if (REFUSAL.test(consequentAt(masked, m.index + m[0].length))) return true;
|
|
175
|
+
}
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
async function matchingDisposition(sitePath) {
|
|
179
|
+
if (!existsSync(join(sitePath, CHECKOUT_MARKER))) {
|
|
180
|
+
return {
|
|
181
|
+
ok: false,
|
|
182
|
+
message: `${sitePath} has no ${CHECKOUT_MARKER} \u2014 this is not a SvelteKit checkout (never cloned, a stale clone, a mistyped site name, or the wrong working directory), so the twin's disposition cannot be established`
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
if (!existsSync(join(sitePath, MATCH_ROUTE_DIR))) {
|
|
186
|
+
return {
|
|
187
|
+
ok: true,
|
|
188
|
+
message: `no ${MATCH_ROUTE_DIR} in this checkout (${CHECKOUT_MARKER} is present, so the absence is a real one)`
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const read = [];
|
|
192
|
+
for (const rel of MATCH_GUARD_FILES) {
|
|
193
|
+
let source;
|
|
194
|
+
try {
|
|
195
|
+
source = await readFile(join(sitePath, rel), "utf-8");
|
|
196
|
+
} catch {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
read.push(rel);
|
|
200
|
+
if (carriesGuard(source)) {
|
|
201
|
+
return {
|
|
202
|
+
ok: true,
|
|
203
|
+
message: `${rel} contains dev guard source \u2014 \`if (!dev)\` on \`$app/environment\` whose own branch refuses with a 404/throw (source text only; the deployed build is checked at the dev-guard step)`
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (read.length === 0) {
|
|
208
|
+
return {
|
|
209
|
+
ok: false,
|
|
210
|
+
message: `${MATCH_ROUTE_DIR} exists but none of ${MATCH_GUARD_FILES.join(", ")} could be read \u2014 the twin's disposition cannot be established`
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
ok: false,
|
|
215
|
+
message: `none of ${read.join(", ")} carries an \`if (!dev)\` guard on \`$app/environment\` whose own branch refuses (\`error(404\` or \`throw\`), once comments are stripped and string contents masked \u2014 the matching twin would ship`
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
var PROBE_TIMEOUT_MS = 15e3;
|
|
219
|
+
var defaultProbe = async (url) => {
|
|
220
|
+
const res = await fetch(url, {
|
|
221
|
+
redirect: "follow",
|
|
222
|
+
signal: AbortSignal.timeout(PROBE_TIMEOUT_MS)
|
|
223
|
+
});
|
|
224
|
+
return { status: res.status, body: await res.text() };
|
|
225
|
+
};
|
|
69
226
|
async function launch(site, deps = {}) {
|
|
70
227
|
const label = siteLabel(site);
|
|
71
228
|
const bootstrap = deps.bootstrap ?? selfUpdating;
|
|
72
229
|
const audit = deps.audit ?? runAudits;
|
|
73
230
|
const base = deps.base ?? openBase(readAirtableConfig());
|
|
231
|
+
const probe = deps.probe ?? defaultProbe;
|
|
74
232
|
const steps = [];
|
|
75
233
|
const stop = () => ({ site: label, steps, complete: false });
|
|
234
|
+
const disposition = await matchingDisposition(site.path);
|
|
235
|
+
steps.push({
|
|
236
|
+
name: "matching-disposition",
|
|
237
|
+
result: disposition.ok ? { kind: "probe", message: disposition.message } : { kind: "error", message: disposition.message }
|
|
238
|
+
});
|
|
239
|
+
if (!disposition.ok) return stop();
|
|
76
240
|
let recipe;
|
|
77
241
|
try {
|
|
78
242
|
recipe = await bootstrap(site);
|
|
@@ -113,6 +277,54 @@ async function launch(site, deps = {}) {
|
|
|
113
277
|
});
|
|
114
278
|
return stop();
|
|
115
279
|
}
|
|
280
|
+
const origin = target.url.replace(/\/+$/, "");
|
|
281
|
+
let twin;
|
|
282
|
+
let control;
|
|
283
|
+
try {
|
|
284
|
+
twin = await probe(`${origin}/dev/match/home`);
|
|
285
|
+
control = await probe(`${origin}/health`);
|
|
286
|
+
} catch (err) {
|
|
287
|
+
steps.push({ name: "dev-guard", result: errorOf(err) });
|
|
288
|
+
return stop();
|
|
289
|
+
}
|
|
290
|
+
if (control.status !== 200) {
|
|
291
|
+
steps.push({
|
|
292
|
+
name: "dev-guard",
|
|
293
|
+
result: {
|
|
294
|
+
kind: "error",
|
|
295
|
+
message: `${origin}/health answered ${control.status}, not 200 \u2014 the twin's 404 proves nothing (host down, wrong url, or the site's /health function is not deploying, in which case the function-health audit is failing too)`
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
return stop();
|
|
299
|
+
}
|
|
300
|
+
const unguardedTell = twin.body.match(UNGUARDED_TWIN_MARKER);
|
|
301
|
+
if (unguardedTell) {
|
|
302
|
+
steps.push({
|
|
303
|
+
name: "dev-guard",
|
|
304
|
+
result: {
|
|
305
|
+
kind: "error",
|
|
306
|
+
message: `${origin}/dev/match/home answered ${twin.status} carrying the twin route's OWN "${unguardedTell[0]}" message \u2014 the twin is LIVE and merely has no assembly for the uid "home". That is not evidence of a dev guard.`
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
return stop();
|
|
310
|
+
}
|
|
311
|
+
if (twin.status !== 404 || !SITE_404_MARKER.test(twin.body)) {
|
|
312
|
+
steps.push({
|
|
313
|
+
name: "dev-guard",
|
|
314
|
+
result: {
|
|
315
|
+
kind: "error",
|
|
316
|
+
message: twin.status === 404 ? `${origin}/dev/match/home 404s, but not with this site's own error page \u2014 cannot tell the guard from a dead route` : `${origin}/dev/match/home answered ${twin.status} \u2014 the matching twin is live in production`
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
return stop();
|
|
320
|
+
}
|
|
321
|
+
steps.push({
|
|
322
|
+
name: "dev-guard",
|
|
323
|
+
result: {
|
|
324
|
+
kind: "probe",
|
|
325
|
+
message: `${origin}/dev/match/home 404 (site error page), /health 200`
|
|
326
|
+
}
|
|
327
|
+
});
|
|
116
328
|
try {
|
|
117
329
|
const auditWrite = await writeAuditsToAirtable({
|
|
118
330
|
base,
|
|
@@ -222,6 +434,7 @@ function formatStep(name, r) {
|
|
|
222
434
|
if (r.kind === "draft") {
|
|
223
435
|
return `${name.padEnd(20)} drafted ${r.report.reportId}`;
|
|
224
436
|
}
|
|
437
|
+
if (r.kind === "probe") return `${name.padEnd(20)} ok \u2014 ${r.message}`;
|
|
225
438
|
const rec = r.result;
|
|
226
439
|
if (rec.status === "noop") return `${name.padEnd(20)} noop${rec.notes ? ` \u2014 ${rec.notes}` : ""}`;
|
|
227
440
|
if (rec.status === "failed")
|
|
@@ -241,8 +454,8 @@ async function runLaunchCommand(site, opts) {
|
|
|
241
454
|
if (!target) {
|
|
242
455
|
return { output: `No site resolved for "${site}".`, code: 1 };
|
|
243
456
|
}
|
|
244
|
-
const { makeReportMirror } = await import("./report-mirror-
|
|
245
|
-
const { makeSiteMirror } = await import("./site-mirror-
|
|
457
|
+
const { makeReportMirror } = await import("./report-mirror-HDTOJE64.js");
|
|
458
|
+
const { makeSiteMirror } = await import("./site-mirror-WON4FTJ2.js");
|
|
246
459
|
const result = await launch(target, {
|
|
247
460
|
reportMirror: await makeReportMirror(),
|
|
248
461
|
siteMirror: await makeSiteMirror()
|
|
@@ -250,6 +463,7 @@ async function runLaunchCommand(site, opts) {
|
|
|
250
463
|
return { output: formatResult(result), code: result.complete ? 0 : 1 };
|
|
251
464
|
}
|
|
252
465
|
export {
|
|
466
|
+
formatStep,
|
|
253
467
|
runLaunchCommand
|
|
254
468
|
};
|
|
255
|
-
//# sourceMappingURL=launch-
|
|
469
|
+
//# sourceMappingURL=launch-UD36AHUN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/launch.ts","../src/recipes/launch.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { launch, type LaunchResult, type LaunchStepResult } from \"../../recipes/launch.js\";\nimport { resolveSites } from \"../fleet/resolve-sites.js\";\n\nexport type LaunchCommandOptions = {\n cwd?: string;\n};\n\nexport function formatStep(name: string, r: LaunchStepResult): string {\n if (r.kind === \"error\") return `${name.padEnd(20)} error: ${r.message}`;\n if (r.kind === \"audit\") {\n const s = r.scores;\n return `${name.padEnd(20)} audited (P=${s.performance} A=${s.accessibility} BP=${s.bestPractices} SEO=${s.seo})`;\n }\n if (r.kind === \"draft\") {\n return `${name.padEnd(20)} drafted ${r.report.reportId}`;\n }\n if (r.kind === \"probe\") return `${name.padEnd(20)} ok — ${r.message}`;\n const rec = r.result;\n if (rec.status === \"noop\") return `${name.padEnd(20)} noop${rec.notes ? ` — ${rec.notes}` : \"\"}`;\n if (rec.status === \"failed\")\n return `${name.padEnd(20)} failed${rec.notes ? ` — ${rec.notes}` : \"\"}`;\n return `${name.padEnd(20)} applied (${rec.commits.length} commit${rec.commits.length === 1 ? \"\" : \"s\"})${rec.notes ? ` — ${rec.notes}` : \"\"}`;\n}\n\nfunction formatResult(r: LaunchResult): string {\n const header = `[${r.site}] launch — ${r.complete ? \"drafted (awaiting approval)\" : \"STOPPED\"}`;\n const body = r.steps.map((s) => formatStep(s.name, s.result)).join(\"\\n\");\n return `${header}\\n${body}`;\n}\n\n/**\n * `launch <site>` — single-site only. Bootstrap (Renovate + protection), first-audit\n * the site, and DRAFT its launch email into the M3 approve queue. Never sends;\n * the operator approves the draft and the next send run delivers the go-live\n * email (flipping Status → maintenance + stamping Launched at).\n */\nexport async function runLaunchCommand(\n site: string,\n opts: LaunchCommandOptions,\n): Promise<{ output: string; code: number }> {\n const cwd = opts.cwd ? resolve(opts.cwd) : process.cwd();\n const sites = await resolveSites({ site, cwd });\n const target = sites[0];\n if (!target) {\n return { output: `No site resolved for \"${site}\".`, code: 1 };\n }\n\n // #539 Phase 5: create-side Turso dual-write, wired at the composition root\n // (see runAnnounceCommand for why it is not defaulted inside the recipe).\n const { makeReportMirror } = await import(\"../../reports/report-mirror.js\");\n const { makeSiteMirror } = await import(\"../../db/site-mirror.js\");\n const result = await launch(target, {\n reportMirror: await makeReportMirror(),\n siteMirror: await makeSiteMirror(),\n });\n return { output: formatResult(result), code: result.complete ? 0 : 1 };\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { AuditResult, RecipeResult, Site } from \"../types.js\";\nimport { siteLabel } from \"../util/site.js\";\nimport { selfUpdating } from \"./self-updating/index.js\";\nimport { runAudits } from \"../audits/index.js\";\nimport { hasRealScores, lighthouseScoresFromResult } from \"../audits/lighthouse-airtable.js\";\nimport { writeAuditsToAirtable } from \"../audits/write-audits-to-airtable.js\";\nimport { openBase, readAirtableConfig } from \"../reports/airtable/client.js\";\nimport type { AirtableBase } from \"../reports/airtable/client.js\";\nimport { listWebsites, siteSlug } from \"../reports/airtable/websites.js\";\nimport type { WebsiteRow } from \"../reports/airtable/websites.js\";\nimport {\n createDraft,\n findReportByPeriod,\n updateReportScores,\n} from \"../reports/airtable/reports.js\";\nimport type { ReportRow } from \"../reports/airtable/reports.js\";\nimport type { ReportMirror } from \"../reports/report-mirror.js\";\nimport type { SiteMirror } from \"../db/site-mirror.js\";\nimport { queueDraft } from \"../reports/queue.js\";\nimport { uploadAttachment } from \"../reports/airtable/attachments.js\";\nimport { renderReportHtml } from \"../reports/render.js\";\nimport { resolveCopy } from \"../reports/copy.js\";\nimport type { LighthouseScores } from \"../reports/types.js\";\n\nexport type LaunchStepResult =\n | { kind: \"recipe\"; result: RecipeResult }\n | { kind: \"audit\"; results: AuditResult[]; scores: LighthouseScores }\n | { kind: \"draft\"; report: ReportRow }\n | { kind: \"probe\"; message: string }\n | { kind: \"error\"; message: string };\n\nexport type LaunchResult = {\n site: string;\n steps: Array<{ name: string; result: LaunchStepResult }>;\n /** True if every step ran (bootstrap + audit + draft); false if a step\n * errored or a recipe `failed` short-circuited the chain. */\n complete: boolean;\n};\n\nexport type LaunchDeps = {\n /** Bootstrap step (Renovate + protection; ci.yml comes from the starter). Defaults to the real `selfUpdating`. */\n bootstrap?: (site: Site) => Promise<RecipeResult>;\n /** Audit step. Defaults to the real `runAudits`. */\n audit?: (site: Site) => Promise<AuditResult[]>;\n /** Airtable handle. Defaults to opening the live base from credentials. */\n base?: AirtableBase;\n /** #539 Phase 5: Turso write-through for everything this recipe writes — the\n * Launch row (or a re-run's refreshed scores), the rendered body, and the\n * queue flag. Wired at the CLI composition root, never defaulted here — the\n * unit suite calls `launch` with a fake base and must not open a real\n * libSQL handle. */\n reportMirror?: ReportMirror;\n /** #539 Phase 5: the Websites-row twin — launch writes the site's FIRST audit\n * results and (on send) its launched status. Injected at the CLI root. */\n siteMirror?: SiteMirror;\n /** HTTP probe for `dev-guard`. Defaults to global fetch. INJECTED in tests:\n * the suite stubs `global.fetch` for the Airtable attachment upload and that\n * stub answers 200 to everything — which is precisely the state this step\n * exists to fail on. */\n probe?: (url: string) => Promise<{ status: number; body: string }>;\n};\n\n/** The site's OWN 404. `src/routes/+error.svelte` renders `<h1>{page.status}</h1>`,\n * so a real SvelteKit 404 from this app carries an `<h1>404</h1>`; a parked\n * domain, a CDN 404 and a dead host do not. \"The route is gone\" and \"the site\n * is gone\" must not look the same to this gate. */\nconst SITE_404_MARKER = /<h1[^>]*>\\s*404\\s*<\\/h1>/i;\n\n/** The UNGUARDED twin's OWN refusal. `src/routes/dev/match/[uid]/+page.server.ts`\n * does `error(404, { message: \\`no matching assembly for \"${uid}\" (have: ...)\\` })`\n * for any uid absent from its assembly map — and that message renders through\n * the very same `+error.svelte` the guard's 404 uses, so it carries an\n * `<h1>404</h1>` too. On a site whose uid set lacks \"home\", a LIVE twin and a\n * guarded one are byte-indistinguishable to SITE_404_MARKER, and the check\n * could never fail. Verified on disk: beachfront-dentistry's copy of that route\n * imports `$app/environment` zero times.\n *\n * BOTH wordings are covered. The on-disk twin says \"no matching assembly for\";\n * the `ROUTE_PAGE` template the `match-harness` recipe will install says \"no\n * assembly for\". A marker that knew only the first would go blind the moment\n * that recipe ships.\n *\n * This is a DENY clause and only ever a deny — it can refuse a green, never\n * grant one. Widening it can only ever refuse a launch that would otherwise\n * have proceeded, so widening is always the safe direction here. */\nconst UNGUARDED_TWIN_MARKER = /no (matching )?assembly for/i;\n\nconst MATCH_ROUTE_DIR = \"src/routes/dev/match\";\n\n/** Positive evidence that `sitePath` is a SvelteKit checkout at all. Without it,\n * the absence of MATCH_ROUTE_DIR is evidence of nothing: a path never cloned, a\n * stale clone, a mistyped site name and the wrong working directory all produce\n * exactly the same `false`, and `resolveSites` builds the path with\n * `localPath(resolve(cwd, site))` and no existence check of its own. This is\n * the filesystem twin of the `/health` control on the deployed gate — an absent\n * error must never be allowed to grant a green. */\nconst CHECKOUT_MARKER = \"src/routes\";\n\n/** Every placement a guard may legitimately take, most-preferred first.\n *\n * `src/routes/dev/+layout.server.ts` is the STRONGEST, and it is the fleet-wide\n * class-fix for \"dev routes ship in production\" (#717): one `load` doing\n * `if (!dev) error(404)` runs for every `/dev/*` route, `/dev/match/[uid]`\n * included. Reading only inside `/dev/match` reported such a site as \"the\n * matching twin would ship\" — untrue, and it penalised the better fix. It also\n * contradicted the deployed half of this same feature, which was deliberately\n * redesigned to survive that class-fix: see the `/health` comment at the\n * dev-guard step for why the 200 control was moved off `/dev/a11y-fixtures`.\n *\n * Below it, the `/dev/match` layout covers every child of the twin, present and\n * future; the page file is the narrowest placement and so the last one tried. */\nconst MATCH_GUARD_FILES = [\n \"src/routes/dev/+layout.server.ts\",\n \"src/routes/dev/match/+layout.server.ts\",\n \"src/routes/dev/match/[uid]/+page.server.ts\",\n] as const;\n\n/** Strip line and block comments, so the COMMON commented-out guard cannot\n * satisfy the match — an import left in place above `// if (!dev) error(404);`\n * is the likeliest real-world state, and it used to pass. String and template\n * literals are skipped so a `//` inside a URL is not read as a comment.\n *\n * This is a scanner, not a parser, and a REGEX LITERAL DEFEATS IT: a quote\n * character inside one — `/[a-z0-9']+/` — opens a string that never closes, and\n * everything to the next matching quote, comment text included, is preserved.\n * The residual direction is therefore UNDER-strip, not over-strip; an earlier\n * version of this comment asserted the opposite, and \"can only deny\" was not\n * something it could back.\n *\n * What stops that under-strip granting a pass today is `maskLiterals`, which\n * `carriesGuard` runs over this output and which misreads the same region the\n * same way — so the region is blanked rather than believed, and the observed\n * failure on such a file is a REFUSED real guard, not an accepted absent one.\n * Read that as one scanner's bug cancelling another's, not as a property\n * either function guarantees. */\nfunction stripComments(source: string): string {\n let out = \"\";\n for (let i = 0; i < source.length;) {\n const ch = source[i]!;\n const next = source[i + 1];\n if (ch === \"/\" && next === \"/\") {\n while (i < source.length && source[i] !== \"\\n\") i++;\n continue;\n }\n if (ch === \"/\" && next === \"*\") {\n i += 2;\n while (i < source.length && !(source[i] === \"*\" && source[i + 1] === \"/\")) i++;\n i += 2;\n continue;\n }\n if (ch === '\"' || ch === \"'\" || ch === \"`\") {\n out += ch;\n i++;\n while (i < source.length) {\n if (source[i] === \"\\\\\") {\n out += source.slice(i, i + 2);\n i += 2;\n continue;\n }\n out += source[i]!;\n i++;\n if (source[i - 1] === ch) break;\n }\n continue;\n }\n out += ch;\n i++;\n }\n return out;\n}\n\n/** Blank the CONTENTS of string and template literals, keeping the quote\n * characters, the newlines and the overall length. Only the guard scan uses\n * this — never the `$app/environment` check, whose whole subject is an import\n * specifier and therefore is itself a string literal.\n *\n * It exists because `if (!dev) console.warn(\"this should throw error(404)\")`\n * read as a refusal. Masking can only ever REMOVE candidate refusal tokens, so\n * it can only ever deny. Its own edge case is the same one `stripComments` has\n * — a regex literal containing a quote character opens a literal that never\n * closes — and there too the failure is over-masking, which denies. */\nfunction maskLiterals(code: string): string {\n let out = \"\";\n for (let i = 0; i < code.length;) {\n const ch = code[i]!;\n if (ch !== '\"' && ch !== \"'\" && ch !== \"`\") {\n out += ch;\n i++;\n continue;\n }\n out += ch;\n i++;\n while (i < code.length) {\n const c = code[i]!;\n if (c === \"\\\\\") {\n out += \" \";\n i += 2;\n continue;\n }\n i++;\n if (c === ch) {\n out += c;\n break;\n }\n out += c === \"\\n\" ? \"\\n\" : \" \";\n }\n }\n return out;\n}\n\n/** The statement or block the `if (...)` ending at `from` actually governs: a\n * braced block, or the single statement up to its terminating `;` — or, under\n * ASI, the end of its line. Bracket depth is tracked so\n * `error(404, {\\n message: \"…\"\\n});` is ONE statement rather than three\n * fragments. Expects `code` to be comment-stripped and literal-masked, so every\n * bracket it sees is a real one. */\nfunction consequentAt(code: string, from: number): string {\n let i = from;\n while (i < code.length && /\\s/.test(code[i]!)) i++;\n const start = i;\n if (code[i] === \"{\") {\n let depth = 0;\n for (; i < code.length; i++) {\n if (code[i] === \"{\") depth++;\n else if (code[i] === \"}\" && --depth === 0) return code.slice(start, i + 1);\n }\n return code.slice(start);\n }\n let depth = 0;\n for (; i < code.length; i++) {\n const ch = code[i]!;\n if (ch === \"(\" || ch === \"[\" || ch === \"{\") depth++;\n else if (ch === \")\" || ch === \"]\" || ch === \"}\") {\n if (depth === 0) return code.slice(start, i);\n depth--;\n } else if (depth === 0 && (ch === \";\" || ch === \"\\n\")) return code.slice(start, i);\n }\n return code.slice(start);\n}\n\n/** An actual refusal: SvelteKit's `error(404, …)`, or any `throw`. */\nconst REFUSAL = /\\berror\\s*\\(\\s*404|\\bthrow\\b/;\n\n/** A guard is `$app/environment` + an `if (!dev)` **whose own branch refuses**.\n *\n * The three conditions used to be ANDed across the WHOLE file, with nothing\n * tying the refusal to the `if`. Two shapes passed that should not have: a\n * warn-only `if (!dev)` alongside the route's own unrelated `throw` (the exact\n * half-fix this comment used to claim was closed), and a refusal occurring only\n * inside a string. Reading the guard's consequent, on literal-masked source, is\n * strictly narrower than the old whole-file grep — every input it rejects, the\n * old predicate also had to reject on `$app/environment` or `if (!dev)`, or was\n * a false pass. It can therefore only deny, never grant.\n *\n * It is a contract with plan BC's `ROUTE_SERVER` template, which BC installs\n * and this pre-flight must accept; tests/recipes/launch.test.ts lifts that\n * template out of the plan and runs this predicate over it rather than\n * restating the pattern. */\nfunction carriesGuard(source: string): boolean {\n const code = stripComments(source);\n if (!code.includes(\"$app/environment\")) return false;\n const masked = maskLiterals(code);\n const guards = /if\\s*\\(\\s*!\\s*dev\\s*\\)/g;\n for (let m = guards.exec(masked); m; m = guards.exec(masked)) {\n if (REFUSAL.test(consequentAt(masked, m.index + m[0].length))) return true;\n }\n return false;\n}\n\n/**\n * Pre-flight: a checkout that still carries the matching twin must carry the\n * dev guard the `match-harness` recipe installs with it. Nothing is deleted at\n * launch — the harness stays for the next round — so the guard is the whole\n * mechanism keeping `/dev/match/*` off the production build.\n *\n * Filesystem only, and it runs BEFORE any GitHub write: a site that will fail\n * the deployed check should not first acquire branch protection and an audit.\n *\n * Liveness first. `src/routes` has to be there before a missing\n * `src/routes/dev/match` may be read as \"this site has no twin\" — otherwise the\n * pass is granted by an absence, and four separate operator errors produce that\n * same absence. See CHECKOUT_MARKER.\n */\nexport async function matchingDisposition(\n sitePath: string,\n): Promise<{ ok: boolean; message: string }> {\n if (!existsSync(join(sitePath, CHECKOUT_MARKER))) {\n return {\n ok: false,\n message: `${sitePath} has no ${CHECKOUT_MARKER} — this is not a SvelteKit checkout (never cloned, a stale clone, a mistyped site name, or the wrong working directory), so the twin's disposition cannot be established`,\n };\n }\n if (!existsSync(join(sitePath, MATCH_ROUTE_DIR))) {\n return {\n ok: true,\n message: `no ${MATCH_ROUTE_DIR} in this checkout (${CHECKOUT_MARKER} is present, so the absence is a real one)`,\n };\n }\n const read: string[] = [];\n for (const rel of MATCH_GUARD_FILES) {\n let source: string;\n try {\n source = await readFile(join(sitePath, rel), \"utf-8\");\n } catch {\n continue;\n }\n read.push(rel);\n if (carriesGuard(source)) {\n // Deliberately NOT \"the twin is guarded in production\". This function reads\n // source text on disk; it cannot observe the deployed build, and a field\n // that can only see configuration must not be named after the thing it\n // cannot see. The deployed behaviour is the `dev-guard` step's job.\n return {\n ok: true,\n message: `${rel} contains dev guard source — \\`if (!dev)\\` on \\`$app/environment\\` whose own branch refuses with a 404/throw (source text only; the deployed build is checked at the dev-guard step)`,\n };\n }\n }\n if (read.length === 0) {\n return {\n ok: false,\n message: `${MATCH_ROUTE_DIR} exists but none of ${MATCH_GUARD_FILES.join(\", \")} could be read — the twin's disposition cannot be established`,\n };\n }\n return {\n ok: false,\n message: `none of ${read.join(\", \")} carries an \\`if (!dev)\\` guard on \\`$app/environment\\` whose own branch refuses (\\`error(404\\` or \\`throw\\`), once comments are stripped and string contents masked — the matching twin would ship`,\n };\n}\n\n/** Undici's defaults are 300s headers + 300s body, and the body timeout is an\n * INACTIVITY timer — so a trickling origin can hold this open for ~10 minutes,\n * AFTER the GitHub writes and a full Lighthouse audit have already run.\n *\n * 15s is NOT the house number, and this comment used to imply it was by citing\n * `audits/function-health.ts`, which is 10s. The 15s call sites are\n * `audits/netlify-deploy.ts`, `github/gh-rest.ts`, `prismic/models/remote.ts`\n * and the inline ones in `prospect/pipeline.ts` and `prospect/http-probes.ts`;\n * `audits/function-health.ts`, `audits/form-e2e.ts`, `audits/browser.ts` and\n * `prospect/dns.ts` are 10s, `prospect/ownership.ts` 12s, `prospect/crawl.ts`\n * 20s. Each is set for its own workload — see the note on PRISMIC_TIMEOUT_MS.\n * 15s here is a bound on a two-request pre-send check, not a convention.\n *\n * An abort rejects, and dev-guard treats a rejection as a refusal, which is the\n * correct reading: an origin that will not answer has proved nothing. */\nconst PROBE_TIMEOUT_MS = 15_000;\n\nconst defaultProbe = async (url: string): Promise<{ status: number; body: string }> => {\n const res = await fetch(url, {\n redirect: \"follow\",\n signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),\n });\n return { status: res.status, body: await res.text() };\n};\n\n/**\n * Launch a site: bootstrap → first-audit → DRAFT a launch email. The M3\n * approve loop is what actually sends; `launch` never sends — it stops at a\n * dashboard-queued draft (`reportType: \"Launch\"`) carrying the just-audited\n * Lighthouse scores, so `sendOne`'s `report.lighthouse` guard passes.\n *\n * EXECUTION order, stopping on the first error or `failed` recipe:\n * 0. matchingDisposition — filesystem pre-flight, BEFORE any GitHub write.\n * 1. selfUpdating — Renovate + protection (platform auto-merge OFF; ci.yml is the starter's).\n * 2. audit — the Lighthouse scores that feed the draft are collected here.\n * 3. the Websites-row lookup, which supplies the url the next step probes.\n * 3b. dev-guard — the same twin, checked against the DEPLOYED url. It sits\n * BETWEEN collecting the scores and writing them, so a site that fails it\n * has been audited but leaves its Websites row untouched.\n * 4. writeAuditsToAirtable — the `audit --write-airtable` writer.\n * 5. createDraft — reportType \"Launch\", today's period, the audited scores.\n *\n * The REPORTED chain is deliberately not that order. The `audit` step is only\n * pushed once its write succeeds (:261), so the emitted steps read\n * `matching-disposition -> self-updating -> dev-guard -> audit -> draft`, which\n * is what the CLI prints and what tests/recipes/launch.test.ts asserts. Do not\n * renumber either list to match the other: one says when work happens, the\n * other says what has been proved. Only step 0 precedes a GitHub write —\n * dev-guard cannot, because it needs the row from step 3 to know the url.\n */\nexport async function launch(site: Site, deps: LaunchDeps = {}): Promise<LaunchResult> {\n const label = siteLabel(site);\n const bootstrap = deps.bootstrap ?? selfUpdating;\n const audit = deps.audit ?? runAudits;\n const base = deps.base ?? openBase(readAirtableConfig());\n const probe = deps.probe ?? defaultProbe;\n\n const steps: Array<{ name: string; result: LaunchStepResult }> = [];\n const stop = (): LaunchResult => ({ site: label, steps, complete: false });\n\n // 0. Matching disposition — filesystem, before any GitHub write.\n const disposition = await matchingDisposition(site.path);\n steps.push({\n name: \"matching-disposition\",\n result: disposition.ok\n ? { kind: \"probe\", message: disposition.message }\n : { kind: \"error\", message: disposition.message },\n });\n if (!disposition.ok) return stop();\n\n // 1. Bootstrap.\n let recipe: RecipeResult;\n try {\n recipe = await bootstrap(site);\n } catch (err) {\n steps.push({ name: \"self-updating\", result: errorOf(err) });\n return stop();\n }\n steps.push({ name: \"self-updating\", result: { kind: \"recipe\", result: recipe } });\n if (recipe.status === \"failed\") return stop();\n\n // 2. Audit + write scores back to Airtable.\n let results: AuditResult[];\n try {\n results = await audit(site);\n } catch (err) {\n steps.push({ name: \"audit\", result: errorOf(err) });\n return stop();\n }\n const lhResult = results.find((r) => r.audit === \"lighthouse\");\n if (!lhResult || !hasRealScores(lhResult)) {\n steps.push({\n name: \"audit\",\n result: { kind: \"error\", message: \"lighthouse audit produced no real scores\" },\n });\n return stop();\n }\n // The launch announcement renders a numeric score per category; a metric that\n // errored this run (now null from lighthouseScoresFromResult) keeps the prior\n // 0 behavior here rather than propagating null into the launch-email path. The\n // Airtable write path (write-audits-to-airtable) keeps the null → shows \"—\".\n const rawScores = lighthouseScoresFromResult(lhResult);\n const scores: LighthouseScores = {\n performance: rawScores.performance ?? 0,\n accessibility: rawScores.accessibility ?? 0,\n bestPractices: rawScores.bestPractices ?? 0,\n seo: rawScores.seo ?? 0,\n };\n\n const websites = await listWebsites(base);\n const target = websites.find((w) => siteSlug(w.name) === siteSlug(label));\n if (!target) {\n steps.push({\n name: \"audit\",\n result: { kind: \"error\", message: `no Websites row matched site \"${label}\"` },\n });\n return stop();\n }\n\n // 2b. The dev guard, on the DEPLOYED build. Two halves, both required:\n // /dev/match/home must 404 WITH this site's own error page, and /health\n // must answer 200. Without the second, a dead host, a wrong url and a\n // parked domain all \"pass\" the first — an absent error granting a green,\n // which is the one shape this fleet does not allow. Reading the deployed\n // url makes this a production-build check by construction; no local build\n // can substitute.\n //\n // The control is /health, NOT a /dev/* route. It used to be\n // /dev/a11y-fixtures, which made this gate require an unguarded dev page\n // to be publicly reachable in production — so the obvious class-fix for\n // \"dev routes ship in production\" (one src/routes/dev/+layout.server.ts\n // doing `if (!dev) error(404)`) would have taken the control down with it\n // and failed every correctly-guarded site. /health is a real production\n // endpoint shipped by the starter and present in all 23 starter-derived\n // repos, each declaring `prerender = false` — so a 200 from it is still a\n // live render/function path, not a static file served by the CDN.\n const origin = target.url.replace(/\\/+$/, \"\");\n let twin: { status: number; body: string };\n let control: { status: number; body: string };\n try {\n twin = await probe(`${origin}/dev/match/home`);\n control = await probe(`${origin}/health`);\n } catch (err) {\n steps.push({ name: \"dev-guard\", result: errorOf(err) });\n return stop();\n }\n if (control.status !== 200) {\n steps.push({\n name: \"dev-guard\",\n result: {\n kind: \"error\",\n message: `${origin}/health answered ${control.status}, not 200 — the twin's 404 proves nothing (host down, wrong url, or the site's /health function is not deploying, in which case the function-health audit is failing too)`,\n },\n });\n return stop();\n }\n const unguardedTell = twin.body.match(UNGUARDED_TWIN_MARKER);\n if (unguardedTell) {\n steps.push({\n name: \"dev-guard\",\n result: {\n kind: \"error\",\n message: `${origin}/dev/match/home answered ${twin.status} carrying the twin route's OWN \"${unguardedTell[0]}\" message — the twin is LIVE and merely has no assembly for the uid \"home\". That is not evidence of a dev guard.`,\n },\n });\n return stop();\n }\n if (twin.status !== 404 || !SITE_404_MARKER.test(twin.body)) {\n steps.push({\n name: \"dev-guard\",\n result: {\n kind: \"error\",\n message:\n twin.status === 404\n ? `${origin}/dev/match/home 404s, but not with this site's own error page — cannot tell the guard from a dead route`\n : `${origin}/dev/match/home answered ${twin.status} — the matching twin is live in production`,\n },\n });\n return stop();\n }\n steps.push({\n name: \"dev-guard\",\n result: {\n kind: \"probe\",\n message: `${origin}/dev/match/home 404 (site error page), /health 200`,\n },\n });\n\n try {\n const auditWrite = await writeAuditsToAirtable({\n base,\n websites,\n slug: siteSlug(target.name),\n results,\n });\n // #539 Phase 5: mirror the first-audit write-back. Launch is the ONE path\n // that writes a brand-new site's health, so without this its row reads empty\n // in the console until the next hourly sync.\n if (auditWrite.siteId && auditWrite.fields) {\n await deps.siteMirror?.health(auditWrite.siteId, auditWrite.fields);\n }\n } catch (err) {\n steps.push({ name: \"audit\", result: errorOf(err) });\n return stop();\n }\n steps.push({ name: \"audit\", result: { kind: \"audit\", results, scores } });\n\n // 3. Draft the launch email (reuses draft.ts's reportId/period scheme). DRAFTS\n // ONLY — the M3 approve loop sends it and flips Status on send.\n const today = new Date();\n const period = today.toISOString().slice(0, 7);\n const slug = siteSlug(target.name);\n\n let report: ReportRow;\n try {\n // Re-run dedupe: reuse an existing Launch row for this (site, period) instead\n // of stacking a second draft. findReportByPeriod is the same idempotency\n // lookup draft.ts documents (dashboard/digest point lookup).\n const existing = await findReportByPeriod(base, target.id, \"Launch\", period);\n if (existing) {\n // Reuse path: the row was created on a prior run with THAT run's scores. This\n // re-run just produced fresh audit scores AND will re-render the preview from\n // them — so refresh the row's Lighthouse cells (+ Completed on) to match,\n // otherwise the sent email (which reads the row) ships stale scores. The\n // create path already writes fresh scores via createDraft.\n await updateReportScores(base, existing.id, scores, today);\n // Mirror the same refresh — see the announce reuse path for why.\n await deps.reportMirror?.patch(existing.id, {\n lighthouse_performance: scores.performance,\n lighthouse_accessibility: scores.accessibility,\n lighthouse_best_practices: scores.bestPractices,\n lighthouse_seo: scores.seo,\n completed_on: today.toISOString().slice(0, 10),\n });\n report = existing;\n } else {\n report = await createDraft(\n base,\n draftInputFor(target, scores, today, period),\n deps.reportMirror?.created,\n );\n }\n } catch (err) {\n steps.push({ name: \"draft\", result: errorOf(err) });\n return stop();\n }\n\n // Mirror draft.ts:135-154 — render → upload \"Rendered HTML\" preview → flip\n // Draft ready. Without setDraftReady the draft never enters the approve queue\n // (every pending-approval gate requires draftReady true), so it can never be\n // approved or sent. The upload is a review convenience; the ready flag is the\n // critical step.\n try {\n const { html } = await renderReportHtml({\n siteName: target.name,\n siteUrl: target.url,\n reportType: \"Launch\",\n completedOn: today,\n lighthouse: scores,\n lastTestedDate: null,\n commentary: null,\n copy: resolveCopy(target),\n headerImageCid: `${slug}-header`,\n });\n // A preview-upload hiccup must NOT fail the launch — log and continue.\n try {\n await uploadAttachment(\n report.id,\n \"Rendered HTML\",\n html,\n `${slug}-${today.toISOString().slice(0, 10)}.html`,\n \"text/html\",\n );\n // The console preview reads the body from Turso, not the attachment.\n await deps.reportMirror?.body(report.id, html);\n } catch (uploadErr) {\n console.warn(\n `⚠ Launch preview upload skipped for ${target.name}: ${\n uploadErr instanceof Error ? uploadErr.message : String(uploadErr)\n }`,\n );\n }\n // Critical: NOT wrapped — a failure here must surface as a failed launch. queueDraft\n // supersedes any lower-tier (Maintenance/Testing) drafts queued for this site; a Launch is\n // top tier so it only stands down if another Launch/Announcement is already queued.\n await queueDraft(\n base,\n { id: report.id, siteId: target.id, reportType: \"Launch\" },\n deps.reportMirror,\n );\n } catch (err) {\n steps.push({ name: \"draft\", result: errorOf(err) });\n return stop();\n }\n\n steps.push({ name: \"draft\", result: { kind: \"draft\", report } });\n\n return { site: label, steps, complete: true };\n}\n\n/** Build the Launch `DraftInput`. reportId/period mirror `draftReportForSite`\n * (draft.ts) — do not invent a new id scheme. `today`/`period` are threaded in\n * from `launch()` so a single timestamp drives the render, the draft, the\n * dedupe lookup, and the preview filename. Launch reports have no period window\n * and no prior maintenance test, so periodStart/periodEnd/completedOn all\n * collapse to \"today\" and `lastTestedDate` is null. */\nfunction draftInputFor(\n target: WebsiteRow,\n scores: LighthouseScores,\n today: Date,\n period: string,\n): Parameters<typeof createDraft>[1] {\n const reportType = \"Launch\" as const;\n const reportId = `${target.name} — ${reportType} — ${today.toISOString().slice(0, 10)}`;\n return {\n reportId,\n siteId: target.id,\n reportType,\n period,\n periodStart: today,\n periodEnd: today,\n completedOn: today,\n lighthouse: scores,\n lastTestedDate: null,\n };\n}\n\nfunction errorOf(err: unknown): LaunchStepResult {\n return { kind: \"error\", message: err instanceof Error ? err.message : String(err) };\n}\n"],"mappings":"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","names":["depth"]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import {
|
|
2
|
+
runRecipeOverSites
|
|
3
|
+
} from "./chunk-VPJ7N6P7.js";
|
|
4
|
+
import {
|
|
5
|
+
appendSkipNotice,
|
|
6
|
+
fleetWorkdir,
|
|
7
|
+
prepareFleetSites
|
|
8
|
+
} from "./chunk-LM2NHRCJ.js";
|
|
9
|
+
import {
|
|
10
|
+
resolveSites
|
|
11
|
+
} from "./chunk-Z2K4JPQ3.js";
|
|
12
|
+
import {
|
|
13
|
+
matchHarness
|
|
14
|
+
} from "./chunk-ZCL7C5LH.js";
|
|
15
|
+
import "./chunk-R53VL3RI.js";
|
|
16
|
+
import "./chunk-ZQV7UQNE.js";
|
|
17
|
+
import "./chunk-Z3JXLULD.js";
|
|
18
|
+
import "./chunk-LBYOLBW7.js";
|
|
19
|
+
import "./chunk-RARREDQE.js";
|
|
20
|
+
import "./chunk-XXTZBPUY.js";
|
|
21
|
+
import "./chunk-AVEQUR44.js";
|
|
22
|
+
|
|
23
|
+
// src/cli/commands/match-harness.ts
|
|
24
|
+
import { resolve } from "path";
|
|
25
|
+
function formatResult(r) {
|
|
26
|
+
if (r.status === "noop") return `[${r.site}] noop: ${r.notes ?? ""}`;
|
|
27
|
+
if (r.status === "failed") return `[${r.site}] failed: ${r.notes ?? ""}`;
|
|
28
|
+
return `[${r.site}] applied: ${r.commits.length} commit(s)
|
|
29
|
+
${r.notes ?? ""}`;
|
|
30
|
+
}
|
|
31
|
+
async function runMatchHarnessCommand(site, opts) {
|
|
32
|
+
const cwd = opts.cwd ? resolve(opts.cwd) : process.cwd();
|
|
33
|
+
let sites = await resolveSites({
|
|
34
|
+
...site !== void 0 ? { site } : {},
|
|
35
|
+
...opts.fleet !== void 0 ? { fleet: opts.fleet } : {},
|
|
36
|
+
...opts.workdir !== void 0 ? { workdir: opts.workdir } : {},
|
|
37
|
+
cwd
|
|
38
|
+
});
|
|
39
|
+
let skipped = [];
|
|
40
|
+
if (opts.fleet) {
|
|
41
|
+
const workdir = opts.workdir ?? fleetWorkdir();
|
|
42
|
+
const prep = await prepareFleetSites(sites, { workdir });
|
|
43
|
+
sites = prep.prepared;
|
|
44
|
+
skipped = prep.skipped;
|
|
45
|
+
}
|
|
46
|
+
const rawMatrix = opts.matrix === void 0 ? void 0 : String(opts.matrix);
|
|
47
|
+
const matrix = rawMatrix === void 0 ? void 0 : rawMatrix.split(",").map((v) => Number(v.trim()));
|
|
48
|
+
if (matrix !== void 0 && matrix.some((v) => !Number.isFinite(v) || v <= 0)) {
|
|
49
|
+
return {
|
|
50
|
+
output: `match-harness: --matrix "${rawMatrix}" is not a list of viewports`,
|
|
51
|
+
code: 1
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const results = await runRecipeOverSites(
|
|
55
|
+
"match-harness",
|
|
56
|
+
sites,
|
|
57
|
+
(s) => matchHarness(s, {
|
|
58
|
+
ref: opts.ref ?? "",
|
|
59
|
+
...opts.cand !== void 0 ? { cand: opts.cand } : {},
|
|
60
|
+
...matrix !== void 0 ? { matrix } : {}
|
|
61
|
+
})
|
|
62
|
+
);
|
|
63
|
+
const output = results.map(formatResult).join("\n");
|
|
64
|
+
const code = results.some((r) => r.status === "failed") ? 1 : 0;
|
|
65
|
+
return { output: appendSkipNotice(output, skipped), code };
|
|
66
|
+
}
|
|
67
|
+
export {
|
|
68
|
+
runMatchHarnessCommand
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=match-harness-QRG6XZAR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/match-harness.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { matchHarness } from \"../../recipes/match-harness/index.js\";\nimport type { RecipeResult } from \"../../types.js\";\nimport { resolveSites } from \"../fleet/resolve-sites.js\";\nimport { prepareFleetSites, appendSkipNotice, type SkippedSite } from \"../fleet/prepare-sites.js\";\nimport { runRecipeOverSites } from \"../fleet/run-recipe-over-sites.js\";\nimport { fleetWorkdir } from \"../../util/fleet-workdir.js\";\n\nexport type MatchHarnessCommandOptions = {\n ref?: string;\n cand?: string;\n /** cac type-coerces a numeric option value, so this arrives as a NUMBER for\n * `--matrix 1440` and a string only when it contains a comma or a letter. */\n matrix?: string | number;\n fleet?: string;\n workdir?: string;\n cwd?: string;\n};\n\nfunction formatResult(r: RecipeResult): string {\n if (r.status === \"noop\") return `[${r.site}] noop: ${r.notes ?? \"\"}`;\n if (r.status === \"failed\") return `[${r.site}] failed: ${r.notes ?? \"\"}`;\n return `[${r.site}] applied: ${r.commits.length} commit(s)\\n${r.notes ?? \"\"}`;\n}\n\nexport async function runMatchHarnessCommand(\n site: string | undefined,\n opts: MatchHarnessCommandOptions,\n): Promise<{ output: string; code: number }> {\n const cwd = opts.cwd ? resolve(opts.cwd) : process.cwd();\n\n let sites = await resolveSites({\n ...(site !== undefined ? { site } : {}),\n ...(opts.fleet !== undefined ? { fleet: opts.fleet } : {}),\n ...(opts.workdir !== undefined ? { workdir: opts.workdir } : {}),\n cwd,\n });\n\n let skipped: SkippedSite[] = [];\n if (opts.fleet) {\n const workdir = opts.workdir ?? fleetWorkdir();\n const prep = await prepareFleetSites(sites, { workdir });\n sites = prep.prepared;\n skipped = prep.skipped;\n }\n\n // A bad --matrix must not silently become [NaN]: the matrix is the gate's\n // denominator, and a NaN viewport would produce a score nobody could read.\n //\n // Two things force the shape below. cac COERCES a numeric option value, so\n // `--matrix 1440` arrives as the number 1440 (`.split` would throw) and\n // `--matrix 0` as the number 0 — which is FALSY, so a truthiness test drops it\n // and the recipe silently applies the default [1440,834,390] and exits 0. So:\n // normalise to a string, and branch on PRESENCE, never on truthiness.\n const rawMatrix = opts.matrix === undefined ? undefined : String(opts.matrix);\n const matrix =\n rawMatrix === undefined ? undefined : rawMatrix.split(\",\").map((v) => Number(v.trim()));\n if (matrix !== undefined && matrix.some((v) => !Number.isFinite(v) || v <= 0)) {\n return {\n output: `match-harness: --matrix \"${rawMatrix}\" is not a list of viewports`,\n code: 1,\n };\n }\n\n const results = await runRecipeOverSites(\"match-harness\", sites, (s) =>\n matchHarness(s, {\n ref: opts.ref ?? \"\",\n ...(opts.cand !== undefined ? { cand: opts.cand } : {}),\n ...(matrix !== undefined ? { matrix } : {}),\n }),\n );\n\n const output = results.map(formatResult).join(\"\\n\");\n const code = results.some((r) => r.status === \"failed\") ? 1 : 0;\n return { output: appendSkipNotice(output, skipped), code };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AAmBxB,SAAS,aAAa,GAAyB;AAC7C,MAAI,EAAE,WAAW,OAAQ,QAAO,IAAI,EAAE,IAAI,WAAW,EAAE,SAAS,EAAE;AAClE,MAAI,EAAE,WAAW,SAAU,QAAO,IAAI,EAAE,IAAI,aAAa,EAAE,SAAS,EAAE;AACtE,SAAO,IAAI,EAAE,IAAI,cAAc,EAAE,QAAQ,MAAM;AAAA,EAAe,EAAE,SAAS,EAAE;AAC7E;AAEA,eAAsB,uBACpB,MACA,MAC2C;AAC3C,QAAM,MAAM,KAAK,MAAM,QAAQ,KAAK,GAAG,IAAI,QAAQ,IAAI;AAEvD,MAAI,QAAQ,MAAM,aAAa;AAAA,IAC7B,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,IACrC,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IACxD,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,MAAI,UAAyB,CAAC;AAC9B,MAAI,KAAK,OAAO;AACd,UAAM,UAAU,KAAK,WAAW,aAAa;AAC7C,UAAM,OAAO,MAAM,kBAAkB,OAAO,EAAE,QAAQ,CAAC;AACvD,YAAQ,KAAK;AACb,cAAU,KAAK;AAAA,EACjB;AAUA,QAAM,YAAY,KAAK,WAAW,SAAY,SAAY,OAAO,KAAK,MAAM;AAC5E,QAAM,SACJ,cAAc,SAAY,SAAY,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC,CAAC;AACxF,MAAI,WAAW,UAAa,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,CAAC,GAAG;AAC7E,WAAO;AAAA,MACL,QAAQ,4BAA4B,SAAS;AAAA,MAC7C,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,UAAU,MAAM;AAAA,IAAmB;AAAA,IAAiB;AAAA,IAAO,CAAC,MAChE,aAAa,GAAG;AAAA,MACd,KAAK,KAAK,OAAO;AAAA,MACjB,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,MACrD,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3C,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,QAAQ,IAAI,YAAY,EAAE,KAAK,IAAI;AAClD,QAAM,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,IAAI,IAAI;AAC9D,SAAO,EAAE,QAAQ,iBAAiB,QAAQ,OAAO,GAAG,KAAK;AAC3D;","names":[]}
|
|
@@ -5,21 +5,21 @@ import {
|
|
|
5
5
|
appendSkipNotice,
|
|
6
6
|
fleetWorkdir,
|
|
7
7
|
prepareFleetSites
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-LM2NHRCJ.js";
|
|
9
9
|
import {
|
|
10
10
|
resolveSites
|
|
11
11
|
} from "./chunk-Z2K4JPQ3.js";
|
|
12
12
|
import {
|
|
13
13
|
onboard
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-
|
|
14
|
+
} from "./chunk-S7RYFUIK.js";
|
|
15
|
+
import "./chunk-ZQV7UQNE.js";
|
|
16
16
|
import "./chunk-OTGB6YQO.js";
|
|
17
17
|
import "./chunk-LKGVSM2O.js";
|
|
18
18
|
import "./chunk-Z3JXLULD.js";
|
|
19
19
|
import "./chunk-LBYOLBW7.js";
|
|
20
|
-
import "./chunk-XXTZBPUY.js";
|
|
21
20
|
import "./chunk-RARREDQE.js";
|
|
22
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-XXTZBPUY.js";
|
|
22
|
+
import "./chunk-AVEQUR44.js";
|
|
23
23
|
|
|
24
24
|
// src/cli/commands/onboard.ts
|
|
25
25
|
import { resolve } from "path";
|
|
@@ -70,4 +70,4 @@ async function runOnboardCommand(site, opts) {
|
|
|
70
70
|
export {
|
|
71
71
|
runOnboardCommand
|
|
72
72
|
};
|
|
73
|
-
//# sourceMappingURL=onboard-
|
|
73
|
+
//# sourceMappingURL=onboard-TM2KESGF.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
parseAddresses,
|
|
5
5
|
sendApprovedReports,
|
|
6
6
|
withGlobalCc
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-2ZAZ7ETT.js";
|
|
8
8
|
import "./chunk-F3JWOPTG.js";
|
|
9
9
|
import "./chunk-VAD43MOR.js";
|
|
10
10
|
import "./chunk-IY6256GK.js";
|
|
@@ -12,13 +12,13 @@ import "./chunk-HN6I2XWI.js";
|
|
|
12
12
|
import "./chunk-HTABUCF4.js";
|
|
13
13
|
import "./chunk-GECESMVS.js";
|
|
14
14
|
import "./chunk-KJGKZLCT.js";
|
|
15
|
-
import "./chunk-5UINJNAJ.js";
|
|
16
15
|
import "./chunk-BGTYPVLT.js";
|
|
16
|
+
import "./chunk-5UINJNAJ.js";
|
|
17
17
|
import "./chunk-3Z6X3BHU.js";
|
|
18
18
|
import "./chunk-WEKL2HYJ.js";
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-BI2VI6EM.js";
|
|
20
|
+
import "./chunk-VSGMCCGQ.js";
|
|
21
|
+
import "./chunk-C3IQQKXL.js";
|
|
22
22
|
import "./chunk-RARREDQE.js";
|
|
23
23
|
import "./chunk-6VAL7XJT.js";
|
|
24
24
|
export {
|
|
@@ -28,4 +28,4 @@ export {
|
|
|
28
28
|
sendApprovedReports,
|
|
29
29
|
withGlobalCc
|
|
30
30
|
};
|
|
31
|
-
//# sourceMappingURL=orchestrate-
|
|
31
|
+
//# sourceMappingURL=orchestrate-HYVQPRCE.js.map
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
envEngines,
|
|
12
12
|
mergeFixes,
|
|
13
13
|
runProspectAudit
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-TR3HFH6J.js";
|
|
15
15
|
import "./chunk-WJMPCVOR.js";
|
|
16
16
|
import "./chunk-T7ZUUOZ2.js";
|
|
17
17
|
import "./chunk-RARREDQE.js";
|
|
@@ -29,4 +29,4 @@ export {
|
|
|
29
29
|
mergeFixes,
|
|
30
30
|
runProspectAudit
|
|
31
31
|
};
|
|
32
|
-
//# sourceMappingURL=pipeline-
|
|
32
|
+
//# sourceMappingURL=pipeline-YROAY6DT.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
preflight
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-R5IMFAFR.js";
|
|
4
4
|
import "./chunk-PZR4EBPY.js";
|
|
5
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-2ZAZ7ETT.js";
|
|
6
6
|
import "./chunk-F3JWOPTG.js";
|
|
7
7
|
import "./chunk-VAD43MOR.js";
|
|
8
8
|
import "./chunk-IY6256GK.js";
|
|
@@ -10,13 +10,13 @@ import "./chunk-HN6I2XWI.js";
|
|
|
10
10
|
import "./chunk-HTABUCF4.js";
|
|
11
11
|
import "./chunk-GECESMVS.js";
|
|
12
12
|
import "./chunk-KJGKZLCT.js";
|
|
13
|
-
import "./chunk-5UINJNAJ.js";
|
|
14
13
|
import "./chunk-BGTYPVLT.js";
|
|
14
|
+
import "./chunk-5UINJNAJ.js";
|
|
15
15
|
import "./chunk-3Z6X3BHU.js";
|
|
16
16
|
import "./chunk-WEKL2HYJ.js";
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-BI2VI6EM.js";
|
|
18
|
+
import "./chunk-VSGMCCGQ.js";
|
|
19
|
+
import "./chunk-C3IQQKXL.js";
|
|
20
20
|
import "./chunk-RARREDQE.js";
|
|
21
21
|
import "./chunk-6VAL7XJT.js";
|
|
22
22
|
|
|
@@ -67,4 +67,4 @@ async function runPreflightCommand(site, opts) {
|
|
|
67
67
|
export {
|
|
68
68
|
runPreflightCommand
|
|
69
69
|
};
|
|
70
|
-
//# sourceMappingURL=preflight-
|
|
70
|
+
//# sourceMappingURL=preflight-RYIP54NY.js.map
|