UNPKG

@nxrocks/common-jvm

Version:

Common library to share code among the JVM-related plugins.

296 lines 14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getGradleDependencyIdRegEx = exports.JVM_PROJECT_FILES = exports.LARGE_BUFFER = void 0; exports.runBuilderCommand = runBuilderCommand; exports.isMavenProject = isMavenProject; exports.isMavenProjectInTree = isMavenProjectInTree; exports.hasMavenProject = hasMavenProject; exports.isGradleProject = isGradleProject; exports.isGradleProjectInTree = isGradleProjectInTree; exports.isGradleProjectSettingsInTree = isGradleProjectSettingsInTree; exports.hasGradleProject = hasGradleProject; exports.hasGradleSettingsFile = hasGradleSettingsFile; exports.hasGradleBuildFile = hasGradleBuildFile; exports.getGradleBuildFilesExtension = getGradleBuildFilesExtension; exports.getGradleBuildFilesExtensionInTree = getGradleBuildFilesExtensionInTree; exports.getJvmPackageInfo = getJvmPackageInfo; exports.checkProjectBuildFileContains = checkProjectBuildFileContains; exports.checkProjectFileContains = checkProjectFileContains; exports.getPathFromParentModule = getPathFromParentModule; exports.getPathToParentModule = getPathToParentModule; exports.getAdjustedProjectAndModuleRoot = getAdjustedProjectAndModuleRoot; const devkit_1 = require("@nx/devkit"); const child_process_1 = require("child_process"); const fileutils_1 = require("@nx/workspace/src/utilities/fileutils"); const common_1 = require("@nxrocks/common"); const utils_1 = require("../utils"); const maven_utils_1 = require("./maven-utils"); const gradle_utils_1 = require("./gradle-utils"); const path_1 = require("path"); exports.LARGE_BUFFER = 1024 * 1000000; exports.JVM_PROJECT_FILES = [ 'pom.xml', 'build.gradle', 'build.gradle.kts', 'settings.gradle', 'settings.gradle.kts', ]; function runBuilderCommand(commandAlias, getBuilder, params, options = { cwd: process.cwd(), ignoreWrapper: false, useLegacyWrapper: false, runFromParentModule: false, }) { // Take the parameters or set defaults const buildSystem = getBuilder(options.cwd); const executable = buildSystem.getExecutable(options.ignoreWrapper ?? false, options.useLegacyWrapper ?? false); const { cwd, command } = buildSystem.getCommand(commandAlias, options); // Create the command to execute const execute = `${executable} ${command} ${(params || []).join(' ')}`; try { devkit_1.logger.info(`Executing command: ${execute}`); (0, child_process_1.execSync)(execute, { cwd, stdio: [0, 1, 2], maxBuffer: exports.LARGE_BUFFER }); return { success: true }; } catch (e) { devkit_1.logger.error(`Failed to execute command: ${execute}`); devkit_1.logger.error(e); return { success: false }; } } function isMavenProject(project) { return (0, fileutils_1.fileExists)((0, common_1.getProjectFilePath)(project, 'pom.xml')); } function isMavenProjectInTree(tree, rootFolder) { return tree.exists(`./${rootFolder}/pom.xml`); } function hasMavenProject(cwd) { return (0, fileutils_1.fileExists)((0, path_1.resolve)(cwd, 'pom.xml')); } function isGradleProject(project) { return ((0, fileutils_1.fileExists)((0, common_1.getProjectFilePath)(project, 'build.gradle')) || (0, fileutils_1.fileExists)((0, common_1.getProjectFilePath)(project, 'settings.gradle')) || (0, fileutils_1.fileExists)((0, common_1.getProjectFilePath)(project, 'build.gradle.kts')) || (0, fileutils_1.fileExists)((0, common_1.getProjectFilePath)(project, 'settings.gradle.kts'))); } function isGradleProjectInTree(tree, rootFolder) { return (tree.exists(`./${rootFolder}/build.gradle`) || tree.exists(`./${rootFolder}/settings.gradle`) || tree.exists(`./${rootFolder}/build.gradle.kts`) || tree.exists(`./${rootFolder}/settings.gradle.kts`)); } function isGradleProjectSettingsInTree(tree, rootFolder) { return (tree.exists(`./${rootFolder}/settings.gradle`) || tree.exists(`./${rootFolder}/settings.gradle.kts`)); } function hasGradleProject(cwd) { return ((0, fileutils_1.fileExists)((0, path_1.resolve)(cwd, 'build.gradle')) || (0, fileutils_1.fileExists)((0, path_1.resolve)(cwd, 'settings.gradle')) || (0, fileutils_1.fileExists)((0, path_1.resolve)(cwd, 'build.gradle.kts')) || (0, fileutils_1.fileExists)((0, path_1.resolve)(cwd, 'settings.gradle.kts'))); } function hasGradleSettingsFile(cwd) { return ((0, fileutils_1.fileExists)((0, path_1.resolve)(cwd, 'settings.gradle')) || (0, fileutils_1.fileExists)((0, path_1.resolve)(cwd, 'settings.gradle.kts'))); } function hasGradleBuildFile(cwd) { return ((0, fileutils_1.fileExists)((0, path_1.resolve)(cwd, 'build.gradle')) || (0, fileutils_1.fileExists)((0, path_1.resolve)(cwd, 'build.gradle.kts'))); } function getGradleBuildFilesExtension(project) { if ((0, fileutils_1.fileExists)((0, common_1.getProjectFilePath)(project, 'build.gradle.kts')) || (0, fileutils_1.fileExists)((0, common_1.getProjectFilePath)(project, 'settings.gradle.kts'))) { return '.gradle.kts'; } return (0, fileutils_1.fileExists)((0, common_1.getProjectFilePath)(project, 'build.gradle')) || (0, fileutils_1.fileExists)((0, common_1.getProjectFilePath)(project, 'settings.gradle')) ? '.gradle' : undefined; } function getGradleBuildFilesExtensionInTree(tree, rootFolder) { if (tree.exists(`./${rootFolder}/build.gradle.kts`) || tree.exists(`./${rootFolder}/settings.gradle.kts`)) { return '.gradle.kts'; } return tree.exists(`./${rootFolder}/build.gradle`) || tree.exists(`./${rootFolder}/settings.gradle`) ? '.gradle' : undefined; } const getGradleDependencyIdRegEx = () => /\s*(api|compileOnly|implementation|runtimeOnly|testApi|testCompileOnly|testImplementation|testRuntimeOnly)\s*(?<project>(\(?project)?\s*\(?['"]:?(?<id>[^"']+)['"]\)?\)?)/g; exports.getGradleDependencyIdRegEx = getGradleDependencyIdRegEx; function getJvmPackageInfo(project) { if (isMavenProject(project)) { // maven project const pomXmlStr = (0, common_1.getProjectFileContent)(project, 'pom.xml'); const pomXmlNode = (0, utils_1.readXml)(pomXmlStr); const { groupId, artifactId } = (0, maven_utils_1.getCoordinatesForMavenProjet)(project.root); const dependencies = []; const dependencyNodes = (0, utils_1.findXmlNodes)(pomXmlNode, `/project/dependencies/dependency`); if (Array.isArray(dependencyNodes)) { dependencyNodes?.forEach((node) => { const depGroupId = (0, utils_1.findNodeContent)(node, `/dependency/groupId/text()`); const depArtifactId = (0, utils_1.findNodeContent)(node, `/dependency/artifactId/text()`); dependencies.push({ packageId: `${depGroupId}:${depArtifactId}`, packageFile: 'pom.xml', }); }); } const modules = (0, maven_utils_1.getMavenModules)(project.root); return { packageId: `${groupId}:${artifactId}`, packageFile: 'pom.xml', dependencies, modules: modules.map((module) => `${project.root}/${module}`), }; } if (isGradleProject(project)) { // gradle project const ext = getGradleBuildFilesExtension(project); const { groupId, artifactId } = (0, gradle_utils_1.getCoordinatesForGradleProjet)(project.root); const gradleDependencyIdRegEx = (0, exports.getGradleDependencyIdRegEx)(); const dependencies = []; if (hasGradleBuildFile(project.root)) { const buildGradle = (0, common_1.getProjectFileContent)(project, `build${ext}`); let match; do { match = gradleDependencyIdRegEx.exec(buildGradle); const idGroup = match?.groups?.['id']; const projectGroup = match?.groups?.['project']; if (idGroup && projectGroup) { let packageId = idGroup; if (/^\(?project/.test(projectGroup)) { // an internal project dependency starts with 'project', we search for its maven coordinates const { groupId, artifactId } = (0, gradle_utils_1.getCoordinatesForGradleProjet)(`${project.root}/../${idGroup.replaceAll(':', '/')}`); packageId = `${groupId}:${artifactId}`; } dependencies.push({ packageId, packageFile: `build${ext}`, }); } } while (match); } const modules = (0, gradle_utils_1.getGradleModules)(project.root); return { packageId: `${groupId}:${artifactId}`, packageFile: hasGradleSettingsFile(project.root) ? `settings${ext}` : `build${ext}`, dependencies, modules: modules.map((module) => `${project.root}/${module.replaceAll(':', '/')}`), }; } throw new Error(`Cannot inspect dependencies of project at: '${(0, common_1.getProjectRoot)(project)}'.\n` + `No 'pom.xml' nor 'build.gradle[.kts]' was found.`); } function checkProjectBuildFileContains(project, opts, searchInParentModule = true) { let found = false; if (isMavenProject(project) && (0, common_1.hasProjectFile)(project, 'pom.xml')) { const content = (0, common_1.getProjectFileContent)(project, 'pom.xml'); found = checkProjectFileContains(content, opts); if (!found && searchInParentModule) { //not found in the project, check at parent module level const parentRoot = getPathToParentModule(project.root); if ((0, common_1.hasProjectFile)({ root: parentRoot }, 'pom.xml')) { const parentModuleContent = (0, common_1.getProjectFileContent)({ root: parentRoot }, 'pom.xml'); return checkProjectFileContains(parentModuleContent, opts); } } } const ext = getGradleBuildFilesExtension(project); if (isGradleProject(project) && ext && (0, common_1.hasProjectFile)(project, `build${ext}`)) { const content = (0, common_1.getProjectFileContent)(project, `build${ext}`); found = checkProjectFileContains(content, opts); if (!found && searchInParentModule) { //not found in the project, check at parent module level const parentRoot = getPathToParentModule(project.root); if ((0, common_1.hasProjectFile)({ root: parentRoot }, `build${ext}`)) { const parentModuleContent = (0, common_1.getProjectFileContent)({ root: parentRoot }, `build${ext}`); return checkProjectFileContains(parentModuleContent, opts); } } } return found; } function checkProjectFileContains(content, opts) { const { fragments, logicalOp = fragments?.length === 1 ? 'and' : 'or' } = opts; const findOccurencesInContent = (content) => { return (fragments || []).reduce((acc, curr) => { return logicalOp === 'and' ? acc && match(content, curr) : acc || match(content, curr); }, logicalOp === 'and'); }; return findOccurencesInContent(content); } function getPathFromParentModule(cwd) { let pathFromParent = []; let root, name; let currentFolder = cwd; do { const obj = (0, common_1.getNameAndRoot)(currentFolder); root = obj.root; name = obj.name; currentFolder = root; if (root !== '.') { pathFromParent = [name, ...pathFromParent]; } } while (!(hasGradleBuildFile(root) && (0, gradle_utils_1.hasGradleModule)(root, name)) && !(hasMavenProject(root) && (0, maven_utils_1.hasMavenModule)(root, name)) && root !== '.'); return pathFromParent.slice(1).join('/'); } function getPathToParentModule(cwd) { let root, name; let currentFolder = cwd; do { const obj = (0, common_1.getNameAndRoot)(currentFolder); root = obj.root; name = obj.name; currentFolder = root; } while (!(hasGradleBuildFile(root) && (0, gradle_utils_1.hasGradleModule)(root, name)) && !(hasMavenProject(root) && (0, maven_utils_1.hasMavenModule)(root, name)) && root !== '.'); return root; } async function getAdjustedProjectAndModuleRoot(options, isMavenProject) { const projectGraph = process.env['NX_INTERACTIVE'] === 'true' ? (0, devkit_1.readCachedProjectGraph)() : await (0, devkit_1.createProjectGraphAsync)(); if (options.addToExistingParentModule && options.parentModuleName && !projectGraph.nodes[options.parentModuleName]) { throw new Error(`No parent module project named '${options.parentModuleName}' was found in this workspace! Make sure the project exists.`); } const indexOfPathSlash = isMavenProject ? options.projectRoot.lastIndexOf('/') : options.projectRoot.indexOf('/'); let projectRoot = options.projectRoot; let moduleRoot; if (options.addToExistingParentModule && options.parentModuleName) { moduleRoot = projectGraph.nodes[options.parentModuleName].data.root; } else { const rootFolder = options.projectRoot.substring(0, indexOfPathSlash); moduleRoot = `${rootFolder}/${options.parentModuleName}`; } projectRoot = `${moduleRoot}/${options.projectRoot.substring(indexOfPathSlash + 1)}`; const offsetFromRoot = (0, path_1.dirname)((0, path_1.relative)(moduleRoot, projectRoot)); return { projectRoot, moduleRoot, offsetFromRoot, }; } function match(content, value) { if (typeof value === 'string') { return content.includes(value); } else { return value.test(content); } } //# sourceMappingURL=utils.js.map