# @akashic/trigger

> An event emitting module for TypeScript

Latest version **2.1.3** (published 2024-09-04) · MIT license · 0 weekly downloads

## Install

```sh
npm install @akashic/trigger
pnpm add @akashic/trigger
yarn add @akashic/trigger
bun add @akashic/trigger
```

## Health

**Score 40/100 (D)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities; high quality score.

Warnings: low downloads.

Negative: abandoned.

## Facts

| | |
|---|---|
| Version | 2.1.3 |
| Published | 2024-09-04 |
| First published | 2019-01-28 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 0 |
| Unpacked size | 59.9 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | DWANGO Co., Ltd. |
| Maintainers | akashic-owner, yu-ogi, kmkr01, akashic-extension-owner, shinobu_takahashi |

## Links

- npm: https://www.npmjs.com/package/@akashic/trigger
- Repository: https://github.com/akashic-games/trigger
- Homepage: https://github.com/akashic-games/trigger#readme
- Issues: https://github.com/akashic-games/trigger/issues
- npm.io page: https://npm.io/package/@akashic/trigger

## Recent versions

- 2.1.3 (latest) — 2024-09-04
- 2.1.2 — 2024-09-04
- 2.1.1 — 2024-08-20
- 2.1.0 — 2023-12-07
- 2.0.1 — 2023-08-28
- 2.0.0 — 2023-04-17
- 1.0.1 — 2022-07-05
- 1.0.0 — 2020-06-04
- 0.1.7 — 2020-01-24
- 0.1.6 — 2019-11-21
- 0.1.5 — 2019-01-28

## README

<p align="center">
<img src="https://raw.githubusercontent.com/akashic-games/trigger/main/img/akashic.png"/>
</p>

# Trigger

TypeScript向けに書かれたイベント通知機構です。
Node.jsの [`EventEmitter`][emitter] に相当する機能を提供しますが、TypeScript上の型定義を明確かつ簡潔にするため次の制限を加えています。

* 名前(イベント名)を持たない (各通知ごとに個別の `Trigger` インスタンスを利用する)
* 引数は高々一つ

[emitter]: https://nodejs.org/api/events.html

## インストール

Node.jsが必要です。次のコマンドでインストールできます。

```
npm install @akashic/trigger
```

## 利用方法

`import` するとclass `Trigger`, `ChainTrigger` が利用できます。

以下は `Trigger` の単純な使用例です。
APIの詳細な仕様は [Trigger.ts][src-trigger], [ChainTrigger.ts][src-chaintrigger] のコメントをご覧ください。

```javascript
import { Trigger } from "@akashic/trigger";

// 引数の型 (ここでは string) を指定してインスタンス生成
const t = new Trigger<string>();

// ハンドラを追加
t.add((s: string) => {
    console.log("fired:", s);
});

// 第二引数でthisを指定して登録することも可能
t.add(someObject.method, someObject);

// オブジェクト引数を使うと全てのオプションが制御可能
t.add({
    func: someObject.method,
    owner: someObject,
    name: "name-as-you-like",  // ハンドラ識別用の名前
    index: 0                   // 挿入先を指定
});

// 一回実行したあと登録解除されるハンドラを追加
t.addOnce((s: string) => {
    // do something
});

// Promise を返すハンドラを追加
t.addOnce(async (s: string) => {
    // do something
});

// 全登録ハンドラを起動
t.fire("some-string-value");

// 条件にマッチするハンドラをすべて削除 (ここでは `owner` が `someObject` で登録されたものすべて)
t.removeAll({ owner: someObject });

// 登録ハンドラをすべて削除
t.removeAll();
```

併せて、 `Trigger`, `ChainTrigger` の公開APIと同じシグネチャを持つinterface `TriggerLike`, `ChainTriggerLike` も公開しています。
公開インターフェースなどにおいて、クラスへの依存を避け duck-typing を可能にしたいケースでは、 `Trigger` などをこれにキャストしてご利用ください。

```javascript
import { Trigger, TriggerLike } from "@akashic/trigger";

export class Foo {
    onDestroyed: TriggerLike<void>;
    constructor() {
        this.onDestroyed = new Trigger<void>();
    }

    // `trigger` は直接 `Trigger` やその派生クラスでなくても、同じシグネチャを持つものでありさえすればよい
    someMethod(trigger: TriggerLike<number>): void {
        // ...
        trigger.fire(someValue);
    }
}
```

[src-trigger]: https://github.com/akashic-games/trigger/blob/master/src/Trigger.ts
[src-chaintrigger]: https://github.com/akashic-games/trigger/blob/master/src/ChainTrigger.ts

## ライセンス
本リポジトリは MIT License の元で公開されています。
詳しくは [LICENSE](https://github.com/akashic-games/trigger/blob/master/LICENSE) をご覧ください。

ただし、画像ファイルおよび音声ファイルは
[CC BY 2.1 JP](https://creativecommons.org/licenses/by/2.1/jp/) の元で公開されています。

---
_Source: https://npm.io/package/@akashic/trigger · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
