generator-easy-ui5 3.6.3 → 3.8.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/README.md CHANGED
@@ -20,7 +20,7 @@ The purpose of the `project` subgenerator is to guide you on your first steps wi
20
20
 
21
21
  ## Requirements
22
22
 
23
- - Get [Node.js](https://nodejs.org/en/download/) (:warning: **version 14 or higher**)
23
+ - Get [Node.js](https://nodejs.org/en/download/) (:warning: **version 18 or higher**)
24
24
 
25
25
  ## Download and Installation
26
26
 
@@ -134,6 +134,10 @@ const generatorOptions = {
134
134
  type: Boolean,
135
135
  description: "Preview the next mode to consume subgenerators from bestofui5.org",
136
136
  },
137
+ skipNested: {
138
+ type: Boolean,
139
+ description: "Skips the nested generators and runs only the first subgenerator",
140
+ },
137
141
  };
138
142
 
139
143
  const generatorArgs = {
@@ -149,6 +153,7 @@ const generatorArgs = {
149
153
  },
150
154
  };
151
155
 
156
+ // The Easy UI5 Generator!
152
157
  export default class extends Generator {
153
158
  constructor(args, opts) {
154
159
  super(args, opts, {
@@ -239,6 +244,102 @@ export default class extends Generator {
239
244
  return "Easy UI5";
240
245
  }
241
246
 
247
+ async _getGeneratorMetadata({ env, generatorPath }) {
248
+ // filter the hidden subgenerators already
249
+ // -> subgenerators must be found in env as they are returned by lookup!
250
+ const lookupGeneratorMeta = await env.lookup({ localOnly: true, packagePaths: generatorPath });
251
+ const subGenerators = lookupGeneratorMeta.filter((sub) => {
252
+ const subGenerator = env.get(sub.namespace);
253
+ return !subGenerator.hidden;
254
+ });
255
+ return subGenerators;
256
+ }
257
+
258
+ async _installGenerator({ octokit, generator, generatorPath }) {
259
+ // lookup the default path of the generator if not set
260
+ if (!generator.branch) {
261
+ try {
262
+ const repoInfo = await octokit.repos.get({
263
+ owner: generator.org,
264
+ repo: generator.name,
265
+ });
266
+ generator.branch = repoInfo.data.default_branch;
267
+ } catch (e) {
268
+ console.error(`Generator "${owner}/${repo}!${dir}${branch ? "#" + branch : ""}" not found! Run with --verbose for details!`);
269
+ if (this.options.verbose) {
270
+ console.error(e);
271
+ }
272
+ return;
273
+ }
274
+ }
275
+ // fetch the branch to retrieve the latest commit SHA
276
+ let commitSHA;
277
+ try {
278
+ // determine the commitSHA
279
+ const reqBranch = await octokit.repos.getBranch({
280
+ owner: generator.org,
281
+ repo: generator.name,
282
+ branch: generator.branch,
283
+ });
284
+ commitSHA = reqBranch.data.commit.sha;
285
+ } catch (ex) {
286
+ console.error(chalk.red(`Failed to retrieve the branch "${generator.branch}" for repository "${generator.name}" for "${generator.org}" organization! Run with --verbose for details!`));
287
+ if (this.options.verbose) {
288
+ console.error(chalk.red(ex.message));
289
+ }
290
+ return;
291
+ }
292
+
293
+ if (this.options.verbose) {
294
+ this.log(`Using commit ${commitSHA} from @${generator.org}/${generator.name}#${generator.branch}!`);
295
+ }
296
+ const shaMarker = path.join(generatorPath, `.${commitSHA}`);
297
+
298
+ if (fs.existsSync(generatorPath) && !this.options.skipUpdate) {
299
+ // check if the SHA marker exists to know whether the generator is up-to-date or not
300
+ if (this.options.forceUpdate || !fs.existsSync(shaMarker)) {
301
+ if (this.options.verbose) {
302
+ this.log(`Generator ${chalk.yellow(generator.name)} in "${generatorPath}" is outdated!`);
303
+ }
304
+ // remove if the SHA marker doesn't exist => outdated!
305
+ this._showBusy(` Deleting subgenerator ${chalk.yellow(generator.name)}...`);
306
+ fs.rmSync(generatorPath, { recursive: true });
307
+ }
308
+ }
309
+
310
+ // re-fetch the generator and extract into local plugin folder
311
+ if (!fs.existsSync(generatorPath)) {
312
+ // unzip the archive
313
+ if (this.options.verbose) {
314
+ this.log(`Extracting ZIP to "${generatorPath}"...`);
315
+ }
316
+ this._showBusy(` Downloading subgenerator ${chalk.yellow(generator.name)}...`);
317
+ const reqZIPArchive = await octokit.repos.downloadZipballArchive({
318
+ owner: generator.org,
319
+ repo: generator.name,
320
+ ref: commitSHA,
321
+ });
322
+
323
+ this._showBusy(` Extracting subgenerator ${chalk.yellow(generator.name)}...`);
324
+ const buffer = Buffer.from(new Uint8Array(reqZIPArchive.data));
325
+ this._unzip(buffer, generatorPath, generator.dir);
326
+
327
+ // write the sha marker
328
+ fs.writeFileSync(shaMarker, commitSHA);
329
+ }
330
+
331
+ // run npm install when not embedding the generator (always for self-healing!)
332
+ if (!this.options.embed) {
333
+ if (this.options.verbose) {
334
+ this.log("Installing the subgenerator dependencies...");
335
+ }
336
+ this._showBusy(` Preparing ${chalk.yellow(generator.name)}...`);
337
+ await this._npmInstall(generatorPath, this.options.pluginsWithDevDeps);
338
+ }
339
+
340
+ this._clearBusy(true);
341
+ }
342
+
242
343
  async prompting() {
243
344
  const home = path.join(__dirname, "..", "..");
244
345
  const pkgJson = JSON.parse(fs.readFileSync(path.join(home, "package.json"), "utf8"));
@@ -369,31 +470,28 @@ export default class extends Generator {
369
470
  // determine the generator to be used
370
471
  let generator;
371
472
 
372
- // try to identify whether concrete generator is defined
373
- if (!generator) {
374
- // determine generator by ${owner}/${repo}(!${dir})? syntax, e.g.:
375
- // > yo easy-ui5 SAP-samples/ui5-typescript-tutorial
376
- // > yo easy-ui5 SAP-samples/ui5-typescript-tutorial#1.0
377
- // > yo easy-ui5 SAP-samples/ui5-typescript-tutorial\!/generator
378
- // > yo easy-ui5 SAP-samples/ui5-typescript-tutorial\!/generator#1.0
379
- const reGenerator = /([^\/]+)\/([^\!\#]+)(?:\!([^\#]+))?(?:\#(.+))?/;
380
- const matchGenerator = reGenerator.exec(this.options.generator);
381
- if (matchGenerator) {
382
- // derive and path the generator information from command line
383
- const [owner, repo, dir = "/generator", branch] = matchGenerator.slice(1);
384
- // the plugin path is derived from the owner, repo, dir and branch
385
- const pluginPath = `_/${owner}/${repo}${dir.replace(/[\/\\]/g, "_")}${branch ? `#${branch.replace(/[\/\\]/g, "_")}` : ""}`;
386
- generator = {
387
- org: owner,
388
- name: repo,
389
- branch,
390
- dir,
391
- pluginPath,
392
- };
393
- // log which generator is being used!
394
- if (this.options.verbose) {
395
- this.log(`Using generator ${chalk.green(`${owner}/${repo}!${dir}${branch ? "#" + branch : ""}`)}`);
396
- }
473
+ // determine generator by ${owner}/${repo}(!${dir})? syntax, e.g.:
474
+ // > yo easy-ui5 SAP-samples/ui5-typescript-tutorial
475
+ // > yo easy-ui5 SAP-samples/ui5-typescript-tutorial#1.0
476
+ // > yo easy-ui5 SAP-samples/ui5-typescript-tutorial\!/generator
477
+ // > yo easy-ui5 SAP-samples/ui5-typescript-tutorial\!/generator#1.0
478
+ const reGenerator = /([^\/]+)\/([^\!\#]+)(?:\!([^\#]+))?(?:\#(.+))?/;
479
+ const matchGenerator = reGenerator.exec(this.options.generator);
480
+ if (matchGenerator) {
481
+ // derive and path the generator information from command line
482
+ const [owner, repo, dir = "/generator", branch] = matchGenerator.slice(1);
483
+ // the plugin path is derived from the owner, repo, dir and branch
484
+ const pluginPath = `_/${owner}/${repo}${dir.replace(/[\/\\]/g, "_")}${branch ? `#${branch.replace(/[\/\\]/g, "_")}` : ""}`;
485
+ generator = {
486
+ org: owner,
487
+ name: repo,
488
+ branch,
489
+ dir,
490
+ pluginPath,
491
+ };
492
+ // log which generator is being used!
493
+ if (this.options.verbose) {
494
+ this.log(`Using generator ${chalk.green(`${owner}/${repo}!${dir}${branch ? "#" + branch : ""}`)}`);
397
495
  }
398
496
  }
399
497
 
@@ -527,85 +625,10 @@ export default class extends Generator {
527
625
  }
528
626
  }
529
627
 
530
- let generatorPath = path.join(pluginsHome, generator.pluginPath || generator.name);
628
+ // install the generator if not running in offline mode
629
+ const generatorPath = path.join(pluginsHome, generator.pluginPath || generator.name);
531
630
  if (!this.options.offline) {
532
- // lookup the default path of the generator if not set
533
- if (!generator.branch) {
534
- try {
535
- const repoInfo = await octokit.repos.get({
536
- owner: generator.org,
537
- repo: generator.name,
538
- });
539
- generator.branch = repoInfo.data.default_branch;
540
- } catch (e) {
541
- console.error(`Generator "${owner}/${repo}!${dir}${branch ? "#" + branch : ""}" not found! Run with --verbose for details!`);
542
- if (this.options.verbose) {
543
- console.error(e);
544
- }
545
- return;
546
- }
547
- }
548
- // fetch the branch to retrieve the latest commit SHA
549
- let commitSHA;
550
- try {
551
- // determine the commitSHA
552
- const reqBranch = await octokit.repos.getBranch({
553
- owner: generator.org,
554
- repo: generator.name,
555
- branch: generator.branch,
556
- });
557
- commitSHA = reqBranch.data.commit.sha;
558
- } catch (ex) {
559
- console.error(chalk.red(`Failed to retrieve the branch "${generator.branch}" for repository "${generator.name}" for "${generator.org}" organization! Run with --verbose for details!`));
560
- if (this.options.verbose) {
561
- console.error(chalk.red(ex.message));
562
- }
563
- return;
564
- }
565
-
566
- if (this.options.verbose) {
567
- this.log(`Using commit ${commitSHA} from @${generator.org}/${generator.name}#${generator.branch}!`);
568
- }
569
- const shaMarker = path.join(generatorPath, `.${commitSHA}`);
570
-
571
- if (fs.existsSync(generatorPath) && !this.options.skipUpdate) {
572
- // check if the SHA marker exists to know whether the generator is up-to-date or not
573
- if (this.options.forceUpdate || !fs.existsSync(shaMarker)) {
574
- if (this.options.verbose) {
575
- this.log(`Generator ${chalk.yellow(generator.name)} in "${generatorPath}" is outdated!`);
576
- }
577
- // remove if the SHA marker doesn't exist => outdated!
578
- this._showBusy(` Deleting subgenerator ${chalk.yellow(generator.name)}...`);
579
- fs.rmSync(generatorPath, { recursive: true });
580
- }
581
- }
582
-
583
- // re-fetch the generator and extract into local plugin folder
584
- if (!fs.existsSync(generatorPath)) {
585
- // unzip the archive
586
- if (this.options.verbose) {
587
- this.log(`Extracting ZIP to "${generatorPath}"...`);
588
- }
589
- this._showBusy(` Downloading subgenerator ${chalk.yellow(generator.name)}...`);
590
- const reqZIPArchive = await octokit.repos.downloadZipballArchive({
591
- owner: generator.org,
592
- repo: generator.name,
593
- ref: commitSHA,
594
- });
595
-
596
- this._showBusy(` Extracting subgenerator ${chalk.yellow(generator.name)}...`);
597
- const buffer = Buffer.from(new Uint8Array(reqZIPArchive.data));
598
- this._unzip(buffer, generatorPath, generator.dir);
599
-
600
- // write the sha marker
601
- fs.writeFileSync(shaMarker, commitSHA);
602
- }
603
-
604
- // only when embedding we clear the busy state as otherwise
605
- // the npm install will immediately again show the busy state
606
- if (this.options.embed) {
607
- this._clearBusy(true);
608
- }
631
+ await this._installGenerator({ octokit, generator, generatorPath });
609
632
  }
610
633
 
611
634
  // do not execute the plugin generator during the setup/embed mode
@@ -613,14 +636,6 @@ export default class extends Generator {
613
636
  // filter the local options and the help command
614
637
  const opts = Object.keys(this._options).filter((optionName) => !(generatorOptions.hasOwnProperty(optionName) || optionName === "help"));
615
638
 
616
- // run npm install (always for self-healing!)
617
- if (this.options.verbose) {
618
- this.log("Installing the subgenerator dependencies...");
619
- }
620
- this._showBusy(` Preparing ${chalk.yellow(generator.name)}...`);
621
- await this._npmInstall(generatorPath, this.options.pluginsWithDevDeps);
622
- this._clearBusy(true);
623
-
624
639
  // create the env for the plugin generator
625
640
  let env = this.env; // in case of Yeoman UI the env is injected!
626
641
  if (!env) {
@@ -628,18 +643,20 @@ export default class extends Generator {
628
643
  env = yeoman.createEnv(this.args, opts);
629
644
  }
630
645
 
631
- // helper to derive the subcommand
632
- function deriveSubcommand(namespace) {
633
- const match = namespace.match(/[^:]+:(.+)/);
634
- return match ? match[1] : namespace;
646
+ // read the generator metadata
647
+ let subGenerators = await this._getGeneratorMetadata({ env, generatorPath });
648
+
649
+ // helper to derive the generator from the namespace
650
+ function deriveGenerator(namespace, defaultValue) {
651
+ const match = namespace.match(/([^:]+):.+/);
652
+ return match ? match[1] : defaultValue === undefined ? namespace : defaultValue;
635
653
  }
636
654
 
637
- // filter the hidden subgenerators already
638
- // -> subgenerators must be found in env as they are returned by lookup!
639
- let subGenerators = env.lookup({ localOnly: true, packagePaths: generatorPath }).filter((sub) => {
640
- const subGenerator = env.get(sub.namespace);
641
- return !subGenerator.hidden;
642
- });
655
+ // helper to derive the subcommand from the namespace
656
+ function deriveSubcommand(namespace, defaultValue) {
657
+ const match = namespace.match(/^[^:]+:(.+)$/);
658
+ return match ? match[1] : defaultValue === undefined ? namespace : defaultValue;
659
+ }
643
660
 
644
661
  // list the available subgenerators in the console (as help)
645
662
  if (this.options.list) {
@@ -725,16 +742,79 @@ export default class extends Generator {
725
742
  ).subGenerator;
726
743
  }
727
744
 
728
- if (this.options.verbose) {
729
- this.log(`Calling ${chalk.red(subGenerator)}...\n \\_ in "${generatorPath}"`);
745
+ // determine the list of subgenerators to be executed
746
+ const subGensToRun = [subGenerator];
747
+
748
+ // method to resolve nested generators (only once!)
749
+ const resolved = [];
750
+ const resolveNestedGenerator = async (generatorToResolve) => {
751
+ const constructor = await env.get(generatorToResolve);
752
+ await Promise.all(
753
+ constructor.nestedGenerators?.map(async (nestedGenerator) => {
754
+ const theNestedGenerator = deriveGenerator(nestedGenerator);
755
+ if (resolved.indexOf(theNestedGenerator) === -1) {
756
+ resolved.push(theNestedGenerator);
757
+ const nestedGeneratorInfo = availGenerators.find((repo) => repo.subGeneratorName === theNestedGenerator);
758
+ const nestedGeneratorPath = path.join(pluginsHome, nestedGeneratorInfo.pluginPath || nestedGeneratorInfo.name);
759
+ await this._installGenerator({ octokit, generator: nestedGeneratorInfo, generatorPath: nestedGeneratorPath });
760
+ const nestedGens = await this._getGeneratorMetadata({ env, generatorPath: nestedGeneratorPath });
761
+ const subcommand = deriveSubcommand(nestedGenerator, "");
762
+ const theNestedGen = nestedGens.filter((nested) => {
763
+ const nestedSubcommand = deriveSubcommand(nested.namespace, "");
764
+ return subcommand ? nestedSubcommand === subcommand : !nestedSubcommand;
765
+ })?.[0];
766
+ if (theNestedGen) {
767
+ subGensToRun.push(theNestedGen.namespace);
768
+ await resolveNestedGenerator(theNestedGen.namespace);
769
+ } else {
770
+ this.log(`The nested generator "${nestedGeneratorInfo.org}/${nestedGeneratorInfo.name}" has no subgenerator "${subcommand || "default"}"! Ignoring execution...`);
771
+ }
772
+ }
773
+ }) || []
774
+ );
775
+ };
776
+
777
+ // only resolve nested generators when they should not be skipped
778
+ if (!this.options.skipNested) {
779
+ await resolveNestedGenerator(subGenerator);
730
780
  }
731
781
 
732
- // finally, run the subgenerator
733
- env.run(subGenerator, {
734
- verbose: this.options.verbose,
735
- embedded: true,
736
- destinationRoot: this.destinationRoot(),
737
- });
782
+ // intercept the environments runGenerator method to determine
783
+ // and forward the destinationRoot between the generator executions
784
+ const runGenerator = env.runGenerator;
785
+ let cwd;
786
+ env.runGenerator = async function (gen) {
787
+ if (cwd) {
788
+ // apply the cwd to the next gen
789
+ gen.destinationRoot(cwd);
790
+ }
791
+ return runGenerator.apply(this, arguments).then((retval) => {
792
+ // store the cwd from the current gen
793
+ cwd = gen.destinationRoot();
794
+ return retval;
795
+ });
796
+ };
797
+
798
+ // chain the execution of the generators
799
+ let chain = Promise.resolve();
800
+ for (const subGen of subGensToRun) {
801
+ chain = chain.then(
802
+ function () {
803
+ // we need to use env.run and not composeWith
804
+ // to ensure that subgenerators can have different
805
+ // dependencies than the root generator
806
+ return env.run(subGen, {
807
+ verbose: this.options.verbose,
808
+ embedded: true,
809
+ destinationRoot: this.destinationRoot(),
810
+ });
811
+ }.bind(this)
812
+ );
813
+ }
814
+
815
+ if (this.options.verbose) {
816
+ this.log(`Running generators in "${generatorPath}"...`);
817
+ }
738
818
  } else {
739
819
  this.log(`The generator ${chalk.red(this.options.generator)} has no visible subgenerators!`);
740
820
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "generator-easy-ui5",
3
- "version": "3.6.3",
3
+ "version": "3.8.0",
4
4
  "description": "Generator for UI5-based project",
5
5
  "main": "generators/app/index.js",
6
6
  "type": "module",
@@ -9,10 +9,10 @@
9
9
  "plugins"
10
10
  ],
11
11
  "engines": {
12
- "node": ">=14.0.0"
12
+ "node": ">=18"
13
13
  },
14
14
  "scripts": {
15
- "prepublishOnly": "npx yo ./ project --embed",
15
+ "prepublishOnly": "npx yo@4.3.1 ./ project --embed",
16
16
  "start": "yo easy-ui5 project",
17
17
  "test": "mocha",
18
18
  "test:subgen:list": "yo easy-ui5 project --list",
@@ -48,26 +48,26 @@
48
48
  },
49
49
  "homepage": "https://github.com/SAP/generator-easy-ui5#readme",
50
50
  "dependencies": {
51
- "@octokit/plugin-throttling": "^5.2.3",
52
- "@octokit/rest": "^19.0.11",
51
+ "@octokit/plugin-throttling": "^8.1.3",
52
+ "@octokit/rest": "^20.0.2",
53
53
  "adm-zip": "^0.5.10",
54
- "chalk": "^5.2.0",
54
+ "chalk": "^5.3.0",
55
55
  "colors": "^1.4.0",
56
- "glob": "^10.2.7",
56
+ "glob": "^10.3.10",
57
57
  "libnpmconfig": "^1.2.1",
58
- "rimraf": "^5.0.1",
58
+ "rimraf": "^5.0.5",
59
59
  "yeoman-environment": "^3.19.3",
60
- "yeoman-generator": "^5.9.0",
60
+ "yeoman-generator": "^5.10.0",
61
61
  "yosay": "^2.0.2"
62
62
  },
63
63
  "devDependencies": {
64
- "@commitlint/cli": "^17.6.5",
65
- "@commitlint/config-conventional": "^17.6.5",
66
- "conventional-changelog-cli": "^3.0.0",
64
+ "@commitlint/cli": "^18.4.3",
65
+ "@commitlint/config-conventional": "^18.4.3",
66
+ "conventional-changelog-cli": "^4.1.0",
67
67
  "cz-conventional-changelog": "^3.3.0",
68
- "eslint": "^8.42.0",
68
+ "eslint": "^8.54.0",
69
69
  "husky": "^8.0.3",
70
- "lint-staged": "^13.2.2",
70
+ "lint-staged": "^15.1.0",
71
71
  "mocha": "^10.2.0",
72
72
  "npm-run-all": "^4.1.5",
73
73
  "prettier": "^2.8.8",
@@ -84,9 +84,5 @@
84
84
  "extends": [
85
85
  "@commitlint/config-conventional"
86
86
  ]
87
- },
88
- "overrides": {
89
- "http-cache-semantics": "^4.1.1",
90
- "minimist": "^1.2.6"
91
87
  }
92
88
  }
Binary file
package/CHANGELOG.md DELETED
@@ -1,170 +0,0 @@
1
- ## [3.6.2](https://github.com/SAP/generator-easy-ui5/compare/v3.5.1...v3.6.2) (2023-06-20)
2
-
3
- ### Bug Fixes
4
-
5
- - also include embedded subgens ([86912a8](https://github.com/SAP/generator-easy-ui5/commit/86912a8cb4736ea8950696de14ce20e87056246f))
6
- - omit devDependencies for plugin generators ([#125](https://github.com/SAP/generator-easy-ui5/issues/125)) ([ffda0c5](https://github.com/SAP/generator-easy-ui5/commit/ffda0c5048543bdb29956bdde01730af4fee74fb))
7
- - removal of the outdated templates must not fail ([667673d](https://github.com/SAP/generator-easy-ui5/commit/667673d771649c98af3ac8e9ca71a6e99885ff23))
8
- - sort subgen list, remove threshold, fix permission issues ([#123](https://github.com/SAP/generator-easy-ui5/issues/123)) ([c5dd321](https://github.com/SAP/generator-easy-ui5/commit/c5dd3218a26870a61722a9675a81831cc8af50e5)), closes [#122](https://github.com/SAP/generator-easy-ui5/issues/122) [#118](https://github.com/SAP/generator-easy-ui5/issues/118) [#117](https://github.com/SAP/generator-easy-ui5/issues/117) [#111](https://github.com/SAP/generator-easy-ui5/issues/111)
9
-
10
- ### Features
11
-
12
- - support for coporate proxy / switch to esm / update deps ([#124](https://github.com/SAP/generator-easy-ui5/issues/124)) ([bf95254](https://github.com/SAP/generator-easy-ui5/commit/bf95254694025f3d22e5af37bb610ba7d2a0e215)), closes [#79](https://github.com/SAP/generator-easy-ui5/issues/79)
13
-
14
- ## [3.5.1](https://github.com/SAP/generator-easy-ui5/compare/v3.2.0...v3.5.1) (2022-09-10)
15
-
16
- ### Bug Fixes
17
-
18
- - enable for Yeoman UI usage ([03c2e38](https://github.com/SAP/generator-easy-ui5/commit/03c2e38af4eebe108d6076710b74d8aaf7c31d8d))
19
- - **postinstall:** allow usage of NPM config for ghAuthToken to avoid rate limit ([#104](https://github.com/SAP/generator-easy-ui5/issues/104)) ([371d7fb](https://github.com/SAP/generator-easy-ui5/commit/371d7fbc82b8a59cef896197b99239b505b3cd90)), closes [#100](https://github.com/SAP/generator-easy-ui5/issues/100)
20
- - **postinstall:** avoid non-existing node_modules ([#98](https://github.com/SAP/generator-easy-ui5/issues/98)) ([f93c7c9](https://github.com/SAP/generator-easy-ui5/commit/f93c7c99b9e5df7af801a085afe72be85e462007))
21
- - usage of proper gh org for logging and download ([#94](https://github.com/SAP/generator-easy-ui5/issues/94)) ([a88d4db](https://github.com/SAP/generator-easy-ui5/commit/a88d4dbb0a1f5ed3cf60f7ed0297c651222a83fb))
22
- - use the org name of the selected generator for downloading the corresponding repo ([d9ca4dc](https://github.com/SAP/generator-easy-ui5/commit/d9ca4dc3170e0507199799d2e14db327cba4d871))
23
-
24
- ### Features
25
-
26
- - allow ghAuthToken as NPM configuration ([#103](https://github.com/SAP/generator-easy-ui5/issues/103)) ([5e3d928](https://github.com/SAP/generator-easy-ui5/commit/5e3d92807e881d0ade80251bc8cc1bdde85142be))
27
- - allow to run easy-ui5 embedded ([#99](https://github.com/SAP/generator-easy-ui5/issues/99)) ([f4952c4](https://github.com/SAP/generator-easy-ui5/commit/f4952c442c9563a51c48b8edc25843f097fce4c4))
28
- - offline support, generator from repo, bestofui5 test ([#110](https://github.com/SAP/generator-easy-ui5/issues/110)) ([70e9012](https://github.com/SAP/generator-easy-ui5/commit/70e9012d85bee0c2ac2dadfe3ca9cac3d297ce84))
29
-
30
- # [3.2.0](https://github.com/SAP/generator-easy-ui5/compare/v3.1.5...v3.2.0) (2022-02-03)
31
-
32
- ### Bug Fixes
33
-
34
- - freeze version of colors.js in package.json ([#85](https://github.com/SAP/generator-easy-ui5/issues/85)) ([6b497b6](https://github.com/SAP/generator-easy-ui5/commit/6b497b6c05748b8f67617c6399a11f8e8d850d48))
35
- - use homedir for plugin-generators avoid EACCESS ([e326676](https://github.com/SAP/generator-easy-ui5/commit/e326676458f439f9ac01498381059229a897fa61)), closes [#84](https://github.com/SAP/generator-easy-ui5/issues/84)
36
-
37
- ### Features
38
-
39
- - Add support for user repositories ([6b7efa6](https://github.com/SAP/generator-easy-ui5/commit/6b7efa63414c31d76a53ee1b069557c527077f39))
40
- - support additional GH org via NPM config ([0d33197](https://github.com/SAP/generator-easy-ui5/commit/0d33197098e010858d1ea7a0e4b172d5d6a5aa22))
41
-
42
- ## [3.1.5](https://github.com/SAP/generator-easy-ui5/compare/v3.1.4...v3.1.5) (2022-01-10)
43
-
44
- ### Bug Fixes
45
-
46
- - re-enable sub-generator update check ([c464bd1](https://github.com/SAP/generator-easy-ui5/commit/c464bd11d2cf32006fd7f42ea8f15a736cb10271))
47
-
48
- ## [3.1.4](https://github.com/SAP/generator-easy-ui5/compare/v3.1.3...v3.1.4) (2021-12-07)
49
-
50
- ### Bug Fixes
51
-
52
- - disable autoinstall of Yeoman 5.x ([de6fcaf](https://github.com/SAP/generator-easy-ui5/commit/de6fcafd164734a9e3fbbab599b7376a49fffe89))
53
-
54
- ## [3.1.3](https://github.com/SAP/generator-easy-ui5/compare/v3.1.2...v3.1.3) (2021-11-25)
55
-
56
- ## [3.1.2](https://github.com/SAP/generator-easy-ui5/compare/v3.1.1...v3.1.2) (2021-11-23)
57
-
58
- ## [3.1.1](https://github.com/SAP/generator-easy-ui5/compare/v3.1.0...v3.1.1) (2021-11-23)
59
-
60
- # [3.1.0](https://github.com/SAP/generator-easy-ui5/compare/v3.0.3...v3.1.0) (2021-11-23)
61
-
62
- ## [3.0.3](https://github.com/SAP/generator-easy-ui5/compare/v3.0.2...v3.0.3) (2021-11-15)
63
-
64
- ## [3.0.2](https://github.com/SAP/generator-easy-ui5/compare/v3.0.1...v3.0.2) (2021-11-15)
65
-
66
- ## [3.0.1](https://github.com/SAP/generator-easy-ui5/compare/v2.4.6...v3.0.1) (2021-05-10)
67
-
68
- ## [2.4.6](https://github.com/SAP/generator-easy-ui5/compare/2.4.6...v2.4.6) (2021-02-10)
69
-
70
- ### Bug Fixes
71
-
72
- - uiveri5 reporters ([f2e2d6d](https://github.com/SAP/generator-easy-ui5/commit/f2e2d6dae71dc580ee0d15c42baafe06ae983d4e))
73
-
74
- ## [2.4.5](https://github.com/SAP/generator-easy-ui5/compare/2.4.5...v2.4.5) (2021-01-29)
75
-
76
- ### Bug Fixes
77
-
78
- - opa test namespace and folder ([fb166b7](https://github.com/SAP/generator-easy-ui5/commit/fb166b7df06b7cd465366726ed484890ad389d96))
79
-
80
- ## [2.4.4](https://github.com/SAP/generator-easy-ui5/compare/2.4.4...v2.4.4) (2021-01-25)
81
-
82
- ## [2.4.3](https://github.com/SAP/generator-easy-ui5/compare/2.4.3...v2.4.3) (2021-01-08)
83
-
84
- ## [2.4.2](https://github.com/SAP/generator-easy-ui5/compare/2.4.2...v2.4.2) (2020-12-18)
85
-
86
- ## [2.4.1](https://github.com/SAP/generator-easy-ui5/compare/v2.4.0...v2.4.1) (2020-12-18)
87
-
88
- # [2.4.0](https://github.com/SAP/generator-easy-ui5/compare/v2.3.0...v2.4.0) (2020-12-10)
89
-
90
- ### Features
91
-
92
- - add wdi5 as test framework ([e63ce2e](https://github.com/SAP/generator-easy-ui5/commit/e63ce2eb2ed9cc23840cb303d01fc4e7d23f2c11))
93
-
94
- # [2.3.0](https://github.com/SAP/generator-easy-ui5/compare/v2.2.4...v2.3.0) (2020-11-25)
95
-
96
- ## [2.2.4](https://github.com/SAP/generator-easy-ui5/compare/v2.2.3...v2.2.4) (2020-11-10)
97
-
98
- ## [2.2.3](https://github.com/SAP/generator-easy-ui5/compare/v2.2.2...v2.2.3) (2020-11-05)
99
-
100
- ## [2.2.2](https://github.com/SAP/generator-easy-ui5/compare/v2.2.1...v2.2.2) (2020-10-28)
101
-
102
- ## [2.2.1](https://github.com/SAP/generator-easy-ui5/compare/v2.2.0...v2.2.1) (2020-10-23)
103
-
104
- # [2.2.0](https://github.com/SAP/generator-easy-ui5/compare/v2.1.7...v2.2.0) (2020-10-16)
105
-
106
- ## [2.1.7](https://github.com/SAP/generator-easy-ui5/compare/v2.1.6...v2.1.7) (2020-09-10)
107
-
108
- ## [2.1.6](https://github.com/SAP/generator-easy-ui5/compare/v2.1.5...v2.1.6) (2020-08-24)
109
-
110
- ## [2.1.5](https://github.com/SAP/generator-easy-ui5/compare/v2.1.4...v2.1.5) (2020-08-24)
111
-
112
- ## [2.1.4](https://github.com/SAP/generator-easy-ui5/compare/v2.1.3...v2.1.4) (2020-08-06)
113
-
114
- ## [2.1.3](https://github.com/SAP/generator-easy-ui5/compare/v2.1.2...v2.1.3) (2020-08-03)
115
-
116
- ## [2.1.2](https://github.com/SAP/generator-easy-ui5/compare/v2.1.1...v2.1.2) (2020-06-29)
117
-
118
- ## [2.1.1](https://github.com/SAP/generator-easy-ui5/compare/v2.1.0...v2.1.1) (2020-06-18)
119
-
120
- # [2.1.0](https://github.com/SAP/generator-easy-ui5/compare/v2.0.1...v2.1.0) (2020-06-15)
121
-
122
- ## [2.0.1](https://github.com/SAP/generator-easy-ui5/compare/v2.0.0...v2.0.1) (2020-06-09)
123
-
124
- # [2.0.0](https://github.com/SAP/generator-easy-ui5/compare/v1.3.7...v2.0.0) (2020-06-08)
125
-
126
- ## [1.3.7](https://github.com/SAP/generator-easy-ui5/compare/v1.3.6...v1.3.7) (2020-05-06)
127
-
128
- ## [1.3.6](https://github.com/SAP/generator-easy-ui5/compare/v1.3.5...v1.3.6) (2020-05-06)
129
-
130
- ## [1.3.5](https://github.com/SAP/generator-easy-ui5/compare/v1.3.4...v1.3.5) (2020-04-30)
131
-
132
- ## [1.3.4](https://github.com/SAP/generator-easy-ui5/compare/v1.3.3...v1.3.4) (2020-04-29)
133
-
134
- ## [1.3.3](https://github.com/SAP/generator-easy-ui5/compare/v1.3.2...v1.3.3) (2020-04-14)
135
-
136
- ## [1.3.2](https://github.com/SAP/generator-easy-ui5/compare/v1.3.1...v1.3.2) (2020-04-02)
137
-
138
- ### Bug Fixes
139
-
140
- - **app:** Fix lint errors ([c4df165](https://github.com/SAP/generator-easy-ui5/commit/c4df165e35b319aedfc932ac37d2593c0fa5e526))
141
- - **formatter:** Fix formatter ([4f637c8](https://github.com/SAP/generator-easy-ui5/commit/4f637c81e2a916a0067d36f8d214a447a7a62212))
142
-
143
- ### Features
144
-
145
- - **BaseController:** Adding the BaseController and formatter ([e51a66b](https://github.com/SAP/generator-easy-ui5/commit/e51a66bfcd8dea90fd27c7684264e1202bde3e47))
146
- - **BaseController:** Fix lint and activate install again after creation ([8697b1b](https://github.com/SAP/generator-easy-ui5/commit/8697b1bdbcc3f82bb8eb5f0e9e750b37f0d44d8f))
147
-
148
- ## [1.3.1](https://github.com/SAP/generator-easy-ui5/compare/v1.3.0...v1.3.1) (2020-03-20)
149
-
150
- # [1.3.0](https://github.com/SAP/generator-easy-ui5/compare/v1.2.0...v1.3.0) (2020-03-11)
151
-
152
- # [1.2.0](https://github.com/SAP/generator-easy-ui5/compare/v1.1.1...v1.2.0) (2020-02-13)
153
-
154
- ## [1.1.1](https://github.com/SAP/generator-easy-ui5/compare/v1.0.3...v1.1.1) (2019-12-13)
155
-
156
- ## [1.0.3](https://github.com/SAP/generator-easy-ui5/compare/v1.0.2...v1.0.3) (2019-12-04)
157
-
158
- ## [1.0.2](https://github.com/SAP/generator-easy-ui5/compare/v1.0.1...v1.0.2) (2019-11-08)
159
-
160
- ## [1.0.1](https://github.com/SAP/generator-easy-ui5/compare/v1.0.0...v1.0.1) (2019-11-06)
161
-
162
- # [1.0.0](https://github.com/SAP/generator-easy-ui5/compare/v0.3.4...v1.0.0) (2019-10-30)
163
-
164
- ## [0.3.4](https://github.com/SAP/generator-easy-ui5/compare/v0.3.3...v0.3.4) (2019-10-24)
165
-
166
- ## [0.3.3](https://github.com/SAP/generator-easy-ui5/compare/v0.3.2...v0.3.3) (2019-10-23)
167
-
168
- ## [0.3.2](https://github.com/SAP/generator-easy-ui5/compare/v0.3.1...v0.3.2) (2019-10-23)
169
-
170
- ## [0.3.1](https://github.com/SAP/generator-easy-ui5/compare/v2.0.2...v0.3.1) (2019-10-23)