├── .editorconfig ├── .eslintrc ├── .gitignore ├── .npmignore ├── .travis.yml ├── LICENSE ├── README.md ├── SECURITY.md ├── package-lock.json ├── package.json ├── spec ├── SubscribableEvent.spec.ts └── support │ └── jasmine.json ├── src └── SubscribableEvent.ts ├── tsconfig.json └── tsconfig ├── cjs.json ├── eslint.json └── types.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | trim_trailing_whitespace = true 5 | insert_final_newline = true 6 | indent_style = space 7 | indent_size = 4 8 | end_of_line = lf 9 | charset = utf-8 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parserOptions": { 3 | "project": "./tsconfig/eslint.json" 4 | }, 5 | "extends": ["skype"], 6 | "env": { 7 | "jasmine": true 8 | }, 9 | "rules": {} 10 | } 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.user 2 | *.log 3 | .node_repl_history 4 | .npm 5 | .vscode 6 | .DS_STORE 7 | npm-debug.log* 8 | node_modules 9 | /dist-es2015 10 | /dist-cjs 11 | /dist-types 12 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /src/.vs 3 | /src/bin 4 | /src/obj 5 | /samples 6 | /extensions 7 | /docs 8 | *.user 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - "node" 5 | 6 | dist: trusty 7 | 8 | sudo: false 9 | 10 | install: 11 | - npm --version 12 | - npm i 13 | 14 | script: 15 | - npm run test 16 | - npm run build 17 | 18 | cache: 19 | directories: 20 | - node_modules 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SubscribableEvent 2 | 3 | [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/Microsoft/SubscribableEvent/blob/master/LICENSE) [![npm version](https://img.shields.io/npm/v/subscribableevent.svg?style=flat-square)](https://www.npmjs.com/package/subscribableevent) [![Build Status](https://img.shields.io/travis/Microsoft/SubscribableEvent/master.svg?style=flat-square)](https://travis-ci.org/Microsoft/SubscribableEvent) [![npm downloads](https://img.shields.io/npm/dm/subscribableevent.svg?style=flat-square)](https://www.npmjs.com/package/subscribableevent) ![npm bundle size (minified)](https://img.shields.io/bundlephobia/min/subscribableevent.svg?style=flat-square) ![npm bundle size (minified + gzip)](https://img.shields.io/bundlephobia/minzip/subscribableevent.svg?style=flat-square) 4 | 5 | > A simple strongly-typed pub/sub/fire eventing system 6 | 7 | ## Installation 8 | 9 | ```shell 10 | npm install --save subscribableevent 11 | ``` 12 | 13 | ## Basic Example 14 | 15 | ```typescript 16 | const event = new SubscribableEvent<(payload: string) => void>(); 17 | 18 | event.subscribe((payload: string) => { 19 | console.log(payload); 20 | }); 21 | 22 | event.fire('Payload Params'); 23 | ``` 24 | 25 | ## Contributing 26 | 27 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 28 | 29 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). 40 | 41 | 42 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "subscribableevent", 3 | "version": "1.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.5.5", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", 10 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.5.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", 19 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "@types/eslint-visitor-keys": { 28 | "version": "1.0.0", 29 | "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 30 | "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", 31 | "dev": true 32 | }, 33 | "@types/jasmine": { 34 | "version": "3.4.4", 35 | "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.4.4.tgz", 36 | "integrity": "sha512-+/sHcTPyDS1JQacDRRRWb+vNrjBwnD+cKvTaWlxlJ/uOOFvzCkjOwNaqVjYMLfsjzNi0WtDH9RyReDXPG1Cdug==", 37 | "dev": true 38 | }, 39 | "@types/json-schema": { 40 | "version": "7.0.3", 41 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", 42 | "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", 43 | "dev": true 44 | }, 45 | "@typescript-eslint/eslint-plugin": { 46 | "version": "2.6.0", 47 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.6.0.tgz", 48 | "integrity": "sha512-iCcXREU4RciLmLniwKLRPCOFVXrkF7z27XuHq5DrykpREv/mz6ztKAyLg2fdkM0hQC7659p5ZF5uStH7uzAJ/w==", 49 | "dev": true, 50 | "requires": { 51 | "@typescript-eslint/experimental-utils": "2.6.0", 52 | "eslint-utils": "^1.4.2", 53 | "functional-red-black-tree": "^1.0.1", 54 | "regexpp": "^2.0.1", 55 | "tsutils": "^3.17.1" 56 | } 57 | }, 58 | "@typescript-eslint/experimental-utils": { 59 | "version": "2.6.0", 60 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.6.0.tgz", 61 | "integrity": "sha512-34BAFpNOwHXeqT+AvdalLxOvcPYnCxA5JGmBAFL64RGMdP0u65rXjii7l/nwpgk5aLEE1LaqF+SsCU0/Cb64xA==", 62 | "dev": true, 63 | "requires": { 64 | "@types/json-schema": "^7.0.3", 65 | "@typescript-eslint/typescript-estree": "2.6.0", 66 | "eslint-scope": "^5.0.0" 67 | } 68 | }, 69 | "@typescript-eslint/parser": { 70 | "version": "2.6.0", 71 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.6.0.tgz", 72 | "integrity": "sha512-AvLejMmkcjRTJ2KD72v565W4slSrrzUIzkReu1JN34b8JnsEsxx7S9Xx/qXEuMQas0mkdUfETr0j3zOhq2DIqQ==", 73 | "dev": true, 74 | "requires": { 75 | "@types/eslint-visitor-keys": "^1.0.0", 76 | "@typescript-eslint/experimental-utils": "2.6.0", 77 | "@typescript-eslint/typescript-estree": "2.6.0", 78 | "eslint-visitor-keys": "^1.1.0" 79 | } 80 | }, 81 | "@typescript-eslint/typescript-estree": { 82 | "version": "2.6.0", 83 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.6.0.tgz", 84 | "integrity": "sha512-A3lSBVIdj2Gp0lFEL6in2eSPqJ33uAc3Ko+Y4brhjkxzjbzLnwBH22CwsW2sCo+iwogfIyvb56/AJri15H0u5Q==", 85 | "dev": true, 86 | "requires": { 87 | "debug": "^4.1.1", 88 | "glob": "^7.1.4", 89 | "is-glob": "^4.0.1", 90 | "lodash.unescape": "4.0.1", 91 | "semver": "^6.3.0" 92 | }, 93 | "dependencies": { 94 | "semver": { 95 | "version": "6.3.0", 96 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 97 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 98 | "dev": true 99 | } 100 | } 101 | }, 102 | "acorn": { 103 | "version": "7.1.1", 104 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", 105 | "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", 106 | "dev": true 107 | }, 108 | "acorn-jsx": { 109 | "version": "5.1.0", 110 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", 111 | "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", 112 | "dev": true 113 | }, 114 | "ajv": { 115 | "version": "6.12.6", 116 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 117 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 118 | "dev": true, 119 | "requires": { 120 | "fast-deep-equal": "^3.1.1", 121 | "fast-json-stable-stringify": "^2.0.0", 122 | "json-schema-traverse": "^0.4.1", 123 | "uri-js": "^4.2.2" 124 | }, 125 | "dependencies": { 126 | "fast-deep-equal": { 127 | "version": "3.1.3", 128 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 129 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 130 | "dev": true 131 | } 132 | } 133 | }, 134 | "ansi-escapes": { 135 | "version": "4.2.1", 136 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", 137 | "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", 138 | "dev": true, 139 | "requires": { 140 | "type-fest": "^0.5.2" 141 | } 142 | }, 143 | "ansi-regex": { 144 | "version": "4.1.1", 145 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 146 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 147 | "dev": true 148 | }, 149 | "ansi-styles": { 150 | "version": "3.2.1", 151 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 152 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 153 | "dev": true, 154 | "requires": { 155 | "color-convert": "^1.9.0" 156 | } 157 | }, 158 | "arg": { 159 | "version": "4.1.1", 160 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", 161 | "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==", 162 | "dev": true 163 | }, 164 | "argparse": { 165 | "version": "1.0.10", 166 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 167 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 168 | "dev": true, 169 | "requires": { 170 | "sprintf-js": "~1.0.2" 171 | } 172 | }, 173 | "astral-regex": { 174 | "version": "1.0.0", 175 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 176 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 177 | "dev": true 178 | }, 179 | "balanced-match": { 180 | "version": "1.0.0", 181 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 182 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 183 | "dev": true 184 | }, 185 | "brace-expansion": { 186 | "version": "1.1.11", 187 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 188 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 189 | "dev": true, 190 | "requires": { 191 | "balanced-match": "^1.0.0", 192 | "concat-map": "0.0.1" 193 | } 194 | }, 195 | "buffer-from": { 196 | "version": "1.1.1", 197 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 198 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 199 | "dev": true 200 | }, 201 | "builtin-modules": { 202 | "version": "1.1.1", 203 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 204 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 205 | "dev": true 206 | }, 207 | "callsites": { 208 | "version": "3.1.0", 209 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 210 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 211 | "dev": true 212 | }, 213 | "chalk": { 214 | "version": "2.4.2", 215 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 216 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 217 | "dev": true, 218 | "requires": { 219 | "ansi-styles": "^3.2.1", 220 | "escape-string-regexp": "^1.0.5", 221 | "supports-color": "^5.3.0" 222 | } 223 | }, 224 | "chardet": { 225 | "version": "0.7.0", 226 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 227 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 228 | "dev": true 229 | }, 230 | "cli-cursor": { 231 | "version": "3.1.0", 232 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 233 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 234 | "dev": true, 235 | "requires": { 236 | "restore-cursor": "^3.1.0" 237 | } 238 | }, 239 | "cli-width": { 240 | "version": "2.2.0", 241 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 242 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 243 | "dev": true 244 | }, 245 | "color-convert": { 246 | "version": "1.9.3", 247 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 248 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 249 | "dev": true, 250 | "requires": { 251 | "color-name": "1.1.3" 252 | } 253 | }, 254 | "color-name": { 255 | "version": "1.1.3", 256 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 257 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 258 | "dev": true 259 | }, 260 | "concat-map": { 261 | "version": "0.0.1", 262 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 263 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 264 | "dev": true 265 | }, 266 | "cross-spawn": { 267 | "version": "6.0.5", 268 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 269 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 270 | "dev": true, 271 | "requires": { 272 | "nice-try": "^1.0.4", 273 | "path-key": "^2.0.1", 274 | "semver": "^5.5.0", 275 | "shebang-command": "^1.2.0", 276 | "which": "^1.2.9" 277 | } 278 | }, 279 | "debug": { 280 | "version": "4.1.1", 281 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 282 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 283 | "dev": true, 284 | "requires": { 285 | "ms": "^2.1.1" 286 | } 287 | }, 288 | "deep-is": { 289 | "version": "0.1.3", 290 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 291 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 292 | "dev": true 293 | }, 294 | "define-properties": { 295 | "version": "1.1.3", 296 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 297 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 298 | "dev": true, 299 | "requires": { 300 | "object-keys": "^1.0.12" 301 | } 302 | }, 303 | "diff": { 304 | "version": "4.0.1", 305 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", 306 | "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", 307 | "dev": true 308 | }, 309 | "doctrine": { 310 | "version": "3.0.0", 311 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 312 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 313 | "dev": true, 314 | "requires": { 315 | "esutils": "^2.0.2" 316 | } 317 | }, 318 | "emoji-regex": { 319 | "version": "8.0.0", 320 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 321 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 322 | "dev": true 323 | }, 324 | "error-ex": { 325 | "version": "1.3.2", 326 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 327 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 328 | "dev": true, 329 | "requires": { 330 | "is-arrayish": "^0.2.1" 331 | } 332 | }, 333 | "es-abstract": { 334 | "version": "1.13.0", 335 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", 336 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", 337 | "dev": true, 338 | "requires": { 339 | "es-to-primitive": "^1.2.0", 340 | "function-bind": "^1.1.1", 341 | "has": "^1.0.3", 342 | "is-callable": "^1.1.4", 343 | "is-regex": "^1.0.4", 344 | "object-keys": "^1.0.12" 345 | } 346 | }, 347 | "es-to-primitive": { 348 | "version": "1.2.0", 349 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 350 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 351 | "dev": true, 352 | "requires": { 353 | "is-callable": "^1.1.4", 354 | "is-date-object": "^1.0.1", 355 | "is-symbol": "^1.0.2" 356 | } 357 | }, 358 | "escape-string-regexp": { 359 | "version": "1.0.5", 360 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 361 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 362 | "dev": true 363 | }, 364 | "eslint": { 365 | "version": "6.6.0", 366 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz", 367 | "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==", 368 | "dev": true, 369 | "requires": { 370 | "@babel/code-frame": "^7.0.0", 371 | "ajv": "^6.10.0", 372 | "chalk": "^2.1.0", 373 | "cross-spawn": "^6.0.5", 374 | "debug": "^4.0.1", 375 | "doctrine": "^3.0.0", 376 | "eslint-scope": "^5.0.0", 377 | "eslint-utils": "^1.4.3", 378 | "eslint-visitor-keys": "^1.1.0", 379 | "espree": "^6.1.2", 380 | "esquery": "^1.0.1", 381 | "esutils": "^2.0.2", 382 | "file-entry-cache": "^5.0.1", 383 | "functional-red-black-tree": "^1.0.1", 384 | "glob-parent": "^5.0.0", 385 | "globals": "^11.7.0", 386 | "ignore": "^4.0.6", 387 | "import-fresh": "^3.0.0", 388 | "imurmurhash": "^0.1.4", 389 | "inquirer": "^7.0.0", 390 | "is-glob": "^4.0.0", 391 | "js-yaml": "^3.13.1", 392 | "json-stable-stringify-without-jsonify": "^1.0.1", 393 | "levn": "^0.3.0", 394 | "lodash": "^4.17.14", 395 | "minimatch": "^3.0.4", 396 | "mkdirp": "^0.5.1", 397 | "natural-compare": "^1.4.0", 398 | "optionator": "^0.8.2", 399 | "progress": "^2.0.0", 400 | "regexpp": "^2.0.1", 401 | "semver": "^6.1.2", 402 | "strip-ansi": "^5.2.0", 403 | "strip-json-comments": "^3.0.1", 404 | "table": "^5.2.3", 405 | "text-table": "^0.2.0", 406 | "v8-compile-cache": "^2.0.3" 407 | }, 408 | "dependencies": { 409 | "semver": { 410 | "version": "6.3.0", 411 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 412 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 413 | "dev": true 414 | } 415 | } 416 | }, 417 | "eslint-config-skype": { 418 | "version": "0.5.0", 419 | "resolved": "https://registry.npmjs.org/eslint-config-skype/-/eslint-config-skype-0.5.0.tgz", 420 | "integrity": "sha512-6zlpjBZcc8Ci1XNp72/2a3sgibjxs7t941cipYSRmdnhaIO9yJ/FF+Iz5eyBunHyVsDOqqjYJ7+MSbTLVZQ6sA==", 421 | "dev": true 422 | }, 423 | "eslint-scope": { 424 | "version": "5.0.0", 425 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 426 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 427 | "dev": true, 428 | "requires": { 429 | "esrecurse": "^4.1.0", 430 | "estraverse": "^4.1.1" 431 | } 432 | }, 433 | "eslint-utils": { 434 | "version": "1.4.3", 435 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 436 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 437 | "dev": true, 438 | "requires": { 439 | "eslint-visitor-keys": "^1.1.0" 440 | } 441 | }, 442 | "eslint-visitor-keys": { 443 | "version": "1.1.0", 444 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 445 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 446 | "dev": true 447 | }, 448 | "espree": { 449 | "version": "6.1.2", 450 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", 451 | "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", 452 | "dev": true, 453 | "requires": { 454 | "acorn": "^7.1.0", 455 | "acorn-jsx": "^5.1.0", 456 | "eslint-visitor-keys": "^1.1.0" 457 | } 458 | }, 459 | "esprima": { 460 | "version": "4.0.1", 461 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 462 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 463 | "dev": true 464 | }, 465 | "esquery": { 466 | "version": "1.0.1", 467 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 468 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 469 | "dev": true, 470 | "requires": { 471 | "estraverse": "^4.0.0" 472 | } 473 | }, 474 | "esrecurse": { 475 | "version": "4.2.1", 476 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 477 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 478 | "dev": true, 479 | "requires": { 480 | "estraverse": "^4.1.0" 481 | } 482 | }, 483 | "estraverse": { 484 | "version": "4.3.0", 485 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 486 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 487 | "dev": true 488 | }, 489 | "esutils": { 490 | "version": "2.0.3", 491 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 492 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 493 | "dev": true 494 | }, 495 | "external-editor": { 496 | "version": "3.1.0", 497 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 498 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 499 | "dev": true, 500 | "requires": { 501 | "chardet": "^0.7.0", 502 | "iconv-lite": "^0.4.24", 503 | "tmp": "^0.0.33" 504 | } 505 | }, 506 | "fast-json-stable-stringify": { 507 | "version": "2.0.0", 508 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 509 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 510 | "dev": true 511 | }, 512 | "fast-levenshtein": { 513 | "version": "2.0.6", 514 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 515 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 516 | "dev": true 517 | }, 518 | "figures": { 519 | "version": "3.1.0", 520 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", 521 | "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", 522 | "dev": true, 523 | "requires": { 524 | "escape-string-regexp": "^1.0.5" 525 | } 526 | }, 527 | "file-entry-cache": { 528 | "version": "5.0.1", 529 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 530 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 531 | "dev": true, 532 | "requires": { 533 | "flat-cache": "^2.0.1" 534 | } 535 | }, 536 | "flat-cache": { 537 | "version": "2.0.1", 538 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 539 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 540 | "dev": true, 541 | "requires": { 542 | "flatted": "^2.0.0", 543 | "rimraf": "2.6.3", 544 | "write": "1.0.3" 545 | }, 546 | "dependencies": { 547 | "rimraf": { 548 | "version": "2.6.3", 549 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 550 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 551 | "dev": true, 552 | "requires": { 553 | "glob": "^7.1.3" 554 | } 555 | } 556 | } 557 | }, 558 | "flatted": { 559 | "version": "2.0.1", 560 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", 561 | "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", 562 | "dev": true 563 | }, 564 | "fs.realpath": { 565 | "version": "1.0.0", 566 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 567 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 568 | "dev": true 569 | }, 570 | "function-bind": { 571 | "version": "1.1.1", 572 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 573 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 574 | "dev": true 575 | }, 576 | "functional-red-black-tree": { 577 | "version": "1.0.1", 578 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 579 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 580 | "dev": true 581 | }, 582 | "glob": { 583 | "version": "7.1.5", 584 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", 585 | "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", 586 | "dev": true, 587 | "requires": { 588 | "fs.realpath": "^1.0.0", 589 | "inflight": "^1.0.4", 590 | "inherits": "2", 591 | "minimatch": "^3.0.4", 592 | "once": "^1.3.0", 593 | "path-is-absolute": "^1.0.0" 594 | } 595 | }, 596 | "glob-parent": { 597 | "version": "5.1.2", 598 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 599 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 600 | "dev": true, 601 | "requires": { 602 | "is-glob": "^4.0.1" 603 | } 604 | }, 605 | "globals": { 606 | "version": "11.12.0", 607 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 608 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 609 | "dev": true 610 | }, 611 | "graceful-fs": { 612 | "version": "4.1.15", 613 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 614 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", 615 | "dev": true 616 | }, 617 | "has": { 618 | "version": "1.0.3", 619 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 620 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 621 | "dev": true, 622 | "requires": { 623 | "function-bind": "^1.1.1" 624 | } 625 | }, 626 | "has-flag": { 627 | "version": "3.0.0", 628 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 629 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 630 | "dev": true 631 | }, 632 | "has-symbols": { 633 | "version": "1.0.0", 634 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 635 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 636 | "dev": true 637 | }, 638 | "hosted-git-info": { 639 | "version": "2.8.9", 640 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 641 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 642 | "dev": true 643 | }, 644 | "iconv-lite": { 645 | "version": "0.4.24", 646 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 647 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 648 | "dev": true, 649 | "requires": { 650 | "safer-buffer": ">= 2.1.2 < 3" 651 | } 652 | }, 653 | "ignore": { 654 | "version": "4.0.6", 655 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 656 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 657 | "dev": true 658 | }, 659 | "import-fresh": { 660 | "version": "3.1.0", 661 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", 662 | "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", 663 | "dev": true, 664 | "requires": { 665 | "parent-module": "^1.0.0", 666 | "resolve-from": "^4.0.0" 667 | } 668 | }, 669 | "imurmurhash": { 670 | "version": "0.1.4", 671 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 672 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 673 | "dev": true 674 | }, 675 | "inflight": { 676 | "version": "1.0.6", 677 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 678 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 679 | "dev": true, 680 | "requires": { 681 | "once": "^1.3.0", 682 | "wrappy": "1" 683 | } 684 | }, 685 | "inherits": { 686 | "version": "2.0.4", 687 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 688 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 689 | "dev": true 690 | }, 691 | "inquirer": { 692 | "version": "7.0.0", 693 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", 694 | "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", 695 | "dev": true, 696 | "requires": { 697 | "ansi-escapes": "^4.2.1", 698 | "chalk": "^2.4.2", 699 | "cli-cursor": "^3.1.0", 700 | "cli-width": "^2.0.0", 701 | "external-editor": "^3.0.3", 702 | "figures": "^3.0.0", 703 | "lodash": "^4.17.15", 704 | "mute-stream": "0.0.8", 705 | "run-async": "^2.2.0", 706 | "rxjs": "^6.4.0", 707 | "string-width": "^4.1.0", 708 | "strip-ansi": "^5.1.0", 709 | "through": "^2.3.6" 710 | } 711 | }, 712 | "is-arrayish": { 713 | "version": "0.2.1", 714 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 715 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 716 | "dev": true 717 | }, 718 | "is-builtin-module": { 719 | "version": "1.0.0", 720 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 721 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 722 | "dev": true, 723 | "requires": { 724 | "builtin-modules": "^1.0.0" 725 | } 726 | }, 727 | "is-callable": { 728 | "version": "1.1.4", 729 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 730 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 731 | "dev": true 732 | }, 733 | "is-date-object": { 734 | "version": "1.0.1", 735 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 736 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 737 | "dev": true 738 | }, 739 | "is-extglob": { 740 | "version": "2.1.1", 741 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 742 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 743 | "dev": true 744 | }, 745 | "is-fullwidth-code-point": { 746 | "version": "3.0.0", 747 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 748 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 749 | "dev": true 750 | }, 751 | "is-glob": { 752 | "version": "4.0.1", 753 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 754 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 755 | "dev": true, 756 | "requires": { 757 | "is-extglob": "^2.1.1" 758 | } 759 | }, 760 | "is-promise": { 761 | "version": "2.1.0", 762 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 763 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 764 | "dev": true 765 | }, 766 | "is-regex": { 767 | "version": "1.0.4", 768 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 769 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 770 | "dev": true, 771 | "requires": { 772 | "has": "^1.0.1" 773 | } 774 | }, 775 | "is-symbol": { 776 | "version": "1.0.2", 777 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 778 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 779 | "dev": true, 780 | "requires": { 781 | "has-symbols": "^1.0.0" 782 | } 783 | }, 784 | "isexe": { 785 | "version": "2.0.0", 786 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 787 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 788 | "dev": true 789 | }, 790 | "jasmine": { 791 | "version": "3.5.0", 792 | "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", 793 | "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", 794 | "dev": true, 795 | "requires": { 796 | "glob": "^7.1.4", 797 | "jasmine-core": "~3.5.0" 798 | } 799 | }, 800 | "jasmine-core": { 801 | "version": "3.5.0", 802 | "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", 803 | "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", 804 | "dev": true 805 | }, 806 | "js-tokens": { 807 | "version": "4.0.0", 808 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 809 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 810 | "dev": true 811 | }, 812 | "js-yaml": { 813 | "version": "3.13.1", 814 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 815 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 816 | "dev": true, 817 | "requires": { 818 | "argparse": "^1.0.7", 819 | "esprima": "^4.0.0" 820 | } 821 | }, 822 | "json-parse-better-errors": { 823 | "version": "1.0.2", 824 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 825 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 826 | "dev": true 827 | }, 828 | "json-schema-traverse": { 829 | "version": "0.4.1", 830 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 831 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 832 | "dev": true 833 | }, 834 | "json-stable-stringify-without-jsonify": { 835 | "version": "1.0.1", 836 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 837 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 838 | "dev": true 839 | }, 840 | "levn": { 841 | "version": "0.3.0", 842 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 843 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 844 | "dev": true, 845 | "requires": { 846 | "prelude-ls": "~1.1.2", 847 | "type-check": "~0.3.2" 848 | } 849 | }, 850 | "load-json-file": { 851 | "version": "4.0.0", 852 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 853 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 854 | "dev": true, 855 | "requires": { 856 | "graceful-fs": "^4.1.2", 857 | "parse-json": "^4.0.0", 858 | "pify": "^3.0.0", 859 | "strip-bom": "^3.0.0" 860 | } 861 | }, 862 | "lodash": { 863 | "version": "4.17.19", 864 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 865 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", 866 | "dev": true 867 | }, 868 | "lodash.unescape": { 869 | "version": "4.0.1", 870 | "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", 871 | "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", 872 | "dev": true 873 | }, 874 | "make-error": { 875 | "version": "1.3.5", 876 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", 877 | "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", 878 | "dev": true 879 | }, 880 | "memorystream": { 881 | "version": "0.3.1", 882 | "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", 883 | "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", 884 | "dev": true 885 | }, 886 | "mimic-fn": { 887 | "version": "2.1.0", 888 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 889 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 890 | "dev": true 891 | }, 892 | "minimatch": { 893 | "version": "3.0.4", 894 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 895 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 896 | "dev": true, 897 | "requires": { 898 | "brace-expansion": "^1.1.7" 899 | } 900 | }, 901 | "minimist": { 902 | "version": "0.0.8", 903 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 904 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 905 | "dev": true 906 | }, 907 | "mkdirp": { 908 | "version": "0.5.1", 909 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 910 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 911 | "dev": true, 912 | "requires": { 913 | "minimist": "0.0.8" 914 | } 915 | }, 916 | "ms": { 917 | "version": "2.1.2", 918 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 919 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 920 | "dev": true 921 | }, 922 | "mute-stream": { 923 | "version": "0.0.8", 924 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 925 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 926 | "dev": true 927 | }, 928 | "natural-compare": { 929 | "version": "1.4.0", 930 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 931 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 932 | "dev": true 933 | }, 934 | "nice-try": { 935 | "version": "1.0.5", 936 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 937 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 938 | "dev": true 939 | }, 940 | "normalize-package-data": { 941 | "version": "2.4.0", 942 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 943 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 944 | "dev": true, 945 | "requires": { 946 | "hosted-git-info": "^2.1.4", 947 | "is-builtin-module": "^1.0.0", 948 | "semver": "2 || 3 || 4 || 5", 949 | "validate-npm-package-license": "^3.0.1" 950 | } 951 | }, 952 | "npm-run-all": { 953 | "version": "4.1.5", 954 | "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", 955 | "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", 956 | "dev": true, 957 | "requires": { 958 | "ansi-styles": "^3.2.1", 959 | "chalk": "^2.4.1", 960 | "cross-spawn": "^6.0.5", 961 | "memorystream": "^0.3.1", 962 | "minimatch": "^3.0.4", 963 | "pidtree": "^0.3.0", 964 | "read-pkg": "^3.0.0", 965 | "shell-quote": "^1.6.1", 966 | "string.prototype.padend": "^3.0.0" 967 | } 968 | }, 969 | "object-keys": { 970 | "version": "1.0.12", 971 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", 972 | "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", 973 | "dev": true 974 | }, 975 | "once": { 976 | "version": "1.4.0", 977 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 978 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 979 | "dev": true, 980 | "requires": { 981 | "wrappy": "1" 982 | } 983 | }, 984 | "onetime": { 985 | "version": "5.1.0", 986 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 987 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 988 | "dev": true, 989 | "requires": { 990 | "mimic-fn": "^2.1.0" 991 | } 992 | }, 993 | "optionator": { 994 | "version": "0.8.2", 995 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 996 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 997 | "dev": true, 998 | "requires": { 999 | "deep-is": "~0.1.3", 1000 | "fast-levenshtein": "~2.0.4", 1001 | "levn": "~0.3.0", 1002 | "prelude-ls": "~1.1.2", 1003 | "type-check": "~0.3.2", 1004 | "wordwrap": "~1.0.0" 1005 | } 1006 | }, 1007 | "os-tmpdir": { 1008 | "version": "1.0.2", 1009 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1010 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1011 | "dev": true 1012 | }, 1013 | "parent-module": { 1014 | "version": "1.0.1", 1015 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1016 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1017 | "dev": true, 1018 | "requires": { 1019 | "callsites": "^3.0.0" 1020 | } 1021 | }, 1022 | "parse-json": { 1023 | "version": "4.0.0", 1024 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 1025 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 1026 | "dev": true, 1027 | "requires": { 1028 | "error-ex": "^1.3.1", 1029 | "json-parse-better-errors": "^1.0.1" 1030 | } 1031 | }, 1032 | "path-is-absolute": { 1033 | "version": "1.0.1", 1034 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1035 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1036 | "dev": true 1037 | }, 1038 | "path-key": { 1039 | "version": "2.0.1", 1040 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1041 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1042 | "dev": true 1043 | }, 1044 | "path-type": { 1045 | "version": "3.0.0", 1046 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", 1047 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", 1048 | "dev": true, 1049 | "requires": { 1050 | "pify": "^3.0.0" 1051 | } 1052 | }, 1053 | "pidtree": { 1054 | "version": "0.3.0", 1055 | "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", 1056 | "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", 1057 | "dev": true 1058 | }, 1059 | "pify": { 1060 | "version": "3.0.0", 1061 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1062 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1063 | "dev": true 1064 | }, 1065 | "prelude-ls": { 1066 | "version": "1.1.2", 1067 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1068 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1069 | "dev": true 1070 | }, 1071 | "progress": { 1072 | "version": "2.0.3", 1073 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1074 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1075 | "dev": true 1076 | }, 1077 | "punycode": { 1078 | "version": "2.1.1", 1079 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1080 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1081 | "dev": true 1082 | }, 1083 | "read-pkg": { 1084 | "version": "3.0.0", 1085 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", 1086 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", 1087 | "dev": true, 1088 | "requires": { 1089 | "load-json-file": "^4.0.0", 1090 | "normalize-package-data": "^2.3.2", 1091 | "path-type": "^3.0.0" 1092 | } 1093 | }, 1094 | "regexpp": { 1095 | "version": "2.0.1", 1096 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1097 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1098 | "dev": true 1099 | }, 1100 | "resolve-from": { 1101 | "version": "4.0.0", 1102 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1103 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1104 | "dev": true 1105 | }, 1106 | "restore-cursor": { 1107 | "version": "3.1.0", 1108 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1109 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1110 | "dev": true, 1111 | "requires": { 1112 | "onetime": "^5.1.0", 1113 | "signal-exit": "^3.0.2" 1114 | } 1115 | }, 1116 | "rimraf": { 1117 | "version": "3.0.0", 1118 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", 1119 | "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", 1120 | "dev": true, 1121 | "requires": { 1122 | "glob": "^7.1.3" 1123 | } 1124 | }, 1125 | "run-async": { 1126 | "version": "2.3.0", 1127 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1128 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1129 | "dev": true, 1130 | "requires": { 1131 | "is-promise": "^2.1.0" 1132 | } 1133 | }, 1134 | "rxjs": { 1135 | "version": "6.5.3", 1136 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", 1137 | "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", 1138 | "dev": true, 1139 | "requires": { 1140 | "tslib": "^1.9.0" 1141 | } 1142 | }, 1143 | "safer-buffer": { 1144 | "version": "2.1.2", 1145 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1146 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1147 | "dev": true 1148 | }, 1149 | "semver": { 1150 | "version": "5.6.0", 1151 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 1152 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", 1153 | "dev": true 1154 | }, 1155 | "shebang-command": { 1156 | "version": "1.2.0", 1157 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1158 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1159 | "dev": true, 1160 | "requires": { 1161 | "shebang-regex": "^1.0.0" 1162 | } 1163 | }, 1164 | "shebang-regex": { 1165 | "version": "1.0.0", 1166 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1167 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1168 | "dev": true 1169 | }, 1170 | "shell-quote": { 1171 | "version": "1.7.3", 1172 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", 1173 | "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", 1174 | "dev": true 1175 | }, 1176 | "signal-exit": { 1177 | "version": "3.0.2", 1178 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1179 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1180 | "dev": true 1181 | }, 1182 | "slice-ansi": { 1183 | "version": "2.1.0", 1184 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1185 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1186 | "dev": true, 1187 | "requires": { 1188 | "ansi-styles": "^3.2.0", 1189 | "astral-regex": "^1.0.0", 1190 | "is-fullwidth-code-point": "^2.0.0" 1191 | }, 1192 | "dependencies": { 1193 | "is-fullwidth-code-point": { 1194 | "version": "2.0.0", 1195 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1196 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1197 | "dev": true 1198 | } 1199 | } 1200 | }, 1201 | "source-map": { 1202 | "version": "0.6.1", 1203 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1204 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1205 | "dev": true 1206 | }, 1207 | "source-map-support": { 1208 | "version": "0.5.16", 1209 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", 1210 | "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", 1211 | "dev": true, 1212 | "requires": { 1213 | "buffer-from": "^1.0.0", 1214 | "source-map": "^0.6.0" 1215 | } 1216 | }, 1217 | "spdx-correct": { 1218 | "version": "3.1.0", 1219 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 1220 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 1221 | "dev": true, 1222 | "requires": { 1223 | "spdx-expression-parse": "^3.0.0", 1224 | "spdx-license-ids": "^3.0.0" 1225 | } 1226 | }, 1227 | "spdx-exceptions": { 1228 | "version": "2.2.0", 1229 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 1230 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", 1231 | "dev": true 1232 | }, 1233 | "spdx-expression-parse": { 1234 | "version": "3.0.0", 1235 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 1236 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 1237 | "dev": true, 1238 | "requires": { 1239 | "spdx-exceptions": "^2.1.0", 1240 | "spdx-license-ids": "^3.0.0" 1241 | } 1242 | }, 1243 | "spdx-license-ids": { 1244 | "version": "3.0.3", 1245 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", 1246 | "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", 1247 | "dev": true 1248 | }, 1249 | "sprintf-js": { 1250 | "version": "1.0.3", 1251 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1252 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1253 | "dev": true 1254 | }, 1255 | "string-width": { 1256 | "version": "4.1.0", 1257 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", 1258 | "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", 1259 | "dev": true, 1260 | "requires": { 1261 | "emoji-regex": "^8.0.0", 1262 | "is-fullwidth-code-point": "^3.0.0", 1263 | "strip-ansi": "^5.2.0" 1264 | } 1265 | }, 1266 | "string.prototype.padend": { 1267 | "version": "3.0.0", 1268 | "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", 1269 | "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", 1270 | "dev": true, 1271 | "requires": { 1272 | "define-properties": "^1.1.2", 1273 | "es-abstract": "^1.4.3", 1274 | "function-bind": "^1.0.2" 1275 | } 1276 | }, 1277 | "strip-ansi": { 1278 | "version": "5.2.0", 1279 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1280 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1281 | "dev": true, 1282 | "requires": { 1283 | "ansi-regex": "^4.1.0" 1284 | } 1285 | }, 1286 | "strip-bom": { 1287 | "version": "3.0.0", 1288 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1289 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1290 | "dev": true 1291 | }, 1292 | "strip-json-comments": { 1293 | "version": "3.0.1", 1294 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 1295 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 1296 | "dev": true 1297 | }, 1298 | "supports-color": { 1299 | "version": "5.5.0", 1300 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1301 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1302 | "dev": true, 1303 | "requires": { 1304 | "has-flag": "^3.0.0" 1305 | } 1306 | }, 1307 | "table": { 1308 | "version": "5.4.6", 1309 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1310 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1311 | "dev": true, 1312 | "requires": { 1313 | "ajv": "^6.10.2", 1314 | "lodash": "^4.17.14", 1315 | "slice-ansi": "^2.1.0", 1316 | "string-width": "^3.0.0" 1317 | }, 1318 | "dependencies": { 1319 | "emoji-regex": { 1320 | "version": "7.0.3", 1321 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1322 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 1323 | "dev": true 1324 | }, 1325 | "is-fullwidth-code-point": { 1326 | "version": "2.0.0", 1327 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1328 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1329 | "dev": true 1330 | }, 1331 | "string-width": { 1332 | "version": "3.1.0", 1333 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1334 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1335 | "dev": true, 1336 | "requires": { 1337 | "emoji-regex": "^7.0.1", 1338 | "is-fullwidth-code-point": "^2.0.0", 1339 | "strip-ansi": "^5.1.0" 1340 | } 1341 | } 1342 | } 1343 | }, 1344 | "text-table": { 1345 | "version": "0.2.0", 1346 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1347 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1348 | "dev": true 1349 | }, 1350 | "through": { 1351 | "version": "2.3.8", 1352 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1353 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1354 | "dev": true 1355 | }, 1356 | "tmp": { 1357 | "version": "0.0.33", 1358 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1359 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1360 | "dev": true, 1361 | "requires": { 1362 | "os-tmpdir": "~1.0.2" 1363 | } 1364 | }, 1365 | "ts-node": { 1366 | "version": "8.4.1", 1367 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.4.1.tgz", 1368 | "integrity": "sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw==", 1369 | "dev": true, 1370 | "requires": { 1371 | "arg": "^4.1.0", 1372 | "diff": "^4.0.1", 1373 | "make-error": "^1.1.1", 1374 | "source-map-support": "^0.5.6", 1375 | "yn": "^3.0.0" 1376 | } 1377 | }, 1378 | "tslib": { 1379 | "version": "1.10.0", 1380 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 1381 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 1382 | "dev": true 1383 | }, 1384 | "tsutils": { 1385 | "version": "3.17.1", 1386 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", 1387 | "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", 1388 | "dev": true, 1389 | "requires": { 1390 | "tslib": "^1.8.1" 1391 | } 1392 | }, 1393 | "type-check": { 1394 | "version": "0.3.2", 1395 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1396 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1397 | "dev": true, 1398 | "requires": { 1399 | "prelude-ls": "~1.1.2" 1400 | } 1401 | }, 1402 | "type-fest": { 1403 | "version": "0.5.2", 1404 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", 1405 | "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", 1406 | "dev": true 1407 | }, 1408 | "typescript": { 1409 | "version": "3.6.4", 1410 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", 1411 | "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==", 1412 | "dev": true 1413 | }, 1414 | "uri-js": { 1415 | "version": "4.2.2", 1416 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1417 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1418 | "dev": true, 1419 | "requires": { 1420 | "punycode": "^2.1.0" 1421 | } 1422 | }, 1423 | "v8-compile-cache": { 1424 | "version": "2.1.0", 1425 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 1426 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 1427 | "dev": true 1428 | }, 1429 | "validate-npm-package-license": { 1430 | "version": "3.0.4", 1431 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1432 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1433 | "dev": true, 1434 | "requires": { 1435 | "spdx-correct": "^3.0.0", 1436 | "spdx-expression-parse": "^3.0.0" 1437 | } 1438 | }, 1439 | "which": { 1440 | "version": "1.3.1", 1441 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1442 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1443 | "dev": true, 1444 | "requires": { 1445 | "isexe": "^2.0.0" 1446 | } 1447 | }, 1448 | "wordwrap": { 1449 | "version": "1.0.0", 1450 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1451 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1452 | "dev": true 1453 | }, 1454 | "wrappy": { 1455 | "version": "1.0.2", 1456 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1457 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1458 | "dev": true 1459 | }, 1460 | "write": { 1461 | "version": "1.0.3", 1462 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1463 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1464 | "dev": true, 1465 | "requires": { 1466 | "mkdirp": "^0.5.1" 1467 | } 1468 | }, 1469 | "yn": { 1470 | "version": "3.1.1", 1471 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1472 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1473 | "dev": true 1474 | } 1475 | } 1476 | } 1477 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "subscribableevent", 3 | "version": "1.0.1", 4 | "description": "A simple strongly-typed pub/sub/fire eventing system", 5 | "author": "ReactXP Team ", 6 | "license": "MIT", 7 | "keywords": [ 8 | "TypeScript", 9 | "Eventing", 10 | "Subscribable", 11 | "subscribe", 12 | "publish", 13 | "publish/subscribe", 14 | "pub/sub", 15 | "eventemitter" 16 | ], 17 | "bugs": { 18 | "url": "https://github.com/Microsoft/SubscribableEvent/issues" 19 | }, 20 | "homepage": "https://github.com/Microsoft/SubscribableEvent#readme", 21 | "module": "dist-es2015/SubscribableEvent.js", 22 | "main": "dist-cjs/SubscribableEvent.js", 23 | "scripts": { 24 | "clean": "rimraf dist-*", 25 | "build:types": "tsc -p tsconfig/types.json", 26 | "build:es2015": "tsc -p tsconfig.json", 27 | "build:cjs": "tsc -p tsconfig/cjs.json", 28 | "build": "run-s clean lint build:*", 29 | "prepare": "npm run build", 30 | "lint": "eslint --config .eslintrc --ext .ts src spec", 31 | "lint:fix": "npm run lint -- --fix", 32 | "test": "ts-node -P ./tsconfig/cjs.json ./node_modules/.bin/jasmine --config=spec/support/jasmine.json" 33 | }, 34 | "repository": { 35 | "type": "git", 36 | "url": "git+https://github.com/Microsoft/SubscribableEvent.git" 37 | }, 38 | "devDependencies": { 39 | "@types/jasmine": "3.4.4", 40 | "@typescript-eslint/eslint-plugin": "2.6.0", 41 | "@typescript-eslint/parser": "2.6.0", 42 | "eslint": "6.6.0", 43 | "eslint-config-skype": "0.5.0", 44 | "jasmine": "3.5.0", 45 | "npm-run-all": "4.1.5", 46 | "rimraf": "3.0.0", 47 | "ts-node": "8.4.1", 48 | "typescript": "3.6.4" 49 | }, 50 | "types": "dist-types/SubscribableEvent.d.ts" 51 | } 52 | -------------------------------------------------------------------------------- /spec/SubscribableEvent.spec.ts: -------------------------------------------------------------------------------- 1 | import SubscribableEvent from '../src/SubscribableEvent'; 2 | 3 | const PAYLOAD = 'payload'; 4 | 5 | describe('SubscribableEvent', () => { 6 | it('calls all subscribers on fire', () => { 7 | const subscribableEvent = new SubscribableEvent<(payload: string) => void>(); 8 | const subscriber = jasmine.createSpy('subscriber', (payload: string) => {}).and.callThrough(); 9 | 10 | subscribableEvent.subscribe(subscriber); 11 | subscribableEvent.subscribe(subscriber); 12 | subscribableEvent.subscribe(subscriber); 13 | subscribableEvent.fire(PAYLOAD); 14 | 15 | expect(subscriber).toHaveBeenCalledWith(PAYLOAD); 16 | expect(subscriber).toHaveBeenCalledTimes(3); 17 | }); 18 | 19 | it('calls subscribers in reverse order', () => { 20 | const subscribableEvent = new SubscribableEvent<(payload: string) => void>(); 21 | const callback = (payload: string): void => {}; 22 | const subscriber1 = jasmine.createSpy('subscriber1', callback).and.callThrough(); 23 | const subscriber2 = jasmine.createSpy('subscriber2', callback).and.callThrough(); 24 | 25 | subscribableEvent.subscribe(subscriber1); 26 | subscribableEvent.subscribe(subscriber2); 27 | subscribableEvent.fire(PAYLOAD); 28 | 29 | expect(subscriber2).toHaveBeenCalledBefore(subscriber1); 30 | }); 31 | 32 | it('unsubscribes listener from an event', () => { 33 | const subscribableEvent = new SubscribableEvent<(payload: string) => void>(); 34 | const callback = (payload: string): void => {}; 35 | const subscriber1 = jasmine.createSpy('subscriber1', callback).and.callThrough(); 36 | const subscriber2 = jasmine.createSpy('subscriber2', callback).and.callThrough(); 37 | 38 | subscribableEvent.subscribe(subscriber1); 39 | subscribableEvent.subscribe(subscriber2).unsubscribe(); 40 | subscribableEvent.fire(PAYLOAD); 41 | 42 | expect(subscriber1).toHaveBeenCalledWith(PAYLOAD); 43 | expect(subscriber1).toHaveBeenCalledTimes(1); 44 | expect(subscriber2).toHaveBeenCalledTimes(0); 45 | }); 46 | 47 | it('unsubscribes all listeners from an event', () => { 48 | const subscribableEvent = new SubscribableEvent<(payload: string) => void>(); 49 | const subscriber = jasmine.createSpy('subscriber', (payload: string) => {}).and.callThrough(); 50 | 51 | subscribableEvent.subscribe(subscriber); 52 | subscribableEvent.subscribe(subscriber); 53 | 54 | subscribableEvent.dispose(); 55 | subscribableEvent.fire(PAYLOAD); 56 | 57 | expect(subscriber).toHaveBeenCalledTimes(0); 58 | }); 59 | 60 | it('stops event propagation if one of a subscribers return a truthy response', () => { 61 | const subscribableEvent = new SubscribableEvent<(payload: string) => boolean>(true); 62 | const subscriber = jasmine.createSpy('subscriber', (payload: string) => true).and.callThrough(); 63 | 64 | subscribableEvent.subscribe(subscriber); 65 | subscribableEvent.subscribe(subscriber); 66 | 67 | expect(subscribableEvent.fire(PAYLOAD)).toEqual(true); 68 | expect(subscriber).toHaveBeenCalledWith(PAYLOAD); 69 | expect(subscriber).toHaveBeenCalledTimes(1); 70 | }); 71 | }); 72 | -------------------------------------------------------------------------------- /spec/support/jasmine.json: -------------------------------------------------------------------------------- 1 | { 2 | "spec_dir": "spec", 3 | "spec_files": [ 4 | "**/*.spec.ts" 5 | ], 6 | "helpers": [], 7 | "stopSpecOnExpectationFailure": false, 8 | "random": false 9 | } 10 | -------------------------------------------------------------------------------- /src/SubscribableEvent.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * SubscribableEvent.ts 3 | * 4 | * Copyright (c) Microsoft Corporation. All rights reserved. 5 | * Licensed under the MIT license. 6 | * 7 | * A simple strongly-typed pub/sub/fire eventing system. 8 | */ 9 | 10 | export class SubscriptionToken { 11 | constructor(private _event: SubscribableEvent, private _callback: (...args: any[]) => boolean | void) { 12 | } 13 | 14 | unsubscribe(): void { 15 | this._event.unsubscribe(this._callback); 16 | } 17 | } 18 | 19 | export default class SubscribableEvent { 20 | private _subscribers: readonly Function[]; 21 | 22 | // By default, SubscribableEvent will fire to all subscribers regardless of any conditions. 23 | // If you enable allowStopPropagation, then a subscription callback can return a truthy response and it will halt further callbacks. 24 | constructor(private _allowStopPropagation = false) { 25 | this._subscribers = []; 26 | } 27 | 28 | dispose(): void { 29 | this._subscribers = []; 30 | } 31 | 32 | subscribe(callback: F): SubscriptionToken { 33 | this._subscribers = this._subscribers.concat(callback); 34 | 35 | return new SubscriptionToken(this, callback); 36 | } 37 | 38 | unsubscribe(callback: F): void { 39 | this._subscribers = this._subscribers.filter(value => value !== callback); 40 | } 41 | 42 | fire: F = ((...args: any[]) => { 43 | // Keep reference to the original readonly array. We don't want to have it change while we're firing 44 | const subs = this._subscribers; 45 | 46 | // Execute handlers in the reverse order in which they were registered. 47 | for (let i = subs.length - 1; i >= 0; i--) { 48 | const ret = subs[i].apply(null, args); 49 | if (this._allowStopPropagation && !!ret) { 50 | // If the value was handled, early out. 51 | return true; 52 | } 53 | } 54 | 55 | return false; 56 | }) as any; 57 | } 58 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "suppressImplicitAnyIndexErrors": true, 4 | "allowSyntheticDefaultImports": true, 5 | "experimentalDecorators": true, 6 | "noImplicitAny": true, 7 | "noResolve": false, 8 | "module": "es2015", 9 | "target": "es5", 10 | "outDir": "dist-es2015", 11 | "strict": true 12 | }, 13 | 14 | "include": [ 15 | "src/**/*" 16 | ], 17 | 18 | "exclude": [ 19 | "node_modules", 20 | "dist-*" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig/cjs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig", 3 | "compilerOptions": { 4 | "esModuleInterop": true, 5 | "module": "commonjs", 6 | "target": "es5", 7 | "outDir": "../dist-cjs" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /tsconfig/eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig", 3 | "include": [ 4 | "../src/**/*", 5 | "../spec/**/*" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /tsconfig/types.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig", 3 | "compilerOptions": { 4 | "emitDeclarationOnly": true, 5 | "declarationDir": "../dist-types", 6 | "declaration": true 7 | } 8 | } 9 | --------------------------------------------------------------------------------