Open21
オープンソースを読む https://github.com/zenn-dev/zenn-editor/tree/canary/packages%2Fzenn-cli
すごく読みやすいし、勉強になる
関数の実行。スクリプト的。
node-typescriptプロジェクト作成コマンド
pnpm init
pnpm install typescript --save-dev
pnpm install @types/node --save-dev
npx tsc --init
tsconfig.json
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"esModuleInterop": true,
"rootDir":"./src",
"outDir": "./dist",
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
}
}
デバッグ用の起動
package.json
"main": "./dist/zenn.js",
"scripts": {
"start": "node ./dist/zenn.js ",
"build": "npx tsc"
}
小ネタ
tsconfigでコメント除去
cat tsconfig.json | \
sed \
-e 's,/\*.*\*/,,' \ # /* コメント除去 */
-e 's,^[ ]*//.*,,' \ # // コメント除去
-e '/^[ ]*$/d' \ # 連続スペース行除去
-e 's/[ ]*$//g' # 末尾の連続スペース除去
面倒な処理はhelperに集める
大まかなロジックだけを集める
generateFileIfNotExist(
getWorkingPath('.gitignore'),
['node_modules', '.DS_Store'].join('\n')
);
type Command1 = {
a : () => void
}
type Command2 = {
[a:string] : () => void
}
インデックスシグネチャ
インデックスシグネチャとは、特定の型を持つオブジェクトの構造を記述する方法です。これによって、オブジェクトが持つことのできるプロパティの型を指定することができます。
インデックスシグネチャを使うと、IFを実装したオブジェクトの集合体が作れる。。。
オブジェクトリテラルで囲んだものは、
[’key'],でもa.bのドットでもアクセス可能だが、
変数で取得するためにインデックス使用する
type Commands = { [command: string]: CliExecFn };
type ExecOptions = { canNotifyUpdate: boolean };
export async function exec(
execCommandName: string,
execCommandArgs: string[],
options: ExecOptions = { canNotifyUpdate: false }
) {
const commands: Commands = {
preview: async () => preview.exec(),
init: async () => init.exec(),
'new:article': async () => newArticle.exec(),
'new:articles': async () => newArticle.exec(),
'new:book': async () => newBook.exec(),
'new:books': async () => newBook.exec(),
'list:articles': async () => listArticles.exec(),
'list:books': async () => listBooks.exec(),
'--help': async () => help.exec(),
'-h': async () => help.exec(),
'--version': async () => version.exec(),
'-v': async () => version.exec(),
};