Skip to content

Commit

Permalink
feat: configuration for sub generator tiles in Template Wizard
Browse files Browse the repository at this point in the history
  • Loading branch information
GDamyanov committed Oct 30, 2024
1 parent 8c763af commit 55dd843
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 7 deletions.
26 changes: 24 additions & 2 deletions packages/backend/src/utils/env.ts
Original file line number Diff line number Diff line change
@@ -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<Environment.Options>;
Expand All @@ -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);
Expand Down Expand Up @@ -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<Environment.LookupGeneratorMeta[]> {
Expand Down
23 changes: 18 additions & 5 deletions packages/backend/src/yeomanui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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);
Expand All @@ -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<any> {
private async createGeneratorChoice(genNamespace: string, genPackagePath: string, packageJson: any, isAdditionalGenerator: boolean): Promise<any> {
let genImageUrl;

try {
Expand All @@ -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);
Expand Down

0 comments on commit 55dd843

Please sign in to comment.