unifiedのプラグイン事例と曖昧性

https://github.com/remarkjs/remark から:

import {visit} from 'unist-util-visit'

/** @type {import('unified').Plugin<[], import('mdast').Root>} */
function myRemarkPluginToIncreaseHeadings() {
  return (tree) => {
    visit(tree, (node) => {
      if (node.type === 'heading') {
        node.depth++
      }
    })
  }
}

JSDocの型表現がどうもわかりにくい。順次解釈する。

  1. import('unified').Plugin<[], import('mdast').Root>
  2. ↑は、unifiedモジュールで定義されたPluginジェネリック型
  3. import('mdast').Root は、mdastモジュールで定義せれたRoot型
  4. プラグインは、引数配列 [] で戻り値型がRoot

unified::Plugin<[], madast::Root> とかなら見やすいのに。

で、このプラグインは、ツリートランスフォーマーを返す。プラグインが関数のときは、それ自身が処理するのではなくて、トランスフォーマー関数を返す使用。

トランスフォーマーは、mdastのtree(実際はNode型)を引数にして何かツリートランスフォーム処理をする。関数の戻り値は不要のようだ。

  1. トランスフォーマー・プラグインは、型が unified::Plugin<Arg, Tree> である関数。ここで、Arg, Tree は型引数で、Arg <: [...any], Tree <: mdast::Node という制約あり。
  2. トランスフォーマー・プラグイン関数は、実行者〈パフォーマー〉関数を返す。パフォーマーは、引数に渡されたツリーを直接書き換える。コピーではなくて変更する。

曖昧なのは:

  1. トランスフォーマーと言ったとき、パフォーマー関数なのか? パフォーマー生成関数なのか?
  2. プラグインと言ったとき、パフォーマー関数なのか? パフォーマー生成関数なのか? ドライバーなのか?
  3. ドライバーと言ったとき、プレーンドライバーなのか? プロセッサ内蔵ドライバーなのか?
  4. パーザーと言ったとき、パーザー・プラグインなのか、パーザー内蔵ドライバーなのか?