Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to compile TypeScript to JavaScript with top-level await?

I would like to utilize top-level await available since TypeScript 3.8 in a NodeJS application.

So, the following TypeScript code:

import { getDoctorsPage } from "./utils/axios.provider";
const page = await getDoctorsPage("047", "1", "1");
console.log(page);

compiles to this JavaScript code:

import { getDoctorsPage } from "./utils/axios.provider";
const page = await getDoctorsPage("047", "1", "1");
console.log(page);
//# sourceMappingURL=index.js.map

And when I try to run it within WebStorm I get the following error:

(node:95053) ExperimentalWarning: The ESM module loader is experimental.
file:///Users/anatoly/Documents/git/maccabi-parser/dist/index.js:2
const page = await getDoctorsPage("047", "1", "1");
             ^^^^^

SyntaxError: Unexpected reserved word
    at Loader.moduleStrategy (internal/modules/esm/translators.js:81:18)
    at async link (internal/modules/esm/module_job.js:37:21)

Does the latest NodeJS 0.13.* support it?

My tsconfig.json

{
  "compilerOptions": {
    "target": "es2020",
    "module": "esnext",
    "pretty": true,
    "sourceMap": true,
    "outDir": "dist",
    "importHelpers": true,
    "strict": true,
    "moduleResolution": "node",
    "esModuleInterop": true,
    "rootDir": "src",
    "noImplicitAny": false,
    "strictNullChecks": false,
    "noImplicitThis": true,
    "alwaysStrict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": false,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "baseUrl": "./",
    "allowSyntheticDefaultImports": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "resolveJsonModule": true
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules",
    "dist"
  ]
}

and package.json contains "type": "module"

like image 837
Anatoly Avatar asked Dec 06 '25 07:12

Anatoly


1 Answers

As mentioned in the comments that this feature is not just dependent on the version of TS but more things like version of WebPack (if using WebPack) and existence of the V8 flag --js-flags="--harmony-top-level-await" during execution of the program or in configs.

Executing this code with this flag enabled can be done as mentioned in the comments:

node -r dotenv/config --harmony-top-level-await --es-module-specifier-resolution=node dist/index.js

like image 172
VPaul Avatar answered Dec 08 '25 19:12

VPaul



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!