diff --git a/src/utils/getImportedPackages.test.ts b/src/utils/getImportedPackages.test.ts index df30540..01bde7e 100644 --- a/src/utils/getImportedPackages.test.ts +++ b/src/utils/getImportedPackages.test.ts @@ -238,4 +238,43 @@ describe('getImportedPackages', () => { archiver: '3.2.1', }); }); + + it('skips relative specifiers marked as external', () => { + const metafileMock: Metafile = { + inputs: { + '../../../common/slack/parseMiddleware.js': { + bytes: 1000, + imports: [], + }, + 'example/example.ts': { + bytes: 130, + imports: [ + { + path: '../../../common/slack/parseMiddleware.js', + kind: 'import-statement', + external: true, + }, + { + path: 'archiver', + kind: 'import-statement', + external: true, + }, + ], + }, + }, + outputs: { + 'example/dist/testfunc.js': { + imports: [], + exports: [], + entryPoint: 'example/example.ts', + inputs: {}, + bytes: 82693, + }, + }, + }; + const packages = getImportedPackages('example/example.ts', metafileMock); + expect(packages).toEqual({ + archiver: '3.2.1', + }); + }); }); diff --git a/src/utils/getImportedPackages.ts b/src/utils/getImportedPackages.ts index c55018c..4ae9983 100644 --- a/src/utils/getImportedPackages.ts +++ b/src/utils/getImportedPackages.ts @@ -65,7 +65,16 @@ const getImportedPackages = ( } */ // TODO: Extract to separate file and add full tests for various scenarios - if (inputImport.external === true) { + + // Node Package decision based on https://nodejs.org/api/esm.html#terminology + // Check if it's a relative specifier (./ or ../) or absolute specifier (/ or file://) + const isRelativeOrAbsoluteSpecifier = + inputImport.path.startsWith('./') || + inputImport.path.startsWith('../') || + inputImport.path.startsWith('/') || + inputImport.path.startsWith('file://'); + + if (inputImport.external === true && !isRelativeOrAbsoluteSpecifier) { const packageName = inputImport.path.startsWith('@') ? inputImport.path.split('/').slice(0, 2).join('/') : inputImport.path.split('/')[0];