Crowi

プラグイン SDK

CrowiPlugin / PluginContext / 拡張ポイント / スキーママーカーの参照

@crowi/plugin-api が公開する型の参照です。書き方のチュートリアルは プラグイン開発、プラグインの一覧は ファーストパーティプラグイン を参照してください。

CrowiPlugin

すべてのプラグインは CrowiPlugin を満たすオブジェクトを デフォルトエクスポート します。ランタイムは起動時に npm パッケージ名で動的 import します。

フィールド役割
namenpm パッケージ名。設定行 (plugin:<name>:*) とページメタデータの名前空間を兼ねる
versionプラグイン自身のバージョン (npm パッケージの semver)
requires実行時に必要な他プラグインの npm 名。依存グラフを解決して先に読み込む
modelAccess触ってよいコアモデル名の許可リスト。宣言しないモデルには一切アクセスできない
exposesConfigToDependents依存側のプラグインに自分の設定を読ませるかどうか
configSchemaグローバル設定を表す Zod スキーマ。管理 UI がこれから設定フォームを生成する
configAtomicGroupsまとめて保存・検証する設定フィールドの束 (name / keys / sensitive)
pageMetadataSchemaページ単位のメタデータスキーマ。宣言するとページ編集 UI に入力欄が出る
adminPlacement管理サイドバーでの表示位置 (section / label / icon)
readiness必須設定が未入力のときに管理画面へ出す警告の宣言
onInstall / onUninstall初回有効化時 / 削除時のフック
reconfigure管理 UI から設定が変わったときに呼ばれる。保持している接続を作り直す
verifyConfig保存された設定で実際に接続できるかを確かめる。結果は管理 UI に出る

拡張ポイント

register* はすべて任意です。実装したものだけがその拡張として登録されます。

フィールド登録するもの
registerStorage添付ファイルの保存先ドライバ
registerSearch全文検索のドライバ
registerMailSenderメール送信のドライバ
registerRenderer本文の記法を足すレンダラ
registerAuth外部アカウントでのサインインのプロバイダ
registerNotifier通知の宛先
registerHooksコアのイベントバスへのリスナ
registerRoutes/api/plugins/<name>/... 配下の HTTP ルート

adminPlacement.section を省略した場合、セクションは登録した拡張の種類から導出されます。どれにも解決しなかったときは「設定」グループに出ます。

adminPlacement.section に指定できる値は settings / shared / storage / mail / notification / auth / search / renderer / platform です。

PluginContext

register* とライフサイクルフックには PluginContext が渡されます。これがコアの状態に触れる唯一の窓口で、プラグインはコアを直接 import しません。

メンバー役割
config<T>()自分の設定を configSchema でパースした型付きの値として読む
dependencyConfig<T>(name)requires に宣言した依存プラグインの設定を読む
setConfig(key, value)設定フィールドを 1 つ書き込む
pageMetadata自分の名前空間に閉じたページメタデータの読み書き (get / set)
model(name)modelAccess で許可したコアモデルにアクセスする
state<T>(initial)ドライバが持つ接続などを保持する StateCell を返す
logプラグイン名で自動プレフィックスされる構造化ロガー

model()modelAccess の許可リストで閉じています。資格情報を保持するモデルは許可リストに書いても起動時に失敗し、実行時にも返りません。設定値の対称暗号化を行う API はこの context にありません。

dependencyConfig は資格情報を共有するベースプラグインのためのもので、@crowi/plugin-aws が持つリージョンとアクセスキーを、依存する AWS 系プラグインが自前のスキーマで重複定義せずに読み取れます。

StateCell

reconfigure で作り直す資源 (ストレージのクライアント、メールのトランスポート、検索クライアントなど) を保持する箱です。同じ引数の state() は同じセルを返すため、register* で作ったセルを reconfigure から差し替えられます。

メンバー役割
withValue(fn)現在の値を取り出して fn に渡す。差し替えと競合しない読み方

スキーママーカー

設定フィールドの Zod スキーマの describe() の先頭にマーカーを書くと、管理 UI の扱いが変わります。

マーカー書き方効果
@sensitive@sensitive <説明>保存時に自動暗号化し、読み取り時に復号する。管理 UI ではシークレット用の入力欄になる
@action@action "<ラベル>" <METHOD> <path>フィールドの隣にボタンを出し、押すとそのプラグインのルートを呼ぶ

@sensitive の暗号化は CROWI_ENCRYPTION_KEY を前提にします (機密設定の暗号化)。@action の宛先は registerRoutes で登録したルートです。

関連ページ

On this page