4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プロもくチャットAdvent Calendar 2024

Day 9

JSで作ったCLIツールをTS化する

Last updated at Posted at 2024-12-08

プロもくチャットアドベントカレンダー9日目です!


アドカレの6日目にJSでツールを作ったのですが、いい機会なのでTS化してみようと思います

TypeScript

まずはtypescriptインストール
トライスパイルするのがめんどくらいのでts-nodeもいれます

npm i typescript ts-node
npx tsc --init

これでもう適当なtsファイル作って実行できます

npx ts-node main.ts

ついでに実行時の引数バリデーションのため、zodを入れました

npm i zod

このように定義して、違う値の場合エラーを発生してくれます

inferを使えば定義したschemaの型を使えるのアツい

const schema = z.object({
  waitMs: z.number().positive(),
  pageToken: z.string(),
  maxPage: z.number().min(0),
  output: z.string().regex(/.+\.csv$/),
  fields: z.string().regex(/^(\w+:[\w.]+,?)+$/),
})

export type Config = {channelId:string; options:z.infer<typeof schema>}

・PR
https://github.com/babu-ch/youtube_csv/pull/1

ついでにテストも導入

vitestを使います

npm i vitest

テストできるようにするため、結構書き換えました

最初テストしにくいコードだったんやなぁと実感

・PR
https://github.com/babu-ch/youtube_csv/pull/2

・こまったとこ

vitestのmockを複数回設定すると最後に設定した値になる

vi.hoistedを使用することで解決した

const channelApi = vi.hoisted(() => vi.fn())
const playlistApi = vi.hoisted(() => vi.fn())
vi.mock('googleapis', () => ({
  google: {
    youtube: () => {
      return {
        playlistItems: {
          list: playlistApi
        },
        channels: {
          list: channelApi
        }
      }
    }
  }
}))

// こんな感じでモックの値を設定
channelApi.mockReturnValue({ data: { items: [{contentDetails:{relatedPlaylists:{uploads:"playlistId"}}}] } })

おわり

最初からTSでもよかったかもしれない

でも記事かけたのでよかったかもしれない

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?