UNPKG

@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
"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