diff --git a/tests/samples/acceptance_sample_dependency_installation.cjs b/tests/samples/acceptance_sample_dependency_installation.cjs index f48ddf1..f32343e 100644 --- a/tests/samples/acceptance_sample_dependency_installation.cjs +++ b/tests/samples/acceptance_sample_dependency_installation.cjs @@ -5,11 +5,19 @@ module.exports = { }, deps: [ {name: 'jimp'}, - {name: 'is-odd', alias: 'check-odd'} + {name: 'is-odd', alias: 'check-odd'}, + {name: 'knex'}, + {name: '@aws-sdk/core'}, + {name: 'pg'}, + {name: 'esbuild'}, ], run: async (args, options) => { const _jimp = await gushio.import('jimp') const _checkOdd = await gushio.import('check-odd') + const _knex = await gushio.import('knex') + const _awsSdkCore = await gushio.import('@aws-sdk/core') + const _pg = await gushio.import('pg') + const _esbuild = await gushio.import('esbuild') console.log(`Written on console ${'after'.bold.yellow} requiring deps`) }, diff --git a/tests/samples/acceptance_sample_dependency_installation.mjs b/tests/samples/acceptance_sample_dependency_installation.mjs index 6b5b693..ea28c5e 100644 --- a/tests/samples/acceptance_sample_dependency_installation.mjs +++ b/tests/samples/acceptance_sample_dependency_installation.mjs @@ -5,10 +5,18 @@ export const cli = { export const deps = [ {name: 'jimp'}, {name: 'is-odd', alias: 'check-odd'}, + {name: 'knex'}, + {name: '@aws-sdk/core'}, + {name: 'pg'}, + {name: 'esbuild'}, ] export const run = async (args, options) => { const _jimp = await gushio.import('jimp') const _checkOdd = await gushio.import('check-odd') + const _knex = await gushio.import('knex') + const _awsSdkCore = await gushio.import('@aws-sdk/core') + const _pg = await gushio.import('pg') + const _esbuild = await gushio.import('esbuild') console.log(`Written on console ${'after'.bold.yellow} requiring deps`) } diff --git a/tests/utils/dependenciesUtils.test.js b/tests/utils/dependenciesUtils.test.js index 1b5e63d..e8c6968 100644 --- a/tests/utils/dependenciesUtils.test.js +++ b/tests/utils/dependenciesUtils.test.js @@ -121,17 +121,33 @@ describe('dependenciesUtils', () => { test.each([ {}, - {main: 'index.js'}, - {main: '/'}, {exports: 'index.js'}, {exports: '/'}, {exports: {import: 'index.js'}}, {exports: {import: '/'}}, + {exports: {default: 'index.js'}}, + {exports: {default: '/'}}, {exports: {'.': 'index.js'}}, {exports: {'.': '/'}}, {exports: {'.': {import: 'index.js'}}}, {exports: {'.': {import: '/'}}}, {exports: {'.': {import: null}}}, + {exports: {'.': {default: 'index.js'}}}, + {exports: {'.': {default: '/'}}}, + {exports: {'.': {default: null}}}, + {exports: {'.': {require: 'index.js'}}}, + {exports: {'.': {require: '/'}}}, + {exports: {'.': {require: null}}}, + {exports: 'index.js', module: 'other_ignored.js'}, + {exports: 'index.js', main: 'other_ignored.js'}, + {type: 'module', module: 'index.js'}, + {type: 'module', module: 'index'}, + {type: 'module', module: '/'}, + {type: 'commonjs', main: 'index.js'}, + {type: 'commonjs', main: 'index'}, + {type: 'commonjs', main: '/'}, + {type: 'commonjs', module: 'other_ignored.js', main: 'index.js'}, + {main: 'index.js', module: 'other_ignored.js'}, ])('found in local folder %p', async (pkgStructure) => { const moduleMock = {default: 'theModule'} const moduleMockName = URL.fileURLToPath(`file://${os.platform() === 'win32' ? '' : 'localhost/'}${folder}/node_modules/a-fake-module/index.js`) @@ -145,6 +161,7 @@ describe('dependenciesUtils', () => { expect(path).toBe(`${folder}/node_modules/a-fake-module/package.json`) return pkgStructure }) + fsExtra.pathExists = jest.fn().mockImplementation((path) => path.endsWith('.js')) expect(JSON.stringify(await patchedImport('a-fake-module'))).toStrictEqual(JSON.stringify(moduleMock)) // call again to assert caching @@ -188,7 +205,8 @@ describe('dependenciesUtils', () => { process.emit('log', 'warn', 'msg3', 'msg4') process.emit('log', 'error', 'msg5', 'msg6') process.emit('log', 'info', 'msg7', 'msg8') - process.emit('log', 'other', 'msg9', 'msg10') + process.emit('log', 'info', 'msg9', 'postinstall') + process.emit('log', 'other', 'msg11', 'msg12') }) } Arborist.mockReturnValueOnce(arborist) @@ -206,6 +224,7 @@ describe('dependenciesUtils', () => { expect(console.warn).toHaveBeenNthCalledWith(2, '[Gushio|Deps] %s', 'msg3', 'msg4') expect(console.error).toHaveBeenNthCalledWith(1, '[Gushio|Deps] %s', 'msg5', 'msg6') expect(console.info).toHaveBeenNthCalledWith(1, '[Gushio|Deps] %s', 'msg7', 'msg8') - expect(console.verbose).toHaveBeenNthCalledWith(1, '[Gushio|Deps] %s', 'msg9', 'msg10') + expect(console.verbose).toHaveBeenNthCalledWith(1, '[Gushio|Deps] %s', 'msg9', 'postinstall') + expect(console.verbose).toHaveBeenNthCalledWith(2, '[Gushio|Deps] %s', 'msg11', 'msg12') }) }) \ No newline at end of file diff --git a/utils/dependenciesUtils.js b/utils/dependenciesUtils.js index 895e3b5..7717379 100644 --- a/utils/dependenciesUtils.js +++ b/utils/dependenciesUtils.js @@ -34,23 +34,53 @@ export const requireStrategy = { const packageEntryPoint = async (pathToPackageFolder) => { const pkg = await fsExtra.readJson(`${pathToPackageFolder}/package.json`) - let entryPoint = pkg.main - if (!entryPoint && pkg.exports) { + let entryPoint + if (pkg.exports) { if (isString(pkg.exports)) { entryPoint = pkg.exports } else if (isString(pkg.exports['import'])) { entryPoint = pkg.exports['import'] + } else if (isString(pkg.exports['default'])) { + entryPoint = pkg.exports['default'] } else if (isString(pkg.exports['.'])) { entryPoint = pkg.exports['.'] - } else if (pkg.exports['.'] && isString(pkg.exports['.']['import'])) { - entryPoint = pkg.exports['.']['import'] + } else if (pkg.exports['.']) { + if (isString(pkg.exports['.']['import'])) { + entryPoint = pkg.exports['.']['import'] + } else if (isString(pkg.exports['.']['default'])) { + entryPoint = pkg.exports['.']['default'] + } else if (isString(pkg.exports['.']['require'])) { + entryPoint = pkg.exports['.']['require'] + } } + } else if (pkg.type === 'module' && pkg.module) { + entryPoint = pkg.module + } else if (pkg.type === 'commonjs' && pkg.main) { + entryPoint = pkg.main + } else { + entryPoint = pkg.main } if (!entryPoint) { entryPoint = 'index.js' } else if (entryPoint.endsWith('/')) { entryPoint += 'index.js' + } else if (!await fsExtra.pathExists(path.join(pathToPackageFolder, entryPoint))) { + if (await fsExtra.pathExists(path.join(pathToPackageFolder, `${entryPoint}.js`))) { + entryPoint += '.js' + } else if (await fsExtra.pathExists(path.join(pathToPackageFolder, `${entryPoint}.json`))) { + entryPoint += '.json' + } else if (await fsExtra.pathExists(path.join(pathToPackageFolder, `${entryPoint}.node`))) { + entryPoint += '.node' + } + } else { + try { + if ((await fsExtra.stat(path.join(pathToPackageFolder, entryPoint))).isDirectory()) { + entryPoint += '/index.js' + } + } catch (e) { + // suppressed + } } const completePath = path.join(pathToPackageFolder, entryPoint) @@ -120,7 +150,11 @@ export const installDependencies = async (folder, dependencies, console) => { break case 'info': - console.info(GushioDepsLogFormat, ...args) + if (args.includes('postinstall')) { + console.verbose(GushioDepsLogFormat, ...args) + } else { + console.info(GushioDepsLogFormat, ...args) + } break default: