ステート管理ライブラリのAlmin 0.15をリリースしました。

🌟 Features

UseCase#shouldExecuteをサポート

UseCase#shouldExecuteはユースケースを実行するかどうかの事前条件を定義できます。

今までの問題として、ユースケースを宣言的に実行するかどうかを決めることができませんでした。 動作としてはUseCase#execute()が実行されたときに条件が合ってなければreturnすれば機能としては同じです。

しかし、almin-loggerなどのイベント的には”実行した”という記録が残ってしまうのでイマイチでした。

class MyUseCase extends UseCase {
    execute(args){
        if(condition){
             return; // Should not execute this UseCase
        }
        // do something
    }
}

UseCase#shouldExecuteではこのケースを宣言的に表現できます。 UseCase#shouldExecutefalseを返せば、そのユースケースを実行しません。

class MyUseCase extends UseCase {
    shouldExecute(args): boolean {
         return false; // if this usecase should not execute
    }
    execute(args){
        // do something
    }
}

この”実行しなかった”というログは別途onWillNotExecuteEachUseCaseイベントで取得できるのできます。 詳しくはLifeCycleEventHub · Alminをみてください。

📝 Documentation

AlminのサイトをOSSドキュメントツールのdocusaurusで作り直した | Web Scratchで書いたようにAlminのドキュメントサイトを作り直しました。

image

cqrs patterns for javascript application 2018-01-18 11-38-49

また、いくつかのドキュメントを追加したり修正しています。

Thanks to @koba04.

まだチュートリアルの前段階の所がイマイチなので直していきたいです。

Alminは必要なレイヤー分けをするために必要なものを置くために、Reduxなどに比べると登場人物が多いです。これは、特別な記法などを増やしてまで減らすことは目的ではなく、必要なものはちゃんと見える形にすることが目的にあるからです。

そのためこの辺の知識などを補完するためのドキュメントがもっとあるといいなという感じがしています。 (ライブラリに依存したものというよりは、よくあるレイヤードアーキテクチャなどにもでてくるような知識。HanamiとかTERASOLUNA Server Frameworkのようなそのライブラリ利用者以外にも役立つとより良い。)

🔥 Breaking Change

破壊的な変更が一部ありますが、almin/migration-toolsでマイグレーションできたり、TypeScriptの型の問題になっています。

TypeScript

  • Payloadtypeプロパティの型定義を改善しました
  • Payloadクラスを継承してる人だけに影響があります。

Before:

今まではよくないものが型エラーになっていませんでした。

// OK
class P1 extends Payload{
    type = "P1"
}
// OK
class P2 extends Payload {
    type: string;
    constructor() {
        super({ type: "P2" });
    }
}
// OK
class P3 extends Payload{
    constructor() {
        super({ type: "P2" });
    }
}
// OK - It is a bug
class P4 extends Payload{
    // no type
}

After:

0.15で型チェックが厳密になりました。

// OK
class P1 extends Payload{
    type = "P1"
}
// OK
class P2 extends Payload {
    type: string;
    constructor() {
        super({ type: "P2" });
    }
}
// NG - Need to defined `type: string`
class P3 extends Payload{
    constructor() {
        super({ type: "P2" });
    }
}
// NG: Fix a bug #295 
class P4 extends Payload{
    // no type
}

♻️ Remove deprecated API

この2つに変更は@almin/migration-toolsで自動的にマイグレーションできます。

How to migrate?

@almin/migration-toolsをインストールして、対話式で移行したバージョンを指定すれば後はコードを自動的に変換してくれます。

npm install -g @almin/migration-tools
almin-migration-tools "src/**/*.js"

screenshot

実際には次のようなコード変更が行われます。

import { UseCase, ChangedPayload } from "almin";

export class ExampleUseCase extends UseCase {
    execute() {
        this.context.useCase(new ChangedPayload()).execute();
    }
}

to

import { UseCase } from "almin";

export class ExampleUseCase extends UseCase {
    execute() {
        this.context.useCase({ type: "ChangedPayload" }).execute();
    }
}

くわしくは@almin/migration-toolsを見てください。

また、このようなマイグレーションツールを作るためのライブラリも作りました。

code-migratorを使えば、1.0.0 -> 2.0.0への移行というような対話CLIを簡単につくれます。実際にマイグレーションする処理はjscodeshiftなどの任意のcodemodツールを使えるので、code-migrator自体は選択されたバージョンに対するスクリプトを起動するだけです。

その他

kukerに対応したAlminのDevToolsを作ったりしています。kukerはイベントのログビューア拡張なので、イベントをちゃんと定義してるAlminなどとは相性がいいです。(Redux-DevTools版のalmin-devtoolsもある)

kuker

また、Alminはいつでもコントビュートを募集しています。

label:"good first issue"というラベルがついたIssueなどが手が出しやすいかもしれません。

また、Alminはalmin-react-containerというReact連携用のライブラリを公開しています。(自分がReactを使うことが多いので作った) 最近、Reactが新しいContext APIRender Propsのドキュメント追加などパターンに変化が見られます。そのためReactとの連携をするalmin-react-containerを新しく作り直そうとしています。(別物を作るイメージ)

この辺に興味がある人は次のIssueを見てみると面白いかもしれません。