【Strapi】generated後のd.tsファイルをライブラリに再利用する
こんにちは、フリーランスエンジニアの太田雅昭です。
Strapiはいつからかは分かりませんが、自動でContent-Typeの型定義を作成するようになっているようです。数ヶ月前には、このような挙動はなかったと思うのですが、最近Strapiを新たに構築し直しても自動でContent-Typeの型定義が作成されるようになっていました。
自動生成されるファイル
2023年11月19日現在、自動生成されるファイルは以下のようになっています。
- types
- generated
- components.d.ts
- contentTypes.d.ts
自動でコピーする
さてこの型定義をライブラリに含めて再利用したいわけです。例えばpackage.jsonを以下のようにします。
{
"scripts": {
"develop": "strapi develop && cp -r ./types/generated ../lib/src/strapi/",
}
}
こうすることで、strapiの開発実行ごとに毎回、../lib/src/strapiに自動生成されたd.tsファイルがコピーされます。
ですがこれだと、lib側のtscでうまくいきません。具体的には、d.tsファイルはtscでコンパイルされないためです。これはtscの仕様で、新しいd.tsファイルはオプション次第で作成するけども、もともとあるd.tsファイルは無視するようになっているためです。
tscで処理できるように、d.tsから.tsにリネームする
そこで、d.tsから.tsにリネームするようにします。以下のスクリプトを用います。ファイル名は copy-generated-to-lib.jsとします。
const fs = require('fs');
const path = require('path');
// ディレクトリパスを設定
const srcPath = path.join(__dirname, './types/generated/');
const distPath = path.join(__dirname, '../lib/src/strapi/generated/');
// 指定ディレクトリ内のファイルを走査
fs.readdir(srcPath, (err, files) => {
if (err) {
return console.error('Unable to scan directory: ' + err);
}
files.forEach((file) => {
if (file.endsWith('.d.ts')) {
const oldPath = path.join(srcPath, file);
const newPath = path.join(distPath, file.replace('.d.ts', '.ts'));
fs.copyFile(oldPath, newPath, (err) => {
if (err) throw err;
console.log(`${oldPath} was renamed to ${newPath}`);
});
}
});
});
これを、先ほどのpackage.jsonの記述と置き換えます。
{
"scripts": {
"develop": "strapi develop && node copy-generated-to-lib.js",
}
}
これで、tsファイルがlibのsrcディレクトリにコピーされるようになりました。そのため、tscで処理されるようになり、libのdistディレクトリに鎮座するでしょう。
小話
最近寒いですね。家の中でジャンパーを羽織り、暖房は省エネで乗り切ってます。