Open4

redocly decoratorsを調査

OSAMU NAKAMURAOSAMU NAKAMURA

Redocly CLI のプラグインにdecorator という仕組みがある。
decoratorを利用するとOpenAPI の要素を書き換えられる。

OSAMU NAKAMURAOSAMU NAKAMURA

decorator は プラグインの位置機能として実装する。

decorator はVisitorパターンで実装する。
Node Typeはここに一覧がある。

公式ドキュメントの Custom decoratorsの例として、 descriptionに絵文字を追加するコードが挙げられている。
この例では、 Operation ノードタイプに対して処理を追加している。

module.exports = OperationSparkle;

function OperationSparkle() {
  console.log("adding sparkles ... ");
  return {
    Operation: {
      leave(target) {
        if(target.description) {
          target.description = "✨ " + String(target.description);
        }
      }
    },
  }
};
OSAMU NAKAMURAOSAMU NAKAMURA

decorator の開発はだいたい以下の流れ:

redocly.yaml の plugins フィールドにプラグインソースのパスを指定する。

plugins:
  - plugins/sparkle.js

decorators:
  sparkle/operation-sparkle: on

plugins に指定したパスのJSソースでプラグイン情報を返す関数を実装する。

// Decorator の実装。
const OperationSparkle = require("./decorators/operation-sparkle.js")

module.exports = function sparklePlugin() {
  return {
    id: "sparkle",        // redocly.yalm の decorators: sparkle/... と一致させる
    decorators: {
      oas3: {
       "operation-sparkle": OperationSparkle, // redocly.yalm の decorators: sparkle/operation-sparkle と一致させる
      }
    }
  }
}

plugins/decorators/operation-sparkle.js は以下の通り(再掲)

module.exports = OperationSparkle;

function OperationSparkle() {
  console.log("adding sparkles ... ");
  return {
    Operation: {
      leave(target) {
        if(target.description) {
          target.description = "✨ " + String(target.description);
        }
      }
    },
  }
};
OSAMU NAKAMURAOSAMU NAKAMURA

Visitor は enter, leave, skip をそれぞれ実装できる
https://github.com/Redocly/redocly-cli/blob/219e15b8089f3040a6a951826881cf75153ca9ff/packages/core/src/visitors.ts#L89-L93

第一引数は node, 第二引数が コンテキスト。第四引数がよくわからない。

https://github.com/Redocly/redocly-cli/blob/219e15b8089f3040a6a951826881cf75153ca9ff/packages/core/src/visitors.ts#L78-L83

skip のみ、真偽値を返せる。true を返すと omit するっぽい。

ctx は、location などノードに関する情報が格納されるので、ctx.location.pointer でrefがとれる
https://github.com/Redocly/redocly-cli/blob/219e15b8089f3040a6a951826881cf75153ca9ff/packages/core/src/walk.ts#L39-L51