From 55dd8438de053316524b5c2e929f34665b2ac765 Mon Sep 17 00:00:00 2001 From: Georgi Damyanov Date: Wed, 30 Oct 2024 13:27:22 +0200 Subject: [PATCH] feat: configuration for sub generator tiles in Template Wizard --- packages/backend/src/utils/env.ts | 26 ++++++++++++++++++++++++-- packages/backend/src/yeomanui.ts | 23 ++++++++++++++++++----- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/packages/backend/src/utils/env.ts b/packages/backend/src/utils/env.ts index 76cc4c001..1da0e762a 100644 --- a/packages/backend/src/utils/env.ts +++ b/packages/backend/src/utils/env.ts @@ -1,16 +1,18 @@ import * as _ from "lodash"; import { homedir } from "os"; import * as path from "path"; -import { existsSync } from "fs"; +import { existsSync, readFileSync } from "fs"; import { isWin32, NpmCommand } from "./npm"; import * as customLocation from "./customLocation"; import * as Environment from "yeoman-environment"; import TerminalAdapter = require("yeoman-environment/lib/adapter"); import { IChildLogger } from "@vscode-logging/logger"; import { getClassLogger } from "../logger/logger-wrapper"; +import { join } from "path"; const GENERATOR = "generator-"; const NAMESPACE = "namespace"; +const PACKAGE_JSON = "package.json"; export type EnvGen = { env: Environment; @@ -22,6 +24,12 @@ export type GeneratorData = { generatorPackageJson: any; }; +export type AdditionalGenerator = { + namespace: string; + displayName: string; + description: string; +} + export class GeneratorNotFoundError extends Error { constructor(message: string) { super(message); @@ -131,7 +139,21 @@ class EnvUtil { } private genMainGensMeta(gensMeta: Environment.LookupGeneratorMeta[]): Environment.LookupGeneratorMeta[] { - return gensMeta.filter((genMeta) => genMeta.namespace.endsWith(":app")); + const mainGenerators = gensMeta.filter((genMeta) => genMeta.namespace.endsWith(":app")); + let additionalGenerators: AdditionalGenerator[] = []; + mainGenerators.forEach((genMeta) => { + const packageJsonPath = join(genMeta.packagePath, PACKAGE_JSON); + const { additional_generators }: { additional_generators: AdditionalGenerator[] } = JSON.parse(readFileSync(packageJsonPath, "utf-8")); + if (additional_generators?.length) + additionalGenerators = [...additional_generators]; + }); + + const additionalGeneratorsMeta = gensMeta.filter((genMeta) => additionalGenerators.find((gen) => gen.namespace === genMeta.namespace)).map(genMeta => { + genMeta.isAdditional = true; + return genMeta; + }); + + return mainGenerators.concat(additionalGeneratorsMeta); } private async getGensMetaByInstallationPath(): Promise { diff --git a/packages/backend/src/yeomanui.ts b/packages/backend/src/yeomanui.ts index 1c6e3783a..048fe2925 100644 --- a/packages/backend/src/yeomanui.ts +++ b/packages/backend/src/yeomanui.ts @@ -16,7 +16,7 @@ import { IPrompt, MessageType } from "@sap-devx/yeoman-ui-types"; import { AnalyticsWrapper } from "./usage-report/usage-analytics-wrapper"; import { Output } from "./output"; import { resolve } from "path"; -import { Env, EnvGen, GeneratorData, GeneratorNotFoundError } from "./utils/env"; +import { AdditionalGenerator, Env, EnvGen, GeneratorData, GeneratorNotFoundError } from "./utils/env"; import { vscode, getVscode } from "./utils/vscodeProxy"; import * as Generator from "yeoman-generator"; import * as Environment from "yeoman-environment"; @@ -563,6 +563,7 @@ export class YeomanUI { private async getGeneratorChoice(genData: GeneratorData, filter: GeneratorFilter, hiddenGeneratorsArray: string[]) { const packageJson = genData.generatorPackageJson; const genMeta = genData.generatorMeta; + const isAdditionalGenerator = genMeta.isAdditional; const genFilter: GeneratorFilter = GeneratorFilter.create(_.get(packageJson, ["generator-filter"])); const typesHasIntersection: boolean = GeneratorFilter.hasIntersection(filter.types, genFilter.types); const categoriesHasIntersection: boolean = GeneratorFilter.hasIntersection(filter.categories, genFilter.categories); @@ -579,11 +580,11 @@ export class YeomanUI { hidden = true; } if (!hidden && typesHasIntersection && categoriesHasIntersection) { - return this.createGeneratorChoice(genMeta.namespace, genMeta.packagePath, packageJson); + return this.createGeneratorChoice(genMeta.namespace, genMeta.packagePath, packageJson, isAdditionalGenerator); } } - private async createGeneratorChoice(genNamespace: string, genPackagePath: string, packageJson: any): Promise { + private async createGeneratorChoice(genNamespace: string, genPackagePath: string, packageJson: any, isAdditionalGenerator: boolean): Promise { let genImageUrl; try { @@ -593,9 +594,21 @@ export class YeomanUI { this.logger.debug(error); } + let genMessage = _.get(packageJson, "description", YeomanUI.defaultMessage); + let genDisplayName = _.get(packageJson, "displayName", ""); + + if (isAdditionalGenerator) { + const additionalGenerators = _.get(packageJson, "additional_generators"); + if (additionalGenerators) { + const genData: AdditionalGenerator = additionalGenerators.find((gen: AdditionalGenerator) => gen.namespace === genNamespace); + genMessage = genData.description; + genDisplayName = genData.displayName; + } + + } + const genName = Environment.namespaceToName(genNamespace); - const genMessage = _.get(packageJson, "description", YeomanUI.defaultMessage); - const genDisplayName = _.get(packageJson, "displayName", ""); + const genPrettyName = _.isEmpty(genDisplayName) ? titleize(humanizeString(genName)) : genDisplayName; const genHomepage = _.get(packageJson, "homepage", ""); const filter = _.get(packageJson, "generator-filter", undefined);