6

I want to understand why this code below doesn't compile when "module" is set to "esnext". Here is the config.

helpers/seeder.ts

import * as faker from "faker";
import { User } from "../interfaces/user";

let user: User = {
  userName: faker.name.firstName(),
};

console.log(user);

Folder Structure

pages
components
helpers
|_run.ts
interfaces
|_user.d.ts
package.json
tsconfig.json

package.json

{
  "name": "with-typescript",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "next": "11.1.2",
    "react": "17.0.2",
    "react-dom": "17.0.2", ....
  },
  "devDependencies": {
    "@types/faker": "^5.5.8",
    "@types/node": "^16.7.10",
    "@types/react": "17.0.20",
    "chai": "^4.3.4",
    "esm": "^3.2.25",
    "faker": "^5.5.3",
    "typescript": "^4.4.2"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "ES2021",
    "module": "esnext",
    "baseUrl": ".",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "strict": true,
    "esModuleInterop": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "esModuleInterop": true,
    "jsx": "preserve"
  },
  "include": [
    "next-env.d.ts",
    "**/*.ts",
    "**/*.tsx",
    "**/[*].ts",
    "**/[*].tsx",
  ],
  "exclude": ["node_modules"]
}

Command from root

$ ts-node helpers/seeder.ts

Case

.tsconfig
.....
{
    "module": "commonjs",
}

Clean exit

Case

.tsconfig
.....
{
    "module": "esnext",
}

Error

import * as faker from "faker";
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at Object.compileFunction (node:vm:352:18)
    at wrapSafe (node:internal/modules/cjs/loader:1031:15)
    at Module._compile (node:internal/modules/cjs/loader:1065:27)
    at Module.m._compile (/usr/local/lib/node_modules/ts-node/src/index.ts:1310:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Object.require.extensions.<computed> [as .ts] (/usr/local/lib/node_modules/ts-node/src/index.ts:1313:12)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:79:12)
    at main (/usr/local/lib/node_modules/ts-node/src/bin.ts:331:12)

Tried

  1. adding "type": module to package.json. Received Error:

    ```
    TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for 
    /root/helpers/run.ts
      at new NodeError (node:internal/errors:371:5)
      at Loader.defaultGetFormat [as _getFormat] 
       (node:internal/modules/esm/get_format:71:15)
      at Loader.getFormat (node:internal/modules/esm/loader:105:42)
      at Loader.getModuleJob (node:internal/modules/esm/loader:243:31)
      at async Loader.import (node:internal/modules/esm/loader:177:17)
      at async Object.loadESM (node:internal/process/esm_loader:68:5)
      at async handleMainPromise (node:internal/modules/run_main:63:12) {
      code: 'ERR_UNKNOWN_FILE_EXTENSION'
    }
    
    ```
    
  2. adding "type": commonjs to package.json. I prefer not to revert to commonjs regardless and keep everything es6 Received Error:

    SyntaxError: Cannot use import statement outside a module
    at Object.compileFunction (node:vm:352:18)
    at wrapSafe (node:internal/modules/cjs/loader:1031:15)
    at Module._compile (node:internal/modules/cjs/loader:1065:27)
    at Module.m._compile (/usr/local/lib/node_modules/ts-node/src/index.ts:1310:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Object.require.extensions.<computed> [as .ts] (/usr/local/lib/node_modules/ts- 
    node/src/index.ts:1313:12)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] 
      (node:internal/modules/run_main:79:12)
    at main (/usr/local/lib/node_modules/ts-node/src/bin.ts:331:12)
    
    
nhasanli
  • 93
  • 2

0 Answers0