UNPKG

@eagleoutice/flowr-dev

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

87 lines 3.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.executeProjectQuery = executeProjectQuery; const log_1 = require("../../../util/log"); const flowr_file_1 = require("../../../project/context/flowr-file"); const r_base_packages_1 = require("../../../util/r-base-packages"); /** * Collects dependency statistics from what the project declares, cross-referenced with the * loaded signature database(s) to report how many dependencies we can cover. */ function collectDependencyStats(declared, deps, basePackages) { const imports = declared.imports ?? []; const dependsAll = declared.depends ?? []; const rEntry = dependsAll.find(d => d.name === 'R'); const rVersion = rEntry?.derivedRange?.raw; const depends = dependsAll.filter(d => d.name !== 'R'); const suggests = declared.suggests ?? []; const linkingTo = declared.linkingTo ?? []; const runtime = new Set([...imports, ...depends, ...linkingTo].map(p => p.name)); let base = 0; let covered = 0; const first = []; for (const name of runtime) { const isBase = basePackages.has(name); const resolved = isBase ? undefined : deps.getDependency(name); if (isBase) { base++; } else if (resolved?.namespaceInfo) { covered++; } if (first.length < 3) { first.push({ name, base: isBase, dbVersion: resolved?.resolvedVersion }); } } return { imports: imports.length, depends: depends.length, suggests: suggests.length, linkingTo: linkingTo.length, runtime: runtime.size, base, covered, first, rVersion: rVersion && /\d/.test(rVersion) ? rVersion : undefined }; } /** * Executes the given project queries. */ async function executeProjectQuery({ analyzer }, queries) { if (queries.length !== 1) { log_1.log.warn('Project query expects only up to one query, but got', queries.length); } const startTime = Date.now(); const withDf = queries.some(q => q.withDf); // we need to know what is considered by the analyzer if (withDf) { await analyzer.dataflow(); } const ctx = analyzer.inspectContext(); const basePackages = new Set(ctx.config.project.basePackages ?? (0, r_base_packages_1.baseRPackages)(ctx.resolvedRVersion)); const roleCounts = {}; for (const file of Object.values(flowr_file_1.FileRole)) { roleCounts[file] = ctx.files.getFilesByRole(file).length; } // whichever plugin read the metadata (DESCRIPTION, rproject.toml, a lockfile) contributed it to the context, // so nothing here has to know which file the project happens to use const declared = ctx.meta.getDeclaredPackages(); const hasDeclarations = Object.values(declared).some(g => g !== undefined); return { '.meta': { timing: Date.now() - startTime }, name: ctx.meta.getProjectName() ?? ctx.meta.getProjectTitle(), files: Array.from(ctx.files.consideredFilesList()), authors: ctx.meta.getAuthors(), encoding: ctx.meta.getEncoding(), version: ctx.meta.getProjectVersion()?.str, rVersion: ctx.meta.getRVersion(), licenses: ctx.meta.getLicenses(), roleCounts: roleCounts, kind: ctx.projectKind(), dependencies: hasDeclarations ? collectDependencyStats(declared, ctx.deps, basePackages) : undefined }; } //# sourceMappingURL=project-query-executor.js.map