UNPKG

@eagleoutice/flowr-dev

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

153 lines 7.42 kB
"use strict"; 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