pob 38.4.0 → 38.6.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 (39) hide show
  1. package/lib/generators/app/PobAppGenerator.js +21 -3
  2. package/lib/generators/app/ignorePaths.js +4 -1
  3. package/lib/generators/common/e2e/CommonE2eGenerator.js +1 -1
  4. package/lib/generators/common/format-lint/CommonLintGenerator.js +43 -9
  5. package/lib/generators/common/format-lint/templates/oxfmtrc.jsonc.ejs +1 -1
  6. package/lib/generators/common/release/CommonReleaseGenerator.js +8 -13
  7. package/lib/generators/common/release/templates/workflow-release.yml.ejs +5 -0
  8. package/lib/generators/common/testing/CommonTestingGenerator.js +2 -2
  9. package/lib/generators/common/transpiler/CommonTranspilerGenerator.js +1 -81
  10. package/lib/generators/common/typescript/templates/tsconfig.tools.json.ejs +1 -0
  11. package/lib/generators/core/ci/CoreCIGenerator.js +1 -7
  12. package/lib/generators/core/ci/templates/github-action-documentation-workflow.yml.ejs +7 -2
  13. package/lib/generators/core/ci/templates/github-action-push-workflow-split.yml.ejs +18 -0
  14. package/lib/generators/core/ci/templates/github-action-push-workflow.yml.ejs +5 -2
  15. package/lib/generators/core/git/generators/github/CoreGitGithubGenerator.js +22 -2
  16. package/lib/generators/core/gitignore/CoreGitignoreGenerator.js +0 -8
  17. package/lib/generators/core/gitignore/templates/gitignore.ejs +6 -4
  18. package/lib/generators/core/node/CoreNodeGenerator.js +24 -0
  19. package/lib/generators/core/package/CorePackageGenerator.js +1 -17
  20. package/lib/generators/core/vscode/templates/extensions.json.ejs +1 -0
  21. package/lib/generators/core/vscode/templates/settings.json.ejs +1 -0
  22. package/lib/generators/generatedDocsOutputPath.test.js +39 -0
  23. package/lib/generators/lib/PobLibGenerator.js +31 -3
  24. package/lib/generators/lib/doc/LibDocGenerator.js +5 -2
  25. package/lib/generators/lib/doc/templates/tsconfig.doc.json.ejs +1 -1
  26. package/lib/generators/lib/doc/templates/tsconfig.doc.json.lerna.ejs +1 -1
  27. package/lib/generators/lib/readme/templates/README.md.ejs +1 -1
  28. package/lib/generators/monorepo/PobMonorepoGenerator.js +20 -6
  29. package/lib/generators/monorepo/typescript/templates/tsconfig.json.ejs +4 -4
  30. package/lib/generators/monorepo/typescript/templates/tsconfig.tools.json.ejs +5 -1
  31. package/lib/generators/monorepo/workspaces/MonorepoWorkspacesGenerator.js +2 -1
  32. package/lib/pob.js +6 -0
  33. package/lib/utils/git.js +27 -0
  34. package/lib/utils/legacyGeneratedDocs.js +26 -0
  35. package/lib/utils/legacyGeneratedDocs.test.js +58 -0
  36. package/lib/utils/nodeEngines.js +124 -0
  37. package/lib/utils/nodeEngines.test.js +168 -0
  38. package/lib/utils/packageManagerUtils.js +17 -0
  39. package/package.json +11 -10
@@ -0,0 +1,168 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ resolveEnginesNode,
4
+ updateNodeEngines,
5
+ updateTypesNodeFromEngines,
6
+ } from "./nodeEngines.js";
7
+
8
+ describe("updateTypesNodeFromEngines", () => {
9
+ it("updates devDependencies when lower than engines min major", () => {
10
+ const pkg = {
11
+ engines: { node: ">=24.14.1" },
12
+ devDependencies: { "@types/node": "22.5.0" },
13
+ };
14
+ updateTypesNodeFromEngines(pkg);
15
+ expect(pkg.devDependencies["@types/node"]).toBe(">=24.0.0");
16
+ });
17
+
18
+ it("keeps devDependencies with the same major", () => {
19
+ const pkg = {
20
+ engines: { node: ">=24.14.1" },
21
+ devDependencies: { "@types/node": "24.13.3" },
22
+ };
23
+ updateTypesNodeFromEngines(pkg);
24
+ expect(pkg.devDependencies["@types/node"]).toBe("24.13.3");
25
+ });
26
+
27
+ it("never lowers devDependencies", () => {
28
+ const pkg = {
29
+ engines: { node: ">=22.18.0" },
30
+ devDependencies: { "@types/node": "24.13.3" },
31
+ };
32
+ updateTypesNodeFromEngines(pkg);
33
+ expect(pkg.devDependencies["@types/node"]).toBe("24.13.3");
34
+ });
35
+
36
+ it("updates a devDependencies range", () => {
37
+ const pkg = {
38
+ engines: { node: ">=24.14.1" },
39
+ devDependencies: { "@types/node": ">=22.0.0" },
40
+ };
41
+ updateTypesNodeFromEngines(pkg);
42
+ expect(pkg.devDependencies["@types/node"]).toBe(">=24.0.0");
43
+ });
44
+
45
+ it("normalizes dependencies", () => {
46
+ const pkg = {
47
+ engines: { node: ">=22.18.0" },
48
+ dependencies: { "@types/node": ">=24.0.0" },
49
+ };
50
+ updateTypesNodeFromEngines(pkg);
51
+ expect(pkg.dependencies["@types/node"]).toBe(">=22.0.0");
52
+ });
53
+
54
+ it("does not add @types/node", () => {
55
+ const pkg = { engines: { node: ">=24.14.1" }, devDependencies: {} };
56
+ updateTypesNodeFromEngines(pkg);
57
+ expect(pkg.devDependencies["@types/node"]).toBeUndefined();
58
+ });
59
+
60
+ it("does nothing without a parseable engines.node", () => {
61
+ const pkg = {
62
+ engines: { node: "lts/*" },
63
+ devDependencies: { "@types/node": "22.5.0" },
64
+ };
65
+ updateTypesNodeFromEngines(pkg);
66
+ expect(pkg.devDependencies["@types/node"]).toBe("22.5.0");
67
+
68
+ const pkgWithoutEngines = { devDependencies: { "@types/node": "22.5.0" } };
69
+ updateTypesNodeFromEngines(pkgWithoutEngines);
70
+ expect(pkgWithoutEngines.devDependencies["@types/node"]).toBe("22.5.0");
71
+ });
72
+
73
+ it.each(["workspace:*", "catalog:", "npm:types-node@22.5.0"])(
74
+ "keeps unparseable version %s",
75
+ (version) => {
76
+ const pkg = {
77
+ engines: { node: ">=24.14.1" },
78
+ devDependencies: { "@types/node": version },
79
+ };
80
+ updateTypesNodeFromEngines(pkg);
81
+ expect(pkg.devDependencies["@types/node"]).toBe(version);
82
+ },
83
+ );
84
+ });
85
+
86
+ describe("resolveEnginesNode", () => {
87
+ it.each([
88
+ ["18", ">=22.18.0"],
89
+ ["22", ">=22.18.0"],
90
+ ["24", ">=24.14.1"],
91
+ ["26", ">=26.0.0"],
92
+ ])("resolves min major %s from envs", (minMajor, expected) => {
93
+ expect(resolveEnginesNode(">=22.18.0", minMajor, true)).toBe(expected);
94
+ });
95
+
96
+ it("throws on an unsupported min major", () => {
97
+ expect(() => resolveEnginesNode(">=22.18.0", "25", true)).toThrow(
98
+ "Invalid min node version: 25",
99
+ );
100
+ });
101
+
102
+ it("migrates >=22.11.x", () => {
103
+ expect(resolveEnginesNode(">=22.11.0", "22", false)).toBe(">=22.18.0");
104
+ });
105
+
106
+ it("raises a lower engines.node without envs", () => {
107
+ expect(resolveEnginesNode(">=18.0.0", "22", false)).toBe(">=22.18.0");
108
+ });
109
+
110
+ it("keeps a higher engines.node without envs", () => {
111
+ expect(resolveEnginesNode(">=26.0.0", "22", false)).toBe(">=26.0.0");
112
+ });
113
+
114
+ it("lets envs lower engines.node", () => {
115
+ expect(resolveEnginesNode(">=24.14.1", "22", true)).toBe(">=22.18.0");
116
+ });
117
+ });
118
+
119
+ describe("updateNodeEngines", () => {
120
+ it("sets engines.node and @types/node from envs", () => {
121
+ const pkg = {
122
+ pob: { envs: [{ target: "node", version: "24" }] },
123
+ devDependencies: { "@types/node": "22.5.0" },
124
+ };
125
+ updateNodeEngines(pkg, {});
126
+ expect(pkg.engines.node).toBe(">=24.14.1");
127
+ expect(pkg.devDependencies["@types/node"]).toBe(">=24.0.0");
128
+ });
129
+
130
+ it("supports babelEnvs", () => {
131
+ const pkg = { pob: { babelEnvs: [{ target: "node", version: "24" }] } };
132
+ updateNodeEngines(pkg, {});
133
+ expect(pkg.engines.node).toBe(">=24.14.1");
134
+ });
135
+
136
+ it("uses the maintenance LTS without envs", () => {
137
+ const pkg = {};
138
+ updateNodeEngines(pkg, {});
139
+ expect(pkg.engines.node).toBe(">=22.18.0");
140
+ });
141
+
142
+ it("uses the latest LTS without envs when onlyLatestLTS", () => {
143
+ const pkg = {};
144
+ updateNodeEngines(pkg, { onlyLatestLTS: true });
145
+ expect(pkg.engines.node).toBe(">=24.14.1");
146
+ });
147
+
148
+ it("removes @types/node when there is no node target", () => {
149
+ const pkg = {
150
+ pob: { envs: [{ target: "browser" }] },
151
+ dependencies: { "@types/node": ">=22.0.0" },
152
+ devDependencies: { "@types/node": "24.13.3", typescript: "6.0.0" },
153
+ };
154
+ updateNodeEngines(pkg, {});
155
+ expect(pkg.dependencies).toBeUndefined();
156
+ expect(pkg.devDependencies["@types/node"]).toBeUndefined();
157
+ expect(pkg.engines.node).toBe(">=22.18.0");
158
+ });
159
+
160
+ it("keeps a higher engines.node when there is no node target", () => {
161
+ const pkg = {
162
+ pob: { envs: [{ target: "browser" }] },
163
+ engines: { node: ">=24.14.1" },
164
+ };
165
+ updateNodeEngines(pkg, {});
166
+ expect(pkg.engines.node).toBe(">=24.14.1");
167
+ });
168
+ });
@@ -34,6 +34,23 @@ export const packageManagerExec = (packageManager, command) => {
34
34
  }
35
35
  };
36
36
 
37
+ // `pnpm run` and `npm run` only resolve package.json scripts, not binaries
38
+ export const packageManagerExecWithCwd = (packageManager, cwd, command) => {
39
+ switch (packageManager) {
40
+ case undefined:
41
+ case "yarn":
42
+ return `yarn ${quoteArg(cwd)} run ${command}`;
43
+ case "npm":
44
+ return `cd ${quoteArg(cwd)} && npx ${command}`;
45
+ case "bun":
46
+ return `bun run --cwd ${quoteArg(cwd)} ${command}`;
47
+ case "pnpm":
48
+ return `pnpm --dir ${quoteArg(cwd)} exec ${command}`;
49
+ default:
50
+ throw new Error(`Unsupported package manager: ${packageManager}`);
51
+ }
52
+ };
53
+
37
54
  export const packageManagerRunWithCwd = (packageManager, cwd, script) => {
38
55
  switch (packageManager) {
39
56
  case undefined:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pob",
3
- "version": "38.4.0",
3
+ "version": "38.6.0",
4
4
  "description": "Pile of bones, library generator with git/babel/typescript/typedoc/readme/vitest",
5
5
  "keywords": [
6
6
  "skeleton"
@@ -30,7 +30,7 @@
30
30
  "dependencies": {
31
31
  "@types/inquirer": "9.0.10",
32
32
  "@yeoman/adapter": "4.0.2",
33
- "eslint": "10.8.0",
33
+ "eslint": "10.8.1",
34
34
  "findup-sync": "^5.0.0",
35
35
  "git-remote-url": "^1.0.1",
36
36
  "github-username": "^9.0.0",
@@ -48,17 +48,17 @@
48
48
  "validate-npm-package-name": "^8.0.0",
49
49
  "yeoman-environment": "6.1.0",
50
50
  "yeoman-generator": "8.2.2",
51
- "@pob/eslint-config-typescript-react": "67.3.0",
52
- "pob-dependencies": "27.3.0",
53
- "@pob/sort-object": "11.1.1",
54
- "@pob/sort-pkg": "13.1.2",
55
- "@pob/eslint-config": "67.3.0"
51
+ "@pob/eslint-config": "67.5.0",
52
+ "@pob/sort-object": "11.1.2",
53
+ "@pob/eslint-config-typescript-react": "67.5.0",
54
+ "@pob/sort-pkg": "13.1.3",
55
+ "pob-dependencies": "27.5.0"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/node": "24.13.3",
59
59
  "@typescript/native": "npm:typescript@7.0.2",
60
60
  "@yeoman/types": "1.11.1",
61
- "@pob/root": "27.4.0"
61
+ "@pob/root": "27.6.0"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=22.18.0"
@@ -69,8 +69,9 @@
69
69
  "scripts": {
70
70
  "build": "pnpm run build:definitions",
71
71
  "build:definitions": "tsc -p tsconfig.json",
72
- "lint": "pnpm run lint:eslint",
73
- "lint:eslint": "pnpm run --dir '../..' eslint --quiet 'packages/pob'",
72
+ "lint": "pnpm run lint:oxlint && pnpm run lint:eslint",
73
+ "lint:eslint": "pnpm --dir '../..' exec eslint --quiet 'packages/pob'",
74
+ "lint:oxlint": "pnpm --dir '../..' exec oxlint 'packages/pob'",
74
75
  "tsc": "tsc"
75
76
  },
76
77
  "bin": {