UNPKG

dependency-cruiser

Version:

Validate and visualize dependencies. With your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.

45 lines (39 loc) 1.36 kB
import path from "node:path/posix"; import { createRequire } from "node:module"; import { coerce, satisfies } from "semver"; const require = createRequire(import.meta.url); const PACKAGE_RE = "[^/]+"; const SCOPED_PACKAGE_RE = "@[^/]+(?:/[^/]+)"; const ROOT_MODULE_RE = new RegExp(`^(${SCOPED_PACKAGE_RE}|${PACKAGE_RE})`, "g"); function extractRootModuleName(pModuleName) { return (pModuleName.match(ROOT_MODULE_RE) || []).shift(); } function getVersion(pModuleName) { // of course we'd love to use something like an import with an import assertion // As that's _experimental_ we have to use _require_ in stead. // eslint-disable-next-line import/no-dynamic-require, security/detect-non-literal-require const lManifest = require( path.join(extractRootModuleName(pModuleName), "package.json"), ); return lManifest.version; } export default function tryImportAvailable(pModuleName, pSemanticVersion) { try { if (pSemanticVersion) { const lVersion = getVersion(pModuleName); const lCoerced = coerce(lVersion); if ( lVersion && lCoerced && !satisfies(lCoerced.version, pSemanticVersion) ) { return false; } } // of course we'd love to use something like import.meta.resolve, but // that's _experimental_, so ¯\_(ツ)_/¯ return Boolean(require.resolve(pModuleName)); } catch (pError) { return false; } }