@reddoorla/maintenance 0.55.0 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/airtable-2BJX4ATJ.js +9 -0
- package/dist/airtable-2BJX4ATJ.js.map +1 -0
- package/dist/announce-JEVCDDKL.js +171 -0
- package/dist/announce-JEVCDDKL.js.map +1 -0
- package/dist/bump-deps-O3SOLQYY.js +57 -0
- package/dist/bump-deps-O3SOLQYY.js.map +1 -0
- package/dist/chunk-2X322ZES.js +99 -0
- package/dist/chunk-2X322ZES.js.map +1 -0
- package/dist/chunk-4NAOR44V.js +153 -0
- package/dist/chunk-4NAOR44V.js.map +1 -0
- package/dist/chunk-4PY4I5OR.js +1167 -0
- package/dist/chunk-4PY4I5OR.js.map +1 -0
- package/dist/chunk-5L2QXUTU.js +279 -0
- package/dist/chunk-5L2QXUTU.js.map +1 -0
- package/dist/chunk-5WL3ET24.js +203 -0
- package/dist/chunk-5WL3ET24.js.map +1 -0
- package/dist/chunk-6LIWDIXU.js +38 -0
- package/dist/chunk-6LIWDIXU.js.map +1 -0
- package/dist/chunk-6VAL7XJT.js +52 -0
- package/dist/chunk-6VAL7XJT.js.map +1 -0
- package/dist/chunk-BWLUNY7L.js +585 -0
- package/dist/chunk-BWLUNY7L.js.map +1 -0
- package/dist/chunk-CASCWQQX.js +161 -0
- package/dist/chunk-CASCWQQX.js.map +1 -0
- package/dist/chunk-CLVTVDOU.js +274 -0
- package/dist/chunk-CLVTVDOU.js.map +1 -0
- package/dist/chunk-D3DQFC32.js +79 -0
- package/dist/chunk-D3DQFC32.js.map +1 -0
- package/dist/chunk-EYODPUHV.js +37 -0
- package/dist/chunk-EYODPUHV.js.map +1 -0
- package/dist/chunk-FDIFTIXC.js +70 -0
- package/dist/chunk-FDIFTIXC.js.map +1 -0
- package/dist/chunk-FUD4I2ZW.js +35 -0
- package/dist/chunk-FUD4I2ZW.js.map +1 -0
- package/dist/chunk-HG5DTFNF.js +62 -0
- package/dist/chunk-HG5DTFNF.js.map +1 -0
- package/dist/chunk-HN6I2XWI.js +65 -0
- package/dist/chunk-HN6I2XWI.js.map +1 -0
- package/dist/chunk-HVOOCK6L.js +84 -0
- package/dist/chunk-HVOOCK6L.js.map +1 -0
- package/dist/chunk-IMIR7SC2.js +51 -0
- package/dist/chunk-IMIR7SC2.js.map +1 -0
- package/dist/chunk-J3OPWFZE.js +64 -0
- package/dist/chunk-J3OPWFZE.js.map +1 -0
- package/dist/chunk-J4ECCFRT.js +221 -0
- package/dist/chunk-J4ECCFRT.js.map +1 -0
- package/dist/chunk-JNXCDUYB.js +211 -0
- package/dist/chunk-JNXCDUYB.js.map +1 -0
- package/dist/chunk-JQG222CI.js +49 -0
- package/dist/chunk-JQG222CI.js.map +1 -0
- package/dist/chunk-LKGVSM2O.js +43 -0
- package/dist/chunk-LKGVSM2O.js.map +1 -0
- package/dist/chunk-LYCKN7ZR.js +41 -0
- package/dist/chunk-LYCKN7ZR.js.map +1 -0
- package/dist/chunk-MKSZBODM.js +162 -0
- package/dist/chunk-MKSZBODM.js.map +1 -0
- package/dist/chunk-O65I7G7G.js +246 -0
- package/dist/chunk-O65I7G7G.js.map +1 -0
- package/dist/chunk-OCS7SZUZ.js +243 -0
- package/dist/chunk-OCS7SZUZ.js.map +1 -0
- package/dist/chunk-OGGRFBL4.js +14 -0
- package/dist/chunk-OGGRFBL4.js.map +1 -0
- package/dist/chunk-OQPMZ6BM.js +368 -0
- package/dist/chunk-OQPMZ6BM.js.map +1 -0
- package/dist/chunk-OTGB6YQO.js +52 -0
- package/dist/chunk-OTGB6YQO.js.map +1 -0
- package/dist/chunk-PZQ3WED2.js +14 -0
- package/dist/chunk-PZQ3WED2.js.map +1 -0
- package/dist/chunk-QTHKOIFJ.js +13 -0
- package/dist/chunk-QTHKOIFJ.js.map +1 -0
- package/dist/chunk-U5SZ4FOP.js +26 -0
- package/dist/chunk-U5SZ4FOP.js.map +1 -0
- package/dist/chunk-W3G7XFBZ.js +444 -0
- package/dist/chunk-W3G7XFBZ.js.map +1 -0
- package/dist/chunk-WEKL2HYJ.js +31 -0
- package/dist/chunk-WEKL2HYJ.js.map +1 -0
- package/dist/chunk-WVRPOXKH.js +74 -0
- package/dist/chunk-WVRPOXKH.js.map +1 -0
- package/dist/chunk-XKOZUVK2.js +121 -0
- package/dist/chunk-XKOZUVK2.js.map +1 -0
- package/dist/chunk-XO2RUYVM.js +138 -0
- package/dist/chunk-XO2RUYVM.js.map +1 -0
- package/dist/chunk-XTK5VIQB.js +97 -0
- package/dist/chunk-XTK5VIQB.js.map +1 -0
- package/dist/chunk-XXTZBPUY.js +9 -0
- package/dist/chunk-XXTZBPUY.js.map +1 -0
- package/dist/chunk-ZYBOT5PM.js +153 -0
- package/dist/chunk-ZYBOT5PM.js.map +1 -0
- package/dist/cli/bin.js +75 -7785
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/audit.js +37 -2336
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/client-EPVO3FEH.js +10 -0
- package/dist/client-EPVO3FEH.js.map +1 -0
- package/dist/client-JA6QLEDW.js +48 -0
- package/dist/client-JA6QLEDW.js.map +1 -0
- package/dist/configs/lighthouse.js +4 -31
- package/dist/configs/lighthouse.js.map +1 -1
- package/dist/configs/playwright-a11y.js +6 -33
- package/dist/configs/playwright-a11y.js.map +1 -1
- package/dist/convert-to-pnpm-UR64X3OX.js +51 -0
- package/dist/convert-to-pnpm-UR64X3OX.js.map +1 -0
- package/dist/db-AXKMRTVA.js +23 -0
- package/dist/db-AXKMRTVA.js.map +1 -0
- package/dist/digest-YTO73BEO.js +408 -0
- package/dist/digest-YTO73BEO.js.map +1 -0
- package/dist/forms/index.js +3 -8
- package/dist/forms/index.js.map +1 -1
- package/dist/github-signals-XLQXXH6Q.js +116 -0
- package/dist/github-signals-XLQXXH6Q.js.map +1 -0
- package/dist/index.js +102 -4757
- package/dist/index.js.map +1 -1
- package/dist/init-JITQXFVL.js +85 -0
- package/dist/init-JITQXFVL.js.map +1 -0
- package/dist/launch-XW6PEKUL.js +207 -0
- package/dist/launch-XW6PEKUL.js.map +1 -0
- package/dist/lighthouse-airtable-4FKYKFH6.js +12 -0
- package/dist/lighthouse-airtable-4FKYKFH6.js.map +1 -0
- package/dist/migrate-P2LS4WXI.js +7 -0
- package/dist/migrate-P2LS4WXI.js.map +1 -0
- package/dist/onboard-TCQOP2W4.js +69 -0
- package/dist/onboard-TCQOP2W4.js.map +1 -0
- package/dist/orchestrate-LHH3LQNP.js +23 -0
- package/dist/orchestrate-LHH3LQNP.js.map +1 -0
- package/dist/recipes/sync-configs.js +9 -505
- package/dist/recipes/sync-configs.js.map +1 -1
- package/dist/renovate-dispatch-YVBTBJJY.js +100 -0
- package/dist/renovate-dispatch-YVBTBJJY.js.map +1 -0
- package/dist/report-WK3SKWJI.js +240 -0
- package/dist/report-WK3SKWJI.js.map +1 -0
- package/dist/resend-G2BJMAQV.js +7 -0
- package/dist/resend-G2BJMAQV.js.map +1 -0
- package/dist/self-updating-BYUBUNO4.js +61 -0
- package/dist/self-updating-BYUBUNO4.js.map +1 -0
- package/dist/svelte-codemods-BYRJAU7I.js +51 -0
- package/dist/svelte-codemods-BYRJAU7I.js.map +1 -0
- package/dist/sync-configs-JPRLAW5J.js +109 -0
- package/dist/sync-configs-JPRLAW5J.js.map +1 -0
- package/dist/upgrade-ERA45EVR.js +64 -0
- package/dist/upgrade-ERA45EVR.js.map +1 -0
- package/dist/util/git.js +19 -76
- package/dist/util/git.js.map +1 -1
- package/dist/util/pkg.js +5 -45
- package/dist/util/pkg.js.map +1 -1
- package/dist/websites-X5DLC2PC.js +43 -0
- package/dist/websites-X5DLC2PC.js.map +1 -0
- package/dist/write-audits-to-airtable-CE4POBAF.js +13 -0
- package/dist/write-audits-to-airtable-CE4POBAF.js.map +1 -0
- package/package.json +13 -12
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import {
|
|
2
|
+
appendSkipNotice,
|
|
3
|
+
fleetWorkdir,
|
|
4
|
+
prepareFleetSites
|
|
5
|
+
} from "./chunk-4NAOR44V.js";
|
|
6
|
+
import {
|
|
7
|
+
resolveSites
|
|
8
|
+
} from "./chunk-J3OPWFZE.js";
|
|
9
|
+
import {
|
|
10
|
+
ALL_CONFIG_NAMES,
|
|
11
|
+
CANONICAL_GITIGNORE_ENTRIES,
|
|
12
|
+
isConfigName,
|
|
13
|
+
mergeGitignore,
|
|
14
|
+
syncConfigs
|
|
15
|
+
} from "./chunk-JNXCDUYB.js";
|
|
16
|
+
import {
|
|
17
|
+
ALL_TEMPLATES,
|
|
18
|
+
templatesByName
|
|
19
|
+
} from "./chunk-CASCWQQX.js";
|
|
20
|
+
import "./chunk-XKOZUVK2.js";
|
|
21
|
+
import "./chunk-FDIFTIXC.js";
|
|
22
|
+
import "./chunk-HVOOCK6L.js";
|
|
23
|
+
import "./chunk-XXTZBPUY.js";
|
|
24
|
+
import "./chunk-XTK5VIQB.js";
|
|
25
|
+
import "./chunk-U5SZ4FOP.js";
|
|
26
|
+
|
|
27
|
+
// src/cli/commands/sync-configs.ts
|
|
28
|
+
import { readFile } from "fs/promises";
|
|
29
|
+
import { join, resolve } from "path";
|
|
30
|
+
function parseOnly(value) {
|
|
31
|
+
if (!value) return void 0;
|
|
32
|
+
const names = value.split(",").map((s) => s.trim());
|
|
33
|
+
for (const n of names) {
|
|
34
|
+
if (!isConfigName(n)) {
|
|
35
|
+
throw Object.assign(
|
|
36
|
+
new Error(`unknown config in --only: "${n}". Valid: ${ALL_CONFIG_NAMES.join(", ")}`),
|
|
37
|
+
{ exitCode: 2 }
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return names;
|
|
42
|
+
}
|
|
43
|
+
async function dryPlanGitignore(cwd) {
|
|
44
|
+
let existing;
|
|
45
|
+
try {
|
|
46
|
+
existing = await readFile(join(cwd, ".gitignore"), "utf-8");
|
|
47
|
+
} catch {
|
|
48
|
+
return "would create .gitignore";
|
|
49
|
+
}
|
|
50
|
+
const merge = mergeGitignore(existing, CANONICAL_GITIGNORE_ENTRIES);
|
|
51
|
+
if (merge.added.length === 0) return null;
|
|
52
|
+
return `would update .gitignore (${merge.added.length} canonical entries to add)`;
|
|
53
|
+
}
|
|
54
|
+
async function dryPlan(cwd, which) {
|
|
55
|
+
const includeGitignore = which ? which.includes("gitignore") : true;
|
|
56
|
+
const templateTargets = which ? templatesByName(which.filter((c) => c !== "gitignore")) : ALL_TEMPLATES;
|
|
57
|
+
const lines = [];
|
|
58
|
+
for (const t of templateTargets) {
|
|
59
|
+
let existing = "";
|
|
60
|
+
try {
|
|
61
|
+
existing = await readFile(join(cwd, t.path), "utf-8");
|
|
62
|
+
} catch {
|
|
63
|
+
}
|
|
64
|
+
if (existing !== t.contents) lines.push(`would update ${t.path} (config: ${t.config})`);
|
|
65
|
+
}
|
|
66
|
+
if (includeGitignore) {
|
|
67
|
+
const gi = await dryPlanGitignore(cwd);
|
|
68
|
+
if (gi) lines.push(gi);
|
|
69
|
+
}
|
|
70
|
+
return lines.length === 0 ? "no changes needed" : lines.join("\n");
|
|
71
|
+
}
|
|
72
|
+
function formatResult(r) {
|
|
73
|
+
if (r.status === "noop") return `[${r.site}] noop: ${r.notes ?? "all configs in sync"}`;
|
|
74
|
+
return `[${r.site}] applied: ${r.commits.length} commit(s)
|
|
75
|
+
${r.notes ?? ""}`;
|
|
76
|
+
}
|
|
77
|
+
async function runSyncConfigsCommand(site, opts) {
|
|
78
|
+
const which = parseOnly(opts.only);
|
|
79
|
+
const cwd = opts.cwd ? resolve(opts.cwd) : process.cwd();
|
|
80
|
+
let sites = await resolveSites({
|
|
81
|
+
...site !== void 0 ? { site } : {},
|
|
82
|
+
...opts.fleet !== void 0 ? { fleet: opts.fleet } : {},
|
|
83
|
+
cwd
|
|
84
|
+
});
|
|
85
|
+
let skipped = [];
|
|
86
|
+
if (opts.fleet) {
|
|
87
|
+
const workdir = opts.workdir ?? fleetWorkdir();
|
|
88
|
+
const prep = await prepareFleetSites(sites, { workdir });
|
|
89
|
+
sites = prep.prepared;
|
|
90
|
+
skipped = prep.skipped;
|
|
91
|
+
}
|
|
92
|
+
if (opts.dry) {
|
|
93
|
+
const blocks = [];
|
|
94
|
+
for (const s of sites) {
|
|
95
|
+
blocks.push(`[${s.name || s.path}]
|
|
96
|
+
` + await dryPlan(s.path, which));
|
|
97
|
+
}
|
|
98
|
+
return { output: appendSkipNotice(blocks.join("\n\n"), skipped), code: 0 };
|
|
99
|
+
}
|
|
100
|
+
const results = [];
|
|
101
|
+
for (const s of sites) results.push(await syncConfigs(s, which ? { which } : {}));
|
|
102
|
+
const output = results.map(formatResult).join("\n");
|
|
103
|
+
const code = results.some((r) => r.status === "failed") ? 1 : 0;
|
|
104
|
+
return { output: appendSkipNotice(output, skipped), code };
|
|
105
|
+
}
|
|
106
|
+
export {
|
|
107
|
+
runSyncConfigsCommand
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=sync-configs-JPRLAW5J.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 { 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 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: RecipeResult[] = [];\n for (const s of sites) results.push(await syncConfigs(s, which ? { which } : {}));\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":[]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import {
|
|
2
|
+
appendSkipNotice,
|
|
3
|
+
fleetWorkdir,
|
|
4
|
+
prepareFleetSites
|
|
5
|
+
} from "./chunk-4NAOR44V.js";
|
|
6
|
+
import {
|
|
7
|
+
resolveSites
|
|
8
|
+
} from "./chunk-J3OPWFZE.js";
|
|
9
|
+
import {
|
|
10
|
+
upgradeSvelte4to5
|
|
11
|
+
} from "./chunk-O65I7G7G.js";
|
|
12
|
+
import "./chunk-OQPMZ6BM.js";
|
|
13
|
+
import "./chunk-XKOZUVK2.js";
|
|
14
|
+
import "./chunk-OTGB6YQO.js";
|
|
15
|
+
import "./chunk-FDIFTIXC.js";
|
|
16
|
+
import "./chunk-HVOOCK6L.js";
|
|
17
|
+
import "./chunk-XXTZBPUY.js";
|
|
18
|
+
import "./chunk-XTK5VIQB.js";
|
|
19
|
+
import "./chunk-U5SZ4FOP.js";
|
|
20
|
+
|
|
21
|
+
// src/cli/commands/upgrade.ts
|
|
22
|
+
import { resolve } from "path";
|
|
23
|
+
var KNOWN_UPGRADES = /* @__PURE__ */ new Set(["svelte-4-to-5"]);
|
|
24
|
+
function formatResult(r) {
|
|
25
|
+
if (r.status === "noop") return `[${r.site}] noop: ${r.notes ?? ""}`;
|
|
26
|
+
return `[${r.site}] applied: ${r.commits.length} commit(s)
|
|
27
|
+
${r.notes ?? ""}`;
|
|
28
|
+
}
|
|
29
|
+
async function runUpgradeCommand(upgradeName, site, opts = {}) {
|
|
30
|
+
if (!upgradeName || !KNOWN_UPGRADES.has(upgradeName)) {
|
|
31
|
+
throw Object.assign(
|
|
32
|
+
new Error(
|
|
33
|
+
`unknown upgrade: ${upgradeName ?? "(none)"}. expected one of ${[...KNOWN_UPGRADES].join(", ")}`
|
|
34
|
+
),
|
|
35
|
+
{ exitCode: 2 }
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
const cwd = opts.cwd ? resolve(opts.cwd) : process.cwd();
|
|
39
|
+
let sites = await resolveSites({
|
|
40
|
+
...site !== void 0 ? { site } : {},
|
|
41
|
+
...opts.fleet !== void 0 ? { fleet: opts.fleet } : {},
|
|
42
|
+
cwd
|
|
43
|
+
});
|
|
44
|
+
let skipped = [];
|
|
45
|
+
if (opts.fleet) {
|
|
46
|
+
const workdir = opts.workdir ?? fleetWorkdir();
|
|
47
|
+
const prep = await prepareFleetSites(sites, { workdir });
|
|
48
|
+
sites = prep.prepared;
|
|
49
|
+
skipped = prep.skipped;
|
|
50
|
+
}
|
|
51
|
+
const results = [];
|
|
52
|
+
for (const s of sites) {
|
|
53
|
+
if (upgradeName === "svelte-4-to-5") {
|
|
54
|
+
results.push(await upgradeSvelte4to5(s));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const output = results.map(formatResult).join("\n");
|
|
58
|
+
const code = results.some((r) => r.status === "failed") ? 1 : 0;
|
|
59
|
+
return { output: appendSkipNotice(output, skipped), code };
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
runUpgradeCommand
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=upgrade-ERA45EVR.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 { 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 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: RecipeResult[] = [];\n for (const s of sites) {\n if (upgradeName === \"svelte-4-to-5\") {\n results.push(await upgradeSvelte4to5(s));\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;AAOxB,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;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,UAA0B,CAAC;AACjC,aAAW,KAAK,OAAO;AACrB,QAAI,gBAAgB,iBAAiB;AACnC,cAAQ,KAAK,MAAM,kBAAkB,CAAC,CAAC;AAAA,IACzC;AAAA,EACF;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":[]}
|
package/dist/util/git.js
CHANGED
|
@@ -1,79 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
async function createBranch(cwd, name) {
|
|
21
|
-
await git(cwd, ["checkout", "-b", name]);
|
|
22
|
-
}
|
|
23
|
-
async function checkoutBranch(cwd, name) {
|
|
24
|
-
await git(cwd, ["checkout", name]);
|
|
25
|
-
}
|
|
26
|
-
async function forceCheckoutBranch(cwd, name) {
|
|
27
|
-
await git(cwd, ["checkout", "-f", name]);
|
|
28
|
-
}
|
|
29
|
-
async function deleteBranch(cwd, name) {
|
|
30
|
-
await git(cwd, ["branch", "-D", name]);
|
|
31
|
-
}
|
|
32
|
-
async function stageAll(cwd) {
|
|
33
|
-
await git(cwd, ["add", "-A"]);
|
|
34
|
-
}
|
|
35
|
-
async function listTrackedFiles(cwd) {
|
|
36
|
-
const { stdout } = await git(cwd, ["ls-files"]);
|
|
37
|
-
return stdout.split("\n").map((l) => l.trim()).filter((l) => l.length > 0);
|
|
38
|
-
}
|
|
39
|
-
async function removeFromIndex(cwd, paths) {
|
|
40
|
-
if (paths.length === 0) return;
|
|
41
|
-
await git(cwd, ["rm", "-r", "--cached", "--", ...paths]);
|
|
42
|
-
}
|
|
43
|
-
async function commit(cwd, message) {
|
|
44
|
-
await stageAll(cwd);
|
|
45
|
-
const { stdout: status } = await git(cwd, ["status", "--porcelain"]);
|
|
46
|
-
if (status.trim().length === 0) return null;
|
|
47
|
-
await git(cwd, ["commit", "-m", message]);
|
|
48
|
-
const { stdout: sha } = await git(cwd, ["rev-parse", "HEAD"]);
|
|
49
|
-
return sha.trim();
|
|
50
|
-
}
|
|
51
|
-
var OWNER_REPO_RE = /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/;
|
|
52
|
-
function isOwnerRepo(repo) {
|
|
53
|
-
if (repo.includes("..")) return false;
|
|
54
|
-
return OWNER_REPO_RE.test(repo);
|
|
55
|
-
}
|
|
56
|
-
function sameOwnerRepo(a, b) {
|
|
57
|
-
const na = isOwnerRepo(a.trim()) ? a.trim() : parseOwnerRepo(a);
|
|
58
|
-
const nb = isOwnerRepo(b.trim()) ? b.trim() : parseOwnerRepo(b);
|
|
59
|
-
if (na === null || nb === null) return false;
|
|
60
|
-
return na.toLowerCase() === nb.toLowerCase();
|
|
61
|
-
}
|
|
62
|
-
function parseOwnerRepo(remoteUrl) {
|
|
63
|
-
const trimmed = remoteUrl.trim().replace(/\.git$/, "").replace(/\/$/, "");
|
|
64
|
-
const scp = trimmed.match(/^[A-Za-z0-9._-]+@[A-Za-z0-9._-]+:(.+)$/);
|
|
65
|
-
const path = scp ? scp[1] : trimmed.replace(/^https?:\/\/[^/]+\//, "");
|
|
66
|
-
const segments = path.split("/").filter(Boolean);
|
|
67
|
-
if (segments.length < 2) return null;
|
|
68
|
-
return `${segments[segments.length - 2]}/${segments[segments.length - 1]}`;
|
|
69
|
-
}
|
|
70
|
-
async function getRemoteUrl(cwd) {
|
|
71
|
-
const { stdout } = await git(cwd, ["remote", "get-url", "origin"]);
|
|
72
|
-
return stdout.trim();
|
|
73
|
-
}
|
|
74
|
-
async function push(cwd, branch) {
|
|
75
|
-
await git(cwd, ["push", "-u", "origin", branch]);
|
|
76
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
OWNER_REPO_RE,
|
|
3
|
+
branchName,
|
|
4
|
+
checkoutBranch,
|
|
5
|
+
commit,
|
|
6
|
+
createBranch,
|
|
7
|
+
currentBranch,
|
|
8
|
+
deleteBranch,
|
|
9
|
+
forceCheckoutBranch,
|
|
10
|
+
getRemoteUrl,
|
|
11
|
+
isOwnerRepo,
|
|
12
|
+
isWorkingTreeClean,
|
|
13
|
+
listTrackedFiles,
|
|
14
|
+
parseOwnerRepo,
|
|
15
|
+
push,
|
|
16
|
+
removeFromIndex,
|
|
17
|
+
sameOwnerRepo,
|
|
18
|
+
stageAll
|
|
19
|
+
} from "../chunk-XTK5VIQB.js";
|
|
77
20
|
export {
|
|
78
21
|
OWNER_REPO_RE,
|
|
79
22
|
branchName,
|
package/dist/util/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/util/pkg.js
CHANGED
|
@@ -1,48 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
function detectIndentFromContent(raw) {
|
|
8
|
-
const match = raw.match(/\n([ \t]+)"/);
|
|
9
|
-
return match ? match[1] ?? " " : " ";
|
|
10
|
-
}
|
|
11
|
-
async function writePackageJson(path, pkg) {
|
|
12
|
-
let indent = " ";
|
|
13
|
-
try {
|
|
14
|
-
const existing = await readFile(path, "utf-8");
|
|
15
|
-
indent = detectIndentFromContent(existing);
|
|
16
|
-
} catch {
|
|
17
|
-
}
|
|
18
|
-
const content = JSON.stringify(pkg, null, indent) + "\n";
|
|
19
|
-
await writeFile(path, content, "utf-8");
|
|
20
|
-
}
|
|
21
|
-
function bumpDep(pkg, name, version, opts = {}) {
|
|
22
|
-
const mode = opts.mode ?? "ensure";
|
|
23
|
-
const next = {
|
|
24
|
-
...pkg
|
|
25
|
-
};
|
|
26
|
-
if (pkg.dependencies) {
|
|
27
|
-
next.dependencies = { ...pkg.dependencies };
|
|
28
|
-
}
|
|
29
|
-
if (pkg.devDependencies) {
|
|
30
|
-
next.devDependencies = { ...pkg.devDependencies };
|
|
31
|
-
}
|
|
32
|
-
if (next.dependencies && name in next.dependencies) {
|
|
33
|
-
if (next.dependencies[name] === version) return pkg;
|
|
34
|
-
next.dependencies[name] = version;
|
|
35
|
-
return next;
|
|
36
|
-
}
|
|
37
|
-
if (next.devDependencies && name in next.devDependencies) {
|
|
38
|
-
if (next.devDependencies[name] === version) return pkg;
|
|
39
|
-
next.devDependencies[name] = version;
|
|
40
|
-
return next;
|
|
41
|
-
}
|
|
42
|
-
if (mode === "bump-only") return pkg;
|
|
43
|
-
next.devDependencies = { ...next.devDependencies ?? {}, [name]: version };
|
|
44
|
-
return next;
|
|
45
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
bumpDep,
|
|
3
|
+
readPackageJson,
|
|
4
|
+
writePackageJson
|
|
5
|
+
} from "../chunk-OTGB6YQO.js";
|
|
46
6
|
export {
|
|
47
7
|
bumpDep,
|
|
48
8
|
readPackageJson,
|
package/dist/util/pkg.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ACTIVE_STATUSES,
|
|
3
|
+
SEVERITY_RANK,
|
|
4
|
+
WEBSITES_TABLE,
|
|
5
|
+
getWebsiteBySlug,
|
|
6
|
+
isDashboardVisible,
|
|
7
|
+
listWebsites,
|
|
8
|
+
mapRow,
|
|
9
|
+
normalizeSecurityAdvisory,
|
|
10
|
+
parseNotifyRouting,
|
|
11
|
+
parseSecurityAdvisories,
|
|
12
|
+
siteSlug,
|
|
13
|
+
updateA11yCounts,
|
|
14
|
+
updateAnalyticsHealth,
|
|
15
|
+
updateAuditFields,
|
|
16
|
+
updateDepsCounts,
|
|
17
|
+
updateGitHubSignals,
|
|
18
|
+
updateLaunched,
|
|
19
|
+
updateScores,
|
|
20
|
+
updateSecurityCounts
|
|
21
|
+
} from "./chunk-CLVTVDOU.js";
|
|
22
|
+
export {
|
|
23
|
+
ACTIVE_STATUSES,
|
|
24
|
+
SEVERITY_RANK,
|
|
25
|
+
WEBSITES_TABLE,
|
|
26
|
+
getWebsiteBySlug,
|
|
27
|
+
isDashboardVisible,
|
|
28
|
+
listWebsites,
|
|
29
|
+
mapRow,
|
|
30
|
+
normalizeSecurityAdvisory,
|
|
31
|
+
parseNotifyRouting,
|
|
32
|
+
parseSecurityAdvisories,
|
|
33
|
+
siteSlug,
|
|
34
|
+
updateA11yCounts,
|
|
35
|
+
updateAnalyticsHealth,
|
|
36
|
+
updateAuditFields,
|
|
37
|
+
updateDepsCounts,
|
|
38
|
+
updateGitHubSignals,
|
|
39
|
+
updateLaunched,
|
|
40
|
+
updateScores,
|
|
41
|
+
updateSecurityCounts
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=websites-X5DLC2PC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
formatFleetWriteSummary,
|
|
3
|
+
writeAuditsToAirtable,
|
|
4
|
+
writeFleetAuditsToAirtable
|
|
5
|
+
} from "./chunk-5WL3ET24.js";
|
|
6
|
+
import "./chunk-IMIR7SC2.js";
|
|
7
|
+
import "./chunk-CLVTVDOU.js";
|
|
8
|
+
export {
|
|
9
|
+
formatFleetWriteSummary,
|
|
10
|
+
writeAuditsToAirtable,
|
|
11
|
+
writeFleetAuditsToAirtable
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=write-audits-to-airtable-CE4POBAF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reddoorla/maintenance",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.57.0",
|
|
4
4
|
"description": "Canonical maintenance configs, audits, and recipes for the reddoor stack.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -52,26 +52,15 @@
|
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"@axe-core/playwright": "^4.11.3",
|
|
54
54
|
"@eslint/js": "^10.0.1",
|
|
55
|
-
"@google-analytics/data": "^6.1.0",
|
|
56
|
-
"@lhci/cli": "^0.15.1",
|
|
57
|
-
"@libsql/client": "^0.8.1",
|
|
58
|
-
"@libsql/kysely-libsql": "^0.4.1",
|
|
59
55
|
"@playwright/test": "^1.59.1",
|
|
60
|
-
"airtable": "^0.12.2",
|
|
61
56
|
"cac": "^6.7.14",
|
|
62
57
|
"eslint": "^10.3.0",
|
|
63
58
|
"eslint-config-prettier": "^10.1.1",
|
|
64
59
|
"eslint-plugin-svelte": "^3.1.0",
|
|
65
60
|
"globals": "^17.6.0",
|
|
66
|
-
"google-auth-library": "^10.6.2",
|
|
67
|
-
"kysely": "^0.29.2",
|
|
68
61
|
"listr2": "^10.2.1",
|
|
69
|
-
"mjml": "^4.18.0",
|
|
70
62
|
"prettier": "^3.1.1",
|
|
71
63
|
"prettier-plugin-svelte": "^3.2.6",
|
|
72
|
-
"resend": "^4.8.0",
|
|
73
|
-
"sharp": "^0.34.5",
|
|
74
|
-
"svix": "^1.94.0",
|
|
75
64
|
"tinyglobby": "^0.2.10",
|
|
76
65
|
"typescript-eslint": "^8.59.1"
|
|
77
66
|
},
|
|
@@ -85,11 +74,22 @@
|
|
|
85
74
|
},
|
|
86
75
|
"devDependencies": {
|
|
87
76
|
"@changesets/cli": "^2.31.0",
|
|
77
|
+
"@google-analytics/data": "^6.1.0",
|
|
78
|
+
"@lhci/cli": "^0.15.1",
|
|
79
|
+
"@libsql/client": "^0.8.1",
|
|
80
|
+
"@libsql/kysely-libsql": "^0.4.1",
|
|
88
81
|
"@netlify/functions": "^5.2.2",
|
|
89
82
|
"@sveltejs/kit": "^2.61.1",
|
|
90
83
|
"@types/mjml": "^4.7.4",
|
|
91
84
|
"@types/node": "^22.0.0",
|
|
92
85
|
"@vitest/coverage-v8": "^4.1.8",
|
|
86
|
+
"airtable": "^0.12.2",
|
|
87
|
+
"google-auth-library": "^10.6.2",
|
|
88
|
+
"kysely": "^0.29.2",
|
|
89
|
+
"mjml": "^4.18.0",
|
|
90
|
+
"resend": "^4.8.0",
|
|
91
|
+
"sharp": "^0.34.5",
|
|
92
|
+
"svix": "^1.94.0",
|
|
93
93
|
"tsup": "^8.3.0",
|
|
94
94
|
"tsx": "^4.19.0",
|
|
95
95
|
"typescript": "^6.0.3",
|
|
@@ -102,6 +102,7 @@
|
|
|
102
102
|
"test": "vitest run",
|
|
103
103
|
"test:watch": "vitest",
|
|
104
104
|
"test:coverage": "vitest run --coverage",
|
|
105
|
+
"pretest:dist": "pnpm run build",
|
|
105
106
|
"test:dist": "node scripts/smoke-dist.mjs",
|
|
106
107
|
"lint": "eslint . && prettier --check .",
|
|
107
108
|
"format": "prettier --write .",
|