Skip to content

Commit

Permalink
feat: Migrate to enhanced-resolve.
Browse files Browse the repository at this point in the history
  • Loading branch information
avocadowastaken committed Mar 6, 2023
1 parent 18a869a commit daecd52
Show file tree
Hide file tree
Showing 8 changed files with 98 additions and 64 deletions.
14 changes: 7 additions & 7 deletions lib/internal/Parser.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
"use strict";

const fs = require("fs");
const assert = require("assert");
const path = require("path");
const Dependency = require("./Dependency");
const resolveModule = require("../utils/resolveModule");
const memoize = require("../utils/memoize");
const fs = require("node:fs");
const assert = require("node:assert");
const path = require("node:path");
const Dependency = require("./Dependency.js");
const resolveModule = require("../utils/resolveModule.js");
const memoize = require("../utils/memoize.js");

class Parser {
/** @readonly */
Expand All @@ -29,7 +29,7 @@ class Parser {
return ast.program.body;
});
/**
* @type {(input: [id: string, basedir?: string]) => string}
* @type {(input: [id: string, directory?: string]) => string}
* @readonly
*/
#resolveModule = memoize(([id, basedir]) => resolveModule(id, basedir), {
Expand Down
2 changes: 1 addition & 1 deletion lib/internal/Transformer.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"use strict";

const memoize = require("../utils/memoize");
const memoize = require("../utils/memoize.js");

/**
* @param {string} localName
Expand Down
8 changes: 4 additions & 4 deletions lib/plugin.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
"use strict";

const Transformer = require("./internal/Transformer");
const parseOptions = require("./utils/parseOptions");
const Parser = require("./internal/Parser");
const memoize = require("./utils/memoize");
const Transformer = require("./internal/Transformer.js");
const parseOptions = require("./utils/parseOptions.js");
const Parser = require("./internal/Parser.js");
const memoize = require("./utils/memoize.js");

/**
* @typedef {object} BabelAPI
Expand Down
2 changes: 1 addition & 1 deletion lib/utils/parseOptions.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"use strict";

const assert = require("assert");
const assert = require("node:assert");

/**
* @param {object} options
Expand Down
37 changes: 15 additions & 22 deletions lib/utils/resolveModule.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,24 @@
"use strict";

const resolve = require("resolve");
const fs = require("node:fs");
const { CachedInputFileSystem, ResolverFactory } = require("enhanced-resolve");

const MAIN_FIELDS = ["module", "esnext", "jsnext:main"];

/**
* @param {resolve.PackageJSON} pkg
* @returns {resolve.PackageJSON}
*/
function packageFilter(pkg) {
for (const key of MAIN_FIELDS) {
/* istanbul ignore else */
const main = pkg[key];
/* istanbul ignore else */
if (typeof main === "string" && main) {
return { ...pkg, main };
}
}
/* istanbul ignore next */
return pkg;
}
const resolver = ResolverFactory.createResolver({
useSyncFileSystemCalls: true,
extensions: [".mjs", ".js", ".json"],
mainFields: ["module", "esnext", "jsnext:main"],
fileSystem: new CachedInputFileSystem(fs, 4_000),
});

/**
* @param {string} id
* @param {string} [basedir]
* @param {string} [directory]
* @returns {string}
*/
module.exports = function resolveModule(id, basedir) {
return resolve.sync(id, { basedir, packageFilter });
module.exports = function resolveModule(id, directory = __dirname) {
const result = resolver.resolveSync({}, directory, id);
if (!result) {
throw new Error(`Can't resolve '${id}' in '${directory}'`);
}
return result;
};
15 changes: 7 additions & 8 deletions lib/utils/resolveModule.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,18 @@ test("basic", () => {
expect(resolveModule("@mui/material")).toMatchInlineSnapshot(
`"<cwd>/node_modules/@mui/material/index.js"`
);
});

test("deep module", () => {
expect(resolveModule("@mui/material/Button")).toMatchInlineSnapshot(
`"<cwd>/node_modules/@mui/material/Button/index.js"`
);
});

test("invalid module", () => {
expect(() =>
resolveModule("@mui/core/Button")
).toThrowErrorMatchingInlineSnapshot(
`"Cannot find module '@mui/core/Button' from '<cwd>/lib/utils'"`
`"Can't resolve '@mui/core/Button' in '<cwd>/lib/utils'"`
);

expect(() =>
resolveModule(
// @ts-expect-error
null
)
).toThrowErrorMatchingInlineSnapshot(`"Path must be a string."`);
});
81 changes: 62 additions & 19 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
]
},
"dependencies": {
"resolve": "^1.22.1"
"enhanced-resolve": "^5.12.0"
},
"devDependencies": {
"@babel/core": "7.21.0",
Expand All @@ -82,7 +82,6 @@
"@mui/system": "5.11.11",
"@types/babel__core": "7.20.0",
"@types/node": "18.14.4",
"@types/resolve": "1.20.2",
"@umidbekk/configs": "0.2.0",
"@vitest/coverage-c8": "^0.29.2",
"eslint": "8.35.0",
Expand Down

0 comments on commit daecd52

Please sign in to comment.