@reddoorla/maintenance 0.68.0 → 0.71.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/dist/airtable-2PJ4NSAV.js +9 -0
- package/dist/{announce-72R3LRNT.js → announce-3JE5FKW7.js} +6 -6
- package/dist/blux-FKZYMKLF.js +2205 -0
- package/dist/blux-FKZYMKLF.js.map +1 -0
- package/dist/{bump-deps-QNM3H4GI.js → bump-deps-K3JMLMBB.js} +3 -2
- package/dist/bump-deps-K3JMLMBB.js.map +1 -0
- package/dist/{chunk-RINXPU3H.js → chunk-2PWQ6MPG.js} +2 -2
- package/dist/{chunk-H6YZBXBQ.js → chunk-52TDNN7K.js} +37 -15
- package/dist/chunk-52TDNN7K.js.map +1 -0
- package/dist/{chunk-XWPZ46IN.js → chunk-5QC5KJHR.js} +2 -2
- package/dist/{chunk-O6G4HHMF.js → chunk-6J25IIAI.js} +162 -42
- package/dist/chunk-6J25IIAI.js.map +1 -0
- package/dist/chunk-7MJBTV2R.js +145 -0
- package/dist/chunk-7MJBTV2R.js.map +1 -0
- package/dist/{chunk-6JFOAPW4.js → chunk-AYM2EFSK.js} +38 -6
- package/dist/chunk-AYM2EFSK.js.map +1 -0
- package/dist/{chunk-GKSXZIMX.js → chunk-CMQMNFFJ.js} +77 -3
- package/dist/chunk-CMQMNFFJ.js.map +1 -0
- package/dist/{chunk-6MT5W6UF.js → chunk-F6OE6MGQ.js} +6 -3
- package/dist/chunk-F6OE6MGQ.js.map +1 -0
- package/dist/{chunk-OTBA7DON.js → chunk-J2SHWT2O.js} +1 -1
- package/dist/chunk-J2SHWT2O.js.map +1 -0
- package/dist/{chunk-XVR7UM6Z.js → chunk-JNXCDUYB.js} +4 -4
- package/dist/{chunk-2E2X5BCG.js → chunk-KOAGMTRI.js} +3 -3
- package/dist/chunk-KRDLHAKK.js +17 -0
- package/dist/chunk-KRDLHAKK.js.map +1 -0
- package/dist/{chunk-LYCKN7ZR.js → chunk-LPMQXS2N.js} +8 -4
- package/dist/chunk-LPMQXS2N.js.map +1 -0
- package/dist/{chunk-WCN54744.js → chunk-M7HOQ4W7.js} +388 -8
- package/dist/chunk-M7HOQ4W7.js.map +1 -0
- package/dist/{chunk-LCKKIJ22.js → chunk-MPRLMGJU.js} +11 -3
- package/dist/chunk-MPRLMGJU.js.map +1 -0
- package/dist/chunk-PKVZMFEB.js +315 -0
- package/dist/chunk-PKVZMFEB.js.map +1 -0
- package/dist/{chunk-A5KYRGQA.js → chunk-PSJQE6T6.js} +4 -4
- package/dist/chunk-SL24DCGC.js +41 -0
- package/dist/chunk-SL24DCGC.js.map +1 -0
- package/dist/{chunk-MAYHLXCS.js → chunk-VR246V3G.js} +25 -5
- package/dist/chunk-VR246V3G.js.map +1 -0
- package/dist/{chunk-45AUGDFR.js → chunk-WN4NEHE7.js} +2 -7
- package/dist/chunk-WN4NEHE7.js.map +1 -0
- package/dist/{chunk-YQMYQAJX.js → chunk-Y7LZHPDF.js} +2 -2
- package/dist/{chunk-C3PDS623.js → chunk-YWRQEDB3.js} +53 -3
- package/dist/chunk-YWRQEDB3.js.map +1 -0
- package/dist/cli/bin.js +63 -19
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/audit.d.ts +1 -1
- package/dist/cli/commands/audit.js +13 -11
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/client/index.d.ts +84 -0
- package/dist/client/index.js +47 -0
- package/dist/client/index.js.map +1 -0
- package/dist/configs/playwright-a11y.js +1 -1
- package/dist/{convert-to-pnpm-XH7NYRVK.js → convert-to-pnpm-6F4RAFEJ.js} +3 -2
- package/dist/convert-to-pnpm-6F4RAFEJ.js.map +1 -0
- package/dist/{digest-J7TDG62Q.js → digest-GZCZYJKC.js} +11 -11
- package/dist/{ensure-site-2PF522VL.js → ensure-site-H5VMBPLF.js} +2 -2
- package/dist/forms/index.d.ts +2 -0
- package/dist/forms/index.js +7 -1
- package/dist/forms/index.js.map +1 -1
- package/dist/{github-signals-PP7GWYIY.js → github-signals-SQECQNST.js} +8 -8
- package/dist/health-endpoint-QXWM6GW2.js +54 -0
- package/dist/health-endpoint-QXWM6GW2.js.map +1 -0
- package/dist/index.d.ts +132 -17
- package/dist/index.js +213 -70
- package/dist/index.js.map +1 -1
- package/dist/{init-WLR35YGN.js → init-KQOIPLVT.js} +12 -8
- package/dist/init-KQOIPLVT.js.map +1 -0
- package/dist/{launch-2HPQXWII.js → launch-RX4VI7F2.js} +13 -13
- package/dist/{lighthouse-airtable-UBSXKHAQ.js → lighthouse-airtable-TTXULEGU.js} +3 -3
- package/dist/{onboard-X6KJ5Z2V.js → onboard-TFBL62J3.js} +2 -2
- package/dist/{orchestrate-PVCGBH4K.js → orchestrate-DYA4XAQJ.js} +6 -6
- package/dist/{preflight-KWVYJ2DU.js → preflight-S3GYME3Q.js} +8 -8
- package/dist/probe-DJAMLVTT.js +46 -0
- package/dist/probe-DJAMLVTT.js.map +1 -0
- package/dist/recipes/sync-configs.d.ts +1 -1
- package/dist/recipes/sync-configs.js +2 -2
- package/dist/{renovate-dispatch-LG4RJGDY.js → renovate-dispatch-MZPAWVBL.js} +2 -2
- package/dist/{report-ZBFMTT76.js → report-BLZ67QAQ.js} +12 -12
- package/dist/run-migration-LJNNZWIV.js +205 -0
- package/dist/run-migration-LJNNZWIV.js.map +1 -0
- package/dist/{self-updating-JTTFOJ7Q.js → self-updating-GSH427XP.js} +2 -2
- package/dist/{selftest-LFZPZRJP.js → selftest-KPTL6KC4.js} +11 -11
- package/dist/smoke-suite-GP3W57JP.js +54 -0
- package/dist/smoke-suite-GP3W57JP.js.map +1 -0
- package/dist/{svelte-codemods-KJLNH6FQ.js → svelte-codemods-GYZZX742.js} +3 -2
- package/dist/svelte-codemods-GYZZX742.js.map +1 -0
- package/dist/{sync-configs-6GBZLGRQ.js → sync-configs-CQNOTJ2B.js} +5 -4
- package/dist/sync-configs-CQNOTJ2B.js.map +1 -0
- package/dist/{types-Dg4mHvyf.d.ts → types-0jreMCF5.d.ts} +2 -2
- package/dist/{upgrade-TPTE26FG.js → upgrade-RTAJZD56.js} +3 -2
- package/dist/upgrade-RTAJZD56.js.map +1 -0
- package/dist/{websites-6YTT5ZTO.js → websites-SVI4KYSH.js} +8 -2
- package/dist/{write-audits-to-airtable-IWOO4FFH.js → write-audits-to-airtable-3XFNWMUE.js} +4 -4
- package/package.json +8 -1
- package/dist/airtable-WGQQ3KAD.js +0 -9
- package/dist/bump-deps-QNM3H4GI.js.map +0 -1
- package/dist/chunk-45AUGDFR.js.map +0 -1
- package/dist/chunk-6JFOAPW4.js.map +0 -1
- package/dist/chunk-6MT5W6UF.js.map +0 -1
- package/dist/chunk-C3PDS623.js.map +0 -1
- package/dist/chunk-GKSXZIMX.js.map +0 -1
- package/dist/chunk-H6YZBXBQ.js.map +0 -1
- package/dist/chunk-LCKKIJ22.js.map +0 -1
- package/dist/chunk-LYCKN7ZR.js.map +0 -1
- package/dist/chunk-MAYHLXCS.js.map +0 -1
- package/dist/chunk-O6G4HHMF.js.map +0 -1
- package/dist/chunk-OTBA7DON.js.map +0 -1
- package/dist/chunk-WCN54744.js.map +0 -1
- package/dist/convert-to-pnpm-XH7NYRVK.js.map +0 -1
- package/dist/init-WLR35YGN.js.map +0 -1
- package/dist/svelte-codemods-KJLNH6FQ.js.map +0 -1
- package/dist/sync-configs-6GBZLGRQ.js.map +0 -1
- package/dist/upgrade-TPTE26FG.js.map +0 -1
- /package/dist/{airtable-WGQQ3KAD.js.map → airtable-2PJ4NSAV.js.map} +0 -0
- /package/dist/{announce-72R3LRNT.js.map → announce-3JE5FKW7.js.map} +0 -0
- /package/dist/{chunk-RINXPU3H.js.map → chunk-2PWQ6MPG.js.map} +0 -0
- /package/dist/{chunk-XWPZ46IN.js.map → chunk-5QC5KJHR.js.map} +0 -0
- /package/dist/{chunk-XVR7UM6Z.js.map → chunk-JNXCDUYB.js.map} +0 -0
- /package/dist/{chunk-2E2X5BCG.js.map → chunk-KOAGMTRI.js.map} +0 -0
- /package/dist/{chunk-A5KYRGQA.js.map → chunk-PSJQE6T6.js.map} +0 -0
- /package/dist/{chunk-YQMYQAJX.js.map → chunk-Y7LZHPDF.js.map} +0 -0
- /package/dist/{digest-J7TDG62Q.js.map → digest-GZCZYJKC.js.map} +0 -0
- /package/dist/{ensure-site-2PF522VL.js.map → ensure-site-H5VMBPLF.js.map} +0 -0
- /package/dist/{github-signals-PP7GWYIY.js.map → github-signals-SQECQNST.js.map} +0 -0
- /package/dist/{launch-2HPQXWII.js.map → launch-RX4VI7F2.js.map} +0 -0
- /package/dist/{lighthouse-airtable-UBSXKHAQ.js.map → lighthouse-airtable-TTXULEGU.js.map} +0 -0
- /package/dist/{onboard-X6KJ5Z2V.js.map → onboard-TFBL62J3.js.map} +0 -0
- /package/dist/{orchestrate-PVCGBH4K.js.map → orchestrate-DYA4XAQJ.js.map} +0 -0
- /package/dist/{preflight-KWVYJ2DU.js.map → preflight-S3GYME3Q.js.map} +0 -0
- /package/dist/{renovate-dispatch-LG4RJGDY.js.map → renovate-dispatch-MZPAWVBL.js.map} +0 -0
- /package/dist/{report-ZBFMTT76.js.map → report-BLZ67QAQ.js.map} +0 -0
- /package/dist/{self-updating-JTTFOJ7Q.js.map → self-updating-GSH427XP.js.map} +0 -0
- /package/dist/{selftest-LFZPZRJP.js.map → selftest-KPTL6KC4.js.map} +0 -0
- /package/dist/{websites-6YTT5ZTO.js.map → websites-SVI4KYSH.js.map} +0 -0
- /package/dist/{write-audits-to-airtable-IWOO4FFH.js.map → write-audits-to-airtable-3XFNWMUE.js.map} +0 -0
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
import {
|
|
2
2
|
buildReportDataForSite,
|
|
3
3
|
scoresFromRow
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-PSJQE6T6.js";
|
|
5
|
+
import "./chunk-6J25IIAI.js";
|
|
6
|
+
import "./chunk-2PWQ6MPG.js";
|
|
7
7
|
import {
|
|
8
8
|
isProbablyEmail,
|
|
9
9
|
parseAddresses,
|
|
10
10
|
prepareHeaderImage,
|
|
11
11
|
renderReportEmail
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-52TDNN7K.js";
|
|
13
13
|
import "./chunk-GECESMVS.js";
|
|
14
14
|
import {
|
|
15
15
|
fetchAttachmentBytes
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import
|
|
16
|
+
} from "./chunk-AYM2EFSK.js";
|
|
17
|
+
import {
|
|
18
|
+
defaultResendClient
|
|
19
|
+
} from "./chunk-WEKL2HYJ.js";
|
|
20
|
+
import "./chunk-J2SHWT2O.js";
|
|
18
21
|
import "./chunk-PH3AGF4Z.js";
|
|
19
22
|
import "./chunk-HIN3P4ZN.js";
|
|
20
23
|
import "./chunk-U5SZ4FOP.js";
|
|
21
24
|
import {
|
|
22
25
|
listWebsites,
|
|
23
26
|
siteSlug
|
|
24
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-YWRQEDB3.js";
|
|
25
28
|
import {
|
|
26
29
|
openBase,
|
|
27
30
|
readAirtableConfig
|
|
28
31
|
} from "./chunk-HN6I2XWI.js";
|
|
29
|
-
import {
|
|
30
|
-
defaultResendClient
|
|
31
|
-
} from "./chunk-WEKL2HYJ.js";
|
|
32
32
|
import "./chunk-6VAL7XJT.js";
|
|
33
33
|
|
|
34
34
|
// src/recipes/selftest-email.ts
|
|
@@ -156,4 +156,4 @@ async function runSelftestCommand(kind, site, opts) {
|
|
|
156
156
|
export {
|
|
157
157
|
runSelftestCommand
|
|
158
158
|
};
|
|
159
|
-
//# sourceMappingURL=selftest-
|
|
159
|
+
//# sourceMappingURL=selftest-KPTL6KC4.js.map
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import {
|
|
2
|
+
runRecipeOverSites
|
|
3
|
+
} from "./chunk-VPJ7N6P7.js";
|
|
4
|
+
import {
|
|
5
|
+
appendSkipNotice,
|
|
6
|
+
fleetWorkdir,
|
|
7
|
+
prepareFleetSites
|
|
8
|
+
} from "./chunk-4NAOR44V.js";
|
|
9
|
+
import {
|
|
10
|
+
resolveSites
|
|
11
|
+
} from "./chunk-Y7LZHPDF.js";
|
|
12
|
+
import {
|
|
13
|
+
smokeSuite
|
|
14
|
+
} from "./chunk-PKVZMFEB.js";
|
|
15
|
+
import "./chunk-KRDLHAKK.js";
|
|
16
|
+
import "./chunk-XKOZUVK2.js";
|
|
17
|
+
import "./chunk-FDIFTIXC.js";
|
|
18
|
+
import "./chunk-HVOOCK6L.js";
|
|
19
|
+
import "./chunk-XXTZBPUY.js";
|
|
20
|
+
import "./chunk-XTK5VIQB.js";
|
|
21
|
+
import "./chunk-U5SZ4FOP.js";
|
|
22
|
+
|
|
23
|
+
// src/cli/commands/smoke-suite.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 runSmokeSuiteCommand(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 results = await runRecipeOverSites("smoke-suite", sites, (s) => smokeSuite(s));
|
|
47
|
+
const output = results.map(formatResult).join("\n");
|
|
48
|
+
const code = results.some((r) => r.status === "failed") ? 1 : 0;
|
|
49
|
+
return { output: appendSkipNotice(output, skipped), code };
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
runSmokeSuiteCommand
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=smoke-suite-GP3W57JP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/smoke-suite.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { smokeSuite } from \"../../recipes/smoke-suite/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 SmokeSuiteCommandOptions = {\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 runSmokeSuiteCommand(\n site: string | undefined,\n opts: SmokeSuiteCommandOptions,\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 const results = await runRecipeOverSites(\"smoke-suite\", sites, (s) => smokeSuite(s));\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;AAcxB,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,qBACpB,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;AAEA,QAAM,UAAU,MAAM,mBAAmB,eAAe,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;AAEnF,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":[]}
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
} from "./chunk-4NAOR44V.js";
|
|
9
9
|
import {
|
|
10
10
|
resolveSites
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-Y7LZHPDF.js";
|
|
12
12
|
import {
|
|
13
13
|
svelteCodemods
|
|
14
14
|
} from "./chunk-BTEBRTW4.js";
|
|
@@ -33,6 +33,7 @@ async function runSvelteCodemodsCommand(site, opts) {
|
|
|
33
33
|
let sites = await resolveSites({
|
|
34
34
|
...site !== void 0 ? { site } : {},
|
|
35
35
|
...opts.fleet !== void 0 ? { fleet: opts.fleet } : {},
|
|
36
|
+
...opts.workdir !== void 0 ? { workdir: opts.workdir } : {},
|
|
36
37
|
cwd
|
|
37
38
|
});
|
|
38
39
|
let skipped = [];
|
|
@@ -50,4 +51,4 @@ async function runSvelteCodemodsCommand(site, opts) {
|
|
|
50
51
|
export {
|
|
51
52
|
runSvelteCodemodsCommand
|
|
52
53
|
};
|
|
53
|
-
//# sourceMappingURL=svelte-codemods-
|
|
54
|
+
//# sourceMappingURL=svelte-codemods-GYZZX742.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/svelte-codemods.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { svelteCodemods } from \"../../recipes/svelte-codemods.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 SvelteCodemodsCommandOptions = {\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 runSvelteCodemodsCommand(\n site: string | undefined,\n opts: SvelteCodemodsCommandOptions,\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 const results = await runRecipeOverSites(\"svelte-codemods\", sites, (s) => svelteCodemods(s));\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;AAcxB,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,yBACpB,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;AAEA,QAAM,UAAU,MAAM,mBAAmB,mBAAmB,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;AAE3F,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":[]}
|
|
@@ -8,19 +8,19 @@ import {
|
|
|
8
8
|
} from "./chunk-4NAOR44V.js";
|
|
9
9
|
import {
|
|
10
10
|
resolveSites
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-Y7LZHPDF.js";
|
|
12
12
|
import {
|
|
13
13
|
ALL_CONFIG_NAMES,
|
|
14
14
|
CANONICAL_GITIGNORE_ENTRIES,
|
|
15
15
|
isConfigName,
|
|
16
16
|
mergeGitignore,
|
|
17
17
|
syncConfigs
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import "./chunk-XKOZUVK2.js";
|
|
18
|
+
} from "./chunk-JNXCDUYB.js";
|
|
20
19
|
import {
|
|
21
20
|
ALL_TEMPLATES,
|
|
22
21
|
templatesByName
|
|
23
22
|
} from "./chunk-CASCWQQX.js";
|
|
23
|
+
import "./chunk-XKOZUVK2.js";
|
|
24
24
|
import "./chunk-FDIFTIXC.js";
|
|
25
25
|
import "./chunk-HVOOCK6L.js";
|
|
26
26
|
import "./chunk-XXTZBPUY.js";
|
|
@@ -83,6 +83,7 @@ async function runSyncConfigsCommand(site, opts) {
|
|
|
83
83
|
let sites = await resolveSites({
|
|
84
84
|
...site !== void 0 ? { site } : {},
|
|
85
85
|
...opts.fleet !== void 0 ? { fleet: opts.fleet } : {},
|
|
86
|
+
...opts.workdir !== void 0 ? { workdir: opts.workdir } : {},
|
|
86
87
|
cwd
|
|
87
88
|
});
|
|
88
89
|
let skipped = [];
|
|
@@ -112,4 +113,4 @@ async function runSyncConfigsCommand(site, opts) {
|
|
|
112
113
|
export {
|
|
113
114
|
runSyncConfigsCommand
|
|
114
115
|
};
|
|
115
|
-
//# sourceMappingURL=sync-configs-
|
|
116
|
+
//# sourceMappingURL=sync-configs-CQNOTJ2B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/sync-configs.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { syncConfigs, ALL_CONFIG_NAMES, isConfigName } from \"../../recipes/sync-configs.js\";\nimport { ALL_TEMPLATES, templatesByName } from \"../../recipes/sync-configs/templates.js\";\nimport {\n CANONICAL_GITIGNORE_ENTRIES,\n mergeGitignore,\n} from \"../../recipes/sync-configs/gitignore.js\";\nimport type { ConfigName, 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 SyncConfigsCommandOptions = {\n only?: string;\n dry?: boolean;\n fleet?: string;\n workdir?: string;\n cwd?: string;\n};\n\nfunction parseOnly(value?: string): ConfigName[] | undefined {\n if (!value) return undefined;\n const names = value.split(\",\").map((s) => s.trim());\n for (const n of names) {\n if (!isConfigName(n)) {\n throw Object.assign(\n new Error(`unknown config in --only: \"${n}\". Valid: ${ALL_CONFIG_NAMES.join(\", \")}`),\n { exitCode: 2 },\n );\n }\n }\n return names as ConfigName[];\n}\n\nasync function dryPlanGitignore(cwd: string): Promise<string | null> {\n let existing: string | null;\n try {\n existing = await readFile(join(cwd, \".gitignore\"), \"utf-8\");\n } catch {\n return \"would create .gitignore\";\n }\n const merge = mergeGitignore(existing, CANONICAL_GITIGNORE_ENTRIES);\n if (merge.added.length === 0) return null;\n return `would update .gitignore (${merge.added.length} canonical entries to add)`;\n}\n\nasync function dryPlan(cwd: string, which?: ConfigName[]): Promise<string> {\n const includeGitignore = which ? which.includes(\"gitignore\") : true;\n const templateTargets = which\n ? templatesByName(which.filter((c): c is ConfigName => c !== \"gitignore\"))\n : ALL_TEMPLATES;\n\n const lines: string[] = [];\n for (const t of templateTargets) {\n let existing = \"\";\n try {\n existing = await readFile(join(cwd, t.path), \"utf-8\");\n } catch {\n // missing file => will be created\n }\n if (existing !== t.contents) lines.push(`would update ${t.path} (config: ${t.config})`);\n }\n if (includeGitignore) {\n const gi = await dryPlanGitignore(cwd);\n if (gi) lines.push(gi);\n }\n return lines.length === 0 ? \"no changes needed\" : lines.join(\"\\n\");\n}\n\nfunction formatResult(r: RecipeResult): string {\n if (r.status === \"noop\") return `[${r.site}] noop: ${r.notes ?? \"all configs in sync\"}`;\n return `[${r.site}] applied: ${r.commits.length} commit(s)\\n${r.notes ?? \"\"}`;\n}\n\nexport async function runSyncConfigsCommand(\n site: string | undefined,\n opts: SyncConfigsCommandOptions,\n): Promise<{ output: string; code: number }> {\n const which = parseOnly(opts.only);\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 if (opts.dry) {\n const blocks: string[] = [];\n for (const s of sites) {\n blocks.push(`[${s.name || s.path}]\\n` + (await dryPlan(s.path, which)));\n }\n return { output: appendSkipNotice(blocks.join(\"\\n\\n\"), skipped), code: 0 };\n }\n\n const results = await runRecipeOverSites(\"sync-configs\", sites, (s) =>\n syncConfigs(s, which ? { which } : {}),\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":"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","names":[]}
|
|
@@ -14,8 +14,8 @@ type Site = {
|
|
|
14
14
|
netlifyId?: string;
|
|
15
15
|
meta?: Record<string, unknown>;
|
|
16
16
|
};
|
|
17
|
-
type AuditName = "deps" | "lighthouse" | "a11y" | "security" | "lint" | "domain" | "browser" | "netlify-deploy";
|
|
18
|
-
type RecipeName = "sync-configs" | "bump-deps" | "svelte-4-to-5" | "svelte-codemods" | "convert-to-pnpm" | "onboard" | "a11y-fixtures-page" | "self-updating" | "init";
|
|
17
|
+
type AuditName = "deps" | "lighthouse" | "a11y" | "security" | "lint" | "domain" | "browser" | "netlify-deploy" | "function-health" | "smoke" | "form-e2e";
|
|
18
|
+
type RecipeName = "sync-configs" | "bump-deps" | "svelte-4-to-5" | "svelte-codemods" | "convert-to-pnpm" | "onboard" | "a11y-fixtures-page" | "health-endpoint" | "smoke-suite" | "self-updating" | "init";
|
|
19
19
|
type ConfigName = "lighthouse" | "eslint" | "prettier" | "prettier-ignore" | "playwright-a11y" | "svelte" | "gitignore" | "ci" | "renovate-action" | "renovate-config" | "netlify";
|
|
20
20
|
type AuditResult = {
|
|
21
21
|
audit: AuditName;
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
} from "./chunk-4NAOR44V.js";
|
|
9
9
|
import {
|
|
10
10
|
resolveSites
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-Y7LZHPDF.js";
|
|
12
12
|
import {
|
|
13
13
|
upgradeSvelte4to5
|
|
14
14
|
} from "./chunk-ZO7WNY57.js";
|
|
@@ -42,6 +42,7 @@ async function runUpgradeCommand(upgradeName, site, opts = {}) {
|
|
|
42
42
|
let sites = await resolveSites({
|
|
43
43
|
...site !== void 0 ? { site } : {},
|
|
44
44
|
...opts.fleet !== void 0 ? { fleet: opts.fleet } : {},
|
|
45
|
+
...opts.workdir !== void 0 ? { workdir: opts.workdir } : {},
|
|
45
46
|
cwd
|
|
46
47
|
});
|
|
47
48
|
let skipped = [];
|
|
@@ -59,4 +60,4 @@ async function runUpgradeCommand(upgradeName, site, opts = {}) {
|
|
|
59
60
|
export {
|
|
60
61
|
runUpgradeCommand
|
|
61
62
|
};
|
|
62
|
-
//# sourceMappingURL=upgrade-
|
|
63
|
+
//# sourceMappingURL=upgrade-RTAJZD56.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/upgrade.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { upgradeSvelte4to5 } from \"../../recipes/svelte-5/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\nconst KNOWN_UPGRADES = new Set([\"svelte-4-to-5\"]);\n\nexport type UpgradeCommandOptions = {\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 return `[${r.site}] applied: ${r.commits.length} commit(s)\\n${r.notes ?? \"\"}`;\n}\n\nexport async function runUpgradeCommand(\n upgradeName: string | undefined,\n site: string | undefined,\n opts: UpgradeCommandOptions = {},\n): Promise<{ output: string; code: number }> {\n if (!upgradeName || !KNOWN_UPGRADES.has(upgradeName)) {\n throw Object.assign(\n new Error(\n `unknown upgrade: ${upgradeName ?? \"(none)\"}. expected one of ${[...KNOWN_UPGRADES].join(\", \")}`,\n ),\n { exitCode: 2 },\n );\n }\n\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 // `upgradeName` is validated against KNOWN_UPGRADES above (throws otherwise),\n // so the only reachable upgrade here is the svelte-4-to-5 recipe.\n const results = await runRecipeOverSites(\"svelte-4-to-5\", sites, (s) => upgradeSvelte4to5(s));\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;AAQxB,IAAM,iBAAiB,oBAAI,IAAI,CAAC,eAAe,CAAC;AAQhD,SAAS,aAAa,GAAyB;AAC7C,MAAI,EAAE,WAAW,OAAQ,QAAO,IAAI,EAAE,IAAI,WAAW,EAAE,SAAS,EAAE;AAClE,SAAO,IAAI,EAAE,IAAI,cAAc,EAAE,QAAQ,MAAM;AAAA,EAAe,EAAE,SAAS,EAAE;AAC7E;AAEA,eAAsB,kBACpB,aACA,MACA,OAA8B,CAAC,GACY;AAC3C,MAAI,CAAC,eAAe,CAAC,eAAe,IAAI,WAAW,GAAG;AACpD,UAAM,OAAO;AAAA,MACX,IAAI;AAAA,QACF,oBAAoB,eAAe,QAAQ,qBAAqB,CAAC,GAAG,cAAc,EAAE,KAAK,IAAI,CAAC;AAAA,MAChG;AAAA,MACA,EAAE,UAAU,EAAE;AAAA,IAChB;AAAA,EACF;AAEA,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;AAIA,QAAM,UAAU,MAAM,mBAAmB,iBAAiB,OAAO,CAAC,MAAM,kBAAkB,CAAC,CAAC;AAE5F,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":[]}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ACTIVE_STATUSES,
|
|
3
|
+
PRE_LAUNCH_STATUSES,
|
|
3
4
|
SEVERITY_RANK,
|
|
4
5
|
WEBSITES_TABLE,
|
|
5
6
|
getWebsiteBySlug,
|
|
6
7
|
isDashboardVisible,
|
|
8
|
+
isPreLaunch,
|
|
7
9
|
listWebsites,
|
|
8
10
|
mapRow,
|
|
9
11
|
normalizeSecurityAdvisory,
|
|
10
12
|
parseNotifyRouting,
|
|
11
13
|
parseSecurityAdvisories,
|
|
12
14
|
siteSlug,
|
|
15
|
+
toVerdict,
|
|
13
16
|
updateA11yCounts,
|
|
14
17
|
updateAnalyticsHealth,
|
|
15
18
|
updateAuditFields,
|
|
@@ -21,19 +24,22 @@ import {
|
|
|
21
24
|
updateScores,
|
|
22
25
|
updateSecurityCounts,
|
|
23
26
|
updateSiteField
|
|
24
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-YWRQEDB3.js";
|
|
25
28
|
export {
|
|
26
29
|
ACTIVE_STATUSES,
|
|
30
|
+
PRE_LAUNCH_STATUSES,
|
|
27
31
|
SEVERITY_RANK,
|
|
28
32
|
WEBSITES_TABLE,
|
|
29
33
|
getWebsiteBySlug,
|
|
30
34
|
isDashboardVisible,
|
|
35
|
+
isPreLaunch,
|
|
31
36
|
listWebsites,
|
|
32
37
|
mapRow,
|
|
33
38
|
normalizeSecurityAdvisory,
|
|
34
39
|
parseNotifyRouting,
|
|
35
40
|
parseSecurityAdvisories,
|
|
36
41
|
siteSlug,
|
|
42
|
+
toVerdict,
|
|
37
43
|
updateA11yCounts,
|
|
38
44
|
updateAnalyticsHealth,
|
|
39
45
|
updateAuditFields,
|
|
@@ -46,4 +52,4 @@ export {
|
|
|
46
52
|
updateSecurityCounts,
|
|
47
53
|
updateSiteField
|
|
48
54
|
};
|
|
49
|
-
//# sourceMappingURL=websites-
|
|
55
|
+
//# sourceMappingURL=websites-SVI4KYSH.js.map
|
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
formatFleetWriteSummary,
|
|
3
3
|
writeAuditsToAirtable,
|
|
4
4
|
writeFleetAuditsToAirtable
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-CMQMNFFJ.js";
|
|
6
|
+
import "./chunk-5QC5KJHR.js";
|
|
7
7
|
import "./chunk-5L3FPQIJ.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-YWRQEDB3.js";
|
|
9
9
|
export {
|
|
10
10
|
formatFleetWriteSummary,
|
|
11
11
|
writeAuditsToAirtable,
|
|
12
12
|
writeFleetAuditsToAirtable
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=write-audits-to-airtable-
|
|
14
|
+
//# sourceMappingURL=write-audits-to-airtable-3XFNWMUE.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reddoorla/maintenance",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.71.0",
|
|
4
4
|
"description": "Canonical maintenance configs, audits, and recipes for the reddoor stack.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,6 +25,10 @@
|
|
|
25
25
|
"types": "./dist/forms/index.d.ts",
|
|
26
26
|
"import": "./dist/forms/index.js"
|
|
27
27
|
},
|
|
28
|
+
"./client": {
|
|
29
|
+
"types": "./dist/client/index.d.ts",
|
|
30
|
+
"import": "./dist/client/index.js"
|
|
31
|
+
},
|
|
28
32
|
"./configs/lighthouse": {
|
|
29
33
|
"types": "./dist/configs/lighthouse.d.ts",
|
|
30
34
|
"import": "./dist/configs/lighthouse.js"
|
|
@@ -59,6 +63,7 @@
|
|
|
59
63
|
"eslint-plugin-svelte": "^3.1.0",
|
|
60
64
|
"globals": "^17.6.0",
|
|
61
65
|
"listr2": "^10.2.1",
|
|
66
|
+
"node-html-parser": "^9.0.0",
|
|
62
67
|
"prettier": "^3.1.1",
|
|
63
68
|
"prettier-plugin-svelte": "^3.2.6",
|
|
64
69
|
"tinyglobby": "^0.2.10",
|
|
@@ -79,6 +84,8 @@
|
|
|
79
84
|
"@libsql/client": "^0.8.1",
|
|
80
85
|
"@libsql/kysely-libsql": "^0.4.1",
|
|
81
86
|
"@netlify/functions": "^5.2.2",
|
|
87
|
+
"@prismicio/client": "^7.21.8",
|
|
88
|
+
"@prismicio/migrate": "^0.0.2",
|
|
82
89
|
"@sveltejs/kit": "^2.61.1",
|
|
83
90
|
"@types/mjml": "^4.7.4",
|
|
84
91
|
"@types/node": "^22.0.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/commands/bump-deps.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { bumpDeps, type BumpDepsGroup } from \"../../recipes/bump-deps.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\nconst GROUPS: BumpDepsGroup[] = [\"patch\", \"minor\", \"major\"];\n\nexport type BumpDepsCommandOptions = {\n group?: string;\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 return `[${r.site}] applied: ${r.commits.length} commit(s)\\n${r.notes ?? \"\"}`;\n}\n\nexport async function runBumpDepsCommand(\n site: string | undefined,\n opts: BumpDepsCommandOptions,\n): Promise<{ output: string; code: number }> {\n const group = (opts.group ?? \"minor\") as BumpDepsGroup;\n if (!GROUPS.includes(group)) {\n throw Object.assign(\n new Error(`unknown --group: ${group}. expected one of ${GROUPS.join(\", \")}`),\n { exitCode: 2 },\n );\n }\n\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 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 const results = await runRecipeOverSites(\"bump-deps\", sites, (s) => bumpDeps(s, { group }));\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;AAQxB,IAAM,SAA0B,CAAC,SAAS,SAAS,OAAO;AAS1D,SAAS,aAAa,GAAyB;AAC7C,MAAI,EAAE,WAAW,OAAQ,QAAO,IAAI,EAAE,IAAI,WAAW,EAAE,SAAS,EAAE;AAClE,SAAO,IAAI,EAAE,IAAI,cAAc,EAAE,QAAQ,MAAM;AAAA,EAAe,EAAE,SAAS,EAAE;AAC7E;AAEA,eAAsB,mBACpB,MACA,MAC2C;AAC3C,QAAM,QAAS,KAAK,SAAS;AAC7B,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,UAAM,OAAO;AAAA,MACX,IAAI,MAAM,oBAAoB,KAAK,qBAAqB,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,MAC3E,EAAE,UAAU,EAAE;AAAA,IAChB;AAAA,EACF;AAEA,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;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;AAEA,QAAM,UAAU,MAAM,mBAAmB,aAAa,OAAO,CAAC,MAAM,SAAS,GAAG,EAAE,MAAM,CAAC,CAAC;AAE1F,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":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/reports/due.ts"],"sourcesContent":["import type { WebsiteRow, Frequency, Status } from \"./airtable/websites.js\";\nimport type { ReportRow } from \"./airtable/reports.js\";\nimport type { ReportType } from \"./types.js\";\n\n/** Statuses where reports are appropriate. Drops \"deprecated\" and\n * \"probably not our problem\" — even if the operator left a freq set, we don't\n * want to surface those sites in --due output. Sites with status=null pass\n * through (existing data is partial; better to surface than silently skip). */\nexport const ELIGIBLE_STATUSES: ReadonlySet<Status> = new Set<Status>([\n \"in development\",\n \"launch period\",\n \"maintenance\",\n \"hosting\",\n]);\n\nexport type DueItem = {\n site: WebsiteRow;\n reportType: ReportType;\n /** Inclusive: the day the next report became due. */\n dueDate: Date;\n /** ISO date of the last `Sent at` for this (site, type), or null if there's never been one. */\n lastSent: string | null;\n};\n\nconst MONTHS: Record<Exclude<Frequency, \"None\">, number> = {\n Monthly: 1,\n Quarterly: 3,\n Yearly: 12,\n};\n\n/**\n * Add `n` calendar months in UTC, clamped to the last day of the target month.\n * Jan 31 + 1 month = Feb 28 (not Mar 3, which is what naive setMonth produces).\n * All-UTC accessors mean the result is timezone-independent.\n */\nfunction addMonths(d: Date, n: number): Date {\n const out = new Date(d);\n const day = out.getUTCDate();\n out.setUTCDate(1);\n out.setUTCMonth(out.getUTCMonth() + n);\n const lastDayOfTargetMonth = new Date(\n Date.UTC(out.getUTCFullYear(), out.getUTCMonth() + 1, 0),\n ).getUTCDate();\n out.setUTCDate(Math.min(day, lastDayOfTargetMonth));\n return out;\n}\n\n/** Truncate to UTC midnight. Avoids local-TZ skew when comparing Airtable date-only fields. */\nfunction startOfDay(d: Date): Date {\n const out = new Date(d);\n out.setUTCHours(0, 0, 0, 0);\n return out;\n}\n\nfunction lastSentForType(reports: ReportRow[], siteId: string, type: ReportType): string | null {\n const candidates = reports\n .filter((r) => r.siteId === siteId && r.reportType === type && r.sentAt !== null)\n .map((r) => r.sentAt!)\n .sort();\n return candidates[candidates.length - 1] ?? null;\n}\n\n/**\n * The next-due date for one (site, type): the date the next report of that type is\n * scheduled to draft, whether or not it's due yet. `null` when there's no schedule —\n * an ineligible status, a \"None\"/blank frequency, or an unrecognized frequency value.\n *\n * baseDate = the last `Sent at` for this (site, type), else the site's\n * `maintenance day`/`testing day` anchor. With no baseDate at all the next report is\n * due now (returns `today` at UTC midnight). Otherwise baseDate + frequency.\n *\n * Shared with {@link findDueReports} so the scheduler and any schedule display can't\n * drift on what \"next\" means. NOTE: callers wanting the LOUD unrecognized-frequency\n * warning use findDueReports; this returns null silently for that case.\n */\nexport function nextDueDate(\n site: WebsiteRow,\n reports: ReportRow[],\n type: ReportType,\n today: Date,\n): Date | null {\n if (site.status !== null && !ELIGIBLE_STATUSES.has(site.status)) return null;\n const rawFreq = type === \"Maintenance\" ? site.maintenanceFreq : site.testingFreq;\n const freq = (typeof rawFreq === \"string\" ? rawFreq.trim() : rawFreq) as Frequency;\n if (freq === \"None\" || freq === (\"\" as Frequency)) return null;\n if (!(freq in MONTHS)) return null;\n const lastSent = lastSentForType(reports, site.id, type);\n const fallback = type === \"Maintenance\" ? site.maintenanceDay : site.testingDay;\n const baseIso = lastSent ?? fallback;\n if (!baseIso) return startOfDay(today);\n return addMonths(new Date(baseIso), MONTHS[freq]);\n}\n\n/**\n * Computes which (site, type) pairs are due as of `today`.\n *\n * Algorithm per (site, type):\n * 1. If freq === \"None\", skip.\n * 2. baseDate = max(last Sent at for this type, site's `maintenance/testing day` fallback).\n * 3. If no baseDate exists at all, the site is due now.\n * 4. dueDate = baseDate + frequency months.\n * 5. Due iff startOfDay(today) >= startOfDay(dueDate).\n */\nexport function findDueReports(\n websites: WebsiteRow[],\n reports: ReportRow[],\n today: Date,\n): DueItem[] {\n const out: DueItem[] = [];\n const todayStart = startOfDay(today);\n\n for (const site of websites) {\n // Skip explicitly-non-active statuses (deprecated, \"probably not our problem\").\n // Null status is treated as active for backwards compat with rows that pre-date\n // the Status convention.\n if (site.status !== null && !ELIGIBLE_STATUSES.has(site.status)) continue;\n\n for (const type of [\"Maintenance\", \"Testing\"] as const) {\n const rawFreq = type === \"Maintenance\" ? site.maintenanceFreq : site.testingFreq;\n // Normalize obvious whitespace so a trailing-space typo (\"Quarterly \") still\n // schedules. The LOUD warning below is the real safety net for genuine\n // casing/spelling mistakes (\"monthly\", \"Quaterly\").\n const freq = (typeof rawFreq === \"string\" ? rawFreq.trim() : rawFreq) as Frequency;\n // Intentional silent skip — \"None\" (and the empty/blank default) means \"no\n // schedule\", not a mistake.\n if (freq === \"None\" || freq === (\"\" as Frequency)) continue;\n // A non-empty, non-None value that doesn't match a known schedule used to\n // silently produce no due date — the site just vanished from the loop. Warn\n // LOUDLY so a casing/typo Airtable value is fixable instead of invisible.\n if (!(freq in MONTHS)) {\n console.warn(\n `⚠ ${site.name}: unrecognized ${type === \"Maintenance\" ? \"maintenance\" : \"testing\"} frequency '${rawFreq}' — not scheduling; fix the Airtable value`,\n );\n continue;\n }\n\n const lastSent = lastSentForType(reports, site.id, type);\n // Same computation as the schedule write-back uses. The guards above already\n // proved a schedule exists, so dueDate is non-null; a no-anchor site returns\n // `today`, so the comparison below pushes it as due-now (the prior behavior).\n const dueDate = nextDueDate(site, reports, type, today);\n if (dueDate !== null && todayStart.getTime() >= startOfDay(dueDate).getTime()) {\n out.push({ site, reportType: type, dueDate, lastSent });\n }\n }\n }\n\n return out;\n}\n\n/**\n * The UTC `YYYY-MM` of a `dueDate` from {@link findDueReports} — the per-recurrence\n * idempotency key for drafting. Monthly recurrences land in distinct months; quarterly\n * and yearly land in distinct due-months too, so this uniquely names one draft per cycle.\n * UTC accessors keep it timezone-independent, consistent with the rest of this module.\n */\nexport function reportPeriodKey(dueDate: Date): string {\n if (Number.isNaN(dueDate.getTime())) throw new TypeError(\"reportPeriodKey: invalid Date\");\n const year = dueDate.getUTCFullYear();\n const month = String(dueDate.getUTCMonth() + 1).padStart(2, \"0\");\n return `${year}-${month}`;\n}\n"],"mappings":"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","names":[]}
|