本文へ移動

5. 設定

cordis.ymlエントリにはconfigブロックを含めることができ、プラグインはapplyの実行前にそれを検証するスキーマを宣言します。不正な設定では、正確なエラーとともに読み込みが失敗します。プラグインが不完全な設定のまま起動することはありません。

設定可能なプラグイン

tmp/cordis-tutorialconfig-demo.tsを作成します。

ts
import type { Context } from '@deepseek-ai/cordis'
import Schema from '@deepseek-ai/schemastery'

export const name = 'config-demo'

export interface Config {
  greeting: string
  targets: string[]
}

export const Config: Schema<Config> = Schema.object({
  greeting: Schema.string().default('Hello'),
  targets: Schema.array(String).default(['world']),
})

export function apply(ctx: Context, config: Config) {
  for (const target of config.targets) {
    console.log(`${config.greeting}, ${target}!`)
  }
}

エクスポートされるConfigは、同じ名前を持つ TypeScript インターフェースであると同時に実行時スキーマでもあります。コンシューマーは型を取得し、Cordis はバリデーターを取得します。このリポジトリではスキーマにSchemasteryを使用します。Cordis 自体は任意のStandard Schemaバリデーターを受け入れるため、Configとしてエクスポートしたプレーンオブジェクトは機能しません。

設定します。

yaml
- name: './config-demo.ts'
  config:
    targets: ['alpha', 'beta']

実行します。

Hello, alpha!
Hello, beta!

greetingは省略されているため、スキーマのデフォルト値によって補われます。applyは常に完全で検証済みの設定を受け取ります。

明確に失敗させる

次に、不正な値を渡します。

yaml
- name: './config-demo.ts'
  config:
    targets: 'not-an-array'
ValidationError: invalid config:
  - $.targets expected array but got not-an-array (at targets)

プラグインの fiber は FAILED になり、このチュートリアルのランチャーはエラーを出力した後、ステータス 1 で終了します。プラグインは、利用できないリソースまたはプロバイダーを指定するスキーマ上は有効な設定についても、その参照を解決できしだい拒否する必要があります。

計算される設定値

このリポジトリで使用するローダーは、読み込み時に計算する必要がある設定値向けに!!jsタグをサポートしています。

yaml
- name: './config-demo.ts'
  config:
    greeting: !!js process.env.DEMO_GREETING ?? 'Hello'

!!jsは、config内およびエントリのdisabledフィールド内でのみ機能します。disabled: !!js ...はマウント判定のたびにローダーコンテキストに対して評価されるため(このリポジトリの拡張)、行ごとにプラットフォームまたは環境で自身を制御できます。その他のメタデータ(nameidinject、…)は静的なままです。そこでは式は通常の truthy なデータとして扱われます。ローダー設定を参照してください。

次へ: 構成と HMRcordis.ymlをアプリケーションとして扱います。