pob 33.1.0 → 33.3.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/CHANGELOG.md CHANGED
@@ -3,6 +3,41 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [33.3.0](https://github.com/christophehurpeau/pob/compare/pob@33.2.0...pob@33.3.0) (2026-03-21)
7
+
8
+ ### Features
9
+
10
+ * add support for scripts directory in TypeScript generator
11
+ * add ts support for check-package script
12
+
13
+ ### Bug Fixes
14
+
15
+ * ensure testing prompt only appears when testing is enabled
16
+ * only delete git-hooks for legacy
17
+
18
+ Version bump for dependency: pob-dependencies
19
+ Version bump for dependency: @pob/root
20
+
21
+
22
+ ## [33.2.0](https://github.com/christophehurpeau/pob/compare/pob@33.1.0...pob@33.2.0) (2026-03-12)
23
+
24
+ ### Features
25
+
26
+ * remove nextjs and remix
27
+ * update pob/eslint-config
28
+ * use OIDC publishing
29
+
30
+ ### Bug Fixes
31
+
32
+ * handle optional TypeScript test loader in test command
33
+ * remove unnecessary dev dependency for non-monorepo packages
34
+
35
+ Version bump for dependency: @pob/sort-object
36
+ Version bump for dependency: @pob/sort-pkg
37
+ Version bump for dependency: pob-dependencies
38
+ Version bump for dependency: @pob/root
39
+
40
+
6
41
  ## [33.1.0](https://github.com/christophehurpeau/pob/compare/pob@33.0.1...pob@33.1.0) (2026-03-01)
7
42
 
8
43
  ### Bug Fixes
@@ -368,13 +368,13 @@ export default class PobAppGenerator extends Generator {
368
368
 
369
369
  switch (this.appConfig.type) {
370
370
  case "next.js":
371
- this.composeWith("pob:app:nextjs", {
372
- export: this.appConfig.export,
373
- });
374
- break;
371
+ throw new Error(
372
+ "nextjs has been removed. Please migrate to 'vite' or 'expo'.",
373
+ );
375
374
  case "remix":
376
- this.composeWith("pob:app:remix", {});
377
- break;
375
+ throw new Error(
376
+ "remix has been removed. Please migrate to 'vite' or 'expo'.",
377
+ );
378
378
  case "vite":
379
379
  this.composeWith("pob:app:vite", {});
380
380
  break;
@@ -33,13 +33,13 @@ export default class CommonHuskyGenerator extends Generator {
33
33
  this.fs.delete(".git/hooks/post-checkout");
34
34
  this.fs.delete(".git/hooks/post-merge");
35
35
  this.fs.delete(".git/hooks/pre-commit");
36
- }
37
36
 
38
- this.fs.delete(".git-hooks/prepare-commit-msg");
39
- this.fs.delete(".git-hooks/post-checkout");
40
- this.fs.delete(".git-hooks/post-merge");
41
- this.fs.delete(".git-hooks/pre-commit");
42
- if (this.fs.exists(".git-hooks")) this.fs.delete(".git-hooks");
37
+ this.fs.delete(".git-hooks/prepare-commit-msg");
38
+ this.fs.delete(".git-hooks/post-checkout");
39
+ this.fs.delete(".git-hooks/post-merge");
40
+ this.fs.delete(".git-hooks/pre-commit");
41
+ if (this.fs.exists(".git-hooks")) this.fs.delete(".git-hooks");
42
+ }
43
43
 
44
44
  if (this.fs.exists(this.destinationPath(".huskyrc.js"))) {
45
45
  this.fs.delete(this.destinationPath(".huskyrc.js"));
@@ -1,5 +1,5 @@
1
1
  import Generator from "yeoman-generator";
2
- import { latestLTS } from "../../../utils/nodeVersions.js";
2
+ // import { latestLTS } from "../../../utils/nodeVersions.js";
3
3
  import * as packageUtils from "../../../utils/package.js";
4
4
 
5
5
  export default class CommonReleaseGenerator extends Generator {
@@ -82,7 +82,7 @@ export default class CommonReleaseGenerator extends Generator {
82
82
  isMonorepoIndependent:
83
83
  this.options.isMonorepo &&
84
84
  (!pkg.version || pkg.version === "0.0.0"),
85
- nodeLatestMajorVersion: latestLTS,
85
+ nodeLatestMajorVersion: 24, // TODO use latestLTS, when latest is updated to 24
86
86
  },
87
87
  );
88
88
  } else {
@@ -89,9 +89,6 @@ jobs:
89
89
  - name: New version
90
90
  if: github.ref == 'refs/heads/main' && !inputs.dry-run
91
91
  run: |
92
- <% if (packageManager === "bun") { -%>
93
- npm install -g npm@latest
94
- <% } -%>
95
92
  <%= packageManager %> run pob-version <% if (enablePublish && packageManager === "bun") { %>--publish <% } %>--create-release=github <% if (isMonorepo && isMonorepoIndependent) { %> --bump-dependents-highest-as=${{ inputs.bump-dependents-highest-as }}<% } %> -m 'chore: release <%- isMonorepoIndependent ? '' : '%v ' %>[skip ci]<%- isMonorepoIndependent ? '\\n\\n%t' : '' %>'
96
93
  env:
97
94
  POB_GIT_HOOKS: 0
@@ -102,17 +99,9 @@ jobs:
102
99
  - name: Publish to npm
103
100
  if: github.ref == 'refs/heads/main' && !inputs.dry-run
104
101
  run: |
105
- if [ -z "$NPM_AUTH_TOKEN" ]; then
106
- echo "Missing env variable NPM_AUTH_TOKEN"
107
- exit 1
108
- fi
109
- echo >> ./.yarnrc.yml
110
- echo "npmAuthToken: $NPM_AUTH_TOKEN" >> ./.yarnrc.yml
111
102
  <% if (isMonorepo) { -%>
112
103
  yarn workspaces foreach --all --parallel --no-private npm publish --tolerate-republish
113
104
  <% } else { -%>
114
105
  yarn npm publish
115
106
  <% } -%>
116
- env:
117
- NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
118
107
  <% } -%>
@@ -108,7 +108,7 @@ export default class CommonTestingGenerator extends Generator {
108
108
  }
109
109
 
110
110
  async prompting() {
111
- if (this.options.runner === "jest") {
111
+ if (this.options.enable && this.options.runner === "jest") {
112
112
  const { confirm } = await this.prompt([
113
113
  {
114
114
  type: "confirm",
@@ -316,7 +316,9 @@ export default class CommonTestingGenerator extends Generator {
316
316
  } --all --src ./${this.options.srcDirectory} `
317
317
  : ""
318
318
  }node ${
319
- this.options.typescript ? `${tsTestLoaderOption} ` : ""
319
+ this.options.typescript
320
+ ? `${tsTestLoaderOption ? `${tsTestLoaderOption} ` : ""}`
321
+ : ""
320
322
  }${this.fs.exists("src/test-setup.ts") ? "--import ./src/test-setup.ts " : ""}--test${experimentalTestCoverage && (coverage || coverageJson) ? " --experimental-test-coverage" : ""} ${this.options.monorepo ? `${workspacesPattern}/*/` : ""}${`${
321
323
  hasTestFolder ? "test/*" : `${this.options.srcDirectory}/**/*.test`
322
324
  }.${this.options.typescript ? "ts" : "js"}`}`;
@@ -306,6 +306,9 @@ export default class CommonTypescriptGenerator extends Generator {
306
306
  monorepoPackageReferences,
307
307
  rootDir: this.options.rootDir,
308
308
  srcDirectory: this.options.srcDirectory || this.options.rootDir,
309
+ scriptsDirectory: this.fs.exists(this.destinationPath("scripts"))
310
+ ? "scripts"
311
+ : undefined,
309
312
  jsx,
310
313
  jsxPreserve: this.options.jsxPreserve,
311
314
  nextConfig: this.options.nextConfig,
@@ -4,7 +4,8 @@
4
4
  <%- presets.map(p => `"${p}"`).join(',\n ') %><% } %>
5
5
  ],
6
6
  "include": [
7
- "<%= srcDirectory %>/**/*.ts"<% if (jsx) { -%>,
7
+ "<%= srcDirectory %>/**/*.ts"<% if (scriptsDirectory) { -%>,
8
+ "<%= scriptsDirectory %>/**/*.ts",<% } %><% if (jsx) { -%>,
8
9
  "<%= srcDirectory %>/**/*.tsx"<% } %><% if (srcDirectory !== rootDir) { -%>,
9
10
  "<%= rootDir %>/*.ts"<% } %><% if (additionalIncludes.length > 0) { -%>,
10
11
  <%- additionalIncludes.map(adi => `"${adi}"`).join(',\n ') %><% } %>
@@ -254,30 +254,41 @@ export default class CorePackageGenerator extends Generator {
254
254
  let doesJsCheckPackageExists = this.fs.exists(
255
255
  this.destinationPath("scripts/check-package.js"),
256
256
  );
257
+ const doesTsCheckPackageExists = this.fs.exists(
258
+ this.destinationPath("scripts/check-package.ts"),
259
+ );
257
260
 
258
261
  if (pkg.type === "module") {
259
- if (!doesJsCheckPackageExists) {
262
+ if (!doesJsCheckPackageExists && !doesTsCheckPackageExists) {
260
263
  doesJsCheckPackageExists = true;
261
264
  this.fs.copyTpl(
262
265
  this.templatePath("check-package.js.ejs"),
263
- this.destinationPath("scripts/check-package.js"),
266
+ this.destinationPath("scripts/check-package.ts"),
264
267
  {
265
268
  isLibrary: pkg.private !== true,
266
269
  },
267
270
  );
268
271
  }
269
272
  }
270
- if (doesJsCheckPackageExists || doesMjsCheckPackageExists) {
273
+ if (
274
+ doesJsCheckPackageExists ||
275
+ doesMjsCheckPackageExists ||
276
+ doesTsCheckPackageExists
277
+ ) {
271
278
  packageUtils.addDevDependencies(pkg, ["check-package-dependencies"]);
272
279
  }
273
280
 
274
281
  packageUtils.addOrRemoveScripts(
275
282
  pkg,
276
- doesMjsCheckPackageExists || doesJsCheckPackageExists,
283
+ doesMjsCheckPackageExists ||
284
+ doesJsCheckPackageExists ||
285
+ doesTsCheckPackageExists,
277
286
  {
278
- checks: `node scripts/check-package.${
279
- doesMjsCheckPackageExists ? "mjs" : "js"
280
- }`,
287
+ checks: `node scripts/check-package.${(() => {
288
+ if (doesMjsCheckPackageExists) return "mjs";
289
+ if (doesTsCheckPackageExists) return "ts";
290
+ return "js";
291
+ })()}`,
281
292
  },
282
293
  );
283
294
  }
@@ -81,10 +81,6 @@ export default class MonorepoWorkspacesGenerator extends Generator {
81
81
  delete pkg.engines.yarn;
82
82
  }
83
83
 
84
- if (pkg.name !== "pob-monorepo") {
85
- packageUtils.addDevDependencies(pkg, ["repository-check-dirty"]);
86
- }
87
-
88
84
  const monorepoConfig = this.config.get("monorepo");
89
85
  const packageManager = this.options.packageManager;
90
86
 
package/lib/pob.js CHANGED
@@ -13,8 +13,6 @@ import minimist from "minimist";
13
13
  import * as yeoman from "yeoman-environment";
14
14
  import PobAppGenerator from "./generators/app/PobAppGenerator.js";
15
15
  import AppE2ETestingGenerator from "./generators/app/e2e-testing/AppE2ETestingGenerator.js";
16
- import AppNextjsGenerator from "./generators/app/nextjs/AppNextjsGenerator.js";
17
- import AppRemixGenerator from "./generators/app/remix/AppRemixGenerator.js";
18
16
  import AppViteGenerator from "./generators/app/vite/AppViteGenerator.js";
19
17
  import CommonBabelGenerator from "./generators/common/babel/CommonBabelGenerator.js";
20
18
  import CommonLintGenerator from "./generators/common/format-lint/CommonLintGenerator.js";
@@ -97,16 +95,6 @@ env.registerStub(
97
95
  "pob:app:e2e-testing",
98
96
  `${__dirname}/generators/app/e2e-testing/AppE2ETestingGenerator.js`,
99
97
  );
100
- env.registerStub(
101
- AppNextjsGenerator,
102
- "pob:app:nextjs",
103
- `${__dirname}/generators/app/nextjs/AppNextjsGenerator.js`,
104
- );
105
- env.registerStub(
106
- AppRemixGenerator,
107
- "pob:app:remix",
108
- `${__dirname}/generators/app/nextjs/AppRemixGenerator.js`,
109
- );
110
98
  env.registerStub(
111
99
  AppViteGenerator,
112
100
  "pob:app:vite",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pob",
3
- "version": "33.1.0",
3
+ "version": "33.3.0",
4
4
  "description": "Pile of bones, library generator with git/babel/typescript/typedoc/readme/jest",
5
5
  "keywords": [
6
6
  "skeleton"
@@ -36,22 +36,22 @@
36
36
  "build:definitions": "tsc -p tsconfig.json",
37
37
  "format": "prettier --write",
38
38
  "lint": "yarn run lint:eslint",
39
- "lint:eslint": "yarn ../.. run eslint --quiet 'packages/pob'"
39
+ "lint:eslint": "yarn '../..' run eslint --quiet 'packages/pob'"
40
40
  },
41
41
  "pob": {
42
42
  "typescript": "check-only"
43
43
  },
44
44
  "prettier": "@pob/root/prettier-config",
45
45
  "dependencies": {
46
- "@pob/eslint-config": "65.0.2",
47
- "@pob/eslint-config-typescript-react": "65.0.2",
48
- "@pob/sort-object": "10.1.1",
49
- "@pob/sort-pkg": "12.1.1",
46
+ "@pob/eslint-config": "65.2.0",
47
+ "@pob/eslint-config-typescript-react": "65.2.0",
48
+ "@pob/sort-object": "10.1.2",
49
+ "@pob/sort-pkg": "12.1.2",
50
50
  "@prettier/sync": "0.6.1",
51
51
  "@types/inquirer": "9.0.9",
52
52
  "@yeoman/adapter": "3.1.0",
53
53
  "@yeoman/types": "1.8.0",
54
- "eslint": "9.39.3",
54
+ "eslint": "10.0.3",
55
55
  "findup-sync": "^5.0.0",
56
56
  "git-remote-url": "^1.0.1",
57
57
  "github-username": "^9.0.0",
@@ -63,7 +63,7 @@
63
63
  "mem-fs-editor": "11.1.4",
64
64
  "minimist": "1.2.8",
65
65
  "parse-author": "2.0.0",
66
- "pob-dependencies": "22.1.0",
66
+ "pob-dependencies": "22.2.1",
67
67
  "prettier": "3.8.1",
68
68
  "semver": "7.7.4",
69
69
  "typescript": "5.9.3",
@@ -72,7 +72,7 @@
72
72
  "yeoman-generator": "7.5.1"
73
73
  },
74
74
  "devDependencies": {
75
- "@pob/root": "22.1.0",
76
- "@types/node": "22.19.1"
75
+ "@pob/root": "22.3.0",
76
+ "@types/node": "22.19.15"
77
77
  }
78
78
  }
@@ -1,28 +0,0 @@
1
- import Generator from "yeoman-generator";
2
- import * as packageUtils from "../../../utils/package.js";
3
-
4
- export default class AppNextjsGenerator extends Generator {
5
- constructor(args, opts) {
6
- super(args, opts);
7
-
8
- this.option("export", {
9
- type: Boolean,
10
- required: false,
11
- default: true,
12
- description: "Use next export.",
13
- });
14
- }
15
-
16
- writing() {
17
- const pkg = this.fs.readJSON(this.destinationPath("package.json"));
18
-
19
- packageUtils.addScripts(pkg, {
20
- start: "next dev",
21
- "start:prod": "next start",
22
- // NODE_ENV=production is for tamagui
23
- build: "NODE_ENV=production next build",
24
- });
25
-
26
- this.fs.writeJSON(this.destinationPath("package.json"), pkg);
27
- }
28
- }
@@ -1,17 +0,0 @@
1
- import Generator from "yeoman-generator";
2
- import * as packageUtils from "../../../utils/package.js";
3
-
4
- // run "yarn create remix remix" first, then "cd remix ; pob app"
5
- export default class AppRemixGenerator extends Generator {
6
- writing() {
7
- const pkg = this.fs.readJSON(this.destinationPath("package.json"));
8
-
9
- packageUtils.addScripts(pkg, {
10
- build: "cross-env NODE_ENV=production remix build",
11
- start: "cross-env NODE_ENV=development remix dev",
12
- "start:prod": "cross-env NODE_ENV=production remix-serve build",
13
- });
14
-
15
- this.fs.writeJSON(this.destinationPath("package.json"), pkg);
16
- }
17
- }