diff --git a/src/runtimes/node/list_imports.js b/src/runtimes/node/list_imports.js index 8ea4fe05d..f67b4a858 100644 --- a/src/runtimes/node/list_imports.js +++ b/src/runtimes/node/list_imports.js @@ -4,6 +4,11 @@ const { tmpName } = require('tmp-promise') const { safeUnlink } = require('../../utils/fs') +// Maximum number of log messages that an esbuild instance will produce. This +// limit is important to avoid out-of-memory errors due to too much data being +// sent in the Go<>Node IPC channel. +const ESBUILD_LOG_LIMIT = 10 + const getListImportsPlugin = ({ imports, path }) => ({ name: 'list-imports', setup(build) { @@ -35,11 +40,14 @@ const listImports = async ({ path }) => { try { await esbuild.build({ - entryPoints: [path], bundle: true, + entryPoints: [path], + logLevel: 'error', + logLimit: ESBUILD_LOG_LIMIT, outfile: targetPath, platform: 'node', plugins: [getListImportsPlugin({ imports, path })], + target: 'esnext', }) } finally { await safeUnlink(targetPath) diff --git a/tests/fixtures/local-node-module-destructure-require/function.js b/tests/fixtures/local-node-module-destructure-require/function.js new file mode 100644 index 000000000..c9a215642 --- /dev/null +++ b/tests/fixtures/local-node-module-destructure-require/function.js @@ -0,0 +1,3 @@ +const { stack } = require('@netlify/mock-package/stack') + +module.exports = { stack } diff --git a/tests/fixtures/local-node-module-destructure-require/node_modules/@netlify/mock-package/index.js b/tests/fixtures/local-node-module-destructure-require/node_modules/@netlify/mock-package/index.js new file mode 100644 index 000000000..dc03a1aeb --- /dev/null +++ b/tests/fixtures/local-node-module-destructure-require/node_modules/@netlify/mock-package/index.js @@ -0,0 +1,3 @@ +const stack = require('./stack') + +module.exports = { stack } diff --git a/tests/fixtures/local-node-module-destructure-require/node_modules/@netlify/mock-package/package.json b/tests/fixtures/local-node-module-destructure-require/node_modules/@netlify/mock-package/package.json new file mode 100644 index 000000000..970c87ddd --- /dev/null +++ b/tests/fixtures/local-node-module-destructure-require/node_modules/@netlify/mock-package/package.json @@ -0,0 +1,4 @@ +{ + "name": "@netlify/mock-package", + "version": "1.0.0" +} diff --git a/tests/fixtures/local-node-module-destructure-require/node_modules/@netlify/mock-package/stack.js b/tests/fixtures/local-node-module-destructure-require/node_modules/@netlify/mock-package/stack.js new file mode 100644 index 000000000..5c0656140 --- /dev/null +++ b/tests/fixtures/local-node-module-destructure-require/node_modules/@netlify/mock-package/stack.js @@ -0,0 +1 @@ +module.exports = 'jam' diff --git a/tests/fixtures/local-node-module-destructure-require/package.json b/tests/fixtures/local-node-module-destructure-require/package.json new file mode 100644 index 000000000..4f3643643 --- /dev/null +++ b/tests/fixtures/local-node-module-destructure-require/package.json @@ -0,0 +1,7 @@ +{ + "name": "local-node-module-destructure-require", + "version": "1.0.0", + "dependencies": { + "@netlify/mock-package": "1.0.0" + } +} diff --git a/tests/fixtures/local-node-module-destructure-require/tsconfig.json b/tests/fixtures/local-node-module-destructure-require/tsconfig.json new file mode 100644 index 000000000..42e12d9c5 --- /dev/null +++ b/tests/fixtures/local-node-module-destructure-require/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "target": "ES5" + } +} diff --git a/tests/main.js b/tests/main.js index 7725a083c..779bf108d 100644 --- a/tests/main.js +++ b/tests/main.js @@ -173,6 +173,21 @@ testBundlers('Can require deep paths in node modules', [ESBUILD, ESBUILD_ZISI, D } }) +testBundlers( + 'Can require Node modules with destructuring expressions', + [ESBUILD, ESBUILD_ZISI, DEFAULT], + async (bundler, t) => { + await zipNode(t, `local-node-module-destructure-require`, { + opts: { config: { '*': { nodeBundler: bundler } } }, + }) + + // TO DO: Remove when `parseWithEsbuild` feature flag is decommissioned. + await zipNode(t, `local-node-module-destructure-require`, { + opts: { config: { '*': { nodeBundler: bundler } }, featureFlags: { parseWithEsbuild: true } }, + }) + }, +) + testBundlers('Can require scoped node modules', [ESBUILD, ESBUILD_ZISI, DEFAULT], async (bundler, t) => { await zipNode(t, 'node-module-scope', { opts: { config: { '*': { nodeBundler: bundler } } } }) })