softshipper
softshipper

Reputation: 34061

Despite "type": "module" declaration in package.json the error occurs

I am trying to build a typescript playground and to use ES module.

package.json

{
  "name": "playgroud",
  "version": "1.0.0",
  "description": "",
  "main": "index.ts",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "tsnd index.ts"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "ts-node-dev": "^1.1.6",
    "tslint": "^6.1.3",
    "typescript": "^4.2.4"
  },
  "dependencies": {
    "fp-ts": "^2.10.0"
  }
}

tsconfig.json

{
  "compilerOptions": {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */
    "target": "ESNext",                                /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
    "module": "ESNext",                           /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */

    /* Strict Type-Checking Options */
    "strict": true,                                 /* Enable all strict type-checking options. */
    "strictNullChecks": true,                    /* Enable strict null checks. */
    "strictPropertyInitialization": true,        /* Enable strict checking of property initialization in classes. */
    "noImplicitThis": true,                      /* Raise error on 'this' expressions with an implied 'any' type. */
    "alwaysStrict": true,                        /* Parse in strict mode and emit "use strict" for each source file. */


    /* Module Resolution Options */
    "moduleResolution": "node",                  /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
    "esModuleInterop": true,                        /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */

    /* Advanced Options */
    "skipLibCheck": true,                           /* Skip type checking of declaration files. */
    "forceConsistentCasingInFileNames": true        /* Disallow inconsistently-cased references to the same file. */
  }
}

index.ts


import * as O from "fp-ts/Option";
import { pipe } from "fp-ts/function";



const fn = (x: number) : boolean => x > 3 ? true : false;

const a = O.of(3)

const b = O.ap(a)(O.some(fn))

const f = (a: string) => (b: number) => ({ a, b })

const res = pipe(
  O.some(f),
  O.ap(O.some("hello")),
  O.ap(O.some(12)),
)

console.log(res);

running yarn run start it shows an error:

[INFO] 20:14:46 Restarting: /home/developer/typescript/playgroud/tsconfig.json has been modified
(node:13329) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/home/developer/typescript/playgroud/index.ts:1
import * as O from "fp-ts/Option";
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at Object.compileFunction (node:vm:355:18)
    at wrapSafe (node:internal/modules/cjs/loader:1022:15)
    at Module._compile (node:internal/modules/cjs/loader:1056:27)
    at Module._compile (/home/developer/typescript/playgroud/node_modules/source-map-support/source-map-support.js:547:25)
    at Module.m._compile (/tmp/ts-node-dev-hook-6308924620652321.js:69:33)
    at Module._extensions..js (node:internal/modules/cjs/loader:1121:10)
    at require.extensions.<computed> (/tmp/ts-node-dev-hook-6308924620652321.js:71:20)
    at Object.nodeDevHook [as .ts] (/home/developer/typescript/playgroud/node_modules/ts-node-dev/lib/hook.js:63:13)
    at Module.load (node:internal/modules/cjs/loader:972:32)
    at Function.Module._load (node:internal/modules/cjs/loader:813:14)
[ERROR] 20:14:46 SyntaxError: Cannot use import statement outside a module

What am I doing wrong? Here is the repo:

https://github.com/softshipper/ts-playground

Upvotes: 1

Views: 5725

Answers (1)

Zwiers
Zwiers

Reputation: 3658

ts-node-dev is using ts-node to compile TypeScript on the fly and it seems to have an issue here with ES Module outputs. I got your code working by going into tsconfig.json and changing module from ESNext to commonjs and then running npm start again, which printed:

> [email protected] start
> tsnd ./src/index.ts

[INFO] 13:26:37 ts-node-dev ver. 1.1.6 (using ts-node ver. 9.1.1, typescript ver. 4.2.4)
{ _tag: 'Some', value: { a: 'hello', b: 12 } }

So it would seem ts-node-dev and/or ts-node expect commonjs module outputs from the TypeScript compiler by default. I did find an option --loader ts-node/esm and adding that to your npm start in combination with module: ESNext in tsconfig.json led to different errors but did not solve the problem.

I tested this on a machine running node v15.11.0.

Upvotes: 1

Related Questions