ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

ts-jestではなくesbuild-jestを試してみる

開発にgoogleapisを使っているとtscが遅くなってしまったのでテストの実行だけでも早くならないかと思い調べるとesbuild-jestとswr-jestというのがあることを知った

github.com

github.com

aws-cdkの@aws-cdk/aws-lambda-nodejsがbuildにesbuildを使っているので、esbuild-jestを試してみた。

tl;dr

なんかesbuild-jestのpackage.jsonに書かれているパッケージが見つからなくてエラーになったりするのでまだ手出さない方がいいかもしれない。

前提

ts-jestの環境を既に構築済みの人

インストール

取ってきて、jest.config.jsを少し書き換えるだけで簡単に実行できた。

yarn add -D esbuild-jest
module.exports = {
  testEnvironment: 'node',
  testMatch: ['**/*.test.ts'],
  transform: {
    // '^.+\\.tsx?$': 'ts-jest',
    '^.+\\.tsx?$': 'esbuild-jest',
  },
}

ハマったこと

jest.mockを書くとCannot find moduleエラーが起きる

ソースコード中にjest.mockを書くとCannot find module '@babel/plugin-transform-modules-commonjs'というエラーが出て動かなくなる。

一応自分でyarn add -D @babel/plugin-transform-modules-commonjsを実行してパッケージをインストールするとここは突破できる

アノテーションをつけるとエラーになる

自分で x: number のような型アノテーションをつけると @babel/preset-typescript等を使って型情報を外す必要があるということが SyntaxErrorと共に表示される

これは@babel/preset-typescriptを追加してプロジェクトのpackage.json@babel/preset-typescriptの設定を書くとエラーが消える。

Cannot transform the imported binding xxxxx since it's also used in a type annotation · Issue #57 · aelbore/esbuild-jest · GitHub

感想

自分のpackage.jsonに設定書き加えたり、依存モジュールが見つけられなかったりイマイチ原因がわからないエラーに当たるのは辛いがやっぱ早いのはいい事だよなと思って、最悪esbuild-jestと書いたところをts-jestに戻すだけで戻れるので使ってみてる。

またハマったという事ではないけど、カバレッジをとった時にts-jestとesbuild-jestで若干値が違ってるんだけど、どっちが正しいのかよくわからないという問題があるな〜とは思うが、そこまでカバレッジを意識するところまで行ってないので一旦esbuild-jestが出す値を目安くらいの気持ちで運用することにした。

aws-cdk + localstackで定義したlambdaを実行してそのログを確認する

イマイチログの見方がわからず、今後使う時もまたハマりそうなのでメモ

想定読者

  • cdkを使ってlambdaを定義できる
  • cdklocal deployを実行して定義したlambdaをデプロイできる
  • デプロイしたlambdaを実行できる

確認用のlambda

nodejsしか使えないのでnodejsでlambdaを定義する。logにはnode-bunyanを使用する

ログを出力してそれをレスポンスとして返す簡単なlambda関数

import type { APIGatewayProxyHandler } from 'aws-lambda'
import * as bunyan from 'bunyan'

const logs = bunyan.createLogger({name: 'myapp'})

export const handler: APIGatewayProxyHandler = async (event) => {
  logs.info({message: 'handle event.', req: event})
  return {
    statusCode: 200,
    body: JSON.stringify(event)
  }
}

ログの確認方法

aws-cliを使用してログを確認する

# log groupを確認する
aws --endpoint-url=http://localhost:4566 logs describe-log-groups  --query logGroups[0].logGroupName

# logをtailで表示する logGroupNameの部分を取得したものに置き換える
aws logs tail {logGroupName} --follow --endpoint-url=http://localhost:4566

これでlambdaのログを追うことができるのでデバッグが捗る

typescript 4.5 betaでes modulesを試す

node.jsでes modulesがサポートされた時にやってみようと思ったがtsmjsに変換する方法が無くて諦めたやつができるようになったっぽいので試してみた。

devblogs.microsoft.com

一応試したコードはgithubに上げてある。

github.com

インストールと設定

beta版(4.5.0-beta)をインストールする

yarn add typescript@beta

tsconfigを作成し、module設定を変更する

yarn tsc --init

commonjses2022

{
    "compilerOptions": {
        "module": "es2022",
    }
}

雑なtypescriptのコードを用意する。ts4.5では .mtsという拡張子が使える様になっている。.mtsコンパイルすると.mjsとes moduleを使う指定になってnode.jsが実行してくれる。

// add.mts
export const add = (x: number, y: number) => x + y

// index.mts
import { add } from "./add.mjs"; // ここがm"js"なことに注意

console.log(add(1,2))

これでtscして実行してみる

yarn tsc -P . && node src/index.mjs

ちなみに

.mtsのような拡張子を使わず、既存の.tsでcommonjsではなくes moduleとして実行することもできることができる。*1

type in package.json and New Extensions

実際にやってみた。ソースコードは前とほぼ同じだけど、ファイルの拡張子が違う。

// add.ts
export const add = (x: number, y: number) => x + y

// index.ts
import { add } from "./add.js";

console.log(add(1,2))

package.jsonに以下を書き加える。設定を書くとnode.jsが.jsをes moduleとして実行する。

{
  "type": "module"
}
yarn tsc -P . && node src/index.js

*1:node.js v12で入った機能ですが https://nodejs.org/api/packages.html#packages_type