プロもくチャットアドベントカレンダー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でもよかったかもしれない
でも記事かけたのでよかったかもしれない