概要
Cordis は、時空間コンポーザビリティというプログラミングパラダイムを導入するメタフレームワークです。現在活発に開発が進められており、プラグインベースのアーキテクチャを採用し、Node.js でモジュラー性と拡張性の高いアプリケーションを構築するために使用されます。
README プレビュー
\n Cordis\n\n\nA Meta-Framework of Spatiotemporal Composability.\n\n**Cordis is under active development. The API is not yet stable and may change without notice.**\n\n- Paper: [_A Programming Paradigm for Spatiotemporal Composability_](https://github.com/cordiverse/paper)\n- Documentation: [cordis-primer](https://deepseek-harness.github.io/deepseek-harness/reference/cordis-primer)\n
FAQ (4)
トラブル対応TypeScriptのexactOptionalPropertyTypes有効時に"Type 'undefined' is not assignable to type 'Timeout'"エラーを修正する方法
@cordisjs/plugin-include 1.0.4 では、オプションプロパティの型に undefined を明示的に含めてください。packages/include/src/index.ts において、次のコード:
private writeTask?: NodeJS.Timeout
を以下のように変更します:
private writeTask?: NodeJS.Timeout | undefined
これは型のみの変更であり、ランタイムの動作は変わりません。明示的に undefined が代入されている他のオプションプロパティにも、同様に T | undefined への拡張を適用してください。アップストリームのリリースを待っている利用者は、patch-package を使って公開されている型宣言にパッチを当てることができます。
トラブル対応なぜ Cordis プラグインは、その Context が dispose された後でも読み込まれ続け、dispose イベントが一度もトリガーされないのですか?
これはCordisのバグでした。親コンテキストが破棄された後にctx.plugin()を非同期で呼び出すと、子プラグインがインストールされてしまい、その副作用がクリーンアップされないまま残る可能性がありました。コミットfc388fdbabb9642d3b5b1440573d96cda25604a3を含むリリースにCordisをアップグレードしてください。この修正後は、破棄されたコンテキストに登録されたプラグインはアクティブ化されなくなります。一時的な回避策として、非同期のプラグイン登録を自分でガードしてください:
let disposed = false
ctx.on('dispose', () => {
disposed = true
})
setTimeout(() => {
if (disposed) return
ctx.plugin((ctx) => {
ctx.on('dispose', () => {
// クリーンアップ
})
})
}, 100)トラブル対応Cordisパッチが同じインクルードリスト内の先行するパッチによって挿入された行を対象としている場合、「patch: entry not found」をどのように修正すればよいですか?
これは、@cordisjs/plugin-include がパッチを適用する前に entryMap を一度だけ構築するために発生します。insert パッチで追加された行はそのマップに追加されないため、後続のパッチがそれらの ID を解決できません。修正方法は、PR #116(またはそれに取って代わる journal 修正)を含むリリースにアップグレードすることです。この修正では、挿入された行が挿入直後にインデックス化されます。ローダーをローカルで保守している場合は、処理を続ける前に insert ブランチ内で buildMap(insert) を呼び出してエントリマップにマージしてください(再帰的なグループエントリも含めて)。一時的な回避策としては、最終状態を挿入行に直接指定する(例:insert: [{ id: 'added', name: 'plugin-c', disabled: true }])、または insert とその後の変更を2つの独立した include/patch パスに分割して、両者の間でマップが再構築されるようにする方法があります。更新は次のコマンドで行います:npm update @cordisjs/plugin-include。
トラブル対応dispose() を呼び出した後に cordis の fiber.state がいつまでも PENDING または UNLOADING のままになってしまうのはなぜですか?
これはcordisのバグです:stateは_updateState()によってのみ再計算されるキャッシュ済みフィールドであり、_setEpoch()内の早期リターンにより、dispose時点でACTIVEではなかったすべてのfiberについてその再計算がスキップされます。これが影響するのは正確に2つのケースです:必要な依存関係が一度も提供されなかったためにPENDINGで止まっているfiberと、ロード中にプラグインが例外をスローしたfiber(UNLOADINGで止まっているもの)です。回避策:(1) disposeの検出にはfiber.stateではなくfiber.uid === nullをチェックしてください — uidはdispose時にnullに設定され、内部の_getState()はすでにnullのuidをFiberState.DISPOSEDにマッピングしています。(2) あるいは、disposeエフェクトが最後にstateを収束させるようにfiber.tsにパッチを適用してください:while (this.inertia) { await this.inertia }ループの後に、this._updateState(() => {})の呼び出しを1つ追加します。この変更により、すべてのケースがDISPOSEDに収束し、disposeは正しくPENDING -> DISPOSEDのinternal/statusイベントを発行し、cordisの全テストスイート(246テスト)がパスします。