Skip to content

Commit

Permalink
fix(core): add cargo and gradle to external graph node
Browse files Browse the repository at this point in the history
  • Loading branch information
xiongemi committed Jan 13, 2025
1 parent 6181592 commit b609459
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 53 deletions.
8 changes: 4 additions & 4 deletions docs/generated/devkit/ProjectGraphExternalNode.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ while allowing tracking of the full tree of different nested versions
### Properties

- [data](../../devkit/documents/ProjectGraphExternalNode#data): Object
- [name](../../devkit/documents/ProjectGraphExternalNode#name): `npm:${string}`
- [type](../../devkit/documents/ProjectGraphExternalNode#type): "npm"
- [name](../../devkit/documents/ProjectGraphExternalNode#name): `npm:${string}` | `cargo:${string}` | `gradle:${string}`
- [type](../../devkit/documents/ProjectGraphExternalNode#type): "npm" | "cargo" | "gradle"

## Properties

Expand All @@ -35,10 +35,10 @@ while allowing tracking of the full tree of different nested versions

### name

**name**: \`npm:$\{string}\`
**name**: \`npm:$\{string}\` \| \`cargo:$\{string}\` \| \`gradle:$\{string}\`

---

### type

**type**: `"npm"`
**type**: `"npm"` \| `"cargo"` \| `"gradle"`
6 changes: 6 additions & 0 deletions packages/eslint-plugin/src/rules/enforce-module-boundaries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import {
matchImportWithWildcard,
stringifyTags,
} from '../utils/runtime-lint-utils';
import { isProjectGraphProjectNode } from 'nx/src/config/project-graph';

type Options = [
{
Expand Down Expand Up @@ -525,6 +526,11 @@ export default ESLintUtils.RuleCreator(
return;
}

if (!isProjectGraphProjectNode(targetProject)) {
return;
}
targetProject = targetProject as ProjectGraphProjectNode;

// check constraints between libs and apps
// check for circular dependency
const circularPath = checkCircularPath(
Expand Down
96 changes: 49 additions & 47 deletions packages/js/src/utils/buildable-libs-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ import { output } from 'nx/src/utils/output';
import { dirname, join, relative, extname, resolve } from 'path';
import type * as ts from 'typescript';
import { readTsConfigPaths } from './typescript/ts-config';
import {
isProjectGraphExternalNode,
isProjectGraphProjectNode,
} from 'nx/src/config/project-graph';

function isBuildable(target: string, node: ProjectGraphProjectNode): boolean {
return (
Expand Down Expand Up @@ -137,7 +141,7 @@ export function calculateProjectDependencies(
} else {
nonBuildableDependencies.push(dep);
}
} else if (depNode.type === 'npm') {
} else if (isProjectGraphExternalNode(depNode)) {
project = {
name: depNode.data.packageName,
outputs: [],
Expand Down Expand Up @@ -529,54 +533,52 @@ export function updatePaths(
) {
const pathsKeys = Object.keys(paths);
// For each registered dependency
dependencies.forEach((dep) => {
if (dep.node.type === 'npm') {
return;
}

// If there are outputs
if (dep.outputs && dep.outputs.length > 0) {
// Directly map the dependency name to the output paths (dist/packages/..., etc.)
paths[dep.name] = dep.outputs;

// check for secondary entrypoints
// For each registered path
for (const path of pathsKeys) {
const nestedName = `${dep.name}/`;

// If the path points to the current dependency and is nested (/)
if (path.startsWith(nestedName)) {
const nestedPart = path.slice(nestedName.length);

// Bind potential secondary endpoints for ng-packagr projects
let mappedPaths = dep.outputs.map(
(output) => `${output}/${nestedPart}`
);

const { root } = dep.node.data;
// Update nested mappings to point to the dependency's output paths
mappedPaths = mappedPaths.concat(
paths[path].flatMap((p) =>
dep.outputs.flatMap((output) => {
const basePath = p.replace(root, output);
return [
// extension-less path to support compiled output
basePath.replace(
new RegExp(`${extname(basePath)}$`, 'gi'),
''
),
// original path with the root re-mapped to the output path
basePath,
];
})
)
);

paths[path] = mappedPaths;
dependencies
.filter((dep) => isProjectGraphProjectNode(dep.node))
.forEach((dep) => {
// If there are outputs
if (dep.outputs && dep.outputs.length > 0) {
// Directly map the dependency name to the output paths (dist/packages/..., etc.)
paths[dep.name] = dep.outputs;

// check for secondary entrypoints
// For each registered path
for (const path of pathsKeys) {
const nestedName = `${dep.name}/`;

// If the path points to the current dependency and is nested (/)
if (path.startsWith(nestedName)) {
const nestedPart = path.slice(nestedName.length);

// Bind potential secondary endpoints for ng-packagr projects
let mappedPaths = dep.outputs.map(
(output) => `${output}/${nestedPart}`
);

const { root } = (dep.node as ProjectGraphProjectNode).data;
// Update nested mappings to point to the dependency's output paths
mappedPaths = mappedPaths.concat(
paths[path].flatMap((p) =>
dep.outputs.flatMap((output) => {
const basePath = p.replace(root, output);
return [
// extension-less path to support compiled output
basePath.replace(
new RegExp(`${extname(basePath)}$`, 'gi'),
''
),
// original path with the root re-mapped to the output path
basePath,
];
})
)
);

paths[path] = mappedPaths;
}
}
}
}
});
});
}

/**
Expand Down
16 changes: 14 additions & 2 deletions packages/nx/src/config/project-graph.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,12 @@ export interface ProjectGraphProjectNode {
};
}

export function isProjectGraphProjectNode(
node: ProjectGraphProjectNode | ProjectGraphExternalNode
): node is ProjectGraphProjectNode {
return node.type === 'app' || node.type === 'e2e' || node.type === 'lib';
}

/**
* A node describing an external dependency
* `name` has as form of:
Expand All @@ -114,15 +120,21 @@ export interface ProjectGraphProjectNode {
*
*/
export interface ProjectGraphExternalNode {
type: 'npm';
name: `npm:${string}`;
type: 'npm' | 'cargo' | 'gradle';
name: `npm:${string}` | `cargo:${string}` | `gradle:${string}`;
data: {
version: string;
packageName: string;
hash?: string;
};
}

export function isProjectGraphExternalNode(
node: ProjectGraphProjectNode | ProjectGraphExternalNode
): node is ProjectGraphExternalNode {
return node.type === 'npm' || node.type === 'cargo' || node.type === 'gradle';
}

/**
* A dependency between two projects
*/
Expand Down

0 comments on commit b609459

Please sign in to comment.