From 07a95a1a67c04d5789412aa390aabfed44238a29 Mon Sep 17 00:00:00 2001 From: Thijs Louisse Date: Mon, 26 Sep 2022 22:38:30 +0200 Subject: [PATCH] feat(providence-analytics): support multi lvl globs for export maps --- .../src/program/services/InputDataService.js | 7 +++-- .../program/services/InputDataService.test.js | 28 +++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/packages-node/providence-analytics/src/program/services/InputDataService.js b/packages-node/providence-analytics/src/program/services/InputDataService.js index c7f61b142..1b19e6738 100644 --- a/packages-node/providence-analytics/src/program/services/InputDataService.js +++ b/packages-node/providence-analytics/src/program/services/InputDataService.js @@ -513,7 +513,9 @@ class InputDataService { const exposedAndInternalPaths = this.getPathsFromExportMap(pkgJson.exports, { packageRootPath: startPath, }); - return exposedAndInternalPaths.map(p => p.internal); + return exposedAndInternalPaths + .map(p => p.internal) + .filter(p => cfg.extensions.includes(`${pathLib.extname(p)}`)); } /** @type {string[]} */ @@ -650,7 +652,8 @@ class InputDataService { continue; } - const valueToUseForGlob = stripDotSlashFromLocalPath(resolvedVal); + // https://nodejs.org/api/packages.html#subpath-exports + const valueToUseForGlob = stripDotSlashFromLocalPath(resolvedVal).replace('*', '**/*'); // Generate all possible entries via glob, first strip './' const internalExportMapPathsForKeyRaw = glob.sync(valueToUseForGlob, { diff --git a/packages-node/providence-analytics/test-node/program/services/InputDataService.test.js b/packages-node/providence-analytics/test-node/program/services/InputDataService.test.js index f179ddab8..d6704eec9 100644 --- a/packages-node/providence-analytics/test-node/program/services/InputDataService.test.js +++ b/packages-node/providence-analytics/test-node/program/services/InputDataService.test.js @@ -540,7 +540,7 @@ build/ it('supports "*" on file level inside key and value of export map entry', async () => { const fakeFs = { '/my/proj/internal-folder/file-a.js': 'export const a = 1;', - '/my/proj/internal-folder/file-b.js': 'export const b = 2;', + '/my/proj/internal-folder/another-folder/file-b.js': 'export const b = 2;', }; mock(fakeFs); const exports = { @@ -550,8 +550,11 @@ build/ packageRootPath: '/my/proj', }); expect(exportMapPaths).to.eql([ + { + internal: './internal-folder/another-folder/file-b.js', + exposed: './exposed-folder/another-folder/file-b.js', + }, { internal: './internal-folder/file-a.js', exposed: './exposed-folder/file-a.js' }, - { internal: './internal-folder/file-b.js', exposed: './exposed-folder/file-b.js' }, ]); }); @@ -574,6 +577,27 @@ build/ ]); }); + // TDOO: implement + it.skip('supports private internal => ""./features/private-internal/*": null"', async () => { + const fakeFs = { + '/my/proj/internal-folder/file-a.js': 'export const a = 1;', + '/my/proj/internal-folder/private-folder/file-b.js': 'export const b = 2;', + }; + mock(fakeFs); + const exports = { + './exposed-folder/*.js': './internal-folder/*.js', + './exposed-folder/private-folder/*.js': null, + }; + const exportMapPaths = await InputDataService.getPathsFromExportMap(exports, { + packageRootPath: '/my/proj', + }); + expect(exportMapPaths).to.eql([ + { internal: './internal-folder/file-a.js', exposed: './exposed-folder/file-a.js' }, + ]); + }); + + // TODO: short notation => {"exports": "./index.js"} + describe('ResolveMode', () => { it('has nodeResolveMode "default" when nothing specified', async () => { const fakeFs = {