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')
);
イネダイネダ

export function generateFileIfNotExist(fullpath: string, content: string) {
fs.outputFileSync(
fullpath,
content,
{ flag: 'wx' } // Don't overwrite
);
}

イネダイネダ
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(),
  };