unifiedストリンギファイアプラグインの事例

https://github.com/retextjs/retext/blob/main/packages/retext-stringify/lib/index.js

/**
 * @typedef {import('nlcst').Root} Root
 */

import {toString} from 'nlcst-to-string'

/** @type {import('unified').Plugin<void[], Root, string>} */
export default function retextStringify() {
  Object.assign(this, {Compiler})
}

/** @type {import('unified').CompilerFunction<Root, string>} */
function Compiler(tree) {
  return toString(tree)
}

型 Root は仕様 nlcst で定義されている。@typedef は文字通り型別名割り当て。

名前 toString は、ncls-to-stringモジュールからエクスポートされている関数名。

下の方の関数 Complier はエクスポートされてないが、unified::CompilerFunction<nlcs::Root, string> 型を持つ。そのプロファイルは nlcs::Root → string 。確かにストリンギファイアだ。次の2つは同値。

  1. f :∈ unified::CompilerFunction<nlcs::Root, string>
  2. f: nlcs::Root → string

型推論して、次が分かる。

  1. nlcst-to-string::toString : nlcs::Root → string

デフォルトエクスポートされている関数 retextStringify は関数でありオブジェクトでありクラスでもある。this.Compiler に Compiler ≡ nlcst-to-string::toString がセットされていることから、unifiedコンパイラ=unifiedストリンギファイア=unifiedシリアライザー になっている。

コンパイラを使う側は、import comp from 'pkg'; let c = (new comp()).Compiler ; でパフォーマー関数を得られる。パフォーマーを得る手法は:

  1. パフォーマー生成関数なら、その関数を呼んだ戻り値がパフォーマー。
  2. クラスコンストラクタなら、new して作ったオブジェクトの約束された名前のメソッドがパフォーマー。