@eagleoutice/flowr-dev
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
153 lines • 7.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FlowrAnalyzerPackageVersionsUvrPlugin = exports.FlowrAnalyzerPackageVersionsRvPlugin = exports.FlowrAnalyzerPackageVersionsPackratPlugin = exports.FlowrAnalyzerPackageVersionsRenvPlugin = exports.lockfileLog = void 0;
const flowr_analyzer_package_versions_plugin_1 = require("./flowr-analyzer-package-versions-plugin");
const semver_1 = require("semver");
const package_1 = require("./package");
const flowr_file_1 = require("../../context/flowr-file");
const built_in_source_1 = require("../../../dataflow/internal/process/functions/call/built-in/built-in-source");
const log_1 = require("../../../util/log");
const smol_toml_1 = require("smol-toml");
const flowr_analyzer_meta_context_1 = require("../../context/flowr-analyzer-meta-context");
exports.lockfileLog = log_1.log.getSubLogger({ name: 'flowr-analyzer-package-versions-lockfile-plugin' });
/** The {@link FileRole.VirtualEnv} lockfiles named `name` (e.g. `renv.lock`), matched case-insensitively like the role is assigned. */
function virtualEnvFiles(ctx, name) {
return ctx.files.getFilesByRole(flowr_file_1.FileRole.VirtualEnv).filter(f => (0, built_in_source_1.platformBasename)(f.path()).toLowerCase() === name);
}
function pin(ctx, name, version) {
const range = package_1.Package.parsePkgVersionRange(undefined, version);
ctx.deps.addDeclaredDependency(new package_1.Package({ name, versionConstraints: range ? [range] : undefined }));
}
/** Reads package versions from an `renv.lock` (JSON). renv pins are exact. */
class FlowrAnalyzerPackageVersionsRenvPlugin extends flowr_analyzer_package_versions_plugin_1.FlowrAnalyzerPackageVersionsPlugin {
name = 'flowr-analyzer-package-versions-renv-plugin';
description = 'Extracts package versions from an renv.lock lockfile.';
version = new semver_1.SemVer('0.1.0');
process(ctx) {
for (const file of virtualEnvFiles(ctx, 'renv.lock')) {
let lock;
try {
lock = JSON.parse(file.content().toString());
}
catch (e) {
exports.lockfileLog.warn(`Could not parse renv.lock: ${e.message}`);
continue;
}
for (const [pkg, meta] of Object.entries(lock.Packages ?? {})) {
if (typeof meta?.Version === 'string') {
pin(ctx, pkg, meta.Version);
}
}
}
}
}
exports.FlowrAnalyzerPackageVersionsRenvPlugin = FlowrAnalyzerPackageVersionsRenvPlugin;
/** Unlike a `DESCRIPTION`, a `packrat.lock` holds one record per package, so the records must not be merged. */
function parseDCFRecords(content) {
const records = [];
let current = new Map();
let key;
for (const line of content.split(/\r?\n/)) {
if (line.trim().length === 0) {
if (current.size > 0) {
records.push(current);
current = new Map();
}
key = undefined;
}
else if (/^\s/.test(line) && key !== undefined) {
current.set(key, `${current.get(key) ?? ''} ${line.trim()}`);
}
else {
const colon = line.indexOf(':');
if (colon < 0) {
continue;
}
key = line.slice(0, colon).trim();
current.set(key, line.slice(colon + 1).trim());
}
}
if (current.size > 0) {
records.push(current);
}
return records;
}
/** Reads package versions from a `packrat.lock` (multi-record DCF, metadata first). packrat pins are exact. */
class FlowrAnalyzerPackageVersionsPackratPlugin extends flowr_analyzer_package_versions_plugin_1.FlowrAnalyzerPackageVersionsPlugin {
name = 'flowr-analyzer-package-versions-packrat-plugin';
description = 'Extracts package versions from a packrat.lock lockfile.';
version = new semver_1.SemVer('0.1.0');
process(ctx) {
for (const file of virtualEnvFiles(ctx, 'packrat.lock')) {
for (const record of parseDCFRecords(file.content().toString())) {
const rVersion = record.get('RVersion');
if (rVersion) {
ctx.meta.contribute({ rVersion }, flowr_analyzer_meta_context_1.MetaPriority.Lockfile);
}
const name = record.get('Package');
const version = record.get('Version');
if (name && version) {
pin(ctx, name, version);
}
}
}
}
}
exports.FlowrAnalyzerPackageVersionsPackratPlugin = FlowrAnalyzerPackageVersionsPackratPlugin;
/** Reads package versions from an `rv.lock` (the resolved rv project lockfile, TOML). rv pins are exact. */
class FlowrAnalyzerPackageVersionsRvPlugin extends flowr_analyzer_package_versions_plugin_1.FlowrAnalyzerPackageVersionsPlugin {
name = 'flowr-analyzer-package-versions-rv-plugin';
description = 'Extracts package versions from an rv.lock lockfile.';
version = new semver_1.SemVer('0.1.0');
process(ctx) {
for (const file of virtualEnvFiles(ctx, 'rv.lock')) {
let lock;
try {
lock = (0, smol_toml_1.parse)(file.content().toString());
}
catch (e) {
exports.lockfileLog.warn(`Could not parse rv.lock: ${e.message}`);
continue;
}
if (typeof lock.r_version === 'string') {
ctx.meta.contribute({ rVersion: lock.r_version }, flowr_analyzer_meta_context_1.MetaPriority.Lockfile);
}
for (const pkg of Array.isArray(lock.packages) ? lock.packages : []) {
const { name, version } = pkg;
if (typeof name === 'string' && typeof version === 'string') {
pin(ctx, name, version);
}
}
}
}
}
exports.FlowrAnalyzerPackageVersionsRvPlugin = FlowrAnalyzerPackageVersionsRvPlugin;
/** Reads package versions from a `uvr.lock` (TOML). uvr pins are exact, the dev-dependencies among them. */
class FlowrAnalyzerPackageVersionsUvrPlugin extends flowr_analyzer_package_versions_plugin_1.FlowrAnalyzerPackageVersionsPlugin {
name = 'flowr-analyzer-package-versions-uvr-plugin';
description = 'Extracts package versions from a uvr.lock lockfile.';
version = new semver_1.SemVer('0.1.0');
process(ctx) {
for (const file of virtualEnvFiles(ctx, 'uvr.lock')) {
let lock;
try {
lock = (0, smol_toml_1.parse)(file.content().toString());
}
catch (e) {
exports.lockfileLog.warn(`Could not parse uvr.lock: ${e.message}`);
continue;
}
if (typeof lock.r?.version === 'string') {
ctx.meta.contribute({ rVersion: lock.r.version }, flowr_analyzer_meta_context_1.MetaPriority.Lockfile);
}
for (const pkg of Array.isArray(lock.package) ? lock.package : []) {
const { name, version } = pkg;
if (typeof name === 'string' && typeof version === 'string') {
pin(ctx, name, version);
}
}
}
}
}
exports.FlowrAnalyzerPackageVersionsUvrPlugin = FlowrAnalyzerPackageVersionsUvrPlugin;
//# sourceMappingURL=flowr-analyzer-package-versions-lockfile-plugin.js.map