UNPKG

eslint-plugin-sonarjs

Version:
80 lines (79 loc) 3.12 kB
"use strict"; 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, }; }