diff --git a/lib/util/entrypoints.js b/lib/util/entrypoints.js index 3bc143c9..36e335e5 100644 --- a/lib/util/entrypoints.js +++ b/lib/util/entrypoints.js @@ -86,7 +86,7 @@ module.exports.processExportsField = function processExportsField( ) { return createFieldProcessor( buildExportsField(exportsField), - "", + request => (request.length === 0 ? "." : "./" + request), assertExportsFieldRequest, assertExportTarget ); @@ -101,7 +101,7 @@ module.exports.processImportsField = function processImportsField( ) { return createFieldProcessor( buildImportsField(importsField), - "#", + request => "#" + request, assertImportsFieldRequest, assertImportTarget ); @@ -109,16 +109,21 @@ module.exports.processImportsField = function processImportsField( /** * @param {ExportsField | ImportsField} field root - * @param {string} prefix Request prefix, for `imports` field it is `#`, for `exports` field it is `./`. + * @param {(s: string) => string} normalizeRequest Normalize request, for `imports` field it adds `#`, for `exports` field it adds `.` or `./` * @param {(s: string) => string} assertRequest assertRequest * @param {(s: string, f: boolean) => void} assertTarget assertTarget * @returns {FieldProcessor} field processor */ -function createFieldProcessor(field, prefix, assertRequest, assertTarget) { +function createFieldProcessor( + field, + normalizeRequest, + assertRequest, + assertTarget +) { return function fieldProcessor(request, conditionNames) { request = assertRequest(request); - const match = findMatch(prefix + request, field); + const match = findMatch(normalizeRequest(request), field); if (match === null) return []; @@ -270,10 +275,8 @@ function findMatch(request, field) { !request.endsWith("/") ) { const target = field[request]; - const isSubpathMapping = - typeof target === "string" ? target.endsWith("/") : false; - return [target, "", isSubpathMapping, false]; + return [target, "", false, false]; } let bestMatch = ""; @@ -310,15 +313,6 @@ function findMatch(request, field) { bestMatch = key; bestMatchSubpath = request.slice(key.length); } - // For legacy `./` - else if ( - key === "./" && - patternKeyCompare(bestMatch, key) === 1 && - request.length > 0 - ) { - bestMatch = key; - bestMatchSubpath = request.slice(key.length - 2); - } } if (bestMatch === "") return null; @@ -512,10 +506,9 @@ function conditionalMapping(conditionalMapping_, conditionNames) { function buildExportsField(field) { // handle syntax sugar, if exports field is direct mapping for "." if (typeof field === "string" || Array.isArray(field)) { - return { "": field }; + return { ".": field }; } - const newField = /** @type {ExportsField} */ ({}); const keys = Object.keys(field); for (let i = 0; i < keys.length; i++) { @@ -536,7 +529,7 @@ function buildExportsField(field) { i++; } - return { "": field }; + return { ".": field }; } throw new Error( @@ -547,8 +540,6 @@ function buildExportsField(field) { } if (key.length === 1) { - newField[""] = field[key]; - continue; } @@ -559,12 +550,9 @@ function buildExportsField(field) { )})` ); } - - // Keep "./" for legacy `{ "./": "./" }` - newField[key.slice(2) || "./"] = field[key]; } - return newField; + return field; } /** diff --git a/test/exportsField.js b/test/exportsField.js index 53646856..035fc759 100644 --- a/test/exportsField.js +++ b/test/exportsField.js @@ -594,6 +594,56 @@ describe("Process exports field", function exportsField() { [] ] }, + { + name: "Direct mapping #11", + expect: ["./foo.js"], + suite: [ + { + "./": "./", + "./*": "./*", + "./dist/index.js": "./dist/index.js" + }, + "./foo.js", + [] + ] + }, + { + name: "Direct mapping #12", + expect: ["./foo/bar/baz.js"], + suite: [ + { + "./": "./", + "./*": "./*", + "./dist/index.js": "./dist/index.js" + }, + "./foo/bar/baz.js", + [] + ] + }, + { + name: "Direct mapping #13", + expect: ["./foo/bar/baz.js"], + suite: [ + { + "./": "./", + "./dist/index.js": "./dist/index.js" + }, + "./foo/bar/baz.js", + [] + ] + }, + { + name: "Direct mapping #14", + expect: ["./foo/bar/baz.js"], + suite: [ + { + "./*": "./*", + "./dist/index.js": "./dist/index.js" + }, + "./foo/bar/baz.js", + [] + ] + }, //#endregion //#region Direct and conditional mapping