@reddoorla/maintenance 0.2.0 → 0.4.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/cli/bin.js +183 -6
- package/dist/cli/bin.js.map +1 -1
- package/dist/configs/svelte.d.ts +39 -0
- package/dist/configs/svelte.js +30 -0
- package/dist/configs/svelte.js.map +1 -0
- package/dist/index.d.ts +14 -3
- package/dist/index.js +119 -2
- package/dist/index.js.map +1 -1
- package/dist/recipes/sync-configs.d.ts +1 -1
- package/dist/recipes/sync-configs.js +19 -1
- package/dist/recipes/sync-configs.js.map +1 -1
- package/dist/{sync-configs-7XIzzN_L.d.ts → sync-configs-C56tK7Go.d.ts} +2 -2
- package/package.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/recipes/sync-configs.ts","../../src/recipes/sync-configs/templates.ts","../../src/util/git.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { RecipeResult, Site, ConfigName } from \"../types.js\";\nimport { ALL_TEMPLATES, templatesByName, type ConfigTemplate } from \"./sync-configs/templates.js\";\nimport { branchName, commit, createBranch, isWorkingTreeClean } from \"../util/git.js\";\n\nexport type SyncConfigsOptions = {\n which?: ConfigName[];\n};\n\nfunction siteLabel(site: Site): string {\n return site.name ?? site.path;\n}\n\nasync function readMaybe(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nasync function planDiffs(cwd: string, templates: ConfigTemplate[]): Promise<ConfigTemplate[]> {\n const diffs: ConfigTemplate[] = [];\n for (const t of templates) {\n const existing = await readMaybe(join(cwd, t.path));\n if (existing !== t.contents) diffs.push(t);\n }\n return diffs;\n}\n\nexport async function syncConfigs(\n site: Site,\n opts: SyncConfigsOptions = {},\n): Promise<RecipeResult> {\n const label = siteLabel(site);\n const targets = opts.which ? templatesByName(opts.which) : ALL_TEMPLATES;\n\n const diffs = await planDiffs(site.path, targets);\n if (diffs.length === 0) {\n return {\n recipe: \"sync-configs\",\n site: label,\n status: \"noop\",\n commits: [],\n notes: \"all targeted configs already match\",\n };\n }\n\n if (!(await isWorkingTreeClean(site.path))) {\n throw new Error(`refusing to run: working tree is not clean at ${site.path}`);\n }\n\n const branch = branchName(\"sync-configs\");\n await createBranch(site.path, branch);\n\n const shas: string[] = [];\n for (const t of diffs) {\n await writeFile(join(site.path, t.path), t.contents, \"utf-8\");\n const sha = await commit(\n site.path,\n `chore: sync ${t.config} config from @reddoorla/maintenance`,\n );\n if (sha) shas.push(sha);\n }\n\n return {\n recipe: \"sync-configs\",\n site: label,\n status: \"applied\",\n commits: shas,\n notes: `branch: ${branch}`,\n };\n}\n","import type { ConfigName } from \"../../types.js\";\n\nexport type ConfigTemplate = {\n config: ConfigName;\n path: string;\n contents: string;\n};\n\nconst eslint: ConfigTemplate = {\n config: \"eslint\",\n path: \"eslint.config.js\",\n contents: `import { createEslintConfig } from \"@reddoorla/maintenance/configs/eslint\";\nimport svelteConfig from \"./svelte.config.js\";\n\nexport default createEslintConfig({ svelteConfig });\n`,\n};\n\nconst prettier: ConfigTemplate = {\n config: \"prettier\",\n path: \".prettierrc.json\",\n contents: `{\n \"trailingComma\": \"all\",\n \"singleQuote\": false,\n \"printWidth\": 100,\n \"plugins\": [\"prettier-plugin-svelte\"]\n}\n`,\n};\n\nconst lighthouse: ConfigTemplate = {\n config: \"lighthouse\",\n path: \"lighthouserc.json\",\n contents: `${JSON.stringify(\n {\n $note:\n \"Generated by @reddoorla/maintenance sync-configs; edit src/configs/lighthouse.ts in the package instead.\",\n extends: \"@reddoorla/maintenance/configs/lighthouse\",\n },\n null,\n 2,\n )}\n`,\n};\n\nconst playwrightA11y: ConfigTemplate = {\n config: \"playwright-a11y\",\n path: \"playwright.config.ts\",\n contents: `export { default } from \"@reddoorla/maintenance/configs/playwright-a11y\";\n`,\n};\n\nexport const ALL_TEMPLATES: ConfigTemplate[] = [eslint
|
|
1
|
+
{"version":3,"sources":["../../src/recipes/sync-configs.ts","../../src/recipes/sync-configs/templates.ts","../../src/util/git.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { RecipeResult, Site, ConfigName } from \"../types.js\";\nimport { ALL_TEMPLATES, templatesByName, type ConfigTemplate } from \"./sync-configs/templates.js\";\nimport { branchName, commit, createBranch, isWorkingTreeClean } from \"../util/git.js\";\n\nexport type SyncConfigsOptions = {\n which?: ConfigName[];\n};\n\nfunction siteLabel(site: Site): string {\n return site.name ?? site.path;\n}\n\nasync function readMaybe(path: string): Promise<string | null> {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nasync function planDiffs(cwd: string, templates: ConfigTemplate[]): Promise<ConfigTemplate[]> {\n const diffs: ConfigTemplate[] = [];\n for (const t of templates) {\n const existing = await readMaybe(join(cwd, t.path));\n if (existing !== t.contents) diffs.push(t);\n }\n return diffs;\n}\n\nexport async function syncConfigs(\n site: Site,\n opts: SyncConfigsOptions = {},\n): Promise<RecipeResult> {\n const label = siteLabel(site);\n const targets = opts.which ? templatesByName(opts.which) : ALL_TEMPLATES;\n\n const diffs = await planDiffs(site.path, targets);\n if (diffs.length === 0) {\n return {\n recipe: \"sync-configs\",\n site: label,\n status: \"noop\",\n commits: [],\n notes: \"all targeted configs already match\",\n };\n }\n\n if (!(await isWorkingTreeClean(site.path))) {\n throw new Error(`refusing to run: working tree is not clean at ${site.path}`);\n }\n\n const branch = branchName(\"sync-configs\");\n await createBranch(site.path, branch);\n\n const shas: string[] = [];\n for (const t of diffs) {\n await writeFile(join(site.path, t.path), t.contents, \"utf-8\");\n const sha = await commit(\n site.path,\n `chore: sync ${t.config} config from @reddoorla/maintenance`,\n );\n if (sha) shas.push(sha);\n }\n\n return {\n recipe: \"sync-configs\",\n site: label,\n status: \"applied\",\n commits: shas,\n notes: `branch: ${branch}`,\n };\n}\n","import type { ConfigName } from \"../../types.js\";\n\nexport type ConfigTemplate = {\n config: ConfigName;\n path: string;\n contents: string;\n};\n\nconst eslint: ConfigTemplate = {\n config: \"eslint\",\n path: \"eslint.config.js\",\n contents: `import { createEslintConfig } from \"@reddoorla/maintenance/configs/eslint\";\nimport svelteConfig from \"./svelte.config.js\";\n\nexport default createEslintConfig({ svelteConfig });\n`,\n};\n\nconst prettier: ConfigTemplate = {\n config: \"prettier\",\n path: \".prettierrc.json\",\n contents: `{\n \"trailingComma\": \"all\",\n \"singleQuote\": false,\n \"printWidth\": 100,\n \"plugins\": [\"prettier-plugin-svelte\"]\n}\n`,\n};\n\nconst lighthouse: ConfigTemplate = {\n config: \"lighthouse\",\n path: \"lighthouserc.json\",\n contents: `${JSON.stringify(\n {\n $note:\n \"Generated by @reddoorla/maintenance sync-configs; edit src/configs/lighthouse.ts in the package instead.\",\n extends: \"@reddoorla/maintenance/configs/lighthouse\",\n },\n null,\n 2,\n )}\n`,\n};\n\nconst playwrightA11y: ConfigTemplate = {\n config: \"playwright-a11y\",\n path: \"playwright.config.ts\",\n contents: `export { default } from \"@reddoorla/maintenance/configs/playwright-a11y\";\n`,\n};\n\nconst svelte: ConfigTemplate = {\n config: \"svelte\",\n path: \"svelte.config.js\",\n contents: `import { createSvelteConfig } from \"@reddoorla/maintenance/configs/svelte\";\nimport adapter from \"@sveltejs/adapter-auto\";\n\n/** @type {import('@sveltejs/kit').Config} */\nexport default createSvelteConfig({\n kit: { adapter: adapter() },\n});\n`,\n};\n\nexport const ALL_TEMPLATES: ConfigTemplate[] = [\n eslint,\n prettier,\n lighthouse,\n playwrightA11y,\n svelte,\n];\n\nexport function templatesByName(which: ConfigName[]): ConfigTemplate[] {\n return ALL_TEMPLATES.filter((t) => which.includes(t.config));\n}\n","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 const iso = when.toISOString().replace(/[-:.]/g, \"\").replace(/Z$/, \"Z\");\n // 2026-05-20T10:30:00.000Z → 20260520T103000000Z; trim millis:\n const trimmed = iso.replace(/(\\d{8}T\\d{6})\\d+(Z)$/, \"$1$2\");\n return `maint/${recipe}-${trimmed}`;\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\nexport async function stageAll(cwd: string): Promise<void> {\n await git(cwd, [\"add\", \"-A\"]);\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"],"mappings":"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","names":[]}
|
|
@@ -5,8 +5,8 @@ type Site = {
|
|
|
5
5
|
meta?: Record<string, unknown>;
|
|
6
6
|
};
|
|
7
7
|
type AuditName = "deps" | "lighthouse" | "a11y" | "security" | "lint";
|
|
8
|
-
type RecipeName = "sync-configs" | "bump-deps" | "svelte-4-to-5" | "convert-to-pnpm";
|
|
9
|
-
type ConfigName = "lighthouse" | "eslint" | "prettier" | "playwright-a11y";
|
|
8
|
+
type RecipeName = "sync-configs" | "bump-deps" | "svelte-4-to-5" | "convert-to-pnpm" | "onboard";
|
|
9
|
+
type ConfigName = "lighthouse" | "eslint" | "prettier" | "playwright-a11y" | "svelte";
|
|
10
10
|
type AuditResult = {
|
|
11
11
|
audit: AuditName;
|
|
12
12
|
site: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reddoorla/maintenance",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Canonical maintenance configs, audits, and recipes for the reddoor stack.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -36,6 +36,10 @@
|
|
|
36
36
|
"./configs/playwright-a11y": {
|
|
37
37
|
"types": "./dist/configs/playwright-a11y.d.ts",
|
|
38
38
|
"import": "./dist/configs/playwright-a11y.js"
|
|
39
|
+
},
|
|
40
|
+
"./configs/svelte": {
|
|
41
|
+
"types": "./dist/configs/svelte.d.ts",
|
|
42
|
+
"import": "./dist/configs/svelte.js"
|
|
39
43
|
}
|
|
40
44
|
},
|
|
41
45
|
"bin": {
|