eslint-plugin-sonarjs
Version:
80 lines (79 loc) • 3.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.denoManifestResolver = void 0;
exports.parseInlineNPMImport = parseInlineNPMImport;
const index_js_1 = require("../index.js");
const helpers_js_1 = require("./helpers.js");
const parse_js_1 = require("../parse.js");
const parsed_dependency_files_js_1 = require("../parsed-dependency-files.js");
exports.denoManifestResolver = {
resolve(dir, topDir, fileSystem) {
// if both `deno.json` and `deno.jsonc` are present, prefer `deno.json` and ignore `deno.jsonc`
const denoJson = (0, helpers_js_1.getManifestFileInDir)(index_js_1.DENO_JSON, dir, topDir, fileSystem);
const denoJsonc = (0, helpers_js_1.getManifestFileInDir)(index_js_1.DENO_JSONC, dir, topDir, fileSystem);
const denoModuleType = 'module';
const effectiveDenoJson = denoJson ?? denoJsonc;
if (effectiveDenoJson) {
const manifest = (0, parsed_dependency_files_js_1.parseDenoManifest)(effectiveDenoJson) ?? {};
return [
{
type: 'deno',
manifest,
dependencies: buildDependencies(manifest),
moduleType: denoModuleType,
},
];
}
return [];
},
};
function buildDependencies(manifest) {
const dependencies = new Map();
if (manifest.imports && typeof manifest.imports === 'object') {
for (const [alias, target] of Object.entries(manifest.imports)) {
if (typeof target !== 'string') {
continue;
}
const parsedSpecifier = parseInlineNPMImport(target);
if (parsedSpecifier) {
(0, parse_js_1.addDependency)(dependencies, {
dependency: parsedSpecifier.packageName,
isGlob: false,
version: parsedSpecifier.version,
alias,
});
}
}
}
if (Array.isArray(manifest.workspace)) {
(0, parse_js_1.addDependenciesArray)(dependencies, manifest.workspace);
}
else if (manifest.workspace?.members) {
(0, parse_js_1.addDependenciesArray)(dependencies, manifest.workspace.members);
}
return dependencies;
}
// Captures `npm:` payload as: package name (scoped or unscoped), optional version, optional ignored subpath.
// Examples:
// npm:cowsay@^1.6.0
// npm:@scopename/mypackage@~11.1.0
const DENO_NPM_IMPORT_PATTERN = /^(@[^/]*\/[^/@]*|[^/@]+)(?:@([^/]*))?(?:\/.*)?$/;
/**
* Parses an import map URL Specifier matching Deno npm format:
* npm:<package>[@<version>][/<path>]
*/
function parseInlineNPMImport(value) {
// currently only handle npm: specifiers since rules are focused on NPM dependencies
if (!value.startsWith('npm:')) {
return undefined;
}
const match = DENO_NPM_IMPORT_PATTERN.exec(value.slice('npm:'.length));
if (!match) {
return undefined;
}
const [, packageName, version] = match;
return {
packageName,
version: version || undefined,
};
}