Skip to content

Commit

Permalink
feat(core): pattern matching for target defaults
Browse files Browse the repository at this point in the history
  • Loading branch information
AgentEnder committed Jul 9, 2024
1 parent 8fd38cb commit 840f448
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,16 @@ describe('project-configuration-utils', () => {
key: 'default-value-for-targetname',
},
},
'e2e-ci--*': {
options: {
key: 'default-value-for-e2e-ci',
},
},
'e2e-ci--file-*': {
options: {
key: 'default-value-for-e2e-ci-file',
},
},
};

it('should prefer executor key', () => {
Expand Down Expand Up @@ -61,6 +71,14 @@ describe('project-configuration-utils', () => {
).toBeNull();
});

it('should return first matching target', () => {
expect(
// This matches both 'e2e-ci--*' and 'e2e-ci--file-*', we expect the first match to be returned.
readTargetDefaultsForTarget('e2e-ci--file-foo', targetDefaults, null)
.options['key']
).toEqual('default-value-for-e2e-ci');
});

it('should not merge top level properties for incompatible targets', () => {
expect(
mergeTargetConfigurations(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import {
AggregateCreateNodesError,
} from '../error-types';
import { CreateNodesResult } from '../plugins';
import { isGlobPattern } from '../../utils/globs';

export type SourceInformation = [file: string | null, plugin: string];
export type ConfigurationSourceMaps = Record<
Expand Down Expand Up @@ -1036,10 +1037,18 @@ export function readTargetDefaultsForTarget(
// If not, use build if it is present.
const key = [executor, targetName].find((x) => targetDefaults?.[x]);
return key ? targetDefaults?.[key] : null;
} else {
} else if (targetDefaults?.[targetName]) {
// If the executor is not defined, the only key we have is the target name.
return targetDefaults?.[targetName];
}

for (const key in targetDefaults ?? {}) {
if (isGlobPattern(key) && minimatch(targetName, key)) {
return targetDefaults[key];
}
}

return {};
}

function createRootMap(projectRootMap: Record<string, ProjectConfiguration>) {
Expand Down
8 changes: 3 additions & 5 deletions packages/nx/src/tasks-runner/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,9 @@ import { splitByColons } from '../utils/split-target';
import { getExecutorInformation } from '../command-line/run/executor-utils';
import { CustomHasher, ExecutorConfig } from '../config/misc-interfaces';
import { readProjectsConfigurationFromProjectGraph } from '../project-graph/project-graph';
import {
GLOB_CHARACTERS,
findMatchingProjects,
} from '../utils/find-matching-projects';
import { findMatchingProjects } from '../utils/find-matching-projects';
import { minimatch } from 'minimatch';
import { isGlobPattern } from '../utils/globs';

export type NormalizedTargetDependencyConfig = TargetDependencyConfig & {
projects: string[];
Expand Down Expand Up @@ -122,7 +120,7 @@ export function expandWildcardTargetConfiguration(
dependencyConfig: NormalizedTargetDependencyConfig,
allTargetNames: string[]
): NormalizedTargetDependencyConfig[] {
if (!GLOB_CHARACTERS.some((char) => dependencyConfig.target.includes(char))) {
if (!isGlobPattern(dependencyConfig.target)) {
return [dependencyConfig];
}
let cache = patternResultCache.get(allTargetNames);
Expand Down
10 changes: 3 additions & 7 deletions packages/nx/src/utils/find-matching-projects.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { minimatch } from 'minimatch';
import type { ProjectGraphProjectNode } from '../config/project-graph';
import { isGlobPattern } from './globs';

const validPatternTypes = [
'name', // Pattern is based on the project's name
Expand All @@ -18,11 +19,6 @@ interface ProjectPattern {
value: string;
}

/**
* The presence of these characters in a string indicates that it might be a glob pattern.
*/
export const GLOB_CHARACTERS = ['*', '|', '{', '}', '(', ')'];

/**
* Find matching project names given a list of potential project names or globs.
*
Expand Down Expand Up @@ -169,7 +165,7 @@ function addMatchingProjectsByName(
return;
}

if (!GLOB_CHARACTERS.some((c) => pattern.value.includes(c))) {
if (!isGlobPattern(pattern.value)) {
return;
}

Expand Down Expand Up @@ -204,7 +200,7 @@ function addMatchingProjectsByTag(
continue;
}

if (!GLOB_CHARACTERS.some((c) => pattern.value.includes(c))) {
if (!isGlobPattern(pattern.value)) {
continue;
}

Expand Down
11 changes: 11 additions & 0 deletions packages/nx/src/utils/globs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,14 @@ export function combineGlobPatterns(...patterns: (string | string[])[]) {
const p = patterns.flat();
return p.length > 1 ? '{' + p.join(',') + '}' : p.length === 1 ? p[0] : '';
}

export const GLOB_CHARACTERS = new Set(['*', '|', '{', '}', '(', ')', '[']);

export function isGlobPattern(pattern: string) {
for (const c of pattern) {
if (GLOB_CHARACTERS.has(c)) {
return true;
}
}
return false;
}

0 comments on commit 840f448

Please sign in to comment.