動かざることバグの如し

近づきたいよ 君の理想に

mdxで特定のコンポーネント以外は消すスクリプト

mdxで特定のコンポーネント以外は消すスクリプト

import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkMdx from 'remark-mdx';
import remarkStringify from 'remark-stringify';
import { visit, SKIP } from 'unist-util-visit';
import { readFile, writeFile } from 'fs/promises';
import {MdxJsxFlowElement} from 'mdast-util-mdx-jsx';

interface ParentNode extends Node {
  children: Node[];
}

// MDXファイルを処理する関数
async function processMdxFile(filePath: string): Promise<void> {
  try {
    // ファイルを読み込む
    const content = await readFile(filePath, 'utf-8');

    // unified処理パイプラインを作成
    const result = await unified()
      .use(remarkParse)
      .use(remarkMdx)
      .use(() => (tree) => {
        visit(tree, 'mdxJsxFlowElement', (node: MdxJsxFlowElement, index: number, parent: ParentNode) => {
          // <Demo>コンポーネント以外を削除
          if (node.name !== 'Demo') {
            parent.children.splice(index, 1);
            return [SKIP, index];
          }
        });
      })
      .use(remarkStringify)
      .process(content);

    // 処理結果を元のファイルに上書き保存
    await writeFile(filePath, result.toString());

    console.log(filePath);
  } catch (error) {
    console.error('error', error);
  }
}

// 使用例
processMdxFile('src/pages/core/pin-input.mdx');