@bensandee/tooling 0.6.0 → 0.6.2

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 (2) hide show
  1. package/dist/bin.mjs +28 -28
  2. package/package.json +3 -2
package/dist/bin.mjs CHANGED
@@ -4,6 +4,7 @@ import * as p from "@clack/prompts";
4
4
  import { execSync } from "node:child_process";
5
5
  import path from "node:path";
6
6
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
7
+ import JSON5 from "json5";
7
8
  import { parse } from "jsonc-parser";
8
9
  import { z } from "zod";
9
10
 
@@ -53,10 +54,14 @@ function parseTsconfig(raw) {
53
54
  const result = TsconfigSchema.safeParse(parse(raw));
54
55
  return result.success ? result.data : {};
55
56
  }
56
- /** Parse a JSON string as a renovate.json. Returns a typed object with `{}` fallback on failure. */
57
+ /** Parse a JSON/JSON5/JSONC string as a renovate config. Returns a typed object with `{}` fallback on failure. */
57
58
  function parseRenovateJson(raw) {
58
- const result = RenovateSchema.safeParse(parse(raw));
59
- return result.success ? result.data : {};
59
+ try {
60
+ const result = RenovateSchema.safeParse(JSON5.parse(raw));
61
+ return result.success ? result.data : {};
62
+ } catch {
63
+ return {};
64
+ }
60
65
  }
61
66
  /** Parse a JSON string as a package.json. Returns `undefined` on failure. */
62
67
  function parsePackageJson(raw) {
@@ -436,8 +441,7 @@ const STANDARD_SCRIPTS_SINGLE = {
436
441
  test: "vitest run",
437
442
  lint: "oxlint",
438
443
  knip: "knip",
439
- check: "pnpm typecheck && pnpm build && pnpm lint && pnpm knip",
440
- prepare: "lefthook install"
444
+ check: "pnpm typecheck && pnpm build && pnpm lint && pnpm knip"
441
445
  };
442
446
  const STANDARD_SCRIPTS_MONOREPO = {
443
447
  build: "pnpm -r build",
@@ -445,8 +449,7 @@ const STANDARD_SCRIPTS_MONOREPO = {
445
449
  typecheck: "pnpm -r --parallel run typecheck",
446
450
  lint: "oxlint",
447
451
  knip: "knip",
448
- check: "pnpm typecheck && pnpm build && pnpm lint && pnpm knip",
449
- prepare: "lefthook install"
452
+ check: "pnpm typecheck && pnpm build && pnpm lint && pnpm knip"
450
453
  };
451
454
  /** DevDeps that belong in every project (single repo) or per-package (monorepo). */
452
455
  const PER_PACKAGE_DEV_DEPS = {
@@ -1237,15 +1240,15 @@ const RENOVATE_CONFIG_PATHS = [
1237
1240
  ".github/renovate.json5"
1238
1241
  ];
1239
1242
  async function generateRenovate(ctx) {
1240
- const filePath = "renovate.json";
1243
+ const defaultPath = "renovate.json";
1241
1244
  if (!ctx.config.setupRenovate) return {
1242
- filePath,
1245
+ filePath: defaultPath,
1243
1246
  action: "skipped",
1244
1247
  description: "Renovate not requested"
1245
1248
  };
1246
1249
  const existingPath = RENOVATE_CONFIG_PATHS.find((p) => ctx.exists(p));
1247
- if (existingPath === filePath) {
1248
- const existing = ctx.read(filePath);
1250
+ if (existingPath) {
1251
+ const existing = ctx.read(existingPath);
1249
1252
  if (existing) {
1250
1253
  const parsed = parseRenovateJson(existing);
1251
1254
  const existingExtends = parsed.extends ?? [];
@@ -1253,9 +1256,9 @@ async function generateRenovate(ctx) {
1253
1256
  if (legacyIndex !== -1) {
1254
1257
  existingExtends[legacyIndex] = SHARED_PRESET;
1255
1258
  parsed.extends = existingExtends;
1256
- ctx.write(filePath, JSON.stringify(parsed, null, 2) + "\n");
1259
+ ctx.write(existingPath, JSON.stringify(parsed, null, 2) + "\n");
1257
1260
  return {
1258
- filePath,
1261
+ filePath: existingPath,
1259
1262
  action: "updated",
1260
1263
  description: `Migrated extends: ${LEGACY_PRESET} → ${SHARED_PRESET}`
1261
1264
  };
@@ -1263,32 +1266,27 @@ async function generateRenovate(ctx) {
1263
1266
  if (!existingExtends.includes(SHARED_PRESET)) {
1264
1267
  existingExtends.unshift(SHARED_PRESET);
1265
1268
  parsed.extends = existingExtends;
1266
- ctx.write(filePath, JSON.stringify(parsed, null, 2) + "\n");
1269
+ ctx.write(existingPath, JSON.stringify(parsed, null, 2) + "\n");
1267
1270
  return {
1268
- filePath,
1271
+ filePath: existingPath,
1269
1272
  action: "updated",
1270
1273
  description: `Added extends: ${SHARED_PRESET}`
1271
1274
  };
1272
1275
  }
1273
1276
  return {
1274
- filePath,
1277
+ filePath: existingPath,
1275
1278
  action: "skipped",
1276
1279
  description: "Already extends shared config"
1277
1280
  };
1278
1281
  }
1279
1282
  }
1280
- if (existingPath) return {
1281
- filePath: existingPath,
1282
- action: "skipped",
1283
- description: `Existing config found at ${existingPath}`
1284
- };
1285
1283
  const config = {
1286
1284
  $schema: "https://docs.renovatebot.com/renovate-schema.json",
1287
1285
  extends: [SHARED_PRESET]
1288
1286
  };
1289
- ctx.write(filePath, JSON.stringify(config, null, 2) + "\n");
1287
+ ctx.write(defaultPath, JSON.stringify(config, null, 2) + "\n");
1290
1288
  return {
1291
- filePath,
1289
+ filePath: defaultPath,
1292
1290
  action: "created",
1293
1291
  description: "Generated renovate.json extending shared config"
1294
1292
  };
@@ -1816,8 +1814,8 @@ function cleanPackageJson(ctx, results) {
1816
1814
  }
1817
1815
  }
1818
1816
  if (pkg.scripts?.["prepare"] && /\bhusky\b/.test(pkg.scripts["prepare"])) {
1819
- pkg.scripts["prepare"] = "lefthook install";
1820
- changes.push("replaced prepare script: husky → lefthook install");
1817
+ delete pkg.scripts["prepare"];
1818
+ changes.push("removed husky prepare script");
1821
1819
  }
1822
1820
  if (changes.length === 0) return;
1823
1821
  ctx.write("package.json", JSON.stringify(pkg, null, 2) + "\n");
@@ -1913,7 +1911,9 @@ const initCommand = defineCommand({
1913
1911
  });
1914
1912
  async function runInit(config, options = {}) {
1915
1913
  const detected = detectProject(config.targetDir);
1914
+ const s = p.spinner();
1916
1915
  const { ctx, archivedFiles } = createContext(config, options.confirmOverwrite ?? (async (relativePath) => {
1916
+ s.stop("Paused");
1917
1917
  const result = await p.select({
1918
1918
  message: `${relativePath} already exists. What do you want to do?`,
1919
1919
  options: [{
@@ -1924,11 +1924,11 @@ async function runInit(config, options = {}) {
1924
1924
  label: "Skip"
1925
1925
  }]
1926
1926
  });
1927
+ s.start("Generating configuration files...");
1927
1928
  if (p.isCancel(result)) return "skip";
1928
1929
  return result;
1929
1930
  }));
1930
1931
  const results = [];
1931
- const s = p.spinner();
1932
1932
  s.start("Generating configuration files...");
1933
1933
  results.push(await generatePackageJson(ctx));
1934
1934
  results.push(await generatePnpmWorkspace(ctx));
@@ -2701,7 +2701,7 @@ function mergeGitHub(dryRun) {
2701
2701
  const main = defineCommand({
2702
2702
  meta: {
2703
2703
  name: "tooling",
2704
- version: "0.6.0",
2704
+ version: "0.6.2",
2705
2705
  description: "Bootstrap and maintain standardized TypeScript project tooling"
2706
2706
  },
2707
2707
  subCommands: {
@@ -2713,7 +2713,7 @@ const main = defineCommand({
2713
2713
  "release:merge": releaseMergeCommand
2714
2714
  }
2715
2715
  });
2716
- console.log(`@bensandee/tooling v0.6.0`);
2716
+ console.log(`@bensandee/tooling v0.6.2`);
2717
2717
  runMain(main);
2718
2718
 
2719
2719
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bensandee/tooling",
3
- "version": "0.6.0",
3
+ "version": "0.6.2",
4
4
  "description": "CLI tool to bootstrap and maintain standardized TypeScript project tooling",
5
5
  "bin": {
6
6
  "tooling": "./dist/bin.mjs"
@@ -23,6 +23,7 @@
23
23
  "dependencies": {
24
24
  "@clack/prompts": "^1.0.1",
25
25
  "citty": "^0.2.1",
26
+ "json5": "^2.2.3",
26
27
  "jsonc-parser": "^3.3.1",
27
28
  "zod": "^4.3.6"
28
29
  },
@@ -31,7 +32,7 @@
31
32
  "tsdown": "0.20.3",
32
33
  "typescript": "5.9.3",
33
34
  "vitest": "4.0.18",
34
- "@bensandee/config": "0.6.0"
35
+ "@bensandee/config": "0.6.1"
35
36
  },
36
37
  "scripts": {
37
38
  "build": "tsdown",