All files / src/node-resolve/package resolvePackageImports.ts

17.64% Statements 3/17
0% Branches 0/16
0% Functions 0/1
17.64% Lines 3/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 851x         1x                                                                                                                                                           1x  
import {
  createBaseErrorMsg,
  findPackageJson,
  InvalidModuleSpecifierError,
} from "./utils";
import resolvePackageImportsExports from "./resolvePackageImportsExports";
import { IsomorphicRollupFs } from "../../fs-iface";
 
interface ParamObject {
  importSpecifier: string;
  importer: string;
  moduleDirs: readonly string[];
  conditions: readonly string[];
  resolveId: (id: string) => any;
  fs: IsomorphicRollupFs;
  validateImportsExports: boolean;
}
 
async function resolvePackageImports({
  importSpecifier,
  importer,
  moduleDirs,
  conditions,
  resolveId,
  fs,
  validateImportsExports = true,
}: ParamObject) {
  const result = await findPackageJson(importer, moduleDirs, fs);
  if (!result) {
    throw new Error(
      `${createBaseErrorMsg(importSpecifier, importer)}. Could not find a parent package.json.`,
    );
  }
 
  const { pkgPath, pkgJsonPath, pkgJson } = result;
  const pkgURL = `/${pkgPath}/`;
  const context = {
    importer,
    importSpecifier,
    moduleDirs,
    pkgURL,
    pkgJsonPath,
    conditions,
    resolveId,
  };
 
  // Assert: specifier begins with "#".
  if (validateImportsExports && !importSpecifier.startsWith("#")) {
    throw new InvalidModuleSpecifierError(
      context,
      true,
      "Invalid import specifier.",
    );
  }
 
  // If specifier is exactly equal to "#" or starts with "#/", then
  if (
    validateImportsExports &&
    (importSpecifier === "#" || importSpecifier.startsWith("#/"))
  ) {
    // Throw an Invalid Module Specifier error.
    throw new InvalidModuleSpecifierError(
      context,
      true,
      "Invalid import specifier.",
    );
  }
 
  const { imports } = pkgJson;
  if (validateImportsExports && !imports) {
    throw new InvalidModuleSpecifierError(context, true);
  }
 
  // Let packageURL be the result of LOOKUP_PACKAGE_SCOPE(parentURL).
  // If packageURL is not null, then
  return resolvePackageImportsExports(context, {
    matchKey: importSpecifier,
    matchObj: imports,
    isImports: true,
    validateImportsExports,
  });
}
 
export default resolvePackageImports;