SymbolSDKv3.1.0をts-nodeで動作させる

symbol-sdk@3.1.0 を試そうとしたら ts-node でパッと動いてくれなかった。
調べたらトランスパイルして実行する方法があったので、同じように設定を変更して ts-node で動かしてみた。

https://qiita.com/planethouki/items/b8e575162ee91b44ac72

# セットアップ

`package.json`を作成する。

```bash
npm init -y
```

必要なパッケージのインストールする。

```bash
npm i -D typescript ts-node
npm i symbol-sdk
```

`tsconfig.json`を作成する。

```bash
npx tsc --init
```

動作確認用の簡単なコードを作成。

```sample.ts
import symsdk from "symbol-sdk";

const network = symsdk.symbol.Network.TESTNET;

console.log(network);
```

このまま`ts-node`で実行すると…

:::note info
ローカルに`ts-node`をインストールしているので、`npx`を付けて実行します。
```bash
npx ts-node sample.ts
```
:::


```
> npx ts-node sample.ts
H:\project_symbol\symbolsdk-sample\node_modules\ts-node\dist\index.js:851
            return old(m, filename);
                   ^
Error [ERR_REQUIRE_ESM]: require() of ES Module H:\project_symbol\symbolsdk-sample\node_modules\symbol-sdk\src\index.js from H:\project_symbol\symbolsdk-sample\sample.ts not supported.
Instead change the require of index.js in H:\project_symbol\symbolsdk-sample\sample.ts to a dynamic import() which is available in all CommonJS modules.
    at require.extensions.<computed> [as .js] (H:\project_symbol\symbolsdk-sample\node_modules\ts-node\dist\index.js:851:20)
    at Object.<anonymous> (H:\project_symbol\symbolsdk-sample\sample.ts:6:38)
    at m._compile (H:\project_symbol\symbolsdk-sample\node_modules\ts-node\dist\index.js:857:29)
    at require.extensions.<computed> [as .ts] (H:\project_symbol\symbolsdk-sample\node_modules\ts-node\dist\index.js:859:16)
    at phase4 (H:\project_symbol\symbolsdk-sample\node_modules\ts-node\dist\bin.js:466:20)
    at bootstrap (H:\project_symbol\symbolsdk-sample\node_modules\ts-node\dist\bin.js:54:12)
    at main (H:\project_symbol\symbolsdk-sample\node_modules\ts-node\dist\bin.js:33:12)
    at Object.<anonymous> (H:\project_symbol\symbolsdk-sample\node_modules\ts-node\dist\bin.js:579:5) {
  code: 'ERR_REQUIRE_ESM'
}
```

という感じで、そのままでは動きません。

# 設定を変更

## package.json

`"type": "module"`を追加する。

```diff:package.json
{
  "name": "symbolsdk-sample",
  "version": "1.0.0",
  "description": "",
+ "type": "module",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "ts-node": "^10.9.2",
    "typescript": "^5.3.3"
  },
  "dependencies": {
    "symbol-sdk": "^3.1.0"
  }
}
```

## tsconfig.json

`"module"`を`"NodeNext"`に変更する。
ついでに`"target"`も`"es2020"`に変更する。

`ts-node`に`--esm`オプション付けて実行する必要があるのですが、毎回入力するのは面倒なので、`ts-node`の設定も追加する。

```diff:tsconfig.json
{
  "compilerOptions": {
-   "target": "es2016",
+   "target": "es2020",
-   "module": "commonjs",
+   "module": "NodeNext",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
- }
+ },
+ "ts-node": {
+   "esm": true
+ }
}
```

# 動作確認

```
> npx ts-node sample.ts
Network {
  name: 'testnet',
  identifier: 152,
  datetimeConverter: NetworkTimestampDatetimeConverter {
    epoch: 2022-10-31T21:07:47.000Z,
    timeUnits: 1
  },
  _addressHasher: [Function (anonymous)],
  _createAddress: [Function (anonymous)],
  _AddressClass: [class Address extends ByteArray] { SIZE: 24, ENCODED_SIZE: 39 },
  _NetworkTimestampClass: [class NetworkTimestamp extends NetworkTimestamp],
  generationHashSeed: Hash256 {
    bytes: Uint8Array(32) [
       73, 214, 225, 206,  39, 106, 133, 183,
       14, 175, 229,  35,  73, 170, 204, 163,
      137,  48,  46, 122, 151,  84, 188, 241,
       34,  30, 121,  73,  79, 198, 101, 164
    ]
  }
}
```