ゆずめも

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

dayjsで時間文字列を特定のタイムゾーンの値としてパースする

google calendarAPIを触っていて特定のタイムゾーンの時間として時間情報をパースする必要があって調べたら、特に情報がなかったのでメモ。

dayjsのtimezoneプラグインを読み込み tz 関数でパースする際にtimezoneを指定する。

day.js.org

import * as dayjs from 'dayjs'
import * as utc from 'dayjs/plugin/utc'
import * as timezone from 'dayjs/plugin/timezone'

dayjs.extend(utc)
dayjs.extend(timezone)

// サーバーの設定で判断する
const d1 = dayjs.tz("2014-06-01 12:00")
console.log(d1.toString()) // => Sun, 01 Jun 2014 03:00:00 GMT

// 時間をニューヨークの時間として解釈する
const d2 = dayjs.tz("2014-06-01 12:00", "America/New_York")
console.log(d2.toString()) // => Sun, 01 Jun 2014 16:00:00 GMT

参考

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のログを追うことができるのでデバッグが捗る