pob 13.2.3 → 13.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/CHANGELOG.md CHANGED
@@ -3,6 +3,56 @@
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
+ ## [13.4.0](https://github.com/christophehurpeau/pob/compare/pob@13.3.0...pob@13.4.0) (2023-08-14)
7
+
8
+
9
+ ### Features
10
+
11
+ * **deps:** update dependency eslint to v8.45.0 ([#1708](https://github.com/christophehurpeau/pob/issues/1708)) ([9113ab1](https://github.com/christophehurpeau/pob/commit/9113ab18fe809614382d9e2fbb8180892f31962e))
12
+ * **deps:** update dependency eslint to v8.46.0 ([#1717](https://github.com/christophehurpeau/pob/issues/1717)) ([e40f88b](https://github.com/christophehurpeau/pob/commit/e40f88b7db84e544e9a5992f654f79bfd0d1aaf8))
13
+ * **deps:** update dependency eslint to v8.47.0 ([#1732](https://github.com/christophehurpeau/pob/issues/1732)) ([333b820](https://github.com/christophehurpeau/pob/commit/333b820c07d500d6aba8f4af3e62125787ab8c22))
14
+ * improve jest config ([8243486](https://github.com/christophehurpeau/pob/commit/82434867b2ba54e1f6eb9faee0a56e38e218d4bf))
15
+ * **pob:** add name in publish job ([4a2bc0f](https://github.com/christophehurpeau/pob/commit/4a2bc0f44bd195425227bfe7e340b0a6169715f2))
16
+ * **pob:** ci plugin yarn version ([7ee583e](https://github.com/christophehurpeau/pob/commit/7ee583eba40a1a609c7c98e459f4e36b394d447e))
17
+ * **pob:** configure types in extraEntries ([10548e2](https://github.com/christophehurpeau/pob/commit/10548e2a55a51f1541412ce8149587c58391a9e7))
18
+ * **pob:** disable tsc cache for apps ([f7b3c46](https://github.com/christophehurpeau/pob/commit/f7b3c46640e68719cbf6c1c08d5b43393d6102f1))
19
+ * **pob:** improve config for app node-library ([3812f31](https://github.com/christophehurpeau/pob/commit/3812f31bd9ed48467f7f31a2d7e29ce1daa04074))
20
+ * **pob:** support esbuild ([a0ece75](https://github.com/christophehurpeau/pob/commit/a0ece756603ca84bcdf2f0c45dde3123ca9b90f7))
21
+ * support tamagui ([8a8e9d4](https://github.com/christophehurpeau/pob/commit/8a8e9d4b87ae5809120e42b04de10729c8a81d94))
22
+
23
+
24
+ ### Bug Fixes
25
+
26
+ * add early return if token is missing ([afeff46](https://github.com/christophehurpeau/pob/commit/afeff4685a6031fbb1aeaecc4e8a551f1ea3938d))
27
+ * configure types in exports for non babel libraries ([e1ed4cf](https://github.com/christophehurpeau/pob/commit/e1ed4cf8634daa5ecb69f64baf97af8bec8a7311))
28
+ * **deps:** update dependency semver to v7.5.4 ([#1703](https://github.com/christophehurpeau/pob/issues/1703)) ([0656af8](https://github.com/christophehurpeau/pob/commit/0656af8a33c72353bc94596478620cec1fff373d))
29
+ * **deps:** update dependency yeoman-generator to v6.0.0-rc.3 ([#1720](https://github.com/christophehurpeau/pob/issues/1720)) ([f397a89](https://github.com/christophehurpeau/pob/commit/f397a890efbe842d82721131f3812dfdc1ed22a3))
30
+ * fix ignore paths for apps ([be6b9c1](https://github.com/christophehurpeau/pob/commit/be6b9c19792a973cce2b77525fecabb56192d53d))
31
+ * fixes for publish workflow ([101ecdb](https://github.com/christophehurpeau/pob/commit/101ecdb32c60875f5b1bac9fa07cd2358485b42e))
32
+ * intialize yarn before getting cached package.json ([ef595bc](https://github.com/christophehurpeau/pob/commit/ef595bc01296ee5b119ec93e64cd89e5e87cfcdc))
33
+ * keep @babel/preset-react for rollup plugins ([f44881e](https://github.com/christophehurpeau/pob/commit/f44881e676afc4a23d7df19e798d293c7a476e98))
34
+ * **pob:** dont use yarn plugin for eslint-config as it is a monorepo with fixed version ([a93cb1f](https://github.com/christophehurpeau/pob/commit/a93cb1fbbed480280d83ffcd40d1ad2adbb17578))
35
+ * **pob:** export types for private package ([c0e78d1](https://github.com/christophehurpeau/pob/commit/c0e78d1d4c066d9c8e86c9d7aa8b7bfc613e15fc))
36
+ * **pob:** fix alp-dev check in dependencies ([4ebc6bb](https://github.com/christophehurpeau/pob/commit/4ebc6bb3eed9aaee8273e02022957824284d39c7))
37
+ * **pob:** fix publish with yarn ([d683add](https://github.com/christophehurpeau/pob/commit/d683addfb20ba95751f84bdd94dfeda0380ddf13))
38
+ * **pob:** fixes and enable yarn plugin version for eslint-configs ([396ffea](https://github.com/christophehurpeau/pob/commit/396ffea15749afe68be4de3d929d83327ff204ba))
39
+ * **pob:** keep incremental true even when cacheEnabled is false ([3e95d46](https://github.com/christophehurpeau/pob/commit/3e95d4664f90b087dcd42fbabea799e67a0d771d))
40
+ * **pob:** node 20 is not yet lts ([0cd5460](https://github.com/christophehurpeau/pob/commit/0cd54609acb348bc88edd985466bbf5b7b13cfce))
41
+ * **pob:** only enable incremental if cache is enabled ([f7c9d2a](https://github.com/christophehurpeau/pob/commit/f7c9d2af5dbc67a61261184410678546f26881e8))
42
+ * **pob:** remove noEmitOnError when noEmit is enabled ([7d9dfa2](https://github.com/christophehurpeau/pob/commit/7d9dfa2d6666577af4e93f96943ebfdb355fe2a5))
43
+
44
+
45
+
46
+ ## [13.3.0](https://github.com/christophehurpeau/pob/compare/pob@13.2.3...pob@13.3.0) (2023-07-05)
47
+
48
+
49
+ ### Features
50
+
51
+ * **deps:** update dependency eslint to v8.44.0 ([#1694](https://github.com/christophehurpeau/pob/issues/1694)) ([1b75923](https://github.com/christophehurpeau/pob/commit/1b75923242c12b624c7c74585d3484c191c913ec))
52
+ * **pob:** add config for yarn-plugin app ([c18d783](https://github.com/christophehurpeau/pob/commit/c18d783621291bd22ea367bf6ca77b7cd84ec661))
53
+
54
+
55
+
6
56
  ## [13.2.3](https://github.com/christophehurpeau/pob/compare/pob@13.2.2...pob@13.2.3) (2023-06-30)
7
57
 
8
58
 
@@ -5,7 +5,14 @@ import inLerna from '../../utils/inLerna.js';
5
5
  import * as packageUtils from '../../utils/package.js';
6
6
  import { appIgnorePaths } from './ignorePaths.js';
7
7
 
8
- const appsWithTypescript = ['alp', 'next.js', 'remix', 'pobpack', 'expo'];
8
+ const appsWithTypescript = [
9
+ 'alp',
10
+ 'next.js',
11
+ 'remix',
12
+ 'pobpack',
13
+ 'expo',
14
+ 'yarn-plugin',
15
+ ];
9
16
  const appsWithBrowser = ['alp', 'next.js', 'remix'];
10
17
 
11
18
  export default class PobAppGenerator extends Generator {
@@ -114,6 +121,9 @@ export default class PobAppGenerator extends Generator {
114
121
  }
115
122
 
116
123
  default() {
124
+ const srcDir = this.appConfig.type === 'yarn-plugin' ? 'sources' : 'src';
125
+ const isAppLibrary = this.appConfig.type === 'node-library';
126
+
117
127
  if (
118
128
  this.appConfig.type === 'node' ||
119
129
  this.appConfig.type === 'node-library' ||
@@ -121,7 +131,8 @@ export default class PobAppGenerator extends Generator {
121
131
  ) {
122
132
  this.composeWith('pob:common:babel', {
123
133
  updateOnly: this.options.updateOnly,
124
- isApp: this.appConfig.type !== 'node-library',
134
+ isApp: true,
135
+ isAppLibrary,
125
136
  useAppConfig: this.appConfig.type === 'alp-node',
126
137
  testing: this.appConfig.testing,
127
138
  documentation: false,
@@ -146,15 +157,22 @@ export default class PobAppGenerator extends Generator {
146
157
  ? pkg.pob.jsx
147
158
  : packageUtils.hasReact(pkg);
148
159
 
160
+ if (!appIgnorePaths[this.appConfig.type]) {
161
+ throw new Error(`Unknown app type: ${this.appConfig.type}`);
162
+ }
163
+
149
164
  const ignorePaths = appIgnorePaths[this.appConfig.type](
150
165
  this.appConfig,
166
+ pkg,
151
167
  ).filter(Boolean);
152
168
 
153
169
  this.composeWith('pob:common:typescript', {
154
170
  enable: babel,
171
+ isApp: true,
172
+ isAppLibrary,
155
173
  // nextjs now supports src
156
- rootDir: this.appConfig.type === 'expo' ? '.' : 'src',
157
- srcDir: 'src',
174
+ rootDir: this.appConfig.type === 'expo' ? '.' : srcDir,
175
+ srcDir,
158
176
  builddefs: false,
159
177
  dom: browser,
160
178
  jsx,
@@ -198,6 +216,7 @@ export default class PobAppGenerator extends Generator {
198
216
  isApp: true,
199
217
  splitCIJobs: false,
200
218
  onlyLatestLTS: true,
219
+ srcDir,
201
220
  });
202
221
 
203
222
  this.composeWith('pob:common:format-lint', {
@@ -211,7 +230,7 @@ export default class PobAppGenerator extends Generator {
211
230
  enableSrcResolver: true,
212
231
  packageManager: this.options.packageManager,
213
232
  yarnNodeLinker: this.options.yarnNodeLinker,
214
- ignorePaths: ignorePaths.join('\n'),
233
+ rootIgnorePaths: ignorePaths.join('\n'),
215
234
  buildDirectory: this.appConfig.type === 'expo' ? '.expo' : 'build',
216
235
  });
217
236
 
@@ -1,12 +1,15 @@
1
1
  export const appIgnorePaths = {
2
2
  alp: (config) => ['# alp paths', '/build', '/public', '/data'],
3
- 'next.js': (config) => [
4
- '# next.js paths',
5
- '/.next',
6
- '/out',
7
- '/build',
8
- '/.env.local',
9
- ],
3
+ 'next.js': (config, pkg) =>
4
+ [
5
+ '# next.js paths',
6
+ '/.next',
7
+ '/out',
8
+ '/build',
9
+ '/.env.local',
10
+ pkg?.dependencies?.tamagui ? '# tamagui' : undefined,
11
+ pkg?.dependencies?.tamagui ? '/.tamagui' : undefined,
12
+ ].filter(Boolean),
10
13
  remix: (config) => ['# remix paths', '/.cache', '/build', '/public/build'],
11
14
  pobpack: (config) => ['/build', '/public'],
12
15
  node: (config) => ['/build'],
@@ -26,4 +29,5 @@ export const appIgnorePaths = {
26
29
  '# Temporary files created by Metro to check the health of the file watcher',
27
30
  '.metro-health-check*',
28
31
  ],
32
+ 'yarn-plugin': (config) => [],
29
33
  };
@@ -19,7 +19,8 @@ export default class AppNextjsGenerator extends Generator {
19
19
  packageUtils.addScripts(pkg, {
20
20
  start: 'next dev',
21
21
  'start:prod': 'next start',
22
- build: 'next build',
22
+ // NODE_ENV=production is for tamagui
23
+ build: 'NODE_ENV=production next build',
23
24
  });
24
25
 
25
26
  this.fs.writeJSON(this.destinationPath('package.json'), pkg);
@@ -34,6 +34,12 @@ export default class CommonBabelGenerator extends Generator {
34
34
  default: false,
35
35
  });
36
36
 
37
+ this.option('isAppLibrary', {
38
+ type: Boolean,
39
+ required: false,
40
+ default: false,
41
+ });
42
+
37
43
  this.option('useAppConfig', {
38
44
  type: Boolean,
39
45
  required: false,
@@ -355,9 +361,14 @@ export default class CommonBabelGenerator extends Generator {
355
361
  packageUtils.addDependencies(pkg, ['@babel/runtime'], '^');
356
362
  }
357
363
 
358
- packageUtils.addOrRemoveDevDependencies(pkg, useBabel && pkg.pob.jsx, [
359
- '@babel/preset-react',
360
- ]);
364
+ const isLibraryRollupPlugin = pkg.name.includes('rollup-plugin');
365
+
366
+ packageUtils.addOrRemoveDevDependencies(
367
+ pkg,
368
+ (useBabel && pkg.pob.jsx) ||
369
+ (pkg.devDependencies?.['@babel/preset-react'] && isLibraryRollupPlugin),
370
+ ['@babel/preset-react'],
371
+ );
361
372
 
362
373
  packageUtils.removeDevDependencies(pkg, [
363
374
  'babel-preset-env', // now @babel/preset-env
@@ -371,8 +382,7 @@ export default class CommonBabelGenerator extends Generator {
371
382
  this.babelEnvs.find(
372
383
  (env) => env.target === 'browser' && env.version === undefined,
373
384
  ) ||
374
- (pkg.devDependencies?.['@babel/preset-env'] &&
375
- pkg.name.includes('rollup-plugin')),
385
+ (pkg.devDependencies?.['@babel/preset-env'] && isLibraryRollupPlugin),
376
386
  ['@babel/preset-env'],
377
387
  );
378
388
 
@@ -437,7 +447,11 @@ export default class CommonBabelGenerator extends Generator {
437
447
  // configured in babel preset
438
448
  // modern: ['defaults and >1% and supports es6-module'],
439
449
  };
440
- } else if (this.options.isApp && pkg.browserslist) {
450
+ } else if (
451
+ this.options.isApp &&
452
+ !this.options.isAppLibrary &&
453
+ pkg.browserslist
454
+ ) {
441
455
  pkg.browserslist = {
442
456
  ...pkg.browserslist,
443
457
  production: [
@@ -454,7 +468,7 @@ export default class CommonBabelGenerator extends Generator {
454
468
 
455
469
  /* side effects */
456
470
 
457
- if (this.options.isApp) {
471
+ if (this.options.isApp && !this.options.isAppLibrary) {
458
472
  delete pkg.sideEffects;
459
473
  } else if (!('sideEffects' in pkg)) {
460
474
  pkg.sideEffects = true;
@@ -553,7 +567,10 @@ export default class CommonBabelGenerator extends Generator {
553
567
  const exportName = entry === 'index' ? '.' : `./${entry}`;
554
568
 
555
569
  const targets = {
556
- types: `./${this.options.buildDirectory}/definitions/index.d.ts`,
570
+ types:
571
+ pkg.private || this.options.isAppLibrary
572
+ ? `./src/${entryDistName}.ts`
573
+ : `./${this.options.buildDirectory}/definitions/${entryDistName}.d.ts`,
557
574
  };
558
575
 
559
576
  const defaultNodeEnv = this.babelEnvs.find(
@@ -621,17 +638,44 @@ export default class CommonBabelGenerator extends Generator {
621
638
  });
622
639
 
623
640
  if (pkg.pob.extraEntries) {
624
- pkg.pob.extraEntries.forEach((exportName) => {
625
- pkg.exports[`./${exportName}`] =
626
- pkg.type === 'module'
627
- ? // eslint-disable-next-line unicorn/no-nested-ternary
628
- exportName.endsWith('.cjs') || exportName.endsWith('.d.ts')
629
- ? `./${exportName}`
630
- : `./${exportName}.js`
631
- : {
632
- import: `./${exportName}.mjs`,
633
- require: `./${exportName}.js`,
634
- };
641
+ pkg.pob.extraEntries.forEach((extraEntryConfig) => {
642
+ if (typeof extraEntryConfig === 'string') {
643
+ extraEntryConfig = {
644
+ name: extraEntryConfig,
645
+ };
646
+ }
647
+
648
+ const calcExport = () => {
649
+ if (pkg.type === 'module') {
650
+ return extraEntryConfig.name.endsWith('.cjs') ||
651
+ extraEntryConfig.name.endsWith('.d.ts')
652
+ ? `./${extraEntryConfig.name}`
653
+ : `./${extraEntryConfig.name}.js`;
654
+ }
655
+
656
+ return {
657
+ import: `./${extraEntryConfig.name}.mjs`,
658
+ require: `./${extraEntryConfig.name}.js`,
659
+ };
660
+ };
661
+
662
+ let exportValue = calcExport();
663
+
664
+ if (extraEntryConfig.types) {
665
+ if (typeof exportValue === 'string') {
666
+ exportValue = {
667
+ types: `./${extraEntryConfig.types}`,
668
+ default: exportValue,
669
+ };
670
+ } else {
671
+ exportValue = {
672
+ types: `./${extraEntryConfig.types}`,
673
+ ...exportValue,
674
+ };
675
+ }
676
+ }
677
+
678
+ pkg.exports[`./${extraEntryConfig.name}`] = exportValue;
635
679
  });
636
680
  }
637
681
  } else if (!pkg.exports) {
@@ -645,6 +689,15 @@ export default class CommonBabelGenerator extends Generator {
645
689
  if (!pkg.exports['./package.json']) {
646
690
  pkg.exports['./package.json'] = './package.json';
647
691
  }
692
+
693
+ if (pkg.types && !pkg.exports['.'].types) {
694
+ if (typeof pkg.exports['.'] === 'string') {
695
+ pkg.exports['.'] = {
696
+ default: pkg.exports['.'],
697
+ };
698
+ }
699
+ pkg.exports['.'] = { types: pkg.types, ...pkg.exports['.'] };
700
+ }
648
701
  }
649
702
 
650
703
  Object.keys(pkg).forEach((key) => {
@@ -661,6 +714,7 @@ export default class CommonBabelGenerator extends Generator {
661
714
  const pkg = this.fs.readJSON(this.destinationPath('package.json'));
662
715
 
663
716
  const useBabel = this.babelEnvs && this.babelEnvs.length > 0;
717
+ const entries = pkg.pob.entries || ['index'];
664
718
 
665
719
  /* pob-babel config */
666
720
 
@@ -668,7 +722,10 @@ export default class CommonBabelGenerator extends Generator {
668
722
  packageUtils.removeDependencies(pkg, ['alp-rollup-plugin-config']);
669
723
  packageUtils.addOrRemoveDevDependencies(
670
724
  pkg,
671
- useBabel && this.options.isApp && this.options.useAppConfig,
725
+ useBabel &&
726
+ this.options.isApp &&
727
+ !this.options.isAppLibrary &&
728
+ this.options.useAppConfig,
672
729
  ['alp-rollup-plugin-config'],
673
730
  );
674
731
 
@@ -682,6 +739,7 @@ export default class CommonBabelGenerator extends Generator {
682
739
  {
683
740
  config: this.options.useAppConfig,
684
741
  outDirectory: this.options.buildDirectory,
742
+ enableRun: !this.options.isAppLibrary && entries.includes('index'),
685
743
  },
686
744
  );
687
745
  } else {
@@ -4,9 +4,11 @@ import { fileURLToPath } from 'node:url';
4
4
  import config from 'alp-rollup-plugin-config';
5
5
  <% } -%>
6
6
  import createRollupConfig from 'pob-babel/createRollupConfig.js';
7
+ <% if (enableRun) { -%>
7
8
  import run from 'pob-babel/plugin-run.cjs';
8
9
 
9
10
  const watch = process.env.ROLLUP_WATCH === 'true';
11
+ <% } -%>
10
12
 
11
13
  export default createRollupConfig({
12
14
  cwd: dirname(fileURLToPath(import.meta.url)),
@@ -17,5 +19,8 @@ export default createRollupConfig({
17
19
  targets: [{ src: 'src/config/**/*.yml' }],
18
20
  }),
19
21
  <% } -%>
20
- watch && run({ execArgv: ['--enable-source-maps'] })],
22
+ <% if (enableRun) { -%>
23
+ watch && run({ execArgv: ['--enable-source-maps'] }),
24
+ <% } -%>
25
+ ],
21
26
  });
@@ -40,6 +40,12 @@ export default class CommonLintGenerator extends Generator {
40
40
  desc: 'Documentation enabled',
41
41
  });
42
42
 
43
+ this.option('testing', {
44
+ type: Boolean,
45
+ required: true,
46
+ desc: 'Testing enabled',
47
+ });
48
+
43
49
  this.option('typescript', {
44
50
  type: Boolean,
45
51
  required: false,
@@ -371,10 +377,9 @@ export default class CommonLintGenerator extends Generator {
371
377
  ? `{${pkg.type === 'commonjs' ? 'mjs' : 'cjs'},js}`
372
378
  : `${hasReact ? '{ts,tsx}' : 'ts'}`;
373
379
 
374
- const jestOverride =
375
- !pkg.jest && !globalTesting
376
- ? null
377
- : {
380
+ const testsOverride =
381
+ this.options.testing || globalTesting
382
+ ? {
378
383
  files: [`**/*.test.${ext}`, `__tests__/**/*.${ext}`],
379
384
  env: { jest: true },
380
385
  rules: {
@@ -383,15 +388,16 @@ export default class CommonLintGenerator extends Generator {
383
388
  { devDependencies: true },
384
389
  ],
385
390
  },
386
- };
391
+ }
392
+ : null;
387
393
 
388
- if (jestOverride) {
394
+ if (testsOverride) {
389
395
  // if (!useBabel) {
390
- // jestOverride.extends = ['pob/babel'];
396
+ // testsOverride.extends = ['pob/babel'];
391
397
  // }
392
398
 
393
399
  if (useBabel) {
394
- jestOverride.extends = ['@pob/eslint-config-typescript/test'];
400
+ testsOverride.extends = ['@pob/eslint-config-typescript/test'];
395
401
  }
396
402
  }
397
403
 
@@ -423,8 +429,8 @@ export default class CommonLintGenerator extends Generator {
423
429
  if ((!inLerna || !inLerna.root) && useBabel) {
424
430
  const buildPath = `/${this.options.buildDirectory}`;
425
431
  if (
426
- !this.options.rootIgnorePatterns ||
427
- !this.options.rootIgnorePatterns.includes(buildPath)
432
+ !this.options.rootIgnorePaths ||
433
+ !this.options.rootIgnorePaths.includes(buildPath)
428
434
  ) {
429
435
  ignorePatterns.add(buildPath);
430
436
  }
@@ -433,8 +439,8 @@ export default class CommonLintGenerator extends Generator {
433
439
  ignorePatterns.add('/rollup.config.mjs');
434
440
  }
435
441
 
436
- if (this.options.rootIgnorePatterns) {
437
- this.options.rootIgnorePatterns
442
+ if (this.options.rootIgnorePaths) {
443
+ this.options.rootIgnorePaths
438
444
  .split('\n')
439
445
  .filter(Boolean)
440
446
  .forEach((ignorePath) => {
@@ -493,7 +499,7 @@ export default class CommonLintGenerator extends Generator {
493
499
  this.fs.readJSON(srcEslintrcPath, {}),
494
500
  {
495
501
  extendsConfig: extendsConfigSrc,
496
- jestOverride,
502
+ testsOverride,
497
503
  useTypescript: useBabel,
498
504
  globalEslint,
499
505
  ignorePatterns:
@@ -1,25 +1,28 @@
1
1
  import sortConfig from '@pob/sort-eslint-config';
2
2
 
3
- function updateOverrides(config, jestOverride) {
4
- const existingJestOverrideIndex = !config.overrides
3
+ function updateOverrides(config, testsOverride) {
4
+ const existingTestsOverrideIndex = !config.overrides
5
5
  ? -1
6
6
  : config.overrides.findIndex(
7
7
  (override) => override.env && override.env.jest,
8
8
  );
9
- if (!jestOverride) {
10
- if (existingJestOverrideIndex !== -1) {
11
- config.overrides.splice(existingJestOverrideIndex, 1);
9
+ if (!testsOverride) {
10
+ if (existingTestsOverrideIndex !== -1) {
11
+ config.overrides.splice(existingTestsOverrideIndex, 1);
12
12
  if (config.overrides.length === 0) {
13
13
  delete config.overrides;
14
14
  }
15
15
  }
16
16
  } else {
17
17
  // eslint-disable-next-line no-lonely-if
18
- if (existingJestOverrideIndex !== -1) {
19
- Object.assign(config.overrides[existingJestOverrideIndex], jestOverride);
18
+ if (existingTestsOverrideIndex !== -1) {
19
+ Object.assign(
20
+ config.overrides[existingTestsOverrideIndex],
21
+ testsOverride,
22
+ );
20
23
  } else {
21
24
  if (!config.overrides) config.overrides = [];
22
- config.overrides.push(jestOverride);
25
+ config.overrides.push(testsOverride);
23
26
  }
24
27
  }
25
28
  return config;
@@ -103,7 +106,7 @@ export default function updateEslintConfig(
103
106
  config,
104
107
  {
105
108
  extendsConfig,
106
- jestOverride,
109
+ testsOverride,
107
110
  useTypescript,
108
111
  globalEslint,
109
112
  settings,
@@ -128,7 +131,7 @@ export default function updateEslintConfig(
128
131
  globalEslint,
129
132
  relativePath,
130
133
  );
131
- config = updateOverrides(config, jestOverride);
134
+ config = updateOverrides(config, testsOverride);
132
135
  if (settings) {
133
136
  config = updateSettings(config, settings);
134
137
  }
@@ -72,6 +72,8 @@ export default class CommonReleaseGenerator extends Generator {
72
72
  );
73
73
  }
74
74
 
75
+ this.fs.delete(this.destinationPath('.release-please-manifest.json'));
76
+
75
77
  this.fs.writeJSON(this.destinationPath('package.json'), pkg);
76
78
  }
77
79
  }
@@ -2,7 +2,10 @@ import path from 'node:path';
2
2
  import Generator from 'yeoman-generator';
3
3
  import inLerna from '../../../utils/inLerna.js';
4
4
  import * as packageUtils from '../../../utils/package.js';
5
- import { copyAndFormatTpl } from '../../../utils/writeAndFormat.js';
5
+ import {
6
+ copyAndFormatTpl,
7
+ writeAndFormatJson,
8
+ } from '../../../utils/writeAndFormat.js';
6
9
 
7
10
  export default class CommonTestingGenerator extends Generator {
8
11
  constructor(args, opts) {
@@ -32,6 +35,12 @@ export default class CommonTestingGenerator extends Generator {
32
35
  desc: 'enable release-please',
33
36
  });
34
37
 
38
+ this.option('enableYarnVersion', {
39
+ type: Boolean,
40
+ default: true,
41
+ desc: 'enable yarn version conventional commits',
42
+ });
43
+
35
44
  this.option('ci', {
36
45
  type: Boolean,
37
46
  required: true,
@@ -85,6 +94,12 @@ export default class CommonTestingGenerator extends Generator {
85
94
  required: true,
86
95
  desc: 'only latest lts',
87
96
  });
97
+
98
+ this.option('srcDir', {
99
+ type: String,
100
+ default: 'src',
101
+ desc: 'customize srcDir, if different than rootDir',
102
+ });
88
103
  }
89
104
 
90
105
  default() {
@@ -92,6 +107,7 @@ export default class CommonTestingGenerator extends Generator {
92
107
  this.composeWith('pob:core:ci', {
93
108
  enable: this.options.ci,
94
109
  enableReleasePlease: this.options.enableReleasePlease,
110
+ enableYarnVersion: this.options.enableYarnVersion,
95
111
  testing: this.options.enable,
96
112
  build: this.options.build,
97
113
  typescript: this.options.typescript,
@@ -125,19 +141,33 @@ export default class CommonTestingGenerator extends Generator {
125
141
  const yoConfigPobMonorepo = inLerna && inLerna.pobMonorepoConfig;
126
142
  const globalTesting = yoConfigPobMonorepo && yoConfigPobMonorepo.testing;
127
143
  const enableForMonorepo = this.options.monorepo && globalTesting;
128
- const transpileWithBabel = this.options.monorepo
144
+ const transpileWithEsbuild = packageUtils.transpileWithEsbuild(pkg);
145
+ const transpileWithBabel = transpileWithEsbuild
146
+ ? false
147
+ : // eslint-disable-next-line unicorn/no-nested-ternary
148
+ this.options.monorepo
129
149
  ? yoConfigPobMonorepo.typescript
130
- : pkg.pob && pkg.pob.babelEnvs && pkg.pob.babelEnvs.length > 0;
150
+ : packageUtils.transpileWithBabel(pkg);
131
151
  let hasReact =
132
152
  transpileWithBabel &&
133
153
  (this.options.monorepo
134
154
  ? yoConfigPobMonorepo.react ?? packageUtils.hasReact(pkg)
135
155
  : packageUtils.hasReact(pkg));
136
156
 
137
- if (this.options.enable || this.options.runner !== 'jest') {
157
+ const isJestRunner = this.options.runner === 'jest';
158
+
159
+ if (
160
+ !this.options.enable ||
161
+ !isJestRunner ||
162
+ (globalTesting && !enableForMonorepo)
163
+ ) {
138
164
  packageUtils.removeDevDependencies(pkg, ['jest', '@types/jest']);
139
165
 
140
166
  delete pkg.jest;
167
+ this.fs.delete(this.destinationPath('jest.config.js'));
168
+ this.fs.delete(this.destinationPath('jest.config.mjs'));
169
+ this.fs.delete(this.destinationPath('jest.config.cjs'));
170
+ this.fs.delete(this.destinationPath('jest.config.json'));
141
171
  }
142
172
 
143
173
  if (!this.options.enable) {
@@ -154,8 +184,9 @@ export default class CommonTestingGenerator extends Generator {
154
184
  delete pkg.scripts['test:coverage'];
155
185
  }
156
186
 
157
- this.fs.writeJSON(this.destinationPath('package.json'), pkg);
187
+ writeAndFormatJson(this.fs, this.destinationPath('package.json'), pkg);
158
188
  } else {
189
+ const jestConfigPath = this.destinationPath('jest.config.json');
159
190
  if (this.options.runner === 'jest') {
160
191
  packageUtils.addOrRemoveDevDependencies(
161
192
  pkg,
@@ -166,7 +197,6 @@ export default class CommonTestingGenerator extends Generator {
166
197
 
167
198
  packageUtils.removeScripts(['test:coverage']);
168
199
  if (this.options.monorepo && !globalTesting) {
169
- delete pkg.jest;
170
200
  packageUtils.addScripts(pkg, {
171
201
  test: 'yarn workspaces foreach --parallel -Av run test',
172
202
  });
@@ -191,7 +221,7 @@ export default class CommonTestingGenerator extends Generator {
191
221
  : testCommand, // not yet configured
192
222
  });
193
223
 
194
- if (this.options.runner === 'jest') {
224
+ if (isJestRunner) {
195
225
  const workspacesWithoutStar = pkg.workspaces.map((workspace) => {
196
226
  if (!workspace.endsWith('/*')) {
197
227
  throw new Error(`Invalid workspace format: ${workspace}`);
@@ -206,31 +236,34 @@ export default class CommonTestingGenerator extends Generator {
206
236
  pkgName.startsWith('react-'),
207
237
  );
208
238
 
209
- if (!pkg.jest) pkg.jest = {};
210
- Object.assign(pkg.jest, {
239
+ const jestConfig = this.fs.readJSON(jestConfigPath, pkg.jest ?? {});
240
+ delete pkg.jest;
241
+
242
+ const srcDir = this.options.srcDir;
243
+ Object.assign(jestConfig, {
211
244
  cacheDirectory: './node_modules/.cache/jest',
212
245
  testEnvironment: 'node',
213
246
  testMatch: [
214
- `<rootDir>/${workspacesPattern}/*/@(src|lib)/**/__tests__/**/*.${
247
+ `<rootDir>/${workspacesPattern}/*/@(${srcDir}|lib)/**/__tests__/**/*.${
215
248
  transpileWithBabel ? '(ts|js|cjs|mjs)' : '(js|cjs|mjs)'
216
249
  }${hasReact ? '?(x)' : ''}`,
217
- `<rootDir>/${workspacesPattern}/*/@(src|lib)/**/*.test.${
250
+ `<rootDir>/${workspacesPattern}/*/@(${srcDir}|lib)/**/*.test.${
218
251
  transpileWithBabel ? '(ts|js|cjs|mjs)' : '(js|cjs|mjs)'
219
252
  }${hasReact ? '?(x)' : ''}`,
220
253
  ],
221
254
  });
222
255
 
223
256
  if (shouldUseExperimentalVmModules) {
224
- pkg.jest.extensionsToTreatAsEsm = [
257
+ jestConfig.extensionsToTreatAsEsm = [
225
258
  transpileWithBabel && '.ts',
226
259
  transpileWithBabel && hasReact && '.tsx',
227
260
  ].filter(Boolean);
228
261
  } else {
229
- delete pkg.jest.extensionsToTreatAsEsm;
262
+ delete jestConfig.extensionsToTreatAsEsm;
230
263
  }
264
+ writeAndFormatJson(this.fs, jestConfigPath, jestConfig);
231
265
  }
232
266
  } else if (globalTesting) {
233
- delete pkg.jest;
234
267
  if (pkg.scripts) {
235
268
  delete pkg.scripts['generate:test-coverage'];
236
269
  delete pkg.scripts['test:watch'];
@@ -242,7 +275,7 @@ export default class CommonTestingGenerator extends Generator {
242
275
  .replace('\\', '/')}`,
243
276
  });
244
277
  } else {
245
- const babelEnvs = pkg.pob.babelEnvs || [];
278
+ const babelEnvs = pkg.pob?.babelEnvs || [];
246
279
  const transpileWithBabel = packageUtils.transpileWithBabel(pkg);
247
280
 
248
281
  const shouldUseExperimentalVmModules =
@@ -267,10 +300,11 @@ export default class CommonTestingGenerator extends Generator {
267
300
  });
268
301
 
269
302
  if (this.options.runner === 'jest') {
270
- const srcDirectory = transpileWithBabel ? 'src' : 'lib';
303
+ const srcDirectory = transpileWithBabel ? this.options.srcDir : 'lib';
271
304
 
272
- if (!pkg.jest) pkg.jest = {};
273
- Object.assign(pkg.jest, {
305
+ const jestConfig = this.fs.readJSON(jestConfigPath, pkg.jest ?? {});
306
+ delete pkg.jest;
307
+ Object.assign(jestConfig, {
274
308
  cacheDirectory: './node_modules/.cache/jest',
275
309
  testMatch: [
276
310
  `<rootDir>/${srcDirectory}/**/__tests__/**/*.${
@@ -296,29 +330,53 @@ export default class CommonTestingGenerator extends Generator {
296
330
  // [`^.+\\.ts${hasReact ? 'x?' : ''}$`]: 'babel-jest',
297
331
  // },
298
332
  });
299
- delete pkg.jest.transform;
333
+ if (transpileWithEsbuild) {
334
+ jestConfig.transform = {
335
+ [hasReact ? '^.+\\.tsx?$' : '^.+\\.ts$']: [
336
+ 'jest-esbuild',
337
+ {
338
+ format: shouldUseExperimentalVmModules ? 'esm' : 'cjs',
339
+ },
340
+ ],
341
+ };
342
+ } else if (!transpileWithBabel) {
343
+ delete jestConfig.transform;
344
+ } else if (jestConfig.transform) {
345
+ jestConfig.transform = Object.fromEntries(
346
+ Object.entries(jestConfig.transform).filter(
347
+ ([key, value]) =>
348
+ !(
349
+ value &&
350
+ Array.isArray(value) &&
351
+ value[0] === 'jest-esbuild'
352
+ ),
353
+ ),
354
+ );
355
+ if (Object.keys(jestConfig.transform).length === 0) {
356
+ delete jestConfig.transform;
357
+ }
358
+ }
300
359
 
301
360
  if (shouldUseExperimentalVmModules) {
302
- pkg.jest.extensionsToTreatAsEsm = [
361
+ jestConfig.extensionsToTreatAsEsm = [
303
362
  transpileWithBabel && '.ts',
304
363
  transpileWithBabel && hasReact && '.tsx',
305
364
  ].filter(Boolean);
306
365
  } else {
307
- delete pkg.jest.extensionsToTreatAsEsm;
366
+ delete jestConfig.extensionsToTreatAsEsm;
308
367
  }
309
368
 
310
369
  if (
311
370
  babelEnvs.length === 0 ||
312
371
  babelEnvs.some((env) => env.target === 'node')
313
372
  ) {
314
- pkg.jest.testEnvironment = 'node';
373
+ // jestConfig.testEnvironment = 'node'; this is the default now
374
+ delete jestConfig.testEnvironment;
315
375
  } else {
316
- delete pkg.jest.testEnvironment;
376
+ delete jestConfig.testEnvironment;
317
377
  }
318
378
 
319
- if (!transpileWithBabel) delete pkg.jest.transform;
320
- } else {
321
- delete pkg.jest;
379
+ writeAndFormatJson(this.fs, jestConfigPath, jestConfig);
322
380
  }
323
381
  }
324
382
  }
@@ -334,10 +392,10 @@ export default class CommonTestingGenerator extends Generator {
334
392
  this.destinationPath('babel.config.cjs'),
335
393
  {
336
394
  only: !this.options.monorepo
337
- ? "'src'"
395
+ ? `'${this.options.srcDir}'`
338
396
  : pkg.workspaces
339
397
  .flatMap((workspace) => [
340
- `'${workspace}/src'`,
398
+ `'${workspace}/${this.options.srcDir}'`,
341
399
  `'${workspace}/lib'`,
342
400
  ])
343
401
  .join(', '),
@@ -353,6 +411,6 @@ export default class CommonTestingGenerator extends Generator {
353
411
  this.fs.delete('babel.config.cjs');
354
412
  }
355
413
 
356
- this.fs.writeJSON(this.destinationPath('package.json'), pkg);
414
+ writeAndFormatJson(this.fs, this.destinationPath('package.json'), pkg);
357
415
  }
358
416
  }
@@ -8,7 +8,7 @@ module.exports = function babelConfig(api) {
8
8
  return {
9
9
  only: [<%- only %>],
10
10
  presets: [
11
- ['pob-babel/preset.js'<% if (!jestExperimentalESM) { %>, { modules: 'commonjs' }<% } %>]
11
+ ['pob-babel/preset.js', { modules: <%- jestExperimentalESM ? 'false' : "'commonjs'" %> }]
12
12
  <% if (hasReact) { %>, [
13
13
  '@babel/preset-react',
14
14
  {
@@ -14,6 +14,18 @@ export default class CommonTypescriptGenerator extends Generator {
14
14
  desc: 'enable typescript',
15
15
  });
16
16
 
17
+ this.option('isApp', {
18
+ type: Boolean,
19
+ required: true,
20
+ desc: 'is app',
21
+ });
22
+
23
+ this.option('isAppLibrary', {
24
+ type: Boolean,
25
+ required: false,
26
+ default: false,
27
+ });
28
+
17
29
  this.option('rootDir', {
18
30
  type: String,
19
31
  default: 'src',
@@ -189,6 +201,7 @@ export default class CommonTypescriptGenerator extends Generator {
189
201
  tsconfigPath,
190
202
  {
191
203
  emit: this.options.builddefs,
204
+ cacheEnabled: !this.options.isApp || this.options.isAppLibrary,
192
205
  monorepoPackageSrcPaths,
193
206
  monorepoPackageReferences,
194
207
  rootDir: this.options.rootDir,
@@ -21,12 +21,16 @@
21
21
  "tsBuildInfoFile": "dist/definitions/tsbuildinfo",
22
22
  <% } -%>
23
23
  <% } else if (composite) { -%>
24
+ <% if (cacheEnabled) { -%>
24
25
  "outDir": "node_modules/.cache/tsc",
26
+ <% } else { -%>
27
+ "noEmit": true,
28
+ <% } -%>
25
29
  "tsBuildInfoFile": "node_modules/.cache/tsc/tsbuildinfo",
26
30
  <% } else { -%>
27
31
  "noEmit": true,
28
32
  <% } -%>
29
- <% if (composite || emit) { -%>
33
+ <% if ((composite && cacheEnabled) || emit) { -%>
30
34
  "noEmitOnError": true,
31
35
  "declaration": true,
32
36
  "declarationMap": true,
@@ -22,6 +22,12 @@ export default class CoreCIGenerator extends Generator {
22
22
  desc: 'enable release-please',
23
23
  });
24
24
 
25
+ this.option('enableYarnVersion', {
26
+ type: Boolean,
27
+ default: true,
28
+ desc: 'enable yarn version conventional commits',
29
+ });
30
+
25
31
  this.option('build', {
26
32
  type: Boolean,
27
33
  default: true,
@@ -88,12 +94,14 @@ export default class CoreCIGenerator extends Generator {
88
94
 
89
95
  this.isReleasePleaseEnabled =
90
96
  this.options.enableReleasePlease &&
97
+ !this.options.enableYarnVersion &&
91
98
  !pkg.devDependencies?.['standard-version'];
92
99
 
93
100
  if (
94
101
  this.options.enableReleasePlease &&
95
102
  !process.env.CI &&
96
- !this.isReleasePleaseEnabled
103
+ !this.isReleasePleaseEnabled &&
104
+ !this.options.enableYarnVersion
97
105
  ) {
98
106
  const { enableReleasePlease } = await this.prompt({
99
107
  type: 'confirm',
@@ -194,14 +202,7 @@ export default class CoreCIGenerator extends Generator {
194
202
  if (!this.options.enable) {
195
203
  packageUtils.removeDevDependencies(pkg, ['jest-junit-reporter']);
196
204
  } else {
197
- // this.babelEnvs = JSON.parse(this.options.babelEnvs);
198
-
199
205
  packageUtils.removeDevDependencies(pkg, ['jest-junit-reporter']);
200
- // packageUtils.addOrRemoveDevDependencies(
201
- // pkg,
202
- // this.options.circleci && pkg.jest,
203
- // ['jest-junit-reporter'],
204
- // );
205
206
  }
206
207
 
207
208
  this.fs.writeJSON(this.destinationPath('package.json'), pkg);
@@ -8,7 +8,7 @@ jobs:
8
8
 
9
9
  strategy:
10
10
  matrix:
11
- node-version: [<% if (!onlyLatestLTS) { -%>18.x, <% } -%>20.x]
11
+ node-version: [18.x<% if (!onlyLatestLTS) { -%>, 20.x <% } -%>]
12
12
 
13
13
  steps:
14
14
  - uses: actions/checkout@v3
@@ -37,9 +37,9 @@ export default class CoreYarnGenerator extends Generator {
37
37
  if (!fs.existsSync('.yarnrc.yml')) {
38
38
  // yarn 2 not yet installed
39
39
  // https://yarnpkg.com/getting-started/install
40
- this.spawnCommandSync('yarn', ['set', 'version', 'stable']);
40
+ this.spawnSync('yarn', ['set', 'version', 'stable']);
41
41
  } else {
42
- this.spawnCommandSync('yarn', ['set', 'version', 'stable']);
42
+ this.spawnSync('yarn', ['set', 'version', 'stable']);
43
43
  ensureJsonFileFormatted(this.destinationPath('package.json'));
44
44
  }
45
45
  }
@@ -55,7 +55,7 @@ export default class CoreYarnGenerator extends Generator {
55
55
  {},
56
56
  );
57
57
 
58
- const { stdout } = this.spawnCommandSync(
58
+ const { stdout } = this.spawnSync(
59
59
  'yarn',
60
60
  ['plugin', 'runtime', '--json'],
61
61
  { stdio: 'pipe' },
@@ -66,31 +66,48 @@ export default class CoreYarnGenerator extends Generator {
66
66
  installedPlugins.some((plugin) => plugin.name === name);
67
67
 
68
68
  const installPlugin = (nameOrUrl) => {
69
- this.spawnCommandSync('yarn', ['plugin', 'import', nameOrUrl]);
69
+ this.spawnSync('yarn', ['plugin', 'import', nameOrUrl]);
70
70
  };
71
71
  const removePlugin = (name) => {
72
- this.spawnCommandSync('yarn', ['plugin', 'remove', name]);
72
+ this.spawnSync('yarn', ['plugin', 'remove', name]);
73
+ };
74
+
75
+ const installPluginIfNotInstalled = (name, nameOrUrl = name) => {
76
+ if (!isPluginInstalled(name)) {
77
+ installPlugin(nameOrUrl);
78
+ }
79
+ };
80
+
81
+ const removePluginIfInstalled = (name) => {
82
+ if (isPluginInstalled(name)) {
83
+ removePlugin(name);
84
+ }
73
85
  };
74
86
 
75
87
  const postinstallDevPluginName = '@yarnpkg/plugin-postinstall-dev';
76
88
  const workspacesPluginName = '@yarnpkg/plugin-workspace-tools';
89
+ const versionPluginName = '@yarnpkg/plugin-conventional-version';
77
90
 
78
91
  if (!inLerna && !pkg.private) {
79
- if (!isPluginInstalled(postinstallDevPluginName)) {
80
- installPlugin(
81
- 'https://raw.githubusercontent.com/sachinraja/yarn-plugin-postinstall-dev/main/bundles/%40yarnpkg/plugin-postinstall-dev.js',
82
- );
83
- }
84
- } else if (isPluginInstalled(postinstallDevPluginName)) {
85
- removePlugin(postinstallDevPluginName);
92
+ installPluginIfNotInstalled(
93
+ postinstallDevPluginName,
94
+ 'https://raw.githubusercontent.com/sachinraja/yarn-plugin-postinstall-dev/main/bundles/%40yarnpkg/plugin-postinstall-dev.js',
95
+ );
96
+ } else {
97
+ removePluginIfInstalled(postinstallDevPluginName);
86
98
  }
87
99
 
88
100
  if (pkg.workspaces) {
89
- if (!isPluginInstalled(workspacesPluginName)) {
90
- installPlugin(workspacesPluginName);
101
+ installPluginIfNotInstalled(workspacesPluginName);
102
+ if (!pkg.devDependencies?.['@pob/lerna-light']) {
103
+ installPluginIfNotInstalled(
104
+ versionPluginName,
105
+ 'https://raw.githubusercontent.com/christophehurpeau/yarn-plugin-conventional-version/main/bundles/%40yarnpkg/plugin-conventional-version.cjs',
106
+ );
91
107
  }
92
- } else if (isPluginInstalled(workspacesPluginName)) {
93
- removePlugin(workspacesPluginName);
108
+ } else {
109
+ removePluginIfInstalled(workspacesPluginName);
110
+ removePluginIfInstalled(versionPluginName);
94
111
  }
95
112
 
96
113
  // must be done after plugins installed
@@ -123,28 +140,28 @@ export default class CoreYarnGenerator extends Generator {
123
140
  this.fs.delete(this.destinationPath('.yarn/build-state.yml'));
124
141
  if (this.options.enable) {
125
142
  if (this.options.yarnNodeLinker === 'pnp') {
126
- this.spawnCommandSync('yarn', ['dlx', '@yarnpkg/sdks', 'vscode']);
143
+ this.spawnSync('yarn', ['dlx', '@yarnpkg/sdks', 'vscode']);
127
144
  } else {
128
145
  this.fs.delete('.yarn/sdks');
129
146
  }
130
- this.spawnCommandSync('yarn', ['install'], {
147
+ this.spawnSync('yarn', ['install'], {
131
148
  env: {
132
149
  YARN_ENABLE_IMMUTABLE_INSTALLS: 'false',
133
150
  },
134
151
  });
135
- this.spawnCommandSync('yarn', ['dedupe']);
152
+ this.spawnSync('yarn', ['dedupe']);
136
153
 
137
- this.spawnCommandSync('yarn', ['prettier', '--write', '.vscode']);
154
+ this.spawnSync('yarn', ['prettier', '--write', '.vscode']);
138
155
 
139
156
  const pkg = this.fs.readJSON(this.destinationPath('package.json'));
140
157
 
141
158
  if (pkg.scripts.preversion) {
142
159
  try {
143
- this.spawnCommandSync('yarn', ['run', 'preversion']);
160
+ this.spawnSync('yarn', ['run', 'preversion']);
144
161
  } catch {}
145
162
  } else if (pkg.scripts.build) {
146
163
  try {
147
- this.spawnCommandSync('yarn', ['run', 'build']);
164
+ this.spawnSync('yarn', ['run', 'build']);
148
165
  } catch {}
149
166
  }
150
167
  }
@@ -242,6 +242,7 @@ export default class PobLibGenerator extends Generator {
242
242
 
243
243
  this.composeWith('pob:common:typescript', {
244
244
  enable: withBabel,
245
+ isApp: false,
245
246
  dom: browser,
246
247
  jsx,
247
248
  updateOnly: this.options.updateOnly,
@@ -283,7 +284,7 @@ export default class PobLibGenerator extends Generator {
283
284
  documentation:
284
285
  !!this.pobjson.documentation ||
285
286
  !!(this.pobjson.testing && this.pobjson.testing.codecov),
286
- testing: this.pobjson.testing,
287
+ testing: !!this.pobjson.testing,
287
288
  packageManager: this.options.packageManager,
288
289
  yarnNodeLinker: this.options.yarnNodeLinker,
289
290
  ignorePaths: withBabel ? '/dist' : '',
@@ -208,7 +208,7 @@ export default class PobMonorepoGenerator extends Generator {
208
208
 
209
209
  this.composeWith('pob:common:husky', {});
210
210
 
211
- const isReleasePleaseEnabled =
211
+ const isYarnVersionEnabled =
212
212
  this.pobLernaConfig.testing &&
213
213
  this.pobLernaConfig.ci &&
214
214
  !pkg.devDependencies?.['@pob/lerna-light'];
@@ -218,7 +218,8 @@ export default class PobMonorepoGenerator extends Generator {
218
218
  this.composeWith('pob:common:testing', {
219
219
  monorepo: true,
220
220
  enable: this.pobLernaConfig.testing,
221
- enableReleasePlease: isReleasePleaseEnabled,
221
+ enableReleasePlease: false,
222
+ enableYarnVersion: isYarnVersionEnabled,
222
223
  testing: this.pobLernaConfig.testing,
223
224
  build: this.pobLernaConfig.typescript,
224
225
  typescript: this.pobLernaConfig.typescript,
@@ -245,11 +246,7 @@ export default class PobMonorepoGenerator extends Generator {
245
246
  ]
246
247
  .filter(Boolean)
247
248
  .join('\n'),
248
- rootIgnorePaths: [
249
- isReleasePleaseEnabled && '/.release-please-manifest.json',
250
- ]
251
- .filter(Boolean)
252
- .join('\n'),
249
+ rootIgnorePaths: [],
253
250
  });
254
251
 
255
252
  this.composeWith('pob:lib:doc', {
@@ -283,7 +280,7 @@ export default class PobMonorepoGenerator extends Generator {
283
280
 
284
281
  this.composeWith('pob:common:release', {
285
282
  enable: this.pobLernaConfig.testing && this.pobLernaConfig.ci,
286
- isReleasePleaseEnabled,
283
+ isYarnVersionEnabled,
287
284
  withBabel: this.pobLernaConfig.typescript,
288
285
  documentation: this.pobLernaConfig.documentation,
289
286
  updateOnly: this.options.updateOnly,
@@ -137,10 +137,19 @@ export default class MonorepoLernaGenerator extends Generator {
137
137
 
138
138
  if (pkg.name === 'pob-monorepo') {
139
139
  pkg.devDependencies['@pob/lerna-light'] = 'workspace:*';
140
- } else if (pkg.name !== 'pob-monorepo-test-repository') {
141
- packageUtils.addDevDependencies(pkg, ['@pob/lerna-light']);
140
+ } else {
141
+ packageUtils.addOrRemoveDevDependencies(
142
+ pkg,
143
+ pkg.name !== 'pob-monorepo-test-repository' &&
144
+ pkg.name !== 'use-react-intl-formatters-monorepo',
145
+ // pkg.name !== '@pob/eslint-config-monorepo'
146
+ ['@pob/lerna-light'],
147
+ );
142
148
  }
143
149
 
150
+ // TODO remove lerna completely
151
+ const isYarnVersionEnabled = !pkg.devDependencies?.['@pob/lerna-light'];
152
+
144
153
  if (pkg.name !== 'pob-monorepo') {
145
154
  packageUtils.addDevDependencies(pkg, ['repository-check-dirty']);
146
155
  }
@@ -173,18 +182,21 @@ export default class MonorepoLernaGenerator extends Generator {
173
182
 
174
183
  packageUtils.addOrRemoveScripts(
175
184
  pkg,
176
- this.options.packageManager === 'yarn',
185
+ this.options.packageManager === 'yarn' && !isYarnVersionEnabled,
177
186
  {
178
187
  version:
179
188
  'YARN_ENABLE_IMMUTABLE_INSTALLS=false yarn && git add yarn.lock',
180
189
  },
181
190
  );
182
191
 
192
+ // TODO rename release (release = version + publish)
183
193
  this.fs.copyTpl(
184
194
  this.templatePath('workflow-publish.yml.ejs'),
185
195
  this.destinationPath('.github/workflows/publish.yml'),
186
196
  {
187
197
  publish: !this.options.isAppProject,
198
+ enableYarnVersion: isYarnVersionEnabled,
199
+ isIndependent: lernaConfig.version === 'independent',
188
200
  },
189
201
  );
190
202
 
@@ -3,9 +3,21 @@ on:
3
3
  workflow_dispatch:
4
4
  inputs:
5
5
  dry-run:
6
- description: "Dry run? (y/N)"
6
+ description: "Dry run"
7
7
  required: true
8
- default: "N"
8
+ type: boolean
9
+ default: false
10
+ <% if (enableYarnVersion) { -%>
11
+ bump-dependents-highest-as:
12
+ description: "Bump dependents highest as"
13
+ required: false
14
+ type: choice
15
+ options:
16
+ - major
17
+ - minor
18
+ - patch
19
+ default: "major"
20
+ <% } -%>
9
21
 
10
22
  jobs:
11
23
  publish:
@@ -24,43 +36,52 @@ jobs:
24
36
  run: yarn install --immutable --immutable-cache
25
37
 
26
38
  - name: New version (dry run)
27
- if: |
28
- github.ref == 'refs/heads/main'
29
- && contains(github.event.inputs.dry-run, 'y')
39
+ if: github.ref == 'refs/heads/main' && inputs.dry-run
40
+ <% if (enableYarnVersion) { -%>
41
+ run: yarn version --dry-run
42
+ <% } else { -%>
30
43
  run: yarn lerna version --yes --no-push --exact --conventional-commits --conventional-graduate --changelog-preset conventional-changelog-conventionalcommits --no-git-tag-version --loglevel=verbose
31
-
44
+ <% } -%>
32
45
  - name: Configure Git user
33
- if: |
34
- github.ref == 'refs/heads/main'
35
- && contains(github.event.inputs.dry-run, 'y') == false
46
+ if: github.ref == 'refs/heads/main' && !inputs.dry-run
36
47
  run: |
37
48
  git config --global user.name 'github-actions[bot]'
38
49
  git config --global user.email 'github-actions[bot]@users.noreply.github.com'
39
50
 
40
51
  - name: New version
41
- if: |
42
- github.ref == 'refs/heads/main'
43
- && contains(github.event.inputs.dry-run, 'y') == false
52
+ if: github.ref == 'refs/heads/main' && !inputs.dry-run
44
53
  run: |
54
+ <% if (enableYarnVersion) { -%>
55
+ yarn version --create-release=github --bump-dependents-highest-as=${{ inputs.bump-dependents-highest-as }} -m 'chore: release <%- isIndependent ? '' : '%v ' %>[skip ci]<%- isIndependent ? '\\n\\n%t' : '' %>'
56
+ <% } else { -%>
45
57
  yarn lerna version --yes --push --exact --conventional-commits --conventional-graduate --changelog-preset conventional-changelog-conventionalcommits --create-release=github -m 'chore: release [skip ci]'
58
+ <% } -%>
46
59
  env:
47
60
  HUSKY: 0
48
61
  GH_TOKEN: ${{ secrets.GH_TOKEN }}
49
62
  YARN_ENABLE_IMMUTABLE_INSTALLS: false
50
63
  <% if (publish) { -%>
51
64
 
65
+ <% if (enableYarnVersion) { -%>
66
+ - name: Publish to npm
67
+ run: |
68
+ if [ -z "$NODE_AUTH_TOKEN" ]; then
69
+ echo "Missing env variable NODE_AUTH_TOKEN"
70
+ exit 1
71
+ fi
72
+ echo >> ./.yarnrc.yml
73
+ echo "npmAuthToken: $NODE_AUTH_TOKEN" >> ./.yarnrc.yml
74
+ yarn workspaces foreach --no-private npm publish --tolerate-republish
75
+ <% } else { -%>
52
76
  - uses: actions/setup-node@v3
53
- if: |
54
- github.ref == 'refs/heads/main'
55
- && contains(github.event.inputs.dry-run, 'y') == false
77
+ if: github.ref == 'refs/heads/main' && !inputs.dry-run
56
78
  with:
57
79
  node-version: 18
58
80
  registry-url: "https://registry.npmjs.org"
59
81
 
60
82
  - run: yarn lerna publish from-git --no-verify-access --yes
61
- if: |
62
- github.ref == 'refs/heads/main'
63
- && contains(github.event.inputs.dry-run, 'y') == false
83
+ <% } -%>
84
+ if: github.ref == 'refs/heads/main' && !inputs.dry-run
64
85
  env:
65
86
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
66
87
  <% } -%>
@@ -121,6 +121,12 @@ export default class PobBaseGenerator extends Generator {
121
121
  }
122
122
 
123
123
  default() {
124
+ this.composeWith('pob:core:yarn', {
125
+ type: this.projectConfig.type,
126
+ enable: this.isRoot && this.projectConfig.packageManager === 'yarn',
127
+ yarnNodeLinker: this.projectConfig.yarnNodeLinker,
128
+ });
129
+
124
130
  this.composeWith('pob:core:package', {
125
131
  updateOnly: this.options.updateOnly,
126
132
  private: this.useLerna,
@@ -150,12 +156,6 @@ export default class PobBaseGenerator extends Generator {
150
156
  app: this.projectConfig.type === 'app',
151
157
  });
152
158
 
153
- this.composeWith('pob:core:yarn', {
154
- type: this.projectConfig.type,
155
- enable: this.isRoot && this.projectConfig.packageManager === 'yarn',
156
- yarnNodeLinker: this.projectConfig.yarnNodeLinker,
157
- });
158
-
159
159
  const onlyLatestLTS =
160
160
  this.projectConfig.type === 'app' ||
161
161
  (inLerna &&
@@ -24,17 +24,21 @@ export const hasBabel = (pkg) =>
24
24
  (pkg.devDependencies['pob-babel'] || pkg.devDependencies['@babel/core'])
25
25
  );
26
26
 
27
+ export const transpileWithEsbuild = (pkg) =>
28
+ !!(pkg.devDependencies && pkg.devDependencies['jest-esbuild']);
29
+
27
30
  export const transpileWithBabel = (pkg) =>
28
31
  !!(
29
32
  (pkg.devDependencies &&
30
33
  (pkg.devDependencies['pob-babel'] ||
31
34
  pkg.devDependencies.next ||
35
+ pkg.devDependencies['@yarnpkg/builder'] ||
32
36
  pkg.devDependencies['alp-dev'])) ||
33
37
  // alp-dev has pob-babel in dependencies
34
38
  (pkg.dependencies &&
35
39
  (pkg.dependencies['pob-babel'] ||
36
40
  pkg.dependencies.next ||
37
- pkg.devDependencies['alp-dev']))
41
+ pkg.dependencies['alp-dev']))
38
42
  );
39
43
 
40
44
  export const hasReact = (pkg) =>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pob",
3
- "version": "13.2.3",
3
+ "version": "13.4.0",
4
4
  "description": "Pile of bones, library generator with git/babel/typescript/typedoc/readme/jest",
5
5
  "keywords": [
6
6
  "skeleton"
@@ -46,7 +46,7 @@
46
46
  "@pob/sort-pkg": "6.0.1",
47
47
  "@types/inquirer": "9.0.3",
48
48
  "@yeoman/types": "1.0.1",
49
- "eslint": "8.43.0",
49
+ "eslint": "8.47.0",
50
50
  "findup-sync": "^5.0.0",
51
51
  "git-remote-url": "^1.0.1",
52
52
  "github-username": "^7.0.0",
@@ -59,14 +59,14 @@
59
59
  "mem-fs-editor": "10.0.2",
60
60
  "minimist": "1.2.8",
61
61
  "parse-author": "2.0.0",
62
- "pob-dependencies": "8.2.0",
62
+ "pob-dependencies": "8.4.0",
63
63
  "prettier": "2.8.8",
64
- "semver": "7.5.3",
64
+ "semver": "7.5.4",
65
65
  "yeoman-environment": "4.0.0-beta.3",
66
- "yeoman-generator": "6.0.0-rc.2"
66
+ "yeoman-generator": "6.0.0-rc.3"
67
67
  },
68
68
  "devDependencies": {
69
- "@pob/root": "8.1.0"
69
+ "@pob/root": "8.2.0"
70
70
  },
71
- "gitHead": "17a6cf5590bcbb5a177c743558e3f62e2ca2f28f"
71
+ "gitHead": "fb707ed440f6c40b84b27fa3efbde4c5615d56ce"
72
72
  }