@nx/gradle 19.5.0-canary.20240705-653cad2 → 19.5.0-canary.20240709-92e09d9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/migrations.json CHANGED
@@ -5,6 +5,12 @@
5
5
  "cli": "nx",
6
6
  "description": "Add task projectReportAll to build.gradle file",
7
7
  "factory": "./src/migrations/19-4-0/add-project-report-all"
8
+ },
9
+ "change-regex-production-test": {
10
+ "version": "19.4.1-beta.0",
11
+ "cli": "nx",
12
+ "description": "This function changes !{projectRoot}/test/**/* in nx.json for production to !{projectRoot}/src/test/**/*",
13
+ "factory": "./src/migrations/19-4-1/change-regex-test-production"
8
14
  }
9
15
  },
10
16
  "packageJsonUpdates": {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/gradle",
3
- "version": "19.5.0-canary.20240705-653cad2",
3
+ "version": "19.5.0-canary.20240709-92e09d9",
4
4
  "private": false,
5
5
  "description": "The Nx Plugin for Gradle allows Gradle tasks to be run through Nx",
6
6
  "repository": {
@@ -34,7 +34,7 @@
34
34
  "migrations": "./migrations.json"
35
35
  },
36
36
  "dependencies": {
37
- "@nx/devkit": "19.5.0-canary.20240705-653cad2"
37
+ "@nx/devkit": "19.5.0-canary.20240709-92e09d9"
38
38
  },
39
39
  "publishConfig": {
40
40
  "access": "public"
@@ -5,4 +5,5 @@ export declare function initGenerator(tree: Tree, options: InitGeneratorSchema):
5
5
  * This function creates and populate build.gradle file next to the settings.gradle file.
6
6
  */
7
7
  export declare function addBuildGradleFileNextToSettingsGradle(tree: Tree): Promise<void>;
8
+ export declare function updateNxJsonConfiguration(tree: Tree): void;
8
9
  export default initGenerator;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.addBuildGradleFileNextToSettingsGradle = exports.initGenerator = void 0;
3
+ exports.updateNxJsonConfiguration = exports.addBuildGradleFileNextToSettingsGradle = exports.initGenerator = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const child_process_1 = require("child_process");
6
6
  const versions_1 = require("../../utils/versions");
@@ -131,7 +131,8 @@ function updateNxJsonConfiguration(tree) {
131
131
  const defaultFilesSet = nxJson.namedInputs.default ?? [];
132
132
  nxJson.namedInputs.default = Array.from(new Set([...defaultFilesSet, '{projectRoot}/**/*']));
133
133
  const productionFileSet = nxJson.namedInputs.production ?? [];
134
- nxJson.namedInputs.production = Array.from(new Set([...productionFileSet, 'default', '!{projectRoot}/test/**/*']));
134
+ nxJson.namedInputs.production = Array.from(new Set([...productionFileSet, 'default', '!{projectRoot}/src/test/**/*']));
135
135
  (0, devkit_1.updateNxJson)(tree, nxJson);
136
136
  }
137
+ exports.updateNxJsonConfiguration = updateNxJsonConfiguration;
137
138
  exports.default = initGenerator;
@@ -0,0 +1,2 @@
1
+ import { Tree } from '@nx/devkit';
2
+ export default function update(tree: Tree): void;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const devkit_1 = require("@nx/devkit");
4
+ const has_gradle_plugin_1 = require("../../utils/has-gradle-plugin");
5
+ // This function changes !{projectRoot}/test/**/* in nx.json for production to !{projectRoot}/src/test/**/*
6
+ function update(tree) {
7
+ if (!(0, has_gradle_plugin_1.hasGradlePlugin)(tree)) {
8
+ return;
9
+ }
10
+ const nxJson = (0, devkit_1.readNxJson)(tree);
11
+ if (!nxJson) {
12
+ return;
13
+ }
14
+ const production = nxJson.namedInputs?.production;
15
+ if (production?.includes('!{projectRoot}/test/**/*')) {
16
+ production[production.indexOf('!{projectRoot}/test/**/*')] =
17
+ '!{projectRoot}/src/test/**/*';
18
+ (0, devkit_1.updateNxJson)(tree, nxJson);
19
+ }
20
+ }
21
+ exports.default = update;
@@ -26,12 +26,11 @@ const createDependencies = async (_, context) => {
26
26
  return Array.from(dependencies);
27
27
  };
28
28
  exports.createDependencies = createDependencies;
29
- const gradleConfigFileNames = new Set(['build.gradle', 'build.gradle.kts']);
30
29
  function findGradleFiles(fileMap) {
31
30
  const gradleFiles = [];
32
31
  for (const [_, files] of Object.entries(fileMap.projectFileMap)) {
33
32
  for (const file of files) {
34
- if (gradleConfigFileNames.has((0, node_path_1.basename)(file.file))) {
33
+ if (get_gradle_report_1.GRADLE_BUILD_FILES.has((0, node_path_1.basename)(file.file))) {
35
34
  gradleFiles.push(file.file);
36
35
  }
37
36
  }
@@ -1,6 +1,7 @@
1
1
  import { CreateNodes, CreateNodesV2, ProjectConfiguration, TargetConfiguration, CreateNodesFunction } from '@nx/devkit';
2
2
  import { GradleReport } from '../utils/get-gradle-report';
3
3
  export interface GradlePluginOptions {
4
+ ciTargetName?: string;
4
5
  testTargetName?: string;
5
6
  classesTargetName?: string;
6
7
  buildTargetName?: string;
@@ -13,7 +14,7 @@ type GradleTargets = Record<string, {
13
14
  }>;
14
15
  export declare function writeTargetsToCache(cachePath: string, results: GradleTargets): void;
15
16
  export declare const createNodesV2: CreateNodesV2<GradlePluginOptions>;
16
- export declare const makeCreateNodes: (gradleReport: GradleReport, targetsCache: GradleTargets) => CreateNodesFunction;
17
+ export declare const makeCreateNodesForGradleConfigFile: (gradleReport: GradleReport, targetsCache?: GradleTargets, gradleProjectRootToTestFilesMap?: Record<string, string[]>) => CreateNodesFunction;
17
18
  /**
18
19
  @deprecated This is replaced with {@link createNodesV2}. Update your plugin to export its own `createNodesV2` function that wraps this one instead.
19
20
  This function will change to the v2 function in Nx 20.
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createNodes = exports.makeCreateNodes = exports.createNodesV2 = exports.writeTargetsToCache = void 0;
3
+ exports.createNodes = exports.makeCreateNodesForGradleConfigFile = exports.createNodesV2 = exports.writeTargetsToCache = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const calculate_hash_for_create_nodes_1 = require("@nx/devkit/src/utils/calculate-hash-for-create-nodes");
6
6
  const node_fs_1 = require("node:fs");
7
7
  const node_path_1 = require("node:path");
8
8
  const cache_directory_1 = require("nx/src/utils/cache-directory");
9
+ const devkit_internals_1 = require("nx/src/devkit-internals");
9
10
  const exec_gradle_1 = require("../utils/exec-gradle");
10
11
  const get_gradle_report_1 = require("../utils/get-gradle-report");
11
12
  const file_hasher_1 = require("nx/src/hasher/file-hasher");
@@ -15,6 +16,13 @@ const dependsOnMap = {
15
16
  test: ['classes'],
16
17
  classes: ['^classes'],
17
18
  };
19
+ function normalizeOptions(options) {
20
+ options ??= {};
21
+ options.testTargetName ??= 'test';
22
+ options.classesTargetName ??= 'classes';
23
+ options.buildTargetName ??= 'build';
24
+ return options;
25
+ }
18
26
  function readTargetsCache(cachePath) {
19
27
  return (0, node_fs_1.existsSync)(cachePath) ? (0, devkit_1.readJsonFile)(cachePath) : {};
20
28
  }
@@ -23,25 +31,28 @@ function writeTargetsToCache(cachePath, results) {
23
31
  }
24
32
  exports.writeTargetsToCache = writeTargetsToCache;
25
33
  exports.createNodesV2 = [
26
- get_gradle_report_1.gradleConfigGlob,
27
- async (configFiles, options, context) => {
34
+ get_gradle_report_1.gradleConfigAndTestGlob,
35
+ async (files, options, context) => {
36
+ const { configFiles, projectRoots, testFiles } = splitConfigFiles(files);
28
37
  const optionsHash = (0, file_hasher_1.hashObject)(options);
29
38
  const cachePath = (0, node_path_1.join)(cache_directory_1.workspaceDataDirectory, `gradle-${optionsHash}.hash`);
30
39
  const targetsCache = readTargetsCache(cachePath);
31
40
  await (0, get_gradle_report_1.populateGradleReport)(context.workspaceRoot);
32
41
  const gradleReport = (0, get_gradle_report_1.getCurrentGradleReport)();
42
+ const gradleProjectRootToTestFilesMap = getGradleProjectRootToTestFilesMap(testFiles, projectRoots);
33
43
  try {
34
- return await (0, devkit_1.createNodesFromFiles)((0, exports.makeCreateNodes)(gradleReport, targetsCache), configFiles, options, context);
44
+ return (0, devkit_1.createNodesFromFiles)((0, exports.makeCreateNodesForGradleConfigFile)(gradleReport, targetsCache, gradleProjectRootToTestFilesMap), configFiles, options, context);
35
45
  }
36
46
  finally {
37
47
  writeTargetsToCache(cachePath, targetsCache);
38
48
  }
39
49
  },
40
50
  ];
41
- const makeCreateNodes = (gradleReport, targetsCache) => async (gradleFilePath, options, context) => {
51
+ const makeCreateNodesForGradleConfigFile = (gradleReport, targetsCache = {}, gradleProjectRootToTestFilesMap = {}) => async (gradleFilePath, options, context) => {
42
52
  const projectRoot = (0, node_path_1.dirname)(gradleFilePath);
53
+ options = normalizeOptions(options);
43
54
  const hash = await (0, calculate_hash_for_create_nodes_1.calculateHashForCreateNodes)(projectRoot, options ?? {}, context);
44
- targetsCache[hash] ??= createGradleProject(gradleReport, gradleFilePath, options, context);
55
+ targetsCache[hash] ??= await createGradleProject(gradleReport, gradleFilePath, options, context, gradleProjectRootToTestFilesMap[projectRoot]);
45
56
  const project = targetsCache[hash];
46
57
  if (!project) {
47
58
  return {};
@@ -52,7 +63,7 @@ const makeCreateNodes = (gradleReport, targetsCache) => async (gradleFilePath, o
52
63
  },
53
64
  };
54
65
  };
55
- exports.makeCreateNodes = makeCreateNodes;
66
+ exports.makeCreateNodesForGradleConfigFile = makeCreateNodesForGradleConfigFile;
56
67
  /**
57
68
  @deprecated This is replaced with {@link createNodesV2}. Update your plugin to export its own `createNodesV2` function that wraps this one instead.
58
69
  This function will change to the v2 function in Nx 20.
@@ -63,11 +74,11 @@ exports.createNodes = [
63
74
  devkit_1.logger.warn('`createNodes` is deprecated. Update your plugin to utilize createNodesV2 instead. In Nx 20, this will change to the createNodesV2 API.');
64
75
  await (0, get_gradle_report_1.populateGradleReport)(context.workspaceRoot);
65
76
  const gradleReport = (0, get_gradle_report_1.getCurrentGradleReport)();
66
- const internalCreateNodes = (0, exports.makeCreateNodes)(gradleReport, {});
77
+ const internalCreateNodes = (0, exports.makeCreateNodesForGradleConfigFile)(gradleReport);
67
78
  return await internalCreateNodes(configFile, options, context);
68
79
  },
69
80
  ];
70
- function createGradleProject(gradleReport, gradleFilePath, options, context) {
81
+ async function createGradleProject(gradleReport, gradleFilePath, options, context, testFiles = []) {
71
82
  try {
72
83
  const { gradleProjectToTasksTypeMap, gradleFileToOutputDirsMap, gradleFileToGradleProjectMap, gradleProjectToProjectName, } = gradleReport;
73
84
  const gradleProject = gradleFileToGradleProjectMap.get(gradleFilePath);
@@ -84,7 +95,7 @@ function createGradleProject(gradleReport, gradleFilePath, options, context) {
84
95
  });
85
96
  }
86
97
  const outputDirs = gradleFileToOutputDirsMap.get(gradleFilePath);
87
- const { targets, targetGroups } = createGradleTargets(tasks, options, context, outputDirs, gradleProject);
98
+ const { targets, targetGroups } = await createGradleTargets(tasks, options, context, outputDirs, gradleProject, gradleFilePath, testFiles);
88
99
  const project = {
89
100
  name: projectName,
90
101
  targets,
@@ -100,29 +111,35 @@ function createGradleProject(gradleReport, gradleFilePath, options, context) {
100
111
  return undefined;
101
112
  }
102
113
  }
103
- function createGradleTargets(tasks, options, context, outputDirs, gradleProject) {
114
+ async function createGradleTargets(tasks, options, context, outputDirs, gradleProject, gradleFilePath, testFiles = []) {
104
115
  const inputsMap = createInputsMap(context);
105
116
  const targets = {};
106
117
  const targetGroups = {};
107
118
  for (const task of tasks) {
108
119
  const targetName = options?.[`${task.name}TargetName`] ?? task.name;
109
- const outputs = outputDirs.get(task.name);
120
+ let outputs = [outputDirs.get(task.name)].filter(Boolean);
121
+ if (task.name === 'test') {
122
+ outputs = [
123
+ outputDirs.get('testReport'),
124
+ outputDirs.get('testResults'),
125
+ ].filter(Boolean);
126
+ getTestCiTargets(testFiles, gradleProject, targetName, options.ciTargetName, inputsMap['test'], outputs, task.type, targets, targetGroups);
127
+ }
128
+ const taskCommandToRun = `${gradleProject ? gradleProject + ':' : ''}${task.name}`;
110
129
  targets[targetName] = {
111
- command: `${(0, exec_gradle_1.getGradleExecFile)()} ${gradleProject ? gradleProject + ':' : ''}${task.name}`,
130
+ command: `${(0, exec_gradle_1.getGradleExecFile)()} ${taskCommandToRun}`,
112
131
  cache: cacheableTaskType.has(task.type),
113
132
  inputs: inputsMap[task.name],
114
133
  dependsOn: dependsOnMap[task.name],
115
134
  metadata: {
116
135
  technologies: ['gradle'],
117
136
  },
137
+ ...(outputs && outputs.length ? { outputs } : {}),
118
138
  };
119
- if (outputs) {
120
- targets[targetName].outputs = [outputs];
121
- }
122
139
  if (!targetGroups[task.type]) {
123
140
  targetGroups[task.type] = [];
124
141
  }
125
- targetGroups[task.type].push(task.name);
142
+ targetGroups[task.type].push(targetName);
126
143
  }
127
144
  return { targetGroups, targets };
128
145
  }
@@ -138,3 +155,79 @@ function createInputsMap(context) {
138
155
  : ['default', '^default'],
139
156
  };
140
157
  }
158
+ function getTestCiTargets(testFiles, gradleProject, testTargetName, ciTargetName, inputs, outputs, targetGroupName, targets, targetGroups) {
159
+ if (!testFiles || testFiles.length === 0 || !ciTargetName) {
160
+ return;
161
+ }
162
+ const taskCommandToRun = `${gradleProject ? gradleProject + ':' : ''}test`;
163
+ if (!targetGroups[targetGroupName]) {
164
+ targetGroups[targetGroupName] = [];
165
+ }
166
+ const dependsOn = [];
167
+ testFiles.forEach((testFile) => {
168
+ const testName = (0, node_path_1.basename)(testFile).split('.')[0];
169
+ const targetName = ciTargetName + '--' + testName;
170
+ targets[targetName] = {
171
+ command: `${(0, exec_gradle_1.getGradleExecFile)()} ${taskCommandToRun} --tests ${testName}`,
172
+ cache: true,
173
+ inputs,
174
+ dependsOn: dependsOnMap['test'],
175
+ metadata: {
176
+ technologies: ['gradle'],
177
+ description: `Runs Gradle test ${testFile} in CI`,
178
+ },
179
+ ...(outputs && outputs.length > 0 ? { outputs } : {}),
180
+ };
181
+ targetGroups[targetGroupName].push(targetName);
182
+ dependsOn.push({
183
+ target: targetName,
184
+ projects: 'self',
185
+ params: 'forward',
186
+ });
187
+ });
188
+ targets[ciTargetName] = {
189
+ executor: 'nx:noop',
190
+ cache: true,
191
+ inputs,
192
+ dependsOn: dependsOn,
193
+ ...(outputs && outputs.length > 0 ? { outputs } : {}),
194
+ metadata: {
195
+ technologies: ['gradle'],
196
+ description: 'Runs Gradle Tests in CI',
197
+ nonAtomizedTarget: testTargetName,
198
+ },
199
+ };
200
+ targetGroups[targetGroupName].push(ciTargetName);
201
+ }
202
+ function splitConfigFiles(files) {
203
+ const configFiles = [];
204
+ const testFiles = [];
205
+ const projectRoots = new Set();
206
+ files.forEach((file) => {
207
+ if (get_gradle_report_1.GRADLE_BUILD_FILES.has((0, node_path_1.basename)(file))) {
208
+ configFiles.push(file);
209
+ projectRoots.add((0, node_path_1.dirname)(file));
210
+ }
211
+ else {
212
+ testFiles.push(file);
213
+ }
214
+ });
215
+ return { configFiles, testFiles, projectRoots: Array.from(projectRoots) };
216
+ }
217
+ function getGradleProjectRootToTestFilesMap(testFiles, projectRoots) {
218
+ if (testFiles.length === 0 || projectRoots.length === 0) {
219
+ return;
220
+ }
221
+ const roots = new Map(projectRoots.map((root) => [root, root]));
222
+ const testFilesToGradleProjectMap = {};
223
+ testFiles.forEach((testFile) => {
224
+ const projectRoot = (0, devkit_internals_1.findProjectForPath)(testFile, roots);
225
+ if (projectRoot) {
226
+ if (!testFilesToGradleProjectMap[projectRoot]) {
227
+ testFilesToGradleProjectMap[projectRoot] = [];
228
+ }
229
+ testFilesToGradleProjectMap[projectRoot].push(testFile);
230
+ }
231
+ });
232
+ return testFilesToGradleProjectMap;
233
+ }
@@ -7,7 +7,10 @@ export interface GradleReport {
7
7
  gradleProjectToTasksTypeMap: Map<string, Map<string, string>>;
8
8
  gradleProjectToProjectName: Map<string, string>;
9
9
  }
10
- export declare const gradleConfigGlob = "**/build.{gradle.kts,gradle}";
10
+ export declare const GRADLE_BUILD_FILES: Set<string>;
11
+ export declare const GRADLE_TEST_FILES: string[];
12
+ export declare const gradleConfigGlob: string;
13
+ export declare const gradleConfigAndTestGlob: string;
11
14
  export declare function getCurrentGradleReport(): GradleReport;
12
15
  export declare function populateGradleReport(workspaceRoot: string): Promise<void>;
13
16
  export declare function processProjectReports(projectReportLines: string[]): GradleReport;
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.processProjectReports = exports.populateGradleReport = exports.getCurrentGradleReport = exports.gradleConfigGlob = exports.newLineSeparator = exports.fileSeparator = void 0;
3
+ exports.processProjectReports = exports.populateGradleReport = exports.getCurrentGradleReport = exports.gradleConfigAndTestGlob = exports.gradleConfigGlob = exports.GRADLE_TEST_FILES = exports.GRADLE_BUILD_FILES = exports.newLineSeparator = exports.fileSeparator = void 0;
4
4
  const node_fs_1 = require("node:fs");
5
5
  const node_path_1 = require("node:path");
6
6
  const devkit_1 = require("@nx/devkit");
7
+ const globs_1 = require("nx/src/utils/globs");
7
8
  const exec_gradle_1 = require("./exec-gradle");
8
9
  const workspace_context_1 = require("nx/src/utils/workspace-context");
9
10
  exports.fileSeparator = process.platform.startsWith('win')
@@ -14,7 +15,13 @@ exports.newLineSeparator = process.platform.startsWith('win')
14
15
  : '\n';
15
16
  let gradleReportCache;
16
17
  let gradleCurrentConfigHash;
17
- exports.gradleConfigGlob = '**/build.{gradle.kts,gradle}';
18
+ exports.GRADLE_BUILD_FILES = new Set(['build.gradle', 'build.gradle.kts']);
19
+ exports.GRADLE_TEST_FILES = [
20
+ '**/src/test/java/**/*.java',
21
+ '**/src/test/kotlin/**/*.kt',
22
+ ];
23
+ exports.gradleConfigGlob = (0, globs_1.combineGlobPatterns)(...Array.from(exports.GRADLE_BUILD_FILES).map((file) => `**/${file}`));
24
+ exports.gradleConfigAndTestGlob = (0, globs_1.combineGlobPatterns)(...Array.from(exports.GRADLE_BUILD_FILES).map((file) => `**/${file}`), ...exports.GRADLE_TEST_FILES);
18
25
  function getCurrentGradleReport() {
19
26
  if (!gradleReportCache) {
20
27
  throw new Error('Expected cached gradle report. Please open an issue at https://github.com/nrwl/nx/issues/new/choose');