{"_id":"@aliser/eventer","_rev":"2-3b25fad08eb76712c92491db2b6b8366","name":"@aliser/eventer","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.2":{"name":"@aliser/eventer","version":"0.0.2","description":"A simple event system.","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"publish":"np","build":"tsc -p tsconfig.build.js.json & tsc -p tsconfig.build.dts.json","docs":"typedoc src/index.ts","test":"jest --coverage"},"keywords":["events","event system"],"author":{"name":"aliser"},"license":"MIT","type":"module","publishConfig":{"access":"public"},"devDependencies":{"@types/jest":"^27.5.1","jest":"^28.1.0","np":"^7.6.2","ts-jest":"^28.0.3","ts-node":"^10.8.0","typedoc":"^0.22.15","typescript":"4.6.x"},"gitHead":"98fe9078efd32ad2447997220acc87db9e408b52","_id":"@aliser/eventer@0.0.2","_nodeVersion":"16.15.1","_npmVersion":"8.13.2","dist":{"integrity":"sha512-wVs0rkXSG1eBuy7mRsXyxFMLIFXAYjhvnFyyq+ILWz93gcvFIoigP6y7i7UWVgcExsd2v2Iu7MpqThrrUjP1lg==","shasum":"830264298c00895b3cdb897140276bf8d632e1a0","tarball":"https://registry.npmjs.org/@aliser/eventer/-/eventer-0.0.2.tgz","fileCount":5,"unpackedSize":15356,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE5zxDhfHm+Mo/JI9LHInTajVbng6C9OXzZTJ9Y69LUnAiEA+C4os8IJiq6DrArGAOPvH3Ovk8/MSR2k7hd6zZrR3wM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0vjtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp6Bg/+PKiirzCZ0W8RFLhdgeXIZoI8NXvkl1b8d8V60tQqtjEQR44h\r\nKCMRZDcyEUcaI7fiGxHc3VxpxYzuWtsxB26tpl5DIMbCRYAKsoF9M4vdVLm6\r\nU2eorlyTATtihw8JicYp5aMFwjX+iUzHYC5/muqgjKIF0yIkBTQPYW2RAJg4\r\nLTZ71Nrog4i7rayO2FfhIWLlRqmiXZP/jKMbHlOCj5OZ2bOEN7+lR5fZxDrd\r\nFFABAxE6QiOeHSBDFsMdeNYBmh88LNqGJhoYxzKYW4OcENZvxy/QX4FPxhoD\r\nt0ZLHt6fil7y73nIegPhPYCVyBnr8Ycn9QttU6qTDxuXagzDYLUlHjlJnsw9\r\n3tOzsyEt0mbcKtrOH+Jy9XxRcEeM2+CafpY9hsYxSiwQOc72b9YeATNCqrgR\r\nLptt+vB7R2bAaAcmDp3fTT6HRsPCicO1ZpgmtkvFtcervn7njMasVzZ2d5me\r\nt3se50ggq6aWl9Tq6df3Z57d6xXh1N42LYEDvYspgOFEYIPgOJ+O4ua7w6bF\r\nheynE9ZSL+d9BLuRKCcjCsi+cHTxEwgZTvhkK0fWea9+Ln1pTO5DBZ9J0i7G\r\nVK2d4pctZ0brzJ5jALbxduXehiy7K9MZ/CUJebV8DEChc7sKuuw+df92OaCv\r\nI2tDILwC1iZif1jpfKLHjW3/MzJOqYl8Xzk=\r\n=nL5c\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"aliser","email":"silikovaniy@mail.ru"},"directories":{},"maintainers":[{"name":"aliser","email":"silikovaniy@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eventer_0.0.2_1657993453159_0.08038678739383509"},"_hasShrinkwrap":false},"0.0.3":{"name":"@aliser/eventer","version":"0.0.3","description":"A simple event system.","repository":{"type":"git","url":"git+https://github.com/Eleseer/eventer.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"publish":"np","build":"tsc -p tsconfig.build.js.json & tsc -p tsconfig.build.dts.json","docs":"typedoc src/index.ts","test":"jest --coverage"},"keywords":["events","event system"],"author":{"name":"aliser"},"license":"MIT","type":"module","publishConfig":{"access":"public"},"devDependencies":{"@types/jest":"^27.5.1","jest":"^28.1.0","np":"^7.6.2","ts-jest":"^28.0.3","ts-node":"^10.8.0","typedoc":"^0.22.15","typescript":"4.6.x"},"gitHead":"dfb3a34c7e55f21b0b8da9acc2156fb5568db74b","bugs":{"url":"https://github.com/Eleseer/eventer/issues"},"homepage":"https://github.com/Eleseer/eventer#readme","_id":"@aliser/eventer@0.0.3","_nodeVersion":"16.15.1","_npmVersion":"8.13.2","dist":{"integrity":"sha512-JOEpLZfvfg3XWIw2Y5Dk3QTQUMZXSOu8rYSVLpj8qjwB6f6d3hPIEOHxEuPtOqfrSreP9nctlAcIN/JI5PFtgg==","shasum":"e197f866d723e1e30732652710fb15546b01aa5b","tarball":"https://registry.npmjs.org/@aliser/eventer/-/eventer-0.0.3.tgz","fileCount":5,"unpackedSize":15411,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAjF1pSGjEE59TzaReTTdJ8ub0tLWOBJDwjbx3zdCN0TAiBGJZ+A3icx2pGYAvlYxe4u3Yi7O7fiQ4KAuE3baVbX0Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0vsAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmojHQ/+LdmMQgB2Yj9c0pO62JYBgTZubMM6DrahRNAGbr/anN4a0aqc\r\ntncMhJQ/j+FSC68LXSYt0Xh/FDEsjoXBjczng6yihn/9XvxSZpKr9aOJ/PJz\r\nzih3wbcUc1eZiG9pzjRTzCCjd1aUImvwFlmHF+tr+yrIHXflScZcrjkRyuQi\r\nU3bq6Q3gv4Bs2YVKmKPjH14RTQGIoZvxV98yTppppYAqLNJVKlJK+o8ls/oG\r\ngKXztKfzgVZa+71meE8YpVbOTAGgXj6vfmFyaQbRpmWOfYesPcuvQeZmK1IQ\r\nV65yiGDmdBhZzoGeXaei68iyY7dIFFmHJiUAYunAagzyKwzzTnv50xA1JGVl\r\nCX8BQMKgMbOUpL/DCXF3scljjnbqIzKPGhpsZOe694K30Oi9ZuOZg4c7iuRs\r\ntcMQ5Tuh49+M8iCnlJy+9JQGfCNJqYuuosBCMlfYH0R1uTM6P/6b2uYfKZ6i\r\nqBmcKXaRQMOWPlEIxtzB3+DMhIqa8ceVRm7Gkf9x+dC55cR5NbkMhyYmH3H2\r\nkLPH1aYjMVkYbJE0+tsWEV137AsF9u0kVwz7I9c0PpsaWhw0zhU/nFoTmTpV\r\nLeLnR9kfBR7F6JzA3bA4dEqGBy8EJNl9nCT4u7cn7Sul5M6C8lIZ0gOwC80o\r\nikjXi6x2dWQFVbDsmhZls4fLONqbbkbo8t4=\r\n=CFo6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"aliser","email":"silikovaniy@mail.ru"},"directories":{},"maintainers":[{"name":"aliser","email":"silikovaniy@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eventer_0.0.3_1657993984398_0.23709419049436864"},"_hasShrinkwrap":false},"0.0.4":{"name":"@aliser/eventer","version":"0.0.4","description":"A simple event system.","repository":{"type":"git","url":"git+https://github.com/Eleseer/eventer.git"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"release":"np","build":"tsc -p tsconfig.build.js.json & tsc -p tsconfig.build.dts.json & npm run docs","docs":"typedoc src/index.ts","test":"jest --coverage"},"keywords":["events","event system"],"author":{"name":"aliser"},"license":"MIT","type":"module","publishConfig":{"access":"public"},"devDependencies":{"@types/jest":"^27.5.1","jest":"^28.1.0","np":"^7.6.2","ts-jest":"^28.0.3","ts-node":"^10.8.0","typedoc":"^0.22.15","typescript":"4.6.x"},"gitHead":"eb73b126ddf218f85cf33d26fe0b3be482c1eeac","bugs":{"url":"https://github.com/Eleseer/eventer/issues"},"homepage":"https://github.com/Eleseer/eventer#readme","_id":"@aliser/eventer@0.0.4","_nodeVersion":"16.15.1","_npmVersion":"8.13.2","dist":{"integrity":"sha512-TrHx5xxA1A9Hmui9o+bwD2Vckle5i1w1m5SAodMXM5bbTF4gt0mVeMIS5f7PdMLy4EOWd1w2SRNmYhj4fvtxZA==","shasum":"7809d3d06851eb175d03b5b6919d8b113123436c","tarball":"https://registry.npmjs.org/@aliser/eventer/-/eventer-0.0.4.tgz","fileCount":5,"unpackedSize":14761,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnqS/gPDXCwqN5o0rQAV4YEz+vkoZDRnZBmjez01txhgIgDrduvZX0LsA+82RnMBnZZAKbJTsMCPJ29ZM6sB7zvjU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi0v5EACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqoRQ/7BWxrrQzFTF+KQhZRCtMIxeVGA7PfdrgzejkwWy4PcdUnLQa2\r\ne9B650AdF5pvBWbj42SL3Lm3BWozfOMWSc4wIU6r+Q5qSsNVOJzg5v1crFou\r\ngUr6D90GhkdW+ZbCHeGdCEzYRNtzI0sFtxsdW6feIREE9BMoPlUsfTQtqp2e\r\nj3NE5yCNYRh3odPLG68oirk9MJCu0UtWvLA8/N2GqBolVS2xTUSH9DEbg9Py\r\nwBQ71th+mYN/ijldefjQGGBFUTjntprzJPqgc2+tbSkL1kzYUnrQDSzvP3av\r\nyAYHN4QIpZs7EaF+YR5wrnuips3G8KoGFGA3geofooFArxnlTtX3o6wSFoKD\r\nEMIQhxCuOMLZLtpjpUYNgLaM0kl/BHpM9kG5HM8jEL8EDhwDzbMLq/v+kgZj\r\nFDWqrnCHj2EwnhusThXqBwz0/VcDkEAy+xSsNUL6f8HbMx9N1Dd3vK2WPkFI\r\nlE/zu4FLUdXiNxeMVYtxiOCsX2Dl3Q0ww6lGuT5Mf9i3MSCaN5P3K9qWKc2U\r\nLoX2LOGxilzymyAZzhG4m+UE6VnWQA9AiCSmUjOLVlosEafNbYixu3/ywuPJ\r\nBKjiNCSEgCQrlZbqI72uQTkDuTsexGDYQl+Bnp1YztNjpXTkkDdV1Uj+v7VB\r\nz10i4BX3v6o8x3jWr6uQiMpj3jrA2CKnlUM=\r\n=3lpg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"aliser","email":"silikovaniy@mail.ru"},"directories":{},"maintainers":[{"name":"aliser","email":"silikovaniy@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/eventer_0.0.4_1657994820545_0.005441130639168401"},"_hasShrinkwrap":false}},"time":{"created":"2022-07-16T17:44:13.090Z","0.0.2":"2022-07-16T17:44:13.327Z","modified":"2022-07-16T18:07:00.855Z","0.0.3":"2022-07-16T17:53:04.570Z","0.0.4":"2022-07-16T18:07:00.762Z"},"maintainers":[{"name":"aliser","email":"silikovaniy@mail.ru"}],"description":"A simple event system.","keywords":["events","event system"],"author":{"name":"aliser"},"license":"MIT","readme":"[![Node.js CI](https://github.com/Eleseer/eventer/actions/workflows/node.js.yml/badge.svg)](https://github.com/Eleseer/eventer/actions/workflows/node.js.yml)\n[![codecov](https://codecov.io/gh/Eleseer/eventer/branch/main/graph/badge.svg?token=2RBZLFAQNA)](https://codecov.io/gh/Eleseer/eventer)\n\n# Eventer\n\nA simple JS **typed** event system, similar to the native one (i.e. *reinventing the wheel*).\n\nDocs are available at the [project page](https://eleseer.github.io/eventer/).\n\n## Table of Contents \n* [Installation](#installation)\n* [Usage](#usage)\n* [Features](#features)\n  * [Basics](#basics)\n  * [Firing events just once](#firing-events-just-once)\n  * [Firing events without listeners](#firing-events-without-listeners)\n  * [Removing never-added listeners](#removing-never-added-listeners)\n* [Type-checking](#type-checking)\n  * [Adding listeners](#adding-listeners)\n  * [Removing listeners](#removing-listeners)\n  * [Firing events](#firing-events)\n\n##  Installation\n\nUsing NPM\n\n```bash\nnpm i @aliser/eventer\n```\n\n## Usage\n\n**Setup**\n\n```ts\nimport Eventer from '@aliser/eventer';\n\n/**\nA type describing your events, where:\n* - propertyName — an event name, a string.\n* - propertyValue — an object with data expected in by the event or an empty object, if event has no data. \n*/ \ntype Events = {\n\thello: { // event with data\n\t\tmsg: string\n\t},\n\tbye: { } // event without data, — is dataless\n}\n\n/*\n* Create a listener that accepts data with the data type specified. If event has no data, don't specify anything.\n*/\nconst helloListener = ({ msg }: Events['hello']) => {\n\tconsole.log(msg);\n}\nconst byeListener = () => {\n\tconsole.log('Bye, world!');\n}\n```\n---\n* **Use `Eventer` in class through inheritance**\n\n```ts\nclass Foo extends Eventer<Events> {\n\tconstructor() {\n\t\tsuper();\n\t}\n}\nconst foo = new Foo();\n\n// add <helloListener> listener to <hello> event\nfoo.addEventListener('hello', helloListener);\n// fire <hello> event with some data\nfoo.dispatchEvent('hello', { msg: 'Hello, world!' });\n// > Hello, world!\n\n// remove <helloListener> from <hello> event\nfoo.removeEventListener('hello', helloListener);\n\n// fire <hello> event with some data, again\nfoo.dispatchEvent('hello', { msg: 'Hello, world!' });\n// no message is printed\n```\n\n* **Or create `Eventer` instance**\n\n```ts\nconst eventer = new Eventer<Events>();\n\n// add <helloListener> listener to <hello> event\neventer.addEventListener('hello', helloListener);\n// fire <hello> event with some data\neventer.dispatchEvent('hello', { msg: 'Hello, world!' });\n// > Hello, world!\n\n// remove <helloListener> from <hello> event\neventer.removeEventListener('hello', helloListener);\n\n// fire <hello> event with some data, again\neventer.dispatchEvent('hello', { msg: 'Hello, world!' });\n// no message is printed\n```\n\n## Features\n\n**Setup**\n\n```ts\nimport Eventer from '@aliser/eventer';\n\ntype Events = {\n\thello: {\n\t\tmsg: string\n\t},\n\tbye: { }\n}\n\nconst eventer = new Eventer<Events>();\n\nconst helloListener = ({ msg }: Events['hello']) => {\n\tconsole.log(msg);\n}\nconst byeListener = () => {\n\tconsole.log('Bye, World!');\n}\n```\n---\n### **Basics**\n\n```ts\neventer.addEventListener('hello', helloListener);\n\neventer.dispatchEvent('hello', { msg: 'Hello, World!' });\n// > Hello, World!\n\neventer.removeEventListener('hello', helloListener);\n\n// =============\n// or use chaining!\neventer\n\t.addEventListener('hello', helloListener)\n\t.dispatchEvent('hello', { msg: 'Hello, World!' }) // > Hello, World!\n\t.removeEventListener('hello', helloListener);\n```\n<br>\n\n### **Firing events just once**\n```ts\neventer.addEventListener('hello', helloListener, { once: true });\n\neventer.dispatchEvent('hello', { msg: 'Hello, World!' });\n// > Hello, World!\n\neventer.dispatchEvent('hello', { msg: 'Hello, World!' });\n// nothing is printed, no error is thrown\n```\n<br>\n\n### **Firing events without listeners**\n\nDoesn't throw any errors.\n\n```ts\neventer.dispatchEvent('bye');\n// nothing is printed, no error is thrown\n```\n<br>\n\n### **Removing never-added listeners**\n\nDoesn't throw any errors.\n\n```ts\neventer.removeEventListener('hello', helloListener);\n// nothing is printed, no error is thrown\n```\n<br>\n\n### **Type-checking**\n#### **Adding listeners**\n> Adding a listener to an event that **doesn't exist**. \n\n```ts\neventer.addEventListener('someEvent', helloListener);\n/*                       ^^^^^^^^^^^\n* error: Argument of type '\"someEvent\"' is not assignable to parameter of type '\"hello\" | \"bye\"'.\n*/\n```\n<br>\n\n> Adding a listener that **expects data** to an event that **doesn't provide** any data.\n```ts\neventer.addEventListener('bye', helloListener);\n/*                              ^^^^^^^^^^^^^\n* error: Argument of type '({ msg }: Events['hello']) => void' is not assignable to parameter of type '() => void'.\n*/\n```\n<br>\n\n> Adding a listener that **expects different data** from that passed in by the event.\n```ts\nconst someEventListener = ({ counter }: { counter: number }) => {\n\tconsole.log('The total count is: ' + counter);\n}\neventer.addEventListener('hello', someEventListener);\n/*                                ^^^^^^^^^^^^^^^^^\n* error: Argument of type '({ counter }: { counter: number; }) => void' is not assignable to parameter of type '(data: { msg: string; }) => void'.\n  Types of parameters '__0' and 'data' are incompatible.\n    Property 'counter' is missing in type '{ msg: string; }' but required in type '{ counter: number; }'.\n*/\n```\n<br>\n\n#### **Removing listeners**\n> Removing a listener that **expects data** from an event that **doesn't provide** any data.\n```ts\neventer.removeEventListener('bye', helloListener);\n/*                                 ^^^^^^^^^^^^^\n* error: Argument of type '({ msg }: Events['hello']) => void' is not assignable to parameter of type '() => void'.\n*/\n```\n<br>\n\n> Removing a listener from an event that **doesn't exist**.\n\n```ts\neventer.removeEventListener('someEvent', helloListener);\n/*                          ^^^^^^^^^^^\n* error: Argument of type '\"someEvent\"' is not assignable to parameter of type '\"hello\" | \"bye\"'.\n*/\n```\n<br>\n\n#### **Firing events**\n\n> Firing an event that **requires data** *without* providing **any data**.\n\nIn this case, because **no data** is given, Typescript checks againts events that have **no data** and will show errors depending on how these events are defined:\n\n\n* `Events` has **no** *dataless* events.\n\n```ts\ntype Events = {\n\thello: {\n\t\tmsg: string\n\t},\n\tsomeEventWithData: {\n\t\tcounter: number\n\t}\n}\n\n. . .\n\neventer.dispatchEvent('hello');\n/*                    ^^^^^^^\n* error: Argument of type 'string' is not assignable to parameter of type 'never'.\n*/\n```\n\n* `Events` has **one or more** *dataless* events.\n\n```ts\ntype Events = {\n\thello: {\n\t\tmsg: string\n\t},\n\tbye: { }, // first dataless event\n\tsomeEvent: { }, // second dataless event\n\tsomeEventWithData: {\n\t\tcounter: number\n\t}\n}\n\n. . .\n\neventer.dispatchEvent('hello');\n/*                    ^^^^^^^\n* error: Argument of type '\"hello\"' is not assignable to parameter of type '\"bye\" | \"someEvent\"'.\n*/\n```\n\n<br>\n\n> Firing an event that **requires data** *with* **wrong data**.\n\n```ts\neventer.dispatchEvent('hello', { total: 127 });\n/*                               ^^^^^^^^^^\n* error: Argument of type '{ total: number; }' is not assignable to parameter of type '{ msg: string; }'.\n  Object literal may only specify known properties, and 'total' does not exist in type '{ msg: string; }'.\n*/\n```\n\n<br>\n\n> Firing an event that **doesn't need data** *with* **any data**.\n\nIn a case where data is provided — *in this case* — Typescript filters through all events where **data is required** and checks againts what was found using **event names**:\n\n* `Events` has **no** events *with data*.\n\n```ts\ntype Events = {\n\tbye: { },\n\tstrangeEvent: { }\n}\n\n. . .\n\neventer.dispatchEvent('bye', { total: 127 });\n/*                    ^^^^^         \n* error: Argument of type 'string' is not assignable to parameter of type 'never'.\n*/\n```\n\n* `Events` has **one or more** events *with data*.\n\n```ts\ntype Events = {\n\thello: { // event with data 1\n\t\tmsg: string\n\t},\n\teventWithData: { // event with data 2\n\t\tdata: number\n\t}\n\tbye: { }\n}\n\n. . .\n\neventer.dispatchEvent('bye', { total: 127 });\n/*                    ^^^^^         \n* error: Argument of type '\"bye\"' is not assignable to parameter of type '\"hello\" | \"eventWithData\"'.\n*/\n```\n\n<br>\n\n> Firing an event that **doesn't exist**.\n\nTypescript will search for event with a given name and show other events **with or without data** — depending on whether it was provided.\n\n* **No data** is provided.\n\n```ts\neventer.dispatchEvent('someEvent');\n/*                    ^^^^^^^^^^^\n* error: Argument of type '\"someEvent\"' is not assignable to parameter of type '\"bye\"'.\n*/\n```\n\n* **Some data** is provided.\n\n```ts\neventer.dispatchEvent('someEvent', { someData: 'beep boop' });\n/*                    ^^^^^^^^^^^\n* error: Argument of type '\"someEvent\"' is not assignable to parameter of type '\"hello\"'.\n*/\n```","readmeFilename":"README.md","homepage":"https://github.com/Eleseer/eventer#readme","repository":{"type":"git","url":"git+https://github.com/Eleseer/eventer.git"},"bugs":{"url":"https://github.com/Eleseer/eventer/issues"}}