From 5b45aa8faad67fd81340b15bc091741ce6cb6c83 Mon Sep 17 00:00:00 2001 From: Khalil LAGRIDA <32600911+khalilou88@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:39:27 +0200 Subject: [PATCH] feat: possibility to override nx-gradle target names (#1084) * feat: possibility to override nx-gradle target names * build: work in progress --- packages/common/src/lib/types/index.ts | 9 +- packages/common/src/lib/utils/generators.ts | 107 +++++++++++++++++- .../src/generators/application/generator.ts | 63 +++++++---- .../src/generators/library/generator.ts | 15 ++- packages/nx-gradle/src/utils/index.ts | 9 +- .../src/generators/application/generator.ts | 11 +- .../src/generators/library/generator.ts | 4 +- .../generators/parent-project/generator.ts | 2 +- packages/nx-maven/src/utils/index.ts | 105 ----------------- 9 files changed, 184 insertions(+), 141 deletions(-) diff --git a/packages/common/src/lib/types/index.ts b/packages/common/src/lib/types/index.ts index 3b37d9b0d..8e17fbc58 100644 --- a/packages/common/src/lib/types/index.ts +++ b/packages/common/src/lib/types/index.ts @@ -29,4 +29,11 @@ export type NxMavenPluginOptions = { testTargetName: string; integrationTestTargetName: string; }; -export type NxGradlePluginOptions = { gradleRootDirectory: string }; +export type NxGradlePluginOptions = { + gradleRootDirectory: string; + buildTargetName: string; + buildImageTargetName: string; + serveTargetName: string; + testTargetName: string; + integrationTestTargetName: string; +}; diff --git a/packages/common/src/lib/utils/generators.ts b/packages/common/src/lib/utils/generators.ts index dbeca2b51..155ba7525 100644 --- a/packages/common/src/lib/utils/generators.ts +++ b/packages/common/src/lib/utils/generators.ts @@ -1,4 +1,4 @@ -import { joinPathFragments, names } from '@nx/devkit'; +import { PluginConfiguration, joinPathFragments, names } from '@nx/devkit'; import { normalizeName } from '.'; export function generateSimpleProjectName(options: { name: string }) { @@ -123,3 +123,108 @@ export const prettierrcNameOptions = [ 'prettier.config.mjs', '.prettierrc.toml', ]; + +export function getBuildTargetName( + plugin: PluginConfiguration | undefined, +): string { + if (typeof plugin === 'string') { + return 'build'; + } + + const options = plugin?.options; + + if ( + typeof options === 'object' && + options && + 'buildTargetName' in options && + typeof options.buildTargetName === 'string' + ) { + return options.buildTargetName; + } + + return 'build'; +} + +export function getBuildImageTargetName( + plugin: PluginConfiguration | undefined, +): string { + if (typeof plugin === 'string') { + return 'build-image'; + } + + const options = plugin?.options; + + if ( + typeof options === 'object' && + options && + 'buildImageTargetName' in options && + typeof options.buildImageTargetName === 'string' + ) { + return options.buildImageTargetName; + } + + return 'build-image'; +} + +export function getServeTargetName( + plugin: PluginConfiguration | undefined, +): string { + if (typeof plugin === 'string') { + return 'serve'; + } + + const options = plugin?.options; + + if ( + typeof options === 'object' && + options && + 'serveTargetName' in options && + typeof options.serveTargetName === 'string' + ) { + return options.serveTargetName; + } + + return 'serve'; +} + +export function getTestTargetName( + plugin: PluginConfiguration | undefined, +): string { + if (typeof plugin === 'string') { + return 'test'; + } + + const options = plugin?.options; + + if ( + typeof options === 'object' && + options && + 'testTargetName' in options && + typeof options.testTargetName === 'string' + ) { + return options.testTargetName; + } + + return 'test'; +} + +export function getIntegrationTestTargetName( + plugin: PluginConfiguration | undefined, +): string { + if (typeof plugin === 'string') { + return 'integration-test'; + } + + const options = plugin?.options; + + if ( + typeof options === 'object' && + options && + 'integrationTestTargetName' in options && + typeof options.integrationTestTargetName === 'string' + ) { + return options.integrationTestTargetName; + } + + return 'integration-test'; +} diff --git a/packages/nx-gradle/src/generators/application/generator.ts b/packages/nx-gradle/src/generators/application/generator.ts index 48c86085e..93fefe275 100644 --- a/packages/nx-gradle/src/generators/application/generator.ts +++ b/packages/nx-gradle/src/generators/application/generator.ts @@ -11,6 +11,11 @@ import { generateProjectName, generateProjectRoot, generateSimpleProjectName, + getBuildImageTargetName, + getBuildTargetName, + getIntegrationTestTargetName, + getServeTargetName, + getTestTargetName, isCustomPortFunction, parseTags, } from '@jnxplus/common'; @@ -30,10 +35,11 @@ import { findQuarkusVersion, getDsl, getGradleRootDirectory, + getPlugin, getVersionManagement, } from '../../utils'; -import { NxGradleAppGeneratorSchema } from './schema'; import { addMissingCode } from '../../utils/libs-versions-toml'; +import { NxGradleAppGeneratorSchema } from './schema'; export default async function ( tree: Tree, @@ -57,6 +63,11 @@ interface NormalizedSchema extends NxGradleAppGeneratorSchema { gradleRootDirectory: string; versionManagement: VersionManagementType; basePackage: string; + buildTargetName: string; + buildImageTargetName: string; + serveTargetName: string; + testTargetName: string; + integrationTestTargetName: string; } function normalizeOptions( @@ -112,6 +123,13 @@ function normalizeOptions( const basePackage = generateBasePackage(options.groupId); + const plugin = getPlugin(); + const buildTargetName = getBuildTargetName(plugin); + const buildImageTargetName = getBuildImageTargetName(plugin); + const serveTargetName = getServeTargetName(plugin); + const testTargetName = getTestTargetName(plugin); + const integrationTestTargetName = getIntegrationTestTargetName(plugin); + return { ...options, projectName, @@ -128,6 +146,11 @@ function normalizeOptions( gradleRootDirectory, versionManagement, basePackage, + buildTargetName, + buildImageTargetName, + serveTargetName, + testTargetName, + integrationTestTargetName, }; } @@ -343,27 +366,27 @@ async function applicationGenerator( projectType: 'application', sourceRoot: `./${normalizedOptions.projectRoot}/src`, targets: { - build: { + [normalizedOptions.buildTargetName]: { executor: '@jnxplus/nx-gradle:run-task', outputs: [`{projectRoot}/build`], options: { task: 'build', }, }, - 'build-image': {}, - serve: { + [normalizedOptions.buildImageTargetName]: {}, + [normalizedOptions.serveTargetName]: { executor: '@jnxplus/nx-gradle:run-task', options: { task: 'run', }, }, - test: { + [normalizedOptions.testTargetName]: { executor: '@jnxplus/nx-gradle:run-task', options: { task: 'test', }, }, - 'integration-test': {}, + [normalizedOptions.integrationTestTargetName]: {}, }, tags: normalizedOptions.parsedTags, }; @@ -371,17 +394,17 @@ async function applicationGenerator( const targets = projectConfiguration.targets ?? {}; if (options.framework === 'spring-boot') { - targets['build'].options = { - ...targets['build'].options, + targets[`${normalizedOptions.buildTargetName}`].options = { + ...targets[`${normalizedOptions.buildTargetName}`].options, task: normalizedOptions.packaging === 'war' ? 'bootWar' : 'bootJar', }; - targets['serve'].options = { - ...targets['serve'].options, + targets[`${normalizedOptions.serveTargetName}`].options = { + ...targets[`${normalizedOptions.serveTargetName}`].options, task: 'bootRun', }; - targets['build-image'] = { + targets[`${normalizedOptions.buildImageTargetName}`] = { executor: '@jnxplus/nx-gradle:run-task', options: { task: 'bootBuildImage', @@ -390,21 +413,21 @@ async function applicationGenerator( } if (options.framework === 'quarkus') { - targets['build'].options = { - ...targets['build'].options, + targets[`${normalizedOptions.buildTargetName}`].options = { + ...targets[`${normalizedOptions.buildTargetName}`].options, task: 'quarkusBuild', }; - targets['serve'].options = { - ...targets['serve'].options, + targets[`${normalizedOptions.serveTargetName}`].options = { + ...targets[`${normalizedOptions.serveTargetName}`].options, task: 'quarkusDev', }; - targets['build-image'] = { + targets[`${normalizedOptions.buildImageTargetName}`] = { executor: '@jnxplus/nx-gradle:quarkus-build-image', }; - targets['integration-test'] = { + targets[`${normalizedOptions.integrationTestTargetName}`] = { executor: '@jnxplus/nx-gradle:run-task', options: { task: 'quarkusIntTest', @@ -413,16 +436,12 @@ async function applicationGenerator( } if (options.framework === 'micronaut') { - targets['build-image'] = { + targets[`${normalizedOptions.buildImageTargetName}`] = { executor: '@jnxplus/nx-gradle:run-task', options: { task: 'dockerBuild', }, }; - - targets['serve'].options = { - ...targets['serve'].options, - }; } clearEmpties(targets); diff --git a/packages/nx-gradle/src/generators/library/generator.ts b/packages/nx-gradle/src/generators/library/generator.ts index abe0f9582..07869c519 100644 --- a/packages/nx-gradle/src/generators/library/generator.ts +++ b/packages/nx-gradle/src/generators/library/generator.ts @@ -8,6 +8,8 @@ import { generateProjectName, generateProjectRoot, generateSimpleProjectName, + getBuildTargetName, + getTestTargetName, parseProjects, parseTags, } from '@jnxplus/common'; @@ -27,6 +29,7 @@ import { addProjectToGradleSetting, getDsl, getGradleRootDirectory, + getPlugin, getVersionManagement, } from '../../utils'; import { addMissingCode } from '../../utils/libs-versions-toml'; @@ -51,6 +54,8 @@ interface NormalizedSchema extends NxGradleLibGeneratorSchema { kotlinExtension: string; gradleRootDirectory: string; versionManagement: VersionManagementType; + buildTargetName: string; + testTargetName: string; } function normalizeOptions( @@ -94,6 +99,10 @@ function normalizeOptions( const versionManagement = getVersionManagement(tree, gradleRootDirectory); + const plugin = getPlugin(); + const buildTargetName = getBuildTargetName(plugin); + const testTargetName = getTestTargetName(plugin); + return { ...options, projectName, @@ -107,6 +116,8 @@ function normalizeOptions( kotlinExtension, gradleRootDirectory, versionManagement, + buildTargetName, + testTargetName, }; } @@ -290,14 +301,14 @@ async function libraryGenerator( projectType: 'library', sourceRoot: `./${normalizedOptions.projectRoot}/src`, targets: { - build: { + [normalizedOptions.buildTargetName]: { executor: '@jnxplus/nx-gradle:run-task', outputs: [`{projectRoot}/build`], options: { task: 'build', }, }, - test: { + [normalizedOptions.testTargetName]: { executor: '@jnxplus/nx-gradle:run-task', options: { task: 'test', diff --git a/packages/nx-gradle/src/utils/index.ts b/packages/nx-gradle/src/utils/index.ts index c6eb5c276..11fefed25 100644 --- a/packages/nx-gradle/src/utils/index.ts +++ b/packages/nx-gradle/src/utils/index.ts @@ -7,6 +7,7 @@ import { import { ExecutorContext, NxJsonConfiguration, + PluginConfiguration, Tree, joinPathFragments, normalizePath, @@ -60,7 +61,7 @@ export function getRootProjectName(settingsGradleContent: string) { return matches[0]; } -export function getGradleRootDirectory(): string { +export function getPlugin(): PluginConfiguration | undefined { const nxJsonPath = path.join(workspaceRoot, 'nx.json'); const nxJson = readJsonFile(nxJsonPath); @@ -71,6 +72,12 @@ export function getGradleRootDirectory(): string { : p.plugin === '@jnxplus/nx-gradle', ); + return plugin; +} + +export function getGradleRootDirectory(): string { + const plugin = getPlugin(); + if (typeof plugin === 'string') { return ''; } diff --git a/packages/nx-maven/src/generators/application/generator.ts b/packages/nx-maven/src/generators/application/generator.ts index c4f8c0f04..a42218a49 100644 --- a/packages/nx-maven/src/generators/application/generator.ts +++ b/packages/nx-maven/src/generators/application/generator.ts @@ -10,6 +10,11 @@ import { generateProjectName, generateProjectRoot, generateSimpleProjectName, + getBuildImageTargetName, + getBuildTargetName, + getIntegrationTestTargetName, + getServeTargetName, + getTestTargetName, isCustomPortFunction, kotlinVersion, micronautVersion, @@ -32,14 +37,9 @@ import { addMissedProperties, addProjectToAggregator, extractRootPomValues, - getBuildImageTargetName, - getBuildTargetName, - getIntegrationTestTargetName, getMavenRootDirectory, getParentProjectValues, getPlugin, - getServeTargetName, - getTestTargetName, } from '../../utils'; import { NxMavenAppGeneratorSchema } from './schema'; @@ -128,7 +128,6 @@ function normalizeOptions( const plugin = getPlugin(); const buildTargetName = getBuildTargetName(plugin); - const buildImageTargetName = getBuildImageTargetName(plugin); const serveTargetName = getServeTargetName(plugin); const testTargetName = getTestTargetName(plugin); diff --git a/packages/nx-maven/src/generators/library/generator.ts b/packages/nx-maven/src/generators/library/generator.ts index f8af4080d..ec85ed219 100644 --- a/packages/nx-maven/src/generators/library/generator.ts +++ b/packages/nx-maven/src/generators/library/generator.ts @@ -6,6 +6,8 @@ import { generateProjectName, generateProjectRoot, generateSimpleProjectName, + getBuildTargetName, + getTestTargetName, kotlinVersion, micronautVersion, parseProjects, @@ -28,11 +30,9 @@ import { addLibraryToProjects, addMissedProperties, addProjectToAggregator, - getBuildTargetName, getMavenRootDirectory, getParentProjectValues, getPlugin, - getTestTargetName, } from '../../utils'; import { NxMavenLibGeneratorSchema } from './schema'; diff --git a/packages/nx-maven/src/generators/parent-project/generator.ts b/packages/nx-maven/src/generators/parent-project/generator.ts index 67fe3293e..af9d6c8ac 100644 --- a/packages/nx-maven/src/generators/parent-project/generator.ts +++ b/packages/nx-maven/src/generators/parent-project/generator.ts @@ -18,6 +18,7 @@ import { micronautVersion, quarkusVersion, springBootVersion, + getBuildTargetName, } from '@jnxplus/common'; import { Tree, @@ -31,7 +32,6 @@ import * as path from 'path'; import { addMissedProperties, addProjectToAggregator, - getBuildTargetName, getMavenRootDirectory, getParentProjectValues, getPlugin, diff --git a/packages/nx-maven/src/utils/index.ts b/packages/nx-maven/src/utils/index.ts index 44b9bf08a..10875bcf6 100644 --- a/packages/nx-maven/src/utils/index.ts +++ b/packages/nx-maven/src/utils/index.ts @@ -93,111 +93,6 @@ export function getPlugin(): PluginConfiguration | undefined { return plugin; } -export function getBuildTargetName( - plugin: PluginConfiguration | undefined, -): string { - if (typeof plugin === 'string') { - return 'build'; - } - - const options = plugin?.options; - - if ( - typeof options === 'object' && - options && - 'buildTargetName' in options && - typeof options.buildTargetName === 'string' - ) { - return options.buildTargetName; - } - - return 'build'; -} - -export function getBuildImageTargetName( - plugin: PluginConfiguration | undefined, -): string { - if (typeof plugin === 'string') { - return 'build-image'; - } - - const options = plugin?.options; - - if ( - typeof options === 'object' && - options && - 'buildImageTargetName' in options && - typeof options.buildImageTargetName === 'string' - ) { - return options.buildImageTargetName; - } - - return 'build-image'; -} - -export function getServeTargetName( - plugin: PluginConfiguration | undefined, -): string { - if (typeof plugin === 'string') { - return 'serve'; - } - - const options = plugin?.options; - - if ( - typeof options === 'object' && - options && - 'serveTargetName' in options && - typeof options.serveTargetName === 'string' - ) { - return options.serveTargetName; - } - - return 'serve'; -} - -export function getTestTargetName( - plugin: PluginConfiguration | undefined, -): string { - if (typeof plugin === 'string') { - return 'test'; - } - - const options = plugin?.options; - - if ( - typeof options === 'object' && - options && - 'testTargetName' in options && - typeof options.testTargetName === 'string' - ) { - return options.testTargetName; - } - - return 'test'; -} - -export function getIntegrationTestTargetName( - plugin: PluginConfiguration | undefined, -): string { - if (typeof plugin === 'string') { - return 'integration-test'; - } - - const options = plugin?.options; - - if ( - typeof options === 'object' && - options && - 'integrationTestTargetName' in options && - typeof options.integrationTestTargetName === 'string' - ) { - return options.integrationTestTargetName; - } - - return 'integration-test'; -} - function getProjectRootFromTree( tree: Tree, mavenRootDirectory: string,