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つは同値。
- f :∈ unified::CompilerFunction<nlcs::Root, string>
- f: nlcs::Root → string
型推論して、次が分かる。
- 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 ; でパフォーマー関数を得られる。パフォーマーを得る手法は:
- パフォーマー生成関数なら、その関数を呼んだ戻り値がパフォーマー。
- クラスコンストラクタなら、new して作ったオブジェクトの約束された名前のメソッドがパフォーマー。