diff --git a/build.gradle.kts b/build.gradle.kts index 671757bd0c694b..1b83371fa360f4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ -group = "io.nx" +group = "dev.nx" plugins { - id("io.nx.gradle.native") version("+") + // id("dev.nx.gradle.native") version("+") } allprojects { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1..a4b76b9530d66f 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1af9e0930b89b3..cea7a793a84b44 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a42690741..f3b75f3b0d4fae 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f135dd2..9d21a21834d519 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/nx.json b/nx.json index bf7922d0997f9e..ecb00171074411 100644 --- a/nx.json +++ b/nx.json @@ -52,7 +52,11 @@ ] }, "release": { - "projects": ["packages/*", "packages/nx/native-packages/*"], + "projects": [ + "packages/*", + "packages/nx/native-packages/*", + "packages/gradle/native/*" + ], "releaseTagPattern": "{version}", "changelog": { "workspaceChangelog": { @@ -240,8 +244,7 @@ "serveStaticTargetName": "serve-static" } }, - "@nx/powerpack-enterprise-cloud", - "@nx/gradle/plugin-v1" + "@nx/powerpack-enterprise-cloud" ], "nxCloudId": "62d013ea0852fe0a2df74438", "nxCloudUrl": "https://staging.nx.app", diff --git a/packages/build.gradle.kts b/packages/build.gradle.kts index 8913d65963d211..9aa884ac23573f 100644 --- a/packages/build.gradle.kts +++ b/packages/build.gradle.kts @@ -1,7 +1,7 @@ -group = "io.nx" +group = "dev.nx" plugins { - id("io.nx.gradle.native") version("+") + // id("dev.nx.gradle.native") version("+") } allprojects { diff --git a/packages/gradle/build.gradle.kts b/packages/gradle/build.gradle.kts index 8913d65963d211..9aa884ac23573f 100644 --- a/packages/gradle/build.gradle.kts +++ b/packages/gradle/build.gradle.kts @@ -1,7 +1,7 @@ -group = "io.nx" +group = "dev.nx" plugins { - id("io.nx.gradle.native") version("+") + // id("dev.nx.gradle.native") version("+") } allprojects { diff --git a/packages/gradle/native/README.md b/packages/gradle/native/README.md new file mode 100644 index 00000000000000..41391c3804519c --- /dev/null +++ b/packages/gradle/native/README.md @@ -0,0 +1,62 @@ +# dev.nx.gradle.native + +This gradle plugin contains + +## Installation + +Kotlin +build.gradle.kts + +``` +plugins { + id("dev.nx.gradle.native") version("+") +} +``` + +Groovy +build.gradle + +``` +plugins { + id "dev.nx.gradle.native" version "+" +} +``` + +## Usage + +```bash +./gradlew :createNodes +``` + +With specific output directory (default to `.nx/cache`): + +```bash +./gradlew :createNodes --outputDirectory ./ +``` + +With specific nx workspace root (default to current working directory): + +```bash +./gradlew :createNodes --workspaceRoot ./ +``` + +In terminal, it should output something like: + +``` +> Task :createNodes +/.nx/cache/add-nx-to-gradle.json +``` + +It generates a json file to be consumed by nx: + +```json +{ + "nodes": { + "app": { + "targets": {} + } + }, + "dependencies": [], + "externalNodes": {} +} +``` diff --git a/packages/gradle/native/build.gradle.kts b/packages/gradle/native/build.gradle.kts index 90e9c44adb1cde..58757fe58b17fb 100644 --- a/packages/gradle/native/build.gradle.kts +++ b/packages/gradle/native/build.gradle.kts @@ -1,7 +1,7 @@ -group = "io.nx.gradle" +group = "dev.nx.gradle" /* - * This file was generated by the Gradle 'init' task. + * This file was generated by the Gradle "init" task. * * This generated file contains a sample Gradle plugin project to get you started. * For more details on writing Custom Plugins, please refer to https://docs.gradle.org/8.5/userguide/custom_plugins.html in the Gradle documentation. @@ -14,8 +14,8 @@ plugins { `maven-publish` id("com.gradle.plugin-publish") version "1.3.0" - // id("java-library") - // id("org.jetbrains.kotlin.jvm") version "2.0.21" + id("java-library") + id("org.jetbrains.kotlin.jvm") version "2.0.21" // Apply the Kotlin JVM plugin to add support for Kotlin. // alias(libs.plugins.jvm) @@ -32,8 +32,8 @@ gradlePlugin { // Define the plugin plugins { create("nxGradleNodesPlugin") { - id = "io.nx.gradle.native" - implementationClass = "io.nx.gradle.native.Nodes" + id = "dev.nx.gradle.native" + implementationClass = "dev.nx.gradle.native.Nodes" displayName = "The Nx Plugin for Gradle to generate nodes, dependencies and external nodes" description = "A plugin to generate a json file with nodes, dependencies and external nodes for Nx" tags = listOf("nx", "monorepo", "javascript", "typescript") diff --git a/packages/gradle/native/project.json b/packages/gradle/native/project.json new file mode 100644 index 00000000000000..4ca4d557cd7e06 --- /dev/null +++ b/packages/gradle/native/project.json @@ -0,0 +1,4 @@ +{ + "name": "gradle-native-plugin", + "$schema": "node_modules/nx/schemas/project-schema.json" +} diff --git a/packages/gradle/native/src/main/kotlin/io/nx/gradle/native/CreateNodesTask.kt b/packages/gradle/native/src/main/kotlin/io/nx/gradle/native/CreateNodesTask.kt index 99532d66e46693..5c851367655ed4 100644 --- a/packages/gradle/native/src/main/kotlin/io/nx/gradle/native/CreateNodesTask.kt +++ b/packages/gradle/native/src/main/kotlin/io/nx/gradle/native/CreateNodesTask.kt @@ -1,4 +1,4 @@ -package io.nx.gradle.native +package dev.nx.gradle.native import org.gradle.api.DefaultTask import org.gradle.api.Project @@ -20,7 +20,7 @@ data class GradleTargets(val targets: MutableMap, val targetGroups: data class Metadata(val targetGroups: MutableMap>, val technologies: Array, val description: String?) data class Node(val targets: MutableMap, val metadata: Metadata, val name: String) data class Dependency(val source: String, val target: String, val sourceFile: String) -data class ExternalDepData(val version: String?, val packageName: String) +data class ExternalDepData(val version: String?, val packageName: String, val hash: String?) data class ExternalNode(var type: String?, val name: String, var data: ExternalDepData) data class GradleNodesReport(val nodes: MutableMap, val dependencies: MutableSet, val externalNodes: MutableMap) @@ -61,7 +61,7 @@ abstract class CreateNodesTask : DefaultTask() { allProjects.forEach { project -> logger.info("CreateNodes: get nodes and dependencies for ${project}") try { - project.getConfigurations().forEach { + /* project.getConfigurations().forEach { it.getAllDependencies().filter { it is ExternalModuleDependency }.forEach { @@ -70,13 +70,13 @@ abstract class CreateNodesTask : DefaultTask() { externalNodes.put(it.name, externalNode) } } - logger.info("CreateNodes: get external deps for ${project}") + logger.info("CreateNodes: get external deps for ${project}") */ // get dependencies of project getDependenciesForProject(project, dependencies, allProjects) logger.info("CreateNodes: get dependencies for ${project}") - val gradleTargets = this.processTargetsForProject(project, workspaceRoot, rootProjectDirectory) + val gradleTargets = this.processTargetsForProject(project, workspaceRoot, rootProjectDirectory, externalNodes) var projectRoot = project.getProjectDir().getPath() val projectNode = Node( gradleTargets.targets, @@ -100,7 +100,8 @@ abstract class CreateNodesTask : DefaultTask() { fun processTargetsForProject( project: Project, workspaceRoot: String, - rootProjectDirectory: File + rootProjectDirectory: File, + externalNodes: MutableMap ): GradleTargets { val targets = mutableMapOf() val targetGroups = mutableMapOf>() @@ -123,6 +124,7 @@ abstract class CreateNodesTask : DefaultTask() { project.getTasks().forEach { task -> logger.info(" >> CreateNodes: process ${task} for ${projectRoot}") val target = mutableMapOf() + target.put("cache", true) val group: String? = task.getGroup(); if (!group.isNullOrBlank()) { @@ -134,23 +136,34 @@ abstract class CreateNodesTask : DefaultTask() { } val inputs = task.getInputs().getSourceFiles() + val externalDependencies = mutableListOf() if (!inputs.isEmpty()) { - target.put("inputs", inputs.mapNotNull { file -> + val mappedInputs: MutableList = inputs.mapNotNull { file -> val path: String = file.getPath() - replaceRootInPath(path, projectRoot, workspaceRoot) - }) + val pathWithReplacedRoot = replaceRootInPath(path, projectRoot, workspaceRoot) + if (pathWithReplacedRoot == null && path.endsWith(".jar")) { + externalDependencies.add(getExternalDepFromInputFile(path, externalNodes)) + } + pathWithReplacedRoot + }.toMutableList() + if (externalDependencies.isNotEmpty()) { + // mappedInputs.add(mutableMapOf("externalDependencies" to externalDependencies)) + } + target.put("inputs", mappedInputs) logger.info(" >> CreateNodes: process ${task} inputs") } try { val outputs = task.getOutputs().getFiles() - if (!outputs.isEmpty()) { - target.put("outputs", outputs.mapNotNull { file -> + // if (!outputs.isEmpty()) { + val mappedOutputs: MutableList = outputs.mapNotNull { file -> val path: String = file.getPath() replaceRootInPath(path, projectRoot, workspaceRoot) - }) + }.toMutableList() + mappedOutputs.add("{workspaceRoot}/.gradle/configuration-cache") + target.put("outputs", mappedOutputs) logger.info(" >> CreateNodes: process ${task} outputs") - } + // } } catch (e: Exception) { logger.info("CreateNodes: get outputs error ${e.toString()}") } @@ -158,13 +171,14 @@ abstract class CreateNodesTask : DefaultTask() { try { val dependsOn = task.getTaskDependencies().getDependencies(task) if (!dependsOn.isEmpty()) { - target.put("dependsOn", dependsOn.map { depTask -> + val dependsOnTasksNames = dependsOn.map { depTask -> val depProject = depTask.getProject() if (depProject == project) { depTask.name } "${depProject.name}:${depTask.name}" - }) + } + target.put("dependsOn", dependsOnTasksNames) logger.info(" >> CreateNodes: process task ${task} dependsOn") } } catch (e: Exception) { @@ -183,8 +197,8 @@ abstract class CreateNodesTask : DefaultTask() { addTestCiTarget(inputs, gradlewCommand, gradleProject, target, targets, targetGroups, projectRoot, workspaceRoot) } - target.put("cache", true) - target.put("command", "${gradlewCommand} ${gradleProject}${task.name}") + target.put("command", "${gradlewCommand} ${gradleProject}${task.name} --configuration-cache") + target.put("parallelism", false) val metadata = mapOf( "description" to task.getDescription(), @@ -239,6 +253,7 @@ abstract class CreateNodesTask : DefaultTask() { val testCiTarget = target.toMutableMap() testCiTarget.put("command", "${gradlewCommand} ${gradleProject}test --tests ${fileName}") testCiTarget.put("metadata", metadata) + testCiTarget.put("cache", true) testCiTarget.put("inputs", arrayOf(replaceRootInPath(testFile.getPath(), projectRoot, workspaceRoot))) val targetName = "ci--${fileName}" @@ -266,6 +281,7 @@ abstract class CreateNodesTask : DefaultTask() { testCiTarget.remove("command") testCiTarget.put("metadata", metadata) testCiTarget.put("dependsOn", dependsOn) + testCiTarget.put("cache", true) targets.put("ci", testCiTarget) targetGroups.get("verification")?.add("ci") } @@ -285,6 +301,29 @@ fun replaceRootInPath(p: String, projectRoot: String, workspaceRoot: String): St return null } +/** + * convert org.apache.commons/commons-lang3/3.13.0/b7263237aa89c1f99b327197c41d0669707a462e/commons-lang3-3.13.0.jar + * to external dep: + * "commons-lang3-3.13.0": { + * "type": "gradle", + * "name": "commons-lang3", + * "data": { "version": "3.13.0", "packageName": "org.apache.commons.commons-lang3", "hash": "b7263237aa89c1f99b327197c41d0669707a462e",} + * }, + */ +fun getExternalDepFromInputFile(inputFile: String, externalNodes: MutableMap): String { + val segments: List = inputFile.split("/") + var nameKey = segments.last().replace(".jar", "") + val hash = segments[segments.size - 2] + val version = segments[segments.size - 3] + val packageName = segments[segments.size - 4] + val packageGroup = segments[segments.size - 5] + + val data = ExternalDepData(version, "${packageGroup}.${packageName}", hash) + val node = ExternalNode("gradle", "gradle:${nameKey}", data) + externalNodes.put("gradle:${nameKey}", node) + return "gradle:${nameKey}" +} + fun getDependenciesForProject(project: Project, dependencies: MutableSet, allProjects: Set) { project.getConfigurations().filter { config -> val configName = config.name diff --git a/packages/gradle/native/src/main/kotlin/io/nx/gradle/native/Nodes.kt b/packages/gradle/native/src/main/kotlin/io/nx/gradle/native/Nodes.kt index eed049d7dbefb8..93af6e579b3f12 100644 --- a/packages/gradle/native/src/main/kotlin/io/nx/gradle/native/Nodes.kt +++ b/packages/gradle/native/src/main/kotlin/io/nx/gradle/native/Nodes.kt @@ -1,4 +1,4 @@ -package io.nx.gradle.native +package dev.nx.gradle.native import org.gradle.api.Project import org.gradle.api.Plugin diff --git a/packages/gradle/src/generators/init/init.ts b/packages/gradle/src/generators/init/init.ts index 197e5ef295a89c..a07646ffb6cd97 100644 --- a/packages/gradle/src/generators/init/init.ts +++ b/packages/gradle/src/generators/init/init.ts @@ -93,10 +93,10 @@ function addCreateNodesPluginToBuildGradle( } const nodesPlugin = filename.endsWith('.kts') - ? ` id("io.nx.gradle.native") version("+")` - : ` id "io.nx.gradle.native" version "+"`; + ? ` id("dev.nx.gradle.native") version("+")` + : ` id "dev.nx.gradle.native" version "+"`; if (buildGradleContent.includes('plugins {')) { - if (!buildGradleContent.includes('"io.nx.gradle.native"')) { + if (!buildGradleContent.includes('"dev.nx.gradle.native"')) { buildGradleContent = buildGradleContent.replace( 'plugins {', `plugins { diff --git a/packages/gradle/src/plugin/nodes.ts b/packages/gradle/src/plugin/nodes.ts index e2854632d840af..600f797de4f125 100644 --- a/packages/gradle/src/plugin/nodes.ts +++ b/packages/gradle/src/plugin/nodes.ts @@ -8,6 +8,7 @@ import { CreateNodesFunction, joinPathFragments, workspaceRoot, + ProjectGraphExternalNode, } from '@nx/devkit'; import { calculateHashForCreateNodes } from '@nx/devkit/src/utils/calculate-hash-for-create-nodes'; import { existsSync } from 'node:fs'; @@ -61,11 +62,11 @@ export const createNodesV2: CreateNodesV2 = [ context.workspaceRoot, gradlewFiles.map((f) => join(context.workspaceRoot, f)) ); - const { nodes } = getCurrentNodesReport(); + const { nodes, externalNodes } = getCurrentNodesReport(); try { return createNodesFromFiles( - makeCreateNodesForGradleConfigFile(nodes, targetsCache), + makeCreateNodesForGradleConfigFile(nodes, targetsCache, externalNodes), buildFiles, options, context @@ -79,7 +80,8 @@ export const createNodesV2: CreateNodesV2 = [ export const makeCreateNodesForGradleConfigFile = ( projects: Record>, - targetsCache: GradleTargets = {} + targetsCache: GradleTargets = {}, + externalNodes: Record = {} ): CreateNodesFunction => async ( gradleFilePath, @@ -153,5 +155,6 @@ export const makeCreateNodesForGradleConfigFile = projects: { [projectRoot]: project, }, + externalNodes: externalNodes, }; }; diff --git a/packages/gradle/src/plugin/utils/get-create-nodes-lines.ts b/packages/gradle/src/plugin/utils/get-create-nodes-lines.ts index f1743c925e9a4b..0f86063e0994f0 100644 --- a/packages/gradle/src/plugin/utils/get-create-nodes-lines.ts +++ b/packages/gradle/src/plugin/utils/get-create-nodes-lines.ts @@ -4,7 +4,10 @@ import { existsSync } from 'fs'; import { dirname, join } from 'path'; import { cacheDirectoryForWorkspace } from 'nx/src/utils/cache-directory'; -export async function getCreateNodesLines(gradlewFile: string) { +export async function getCreateNodesLines( + gradlewFile: string, + gradleConfigHash: string +): Promise { let createNodesBuffer: Buffer; // if there is no build.gradle or build.gradle.kts file, we cannot run the createNodes task @@ -25,7 +28,9 @@ export async function getCreateNodesLines(gradlewFile: string) { cacheDirectoryForWorkspace(workspaceRoot), '--workspaceRoot', workspaceRoot, - '--no-parallel' // we need to run this task sequentially because tasks need to be processed in order + '--hash', + gradleConfigHash, + '--no-parallel', // we need to run this task sequentially because tasks need to be processed in order ]); } catch (e) { throw new AggregateCreateNodesError( @@ -33,7 +38,9 @@ export async function getCreateNodesLines(gradlewFile: string) { [ gradlewFile, new Error( - `Could not run 'createNodes' task using ${gradlewFile}. Please run 'nx generate @nx/gradle:init' to generate the necessary tasks. ${e.message ?? e}`, + `Could not run 'createNodes' task using ${gradlewFile}. Please run 'nx generate @nx/gradle:init' to generate the necessary tasks. ${ + e.message ?? e + }`, { cause: e } ), ], diff --git a/packages/gradle/src/plugin/utils/get-nodes-from-gradle-plugin.ts b/packages/gradle/src/plugin/utils/get-nodes-from-gradle-plugin.ts index 4a1b9aa80f6fad..3f65ba2bf1b2f9 100644 --- a/packages/gradle/src/plugin/utils/get-nodes-from-gradle-plugin.ts +++ b/packages/gradle/src/plugin/utils/get-nodes-from-gradle-plugin.ts @@ -4,6 +4,7 @@ import { join } from 'node:path'; import { AggregateCreateNodesError, ProjectConfiguration, + ProjectGraphExternalNode, readJsonFile, StaticDependency, writeJsonFile, @@ -20,6 +21,7 @@ export interface NodesReport { [appRoot: string]: Partial; }; dependencies: Array; + externalNodes?: Record; } export interface NodesReportCache extends NodesReport { @@ -58,7 +60,7 @@ let nodesReportCachePath: string = join( 'gradle-nodes.hash' ); -export function getCurrentNodesReport() { +export function getCurrentNodesReport(): NodesReport { if (!nodesReportCache) { throw new AggregateCreateNodesError( [ @@ -111,7 +113,10 @@ export async function populateNodes( gradlewFile: string ): Promise => { const allLines = await createNodesLines; - const currentLines = await getCreateNodesLines(gradlewFile); + const currentLines = await getCreateNodesLines( + gradlewFile, + gradleConfigHash + ); return [...allLines, ...currentLines]; }, Promise.resolve([]) @@ -133,8 +138,8 @@ export function processCreateNodes(createNodesLines: string[]): NodesReport { let nodesReportForAllProjects: NodesReport = { nodes: {}, dependencies: [], + externalNodes: {}, }; - let dependencies: Array = []; while (index < createNodesLines.length) { const line = createNodesLines[index].trim(); if (line.startsWith('> Task ') && line.endsWith(':createNodes')) { @@ -150,10 +155,17 @@ export function processCreateNodes(createNodesLines: string[]): NodesReport { ...nodesReportForAllProjects.nodes, ...nodesReportJson.nodes, }; - nodesReportForAllProjects.dependencies = [ - ...nodesReportJson.dependencies, - ...dependencies, - ]; + if (nodesReportJson.dependencies) { + nodesReportForAllProjects.dependencies.push( + ...nodesReportJson.dependencies + ); + } + if (Object.keys(nodesReportJson.externalNodes)) { + nodesReportForAllProjects.externalNodes = { + ...nodesReportForAllProjects.externalNodes, + ...nodesReportJson.externalNodes, + }; + } } index++; } diff --git a/packages/nx/src/command-line/release/changelog.ts b/packages/nx/src/command-line/release/changelog.ts index b8f785bdc8bf88..a22c70c9a0da58 100644 --- a/packages/nx/src/command-line/release/changelog.ts +++ b/packages/nx/src/command-line/release/changelog.ts @@ -4,10 +4,7 @@ import { readFileSync, rmSync, writeFileSync } from 'node:fs'; import { ReleaseType, valid } from 'semver'; import { dirSync } from 'tmp'; import type { DependencyBump } from '../../../release/changelog-renderer'; -import { - NxReleaseConfiguration, - readNxJson, -} from '../../config/nx-json'; +import { NxReleaseConfiguration, readNxJson } from '../../config/nx-json'; import { FileData, ProjectFileMap,