commit e286e3092c2921c50e58439e24b216680e9a332d Author: kodemon Date: Sun Jun 30 14:06:20 2024 +0200 feat: first release diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..3a0472a --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,34 @@ +name: Publish + +on: + workflow_dispatch: + push: + branches: + - main + paths: + - "deno.json" + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Setup Deno + uses: maximousblk/setup-deno@v2 # Installs latest version + + - run: deno task test + + publish: + runs-on: ubuntu-latest + needs: test + + permissions: + contents: read + id-token: write + + steps: + - uses: actions/checkout@v4 + + - name: Publish package + run: npx jsr publish \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..631d373 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,20 @@ +name: Test + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Setup Deno + uses: maximousblk/setup-deno@v2 # Installs latest version + + - run: deno task test \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3f42bd6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "deno.enable": true, + "editor.formatOnSave": true, + "editor.defaultFormatter": "denoland.vscode-deno", + "emeraldwalk.runonsave": { + "commands": [ + { + "match": "\\.ts$", + "cmd": "deno lint ${file} --fix" + } + ] + } +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e184245 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +

+ +

+ +# Event Emitter + +Introduces a `subscribe` extension on the latest popular [eventemitter3](https://github.com/primus/eventemitter3) +solution. diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..2142621 --- /dev/null +++ b/deno.json @@ -0,0 +1,26 @@ +{ + "name": "@valkyr/event-emitter", + "version": "1.0.0", + "exports": "./event-emitter.ts", + "imports": { + "eventemitter3": "npm:eventemitter3@5.0.1" + }, + "exclude": [ + ".vscode" + ], + "lint": { + "rules": { + "exclude": [ + "no-explicit-any", + "require-await" + ] + } + }, + "fmt": { + "lineWidth": 120 + }, + "tasks": { + "test": "deno test --allow-all --unstable-ffi", + "lint": "deno lint --fix" + } +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..df98f38 --- /dev/null +++ b/deno.lock @@ -0,0 +1,20 @@ +{ + "version": "3", + "packages": { + "specifiers": { + "npm:eventemitter3@5.0.1": "npm:eventemitter3@5.0.1" + }, + "npm": { + "eventemitter3@5.0.1": { + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dependencies": {} + } + } + }, + "remote": {}, + "workspace": { + "dependencies": [ + "npm:eventemitter3@5.0.1" + ] + } +} diff --git a/event-emitter.ts b/event-emitter.ts new file mode 100644 index 0000000..91baba1 --- /dev/null +++ b/event-emitter.ts @@ -0,0 +1,39 @@ +import { EventEmitter as BaseEventEmitter } from "eventemitter3"; + +export class EventEmitter extends BaseEventEmitter { + subscribe>( + event: T, + fn: EventListener, + destroy?: () => void, + ): { + unsubscribe: () => void; + } { + this.addListener(event, fn); + return { + unsubscribe: () => { + this.removeListener(event, fn); + if (destroy) { + destroy(); + } + }, + }; + } +} + +/* + |-------------------------------------------------------------------------------- + | Types + |-------------------------------------------------------------------------------- + */ + +type EventListener> = T extends string | symbol + ? (...args: any[]) => void + : (...args: ArgumentMap>[Extract]) => void; + +type EventNames = T extends string | symbol ? T : keyof T; + +type ValidEventTypes = string | symbol | Record; + +type ArgumentMap> = { + [K in keyof T]: T[K] extends (...args: any[]) => void ? Parameters : T[K] extends any[] ? T[K] : any[]; +};