@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.
Files changed (150) hide show
  1. package/README.md +3 -1
  2. package/dist/airtable-2BJX4ATJ.js +9 -0
  3. package/dist/airtable-2BJX4ATJ.js.map +1 -0
  4. package/dist/announce-JEVCDDKL.js +171 -0
  5. package/dist/announce-JEVCDDKL.js.map +1 -0
  6. package/dist/bump-deps-O3SOLQYY.js +57 -0
  7. package/dist/bump-deps-O3SOLQYY.js.map +1 -0
  8. package/dist/chunk-2X322ZES.js +99 -0
  9. package/dist/chunk-2X322ZES.js.map +1 -0
  10. package/dist/chunk-4NAOR44V.js +153 -0
  11. package/dist/chunk-4NAOR44V.js.map +1 -0
  12. package/dist/chunk-4PY4I5OR.js +1167 -0
  13. package/dist/chunk-4PY4I5OR.js.map +1 -0
  14. package/dist/chunk-5L2QXUTU.js +279 -0
  15. package/dist/chunk-5L2QXUTU.js.map +1 -0
  16. package/dist/chunk-5WL3ET24.js +203 -0
  17. package/dist/chunk-5WL3ET24.js.map +1 -0
  18. package/dist/chunk-6LIWDIXU.js +38 -0
  19. package/dist/chunk-6LIWDIXU.js.map +1 -0
  20. package/dist/chunk-6VAL7XJT.js +52 -0
  21. package/dist/chunk-6VAL7XJT.js.map +1 -0
  22. package/dist/chunk-BWLUNY7L.js +585 -0
  23. package/dist/chunk-BWLUNY7L.js.map +1 -0
  24. package/dist/chunk-CASCWQQX.js +161 -0
  25. package/dist/chunk-CASCWQQX.js.map +1 -0
  26. package/dist/chunk-CLVTVDOU.js +274 -0
  27. package/dist/chunk-CLVTVDOU.js.map +1 -0
  28. package/dist/chunk-D3DQFC32.js +79 -0
  29. package/dist/chunk-D3DQFC32.js.map +1 -0
  30. package/dist/chunk-EYODPUHV.js +37 -0
  31. package/dist/chunk-EYODPUHV.js.map +1 -0
  32. package/dist/chunk-FDIFTIXC.js +70 -0
  33. package/dist/chunk-FDIFTIXC.js.map +1 -0
  34. package/dist/chunk-FUD4I2ZW.js +35 -0
  35. package/dist/chunk-FUD4I2ZW.js.map +1 -0
  36. package/dist/chunk-HG5DTFNF.js +62 -0
  37. package/dist/chunk-HG5DTFNF.js.map +1 -0
  38. package/dist/chunk-HN6I2XWI.js +65 -0
  39. package/dist/chunk-HN6I2XWI.js.map +1 -0
  40. package/dist/chunk-HVOOCK6L.js +84 -0
  41. package/dist/chunk-HVOOCK6L.js.map +1 -0
  42. package/dist/chunk-IMIR7SC2.js +51 -0
  43. package/dist/chunk-IMIR7SC2.js.map +1 -0
  44. package/dist/chunk-J3OPWFZE.js +64 -0
  45. package/dist/chunk-J3OPWFZE.js.map +1 -0
  46. package/dist/chunk-J4ECCFRT.js +221 -0
  47. package/dist/chunk-J4ECCFRT.js.map +1 -0
  48. package/dist/chunk-JNXCDUYB.js +211 -0
  49. package/dist/chunk-JNXCDUYB.js.map +1 -0
  50. package/dist/chunk-JQG222CI.js +49 -0
  51. package/dist/chunk-JQG222CI.js.map +1 -0
  52. package/dist/chunk-LKGVSM2O.js +43 -0
  53. package/dist/chunk-LKGVSM2O.js.map +1 -0
  54. package/dist/chunk-LYCKN7ZR.js +41 -0
  55. package/dist/chunk-LYCKN7ZR.js.map +1 -0
  56. package/dist/chunk-MKSZBODM.js +162 -0
  57. package/dist/chunk-MKSZBODM.js.map +1 -0
  58. package/dist/chunk-O65I7G7G.js +246 -0
  59. package/dist/chunk-O65I7G7G.js.map +1 -0
  60. package/dist/chunk-OCS7SZUZ.js +243 -0
  61. package/dist/chunk-OCS7SZUZ.js.map +1 -0
  62. package/dist/chunk-OGGRFBL4.js +14 -0
  63. package/dist/chunk-OGGRFBL4.js.map +1 -0
  64. package/dist/chunk-OQPMZ6BM.js +368 -0
  65. package/dist/chunk-OQPMZ6BM.js.map +1 -0
  66. package/dist/chunk-OTGB6YQO.js +52 -0
  67. package/dist/chunk-OTGB6YQO.js.map +1 -0
  68. package/dist/chunk-PZQ3WED2.js +14 -0
  69. package/dist/chunk-PZQ3WED2.js.map +1 -0
  70. package/dist/chunk-QTHKOIFJ.js +13 -0
  71. package/dist/chunk-QTHKOIFJ.js.map +1 -0
  72. package/dist/chunk-U5SZ4FOP.js +26 -0
  73. package/dist/chunk-U5SZ4FOP.js.map +1 -0
  74. package/dist/chunk-W3G7XFBZ.js +444 -0
  75. package/dist/chunk-W3G7XFBZ.js.map +1 -0
  76. package/dist/chunk-WEKL2HYJ.js +31 -0
  77. package/dist/chunk-WEKL2HYJ.js.map +1 -0
  78. package/dist/chunk-WVRPOXKH.js +74 -0
  79. package/dist/chunk-WVRPOXKH.js.map +1 -0
  80. package/dist/chunk-XKOZUVK2.js +121 -0
  81. package/dist/chunk-XKOZUVK2.js.map +1 -0
  82. package/dist/chunk-XO2RUYVM.js +138 -0
  83. package/dist/chunk-XO2RUYVM.js.map +1 -0
  84. package/dist/chunk-XTK5VIQB.js +97 -0
  85. package/dist/chunk-XTK5VIQB.js.map +1 -0
  86. package/dist/chunk-XXTZBPUY.js +9 -0
  87. package/dist/chunk-XXTZBPUY.js.map +1 -0
  88. package/dist/chunk-ZYBOT5PM.js +153 -0
  89. package/dist/chunk-ZYBOT5PM.js.map +1 -0
  90. package/dist/cli/bin.js +75 -7785
  91. package/dist/cli/bin.js.map +1 -1
  92. package/dist/cli/commands/audit.js +37 -2336
  93. package/dist/cli/commands/audit.js.map +1 -1
  94. package/dist/client-EPVO3FEH.js +10 -0
  95. package/dist/client-EPVO3FEH.js.map +1 -0
  96. package/dist/client-JA6QLEDW.js +48 -0
  97. package/dist/client-JA6QLEDW.js.map +1 -0
  98. package/dist/configs/lighthouse.js +4 -31
  99. package/dist/configs/lighthouse.js.map +1 -1
  100. package/dist/configs/playwright-a11y.js +6 -33
  101. package/dist/configs/playwright-a11y.js.map +1 -1
  102. package/dist/convert-to-pnpm-UR64X3OX.js +51 -0
  103. package/dist/convert-to-pnpm-UR64X3OX.js.map +1 -0
  104. package/dist/db-AXKMRTVA.js +23 -0
  105. package/dist/db-AXKMRTVA.js.map +1 -0
  106. package/dist/digest-YTO73BEO.js +408 -0
  107. package/dist/digest-YTO73BEO.js.map +1 -0
  108. package/dist/forms/index.js +3 -8
  109. package/dist/forms/index.js.map +1 -1
  110. package/dist/github-signals-XLQXXH6Q.js +116 -0
  111. package/dist/github-signals-XLQXXH6Q.js.map +1 -0
  112. package/dist/index.js +102 -4757
  113. package/dist/index.js.map +1 -1
  114. package/dist/init-JITQXFVL.js +85 -0
  115. package/dist/init-JITQXFVL.js.map +1 -0
  116. package/dist/launch-XW6PEKUL.js +207 -0
  117. package/dist/launch-XW6PEKUL.js.map +1 -0
  118. package/dist/lighthouse-airtable-4FKYKFH6.js +12 -0
  119. package/dist/lighthouse-airtable-4FKYKFH6.js.map +1 -0
  120. package/dist/migrate-P2LS4WXI.js +7 -0
  121. package/dist/migrate-P2LS4WXI.js.map +1 -0
  122. package/dist/onboard-TCQOP2W4.js +69 -0
  123. package/dist/onboard-TCQOP2W4.js.map +1 -0
  124. package/dist/orchestrate-LHH3LQNP.js +23 -0
  125. package/dist/orchestrate-LHH3LQNP.js.map +1 -0
  126. package/dist/recipes/sync-configs.js +9 -505
  127. package/dist/recipes/sync-configs.js.map +1 -1
  128. package/dist/renovate-dispatch-YVBTBJJY.js +100 -0
  129. package/dist/renovate-dispatch-YVBTBJJY.js.map +1 -0
  130. package/dist/report-WK3SKWJI.js +240 -0
  131. package/dist/report-WK3SKWJI.js.map +1 -0
  132. package/dist/resend-G2BJMAQV.js +7 -0
  133. package/dist/resend-G2BJMAQV.js.map +1 -0
  134. package/dist/self-updating-BYUBUNO4.js +61 -0
  135. package/dist/self-updating-BYUBUNO4.js.map +1 -0
  136. package/dist/svelte-codemods-BYRJAU7I.js +51 -0
  137. package/dist/svelte-codemods-BYRJAU7I.js.map +1 -0
  138. package/dist/sync-configs-JPRLAW5J.js +109 -0
  139. package/dist/sync-configs-JPRLAW5J.js.map +1 -0
  140. package/dist/upgrade-ERA45EVR.js +64 -0
  141. package/dist/upgrade-ERA45EVR.js.map +1 -0
  142. package/dist/util/git.js +19 -76
  143. package/dist/util/git.js.map +1 -1
  144. package/dist/util/pkg.js +5 -45
  145. package/dist/util/pkg.js.map +1 -1
  146. package/dist/websites-X5DLC2PC.js +43 -0
  147. package/dist/websites-X5DLC2PC.js.map +1 -0
  148. package/dist/write-audits-to-airtable-CE4POBAF.js +13 -0
  149. package/dist/write-audits-to-airtable-CE4POBAF.js.map +1 -0
  150. 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
- // src/util/git.ts
2
- import { execFile } from "child_process";
3
- import { promisify } from "util";
4
- var exec = promisify(execFile);
5
- async function git(cwd, args) {
6
- return exec("git", args, { cwd, env: process.env });
7
- }
8
- function branchName(recipe, when = /* @__PURE__ */ new Date()) {
9
- const compact = when.toISOString().replace(/[-:.]/g, "");
10
- return `maint/${recipe}-${compact}`;
11
- }
12
- async function currentBranch(cwd) {
13
- const { stdout } = await git(cwd, ["rev-parse", "--abbrev-ref", "HEAD"]);
14
- return stdout.trim();
15
- }
16
- async function isWorkingTreeClean(cwd) {
17
- const { stdout } = await git(cwd, ["status", "--porcelain"]);
18
- return stdout.trim().length === 0;
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,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/util/git.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst exec = promisify(execFile);\n\nasync function git(cwd: string, args: string[]): Promise<{ stdout: string; stderr: string }> {\n return exec(\"git\", args, { cwd, env: process.env });\n}\n\nexport function branchName(recipe: string, when: Date = new Date()): string {\n // ISO with millisecond precision: 2026-05-20T10:30:00.123Z → 20260520T103000123Z.\n // Millis (vs. second-precision) shrinks the collision window for parallel runs.\n const compact = when.toISOString().replace(/[-:.]/g, \"\");\n return `maint/${recipe}-${compact}`;\n}\n\nexport async function currentBranch(cwd: string): Promise<string> {\n const { stdout } = await git(cwd, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]);\n return stdout.trim();\n}\n\nexport async function isWorkingTreeClean(cwd: string): Promise<boolean> {\n const { stdout } = await git(cwd, [\"status\", \"--porcelain\"]);\n return stdout.trim().length === 0;\n}\n\nexport async function createBranch(cwd: string, name: string): Promise<void> {\n await git(cwd, [\"checkout\", \"-b\", name]);\n}\n\n/** Check out an existing branch. Throws (via git) if the branch is missing or\n * the checkout is blocked (e.g. uncommitted changes that would be overwritten). */\nexport async function checkoutBranch(cwd: string, name: string): Promise<void> {\n await git(cwd, [\"checkout\", name]);\n}\n\n/**\n * Force-check-out an existing branch, DISCARDING any uncommitted changes on the\n * current branch. Used by the recipe failure path to return the operator to\n * their original branch even when a recipe left the work-in-progress branch\n * dirty. Only ever called with the operator's ORIGINAL branch as `name`. Does\n * not run `git clean`, so untracked operator files are left untouched.\n */\nexport async function forceCheckoutBranch(cwd: string, name: string): Promise<void> {\n await git(cwd, [\"checkout\", \"-f\", name]);\n}\n\n/**\n * Delete a local branch with `-D` (force). Used by the recipe failure path to\n * remove the branch the recipe itself created so a re-run starts clean. Callers\n * MUST only ever pass the recipe-created branch here, never the operator's\n * original branch.\n */\nexport async function deleteBranch(cwd: string, name: string): Promise<void> {\n await git(cwd, [\"branch\", \"-D\", name]);\n}\n\nexport async function stageAll(cwd: string): Promise<void> {\n await git(cwd, [\"add\", \"-A\"]);\n}\n\nexport async function listTrackedFiles(cwd: string): Promise<string[]> {\n const { stdout } = await git(cwd, [\"ls-files\"]);\n return stdout\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n}\n\nexport async function removeFromIndex(cwd: string, paths: string[]): Promise<void> {\n if (paths.length === 0) return;\n await git(cwd, [\"rm\", \"-r\", \"--cached\", \"--\", ...paths]);\n}\n\n/**\n * Stages all current changes and commits with `message`. Returns the commit SHA,\n * or `null` if there was nothing to commit.\n */\nexport async function commit(cwd: string, message: string): Promise<string | null> {\n await stageAll(cwd);\n const { stdout: status } = await git(cwd, [\"status\", \"--porcelain\"]);\n if (status.trim().length === 0) return null;\n await git(cwd, [\"commit\", \"-m\", message]);\n const { stdout: sha } = await git(cwd, [\"rev-parse\", \"HEAD\"]);\n return sha.trim();\n}\n\n/**\n * Strict GitHub repo identity: exactly two `[A-Za-z0-9._-]` segments separated\n * by a single slash. Rejects a scheme, host, extra path segment, traversal\n * (`..`), whitespace, or an argv flag — anything that could retarget a `gh`\n * write at an unintended (attacker/typo-controlled) repo.\n */\nexport const OWNER_REPO_RE = /^[A-Za-z0-9._-]+\\/[A-Za-z0-9._-]+$/;\n\n/** True when `repo` is a clean `owner/repo` (see {@link OWNER_REPO_RE}). The\n * explicit `..` reject covers traversal segments the char-class would otherwise\n * admit (`.` is a legal repo char, so `../evil` matches the shape regex). */\nexport function isOwnerRepo(repo: string): boolean {\n if (repo.includes(\"..\")) return false;\n return OWNER_REPO_RE.test(repo);\n}\n\n/**\n * True when two repo references name the same `owner/repo`. Each side may be a\n * full remote URL (https or scp-style), or already an `owner/repo`. Used to\n * verify an existing checkout's `origin` matches the site's expected repo\n * before reusing it. Returns false if either side is unparseable.\n */\nexport function sameOwnerRepo(a: string, b: string): boolean {\n const na = isOwnerRepo(a.trim()) ? a.trim() : parseOwnerRepo(a);\n const nb = isOwnerRepo(b.trim()) ? b.trim() : parseOwnerRepo(b);\n if (na === null || nb === null) return false;\n return na.toLowerCase() === nb.toLowerCase();\n}\n\n/** Derive `owner/repo` from a git remote URL (https or scp-style). Null if unparseable. */\nexport function parseOwnerRepo(remoteUrl: string): string | null {\n const trimmed = remoteUrl\n .trim()\n .replace(/\\.git$/, \"\")\n .replace(/\\/$/, \"\");\n // scp-style: git@github.com:owner/repo\n const scp = trimmed.match(/^[A-Za-z0-9._-]+@[A-Za-z0-9._-]+:(.+)$/);\n const path = scp ? scp[1]! : trimmed.replace(/^https?:\\/\\/[^/]+\\//, \"\");\n const segments = path.split(\"/\").filter(Boolean);\n if (segments.length < 2) return null;\n return `${segments[segments.length - 2]}/${segments[segments.length - 1]}`;\n}\n\n/** `origin` remote URL for a checkout, trimmed. Throws (via git) if there's no origin. */\nexport async function getRemoteUrl(cwd: string): Promise<string> {\n const { stdout } = await git(cwd, [\"remote\", \"get-url\", \"origin\"]);\n return stdout.trim();\n}\n\n/** Push a branch to origin, setting upstream. Throws on non-zero (execFile rejects). */\nexport async function push(cwd: string, branch: string): Promise<void> {\n await git(cwd, [\"push\", \"-u\", \"origin\", branch]);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/util/pkg.js CHANGED
@@ -1,48 +1,8 @@
1
- // src/util/pkg.ts
2
- import { readFile, writeFile } from "fs/promises";
3
- async function readPackageJson(path) {
4
- const raw = await readFile(path, "utf-8");
5
- return JSON.parse(raw);
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,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/util/pkg.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\n\nexport type PackageJsonLike = {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\nexport async function readPackageJson(path: string): Promise<PackageJsonLike> {\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw) as PackageJsonLike;\n}\n\n/** Sniff the indent style (tab vs 2 vs 4 vs N spaces) from existing package.json\n * content by looking at the first indented `\"key\"` line. Defaults to two spaces. */\nfunction detectIndentFromContent(raw: string): string {\n const match = raw.match(/\\n([ \\t]+)\"/);\n return match ? (match[1] ?? \" \") : \" \";\n}\n\nexport async function writePackageJson(path: string, pkg: PackageJsonLike): Promise<void> {\n let indent = \" \";\n try {\n const existing = await readFile(path, \"utf-8\");\n indent = detectIndentFromContent(existing);\n } catch {\n // file doesn't exist yet — first write — keep the 2-space default\n }\n const content = JSON.stringify(pkg, null, indent) + \"\\n\";\n await writeFile(path, content, \"utf-8\");\n}\n\nexport type BumpDepMode =\n | \"ensure\" // default: add to devDependencies if missing\n | \"bump-only\"; // never add; only update existing entries\n\nexport type BumpDepOptions = {\n mode?: BumpDepMode;\n};\n\nexport function bumpDep(\n pkg: PackageJsonLike,\n name: string,\n version: string,\n opts: BumpDepOptions = {},\n): PackageJsonLike {\n const mode = opts.mode ?? \"ensure\";\n\n const next: PackageJsonLike = {\n ...pkg,\n };\n\n if (pkg.dependencies) {\n next.dependencies = { ...pkg.dependencies };\n }\n if (pkg.devDependencies) {\n next.devDependencies = { ...pkg.devDependencies };\n }\n\n if (next.dependencies && name in next.dependencies) {\n if (next.dependencies[name] === version) return pkg;\n next.dependencies[name] = version;\n return next;\n }\n if (next.devDependencies && name in next.devDependencies) {\n if (next.devDependencies[name] === version) return pkg;\n next.devDependencies[name] = version;\n return next;\n }\n // Not present in either map. bump-only leaves the pkg alone so recipes\n // can express \"raise the floor on packages this site already uses\" without\n // also installing every related dep across the fleet.\n if (mode === \"bump-only\") return pkg;\n next.devDependencies = { ...(next.devDependencies ?? {}), [name]: version };\n return next;\n}\n"],"mappings":";AAAA,SAAS,UAAU,iBAAiB;AAUpC,eAAsB,gBAAgB,MAAwC;AAC5E,QAAM,MAAM,MAAM,SAAS,MAAM,OAAO;AACxC,SAAO,KAAK,MAAM,GAAG;AACvB;AAIA,SAAS,wBAAwB,KAAqB;AACpD,QAAM,QAAQ,IAAI,MAAM,aAAa;AACrC,SAAO,QAAS,MAAM,CAAC,KAAK,OAAQ;AACtC;AAEA,eAAsB,iBAAiB,MAAc,KAAqC;AACxF,MAAI,SAAS;AACb,MAAI;AACF,UAAM,WAAW,MAAM,SAAS,MAAM,OAAO;AAC7C,aAAS,wBAAwB,QAAQ;AAAA,EAC3C,QAAQ;AAAA,EAER;AACA,QAAM,UAAU,KAAK,UAAU,KAAK,MAAM,MAAM,IAAI;AACpD,QAAM,UAAU,MAAM,SAAS,OAAO;AACxC;AAUO,SAAS,QACd,KACA,MACA,SACA,OAAuB,CAAC,GACP;AACjB,QAAM,OAAO,KAAK,QAAQ;AAE1B,QAAM,OAAwB;AAAA,IAC5B,GAAG;AAAA,EACL;AAEA,MAAI,IAAI,cAAc;AACpB,SAAK,eAAe,EAAE,GAAG,IAAI,aAAa;AAAA,EAC5C;AACA,MAAI,IAAI,iBAAiB;AACvB,SAAK,kBAAkB,EAAE,GAAG,IAAI,gBAAgB;AAAA,EAClD;AAEA,MAAI,KAAK,gBAAgB,QAAQ,KAAK,cAAc;AAClD,QAAI,KAAK,aAAa,IAAI,MAAM,QAAS,QAAO;AAChD,SAAK,aAAa,IAAI,IAAI;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,mBAAmB,QAAQ,KAAK,iBAAiB;AACxD,QAAI,KAAK,gBAAgB,IAAI,MAAM,QAAS,QAAO;AACnD,SAAK,gBAAgB,IAAI,IAAI;AAC7B,WAAO;AAAA,EACT;AAIA,MAAI,SAAS,YAAa,QAAO;AACjC,OAAK,kBAAkB,EAAE,GAAI,KAAK,mBAAmB,CAAC,GAAI,CAAC,IAAI,GAAG,QAAQ;AAC1E,SAAO;AACT;","names":[]}
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.55.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 .",