@nx-dart/nx-dart
Version:
A Nx plugin, that adds support for developing Dart and Flutter packages in a Nx workspace
114 lines • 4.79 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DartPackageNodeResolver = void 0;
const devkit_1 = require("@nrwl/devkit");
const crypto = require("crypto");
const pkg = require("../utils/package");
class DartPackageNodeResolver {
constructor(nodes) {
this.nodes = nodes;
/**
* For each package, its project name.
*/
this.packageToProject = {};
/**
* For each project name that is a Dart package, the package name.
*/
this.projectToPackage = {};
/**
* For ech package, its parsed pubspec.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
this.pubspecs = {};
/**
* For each package, a map from packages they depend on, to the name of the corresponding graph
* node.
*/
this.dependencyToNode = {};
/**
* For each package, the list of nodes of external dependencies.
*/
this.externalDependencyNodes = {};
this.loadDartPackageProjects();
for (const packageName of Object.keys(this.packageToProject)) {
this.buildDependencyNodes(packageName);
}
}
resolveExternalDependencyNodes(sourceProject) {
// Find the package for the source project.
const pkg = this.projectToPackage[sourceProject];
if (!pkg) {
// The project is not a Dart package.
return [];
}
return this.externalDependencyNodes[pkg];
}
resolveDependencyNodeName(sourceProject, targetPackage) {
var _a;
return (_a = this.dependencyToNode[sourceProject]) === null || _a === void 0 ? void 0 : _a[targetPackage];
}
loadDartPackageProjects() {
for (const [project, node] of Object.entries(this.nodes)) {
const pubspecPath = (0, devkit_1.normalizePath)(pkg.pubspecPath(node.data.root));
const hasPubspec = node.data.files.some((file) => file.file === pubspecPath);
if (hasPubspec) {
const pubspec = pkg.loadPubspec(node.data.root);
const packageName = pubspec.name;
if (packageName) {
this.packageToProject[packageName] = project;
this.projectToPackage[project] = packageName;
this.pubspecs[packageName] = pubspec;
this.dependencyToNode[packageName] = {};
this.externalDependencyNodes[packageName] = [];
}
}
}
}
buildDependencyNodes(packageName) {
var _a, _b;
const pubspec = this.pubspecs[packageName];
const dependencies = (_a = pubspec.dependencies) !== null && _a !== void 0 ? _a : {};
const devDependencies = (_b = pubspec.dev_dependencies) !== null && _b !== void 0 ? _b : {};
const allDependencies = Object.assign(Object.assign({}, dependencies), devDependencies);
for (const dependency of Object.keys(allDependencies)) {
const project = this.packageToProject[dependency];
if (project) {
// For dependencies on packages in the workspace, we use the corresponding project.
this.addProjectDependency(packageName, dependency, project);
continue;
}
else {
// For dependencies on external packages, we create an external node.
const spec = allDependencies[dependency];
const specJson = JSON.stringify(spec);
this.addExternalDependency(packageName, dependency, specJson);
}
}
}
addProjectDependency(packageName, dependency, project) {
this.dependencyToNode[packageName][dependency] = project;
}
addExternalDependency(packageName, dependency, dependencySpecString) {
const dependencyNodes = this.dependencyToNode[packageName];
const externalNodes = this.externalDependencyNodes[packageName];
const specHash = crypto
.createHash('sha256')
.update(dependencySpecString)
.digest('hex');
const externalNode = {
/* eslint-disable @typescript-eslint/no-explicit-any */
type: 'pub',
name: `pub:${dependency}:${specHash}`,
/* eslint-enable */
data: {
packageName: dependency,
// TODO: Provide actual version number, if available.
version: specHash,
},
};
dependencyNodes[dependency] = externalNode.name;
externalNodes.push(externalNode);
}
}
exports.DartPackageNodeResolver = DartPackageNodeResolver;
//# sourceMappingURL=dart-package-node-resolver.js.map