feat(providence-analytics): support multi lvl globs for export maps

This commit is contained in:
Thijs Louisse 2022-09-26 22:38:30 +02:00 committed by Thomas Allmer
parent 78697d3b00
commit 07a95a1a67
2 changed files with 31 additions and 4 deletions

View file

@ -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, {

View file

@ -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 = {