egoist / esbuild-register

Transpile JSX, TypeScript and esnext features on the fly with esbuild
MIT License
982 stars 52 forks source link

SyntaxError: Cannot use import statement outside a module #75

Open arve0 opened 2 years ago

arve0 commented 2 years ago

Hi 👋 Thanks for esbuild-register 🙌 I get SyntaxError: Cannot use import statement outside a module when using esbuild-register for installed package. bin in package.json points to entrypoint which has contents:

#!/usr/bin/env node
require('esbuild-register/dist/node').register();
require('./cli.ts');

cli.ts simply outputs package version:

import pkg from "./package.json";

console.log(`version: ${pkg.version}`)

When running cli as installed package, it fails with:

SyntaxError: Cannot use import statement outside a module
    at Object.compileFunction (node:vm:352:18)
    at wrapSafe (node:internal/modules/cjs/loader:1033:15)
    at Module._compile (node:internal/modules/cjs/loader:1069:27)
    at Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Object.newLoader [as .ts] (/Users/arve/.config/nvm/18.3.0/lib/node_modules/@arve0/esbuild-register-syntaxerror/node_modules/esbuild-register/dist/node.js:2262:9)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Module._load (node:internal/modules/cjs/loader:827:12)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (/Users/arve/.config/nvm/18.3.0/lib/node_modules/@arve0/esbuild-register-syntaxerror/cli:9:2)

Node.js v18.3.0

Reproduction:

npm i -g @arve0/esbuild-register-syntaxerror
esbuild-cli

When in package source folder, it does not fail:

cd /tmp
cd esbuild-register-syntaxerror
npm i
./cli
arve0 commented 2 years ago

Debugging, it seems like shouldCompile returns false because ignoreNodeModules is true and cli.ts is inside global node_modules folder.

I added

console.dir({ filename, exts, matcher, ignoreNodeModules, shouldCompile: shouldCompile(filename, exts, matcher, ignoreNodeModules)})

in newLoader file:line esbuild-register/dist/node.js:2249, which gives:

{
  filename: '/Users/arve/.config/nvm/18.3.0/lib/node_modules/@arve0/esbuild-register-syntaxerror/cli.ts',
  exts: [ '.js', '.jsx', '.ts', '.tsx', '.mjs' ],
  matcher: null,
  ignoreNodeModules: true,
  shouldCompile: false
}

Setting option hookIgnoreNodeModules: false resolves the issue. But unsure if "global installed = node_modules" is intended behavior or not.