TypeStrong / ts-node

TypeScript execution and REPL for node.js
https://typestrong.org/ts-node
MIT License
12.83k stars 534 forks source link

ESM issues: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts #1584

Closed meow-developer closed 2 years ago

meow-developer commented 2 years ago

When I use ESMs in my nodeJS scripts, it always throws TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"

package.json

{
  "name": "abc",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "firebase-admin": "^10.0.1"
  },
  "devDependencies": {
    "typescript": "^4.5.4"
  },
  "type": "module"
}

tsconfig.json

{
  "compilerOptions": {
    "watch": true,
    "target": "es2020",
    "module": "es2020",
    "rootDir": "src",
    "strict": true,
    "outDir": "build",
    "sourceMap": true,
    "moduleResolution": "node",
    "esModuleInterop": true
  }
}

My Code

import * as firebaseAdminModule from 'firebase-admin'

firebaseAdminModule.initializeApp({
    credential: firebaseAdminModule.credential.applicationDefault(),
    databaseURL: 'https://abc.firebaseio.com'
});

export const MAIN_DB = firebaseAdminModule.firestore();

Error

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /index.ts at new NodeError (node:internal/errors:371:5) at Object.file: (node:internal/modules/esm/get_format:72:15) at defaultGetFormat (node:internal/modules/esm/get_format:85:38) at defaultLoad (node:internal/modules/esm/load:13:42) at ESMLoader.load (node:internal/modules/esm/loader:303:26) at ESMLoader.moduleProvider (node:internal/modules/esm/loader:230:58) at new ModuleJob (node:internal/modules/esm/module_job:63:26) at ESMLoader.getModuleJob (node:internal/modules/esm/loader:244:11) at async Promise.all (index 0) at async ESMLoader.import (node:internal/modules/esm/loader:281:24) { code: 'ERR_UNKNOWN_FILE_EXTENSION' }

Not workable Solution

I saw some comments online saying that I should remove the

"type" : "module"

from package.json. I tried, but another problem occured:

import * as firebaseAdminModule from "firebase-admin";
^^^^^^

SyntaxError: Cannot use import statement outside a module

Versions I am using

ts-node@10.4.0 | MIT | deps: 12 | versions: 118 typescript@4.5.4 node --version v16.13.1

cspotcode commented 2 years ago

Are you using #1007?

berekmerilorand commented 1 year ago

I'm receiving the same error after upgrading the wdio packages from package.json to below ones. Since now I've used Node 14 and wdio 7.

I checked through a bunch of places where issues like this were reported and tried a lot of different configuration types, but with no success. I'll appreciate a solution to this.

    "@wdio/appium-service": "^8.1.3",
    "@wdio/browserstack-service": "^8.1.3",
    "@wdio/cli": "^8.1.3",
    "@wdio/local-runner": "^8.1.3",
    "@wdio/mocha-framework": "^8.1.2",
    "@wdio/shared-store-service": "^8.1.3",
    "@wdio/spec-reporter": "^8.1.2",

tsconfig.json

{
    "compilerOptions": {
        "baseUrl": ".",
        "allowJs": true,
        "resolveJsonModule": true,
        "allowSyntheticDefaultImports": true,
        "esModuleInterop": true,
        "isolatedModules": true,
        "jsx": "react",
        "lib": ["es6", "es2019"],
        "skipLibCheck": true,
        "moduleResolution": "node",
        "noEmit": true,
        "strict": true,
        "target": "esnext",
        "types": [
            "node",
            "webdriverio/sync",
            "@wdio/mocha-framework",
            "./types/wdio",
            "@types/mocha-steps",
            "expect-webdriverio",
            "jest"
        ],
    "ts-node": {
        "transpileOnly": true
    }
}

Node version: v16.15.1 (tried also with 16.19.0 and 19.4.0) - I can't use lower version than 16 because wdio 8 is not supported.

Yarn version: 1.18.0

Full error output:

2023-01-12T13:23:49.334Z ERROR @wdio/config:ConfigParser: Failed loading configuration file: file:///Users/berekmerilorand/./e2e/config/wdio.e2e.config.ts: Unknown file extension ".ts" for /Users/berekmerilorand/./e2e/config/wdio.e2e.config.ts
TypeError: Unknown file extension ".ts" for /Users/berekmerilorand/./e2e/config/wdio.e2e.config.ts
    at new NodeError (node:internal/errors:372:5)
    at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:76:11)
    at defaultGetFormat (node:internal/modules/esm/get_format:118:38)
    at defaultLoad (node:internal/modules/esm/load:21:20)
    at ESMLoader.load (node:internal/modules/esm/loader:407:26)
    at ESMLoader.moduleProvider (node:internal/modules/esm/loader:326:22)
    at new ModuleJob (node:internal/modules/esm/module_job:66:26)
    at ESMLoader.#createModuleJob (node:internal/modules/esm/loader:345:17)
    at ESMLoader.getModuleJob (node:internal/modules/esm/loader:304:34)
    at async Promise.all (index 0) {
  code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
error Command failed with exit code 1.

wdio.e2e.config.ts content

require('module-alias/register');

import { config as baseConfig } from '@e2e/config/wdio.base.config';
import { merge } from 'lodash';
import path from 'path';

import { devicesCapabilities } from './wdio.device.capabilities.config';
import { testVars } from './wdio.test.vars';

const sharedSpecsPath = '../e2e/shared/specs';
const specsPath = './e2e/tests/specs';

const specs = {
    specs: [path.join(sharedSpecsPath, '/**')],
};

const smokeSuite = {};

const validationSuite = {};

const allSuites = {
    smokeSuite,
    validationSuite,
};

export const config = merge(testVars, baseConfig, devicesCapabilities.local, specs, {
    specs: [...Object.values(baseConfig.getTargetSuite(allSuites)).flat()],
    suites: {
        ...baseConfig.getTargetSuite(allSuites),
    },
});