diff --git a/actions/generate.action.ts b/actions/generate.action.ts index 926d5eaab..447436eff 100644 --- a/actions/generate.action.ts +++ b/actions/generate.action.ts @@ -14,6 +14,7 @@ import { askForProjectName, moveDefaultProjectToStart, shouldAskForProject, + shouldGenerateFlat, shouldGenerateSpec, } from '../lib/utils/project-utils'; import { AbstractAction } from './abstract.action'; @@ -34,6 +35,7 @@ const generateFiles = async (inputs: Input[]) => { const appName = inputs.find((option) => option.name === 'project')! .value as string; const spec = inputs.find((option) => option.name === 'spec'); + const flat = inputs.find((option) => option.name === 'flat'); const collection: AbstractCollection = CollectionFactory.create( collectionOption || configuration.collection || Collection.NESTJS, @@ -49,6 +51,7 @@ const generateFiles = async (inputs: Input[]) => { : configuration.sourceRoot; const specValue = spec!.value as boolean; + const flatValue = !!flat as boolean; const specOptions = spec!.options as any; let generateSpec = shouldGenerateSpec( configuration, @@ -57,6 +60,7 @@ const generateFiles = async (inputs: Input[]) => { specValue, specOptions.passedAsInput, ); + let generateFlat = shouldGenerateFlat(configuration, appName, flatValue); // If you only add a `lib` we actually don't have monorepo: true BUT we do have "projects" // Ensure we don't run for new app/libs schematics @@ -98,11 +102,13 @@ const generateFiles = async (inputs: Input[]) => { specValue, specOptions.passedAsInput, ); + generateFlat = shouldGenerateFlat(configuration, answers.appNames, flatValue); } } schematicOptions.push(new SchematicOption('sourceRoot', sourceRoot)); schematicOptions.push(new SchematicOption('spec', generateSpec)); + schematicOptions.push(new SchematicOption('flat', generateFlat)); try { const schematicInput = inputs.find((input) => input.name === 'schematic'); if (!schematicInput) { @@ -117,7 +123,7 @@ const generateFiles = async (inputs: Input[]) => { }; const mapSchematicOptions = (inputs: Input[]): SchematicOption[] => { - const excludedInputNames = ['schematic', 'spec']; + const excludedInputNames = ['schematic', 'spec', 'flat']; const options: SchematicOption[] = []; inputs.forEach((input) => { if (!excludedInputNames.includes(input.name) && input.value !== undefined) { diff --git a/lib/configuration/configuration.ts b/lib/configuration/configuration.ts index 175ec8ec8..9027c8f50 100644 --- a/lib/configuration/configuration.ts +++ b/lib/configuration/configuration.ts @@ -32,6 +32,7 @@ interface PluginOptions { interface GenerateOptions { spec?: boolean | Record; + flat?: boolean; } export interface ProjectConfiguration { diff --git a/lib/utils/project-utils.ts b/lib/utils/project-utils.ts index 0bd91bbeb..60598d12a 100644 --- a/lib/utils/project-utils.ts +++ b/lib/utils/project-utils.ts @@ -68,6 +68,27 @@ export function shouldGenerateSpec( return specValue; } +export function shouldGenerateFlat( + configuration: Required, + appName: string, + flatValue: boolean, +): boolean { + // CLI parameters have the highest priority + if (flatValue === true) { + return flatValue; + } + + const flatConfiguration = getValueOrDefault( + configuration, + 'generateOptions.flat', + appName || '', + ); + if (typeof flatConfiguration === 'boolean') { + return flatConfiguration; + } + return flatValue; +} + export async function askForProjectName( promptQuestion: string, projects: string[],