├── .gitignore ├── .npmignore ├── package.json ├── readme.markdown ├── src ├── index.ts └── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /lib 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/insidewhy/observable-input/00a6bbf1c4be2d6d2cb651b626cf8a259fa6857c/.npmignore -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "observable-input", 3 | "version": "2.0.2", 4 | "description": "angular input properties as observable streams", 5 | "main": "lib/index.js", 6 | "directories": { 7 | "lib": "lib" 8 | }, 9 | "scripts": { 10 | "build": "tsc -p src", 11 | "build:watch": "tsc -w -p src", 12 | "test": "npm run build && npm run mocha", 13 | "watch": "concurrently 'npm run build:watch' 'npm run mocha:watch'", 14 | "prepublish": "npm run build", 15 | "mocha": "mocha lib/*.spec.js", 16 | "mocha:watch": "npm run mocha -- -w" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git://github.com/ohjames/observable-input.git" 21 | }, 22 | "keywords": [ 23 | "angular", 24 | "rxjs", 25 | "observable" 26 | ], 27 | "author": "James Pike ", 28 | "license": "ISC", 29 | "bugs": { 30 | "url": "https://github.com/ohjames/observable-input/issues" 31 | }, 32 | "homepage": "https://github.com/ohjames/observable-input#readme", 33 | "devDependencies": { 34 | "@types/chai": "^4.0.4", 35 | "@types/mocha": "^2.2.43", 36 | "@types/sinon": "^2.3.3", 37 | "@types/sinon-chai": "^2.7.29", 38 | "chai": "^4.1.2", 39 | "concurrently": "^3.5.0", 40 | "mocha": "^3.5.2", 41 | "sinon": "^3.2.1", 42 | "sinon-chai": "^2.13.0", 43 | "typescript": "^2.9.1" 44 | }, 45 | "dependencies": { 46 | "rxjs": "^6.2.2" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /readme.markdown: -------------------------------------------------------------------------------- 1 | # Installation 2 | 3 | ```bash 4 | npm install -S observable-input 5 | ``` 6 | or 7 | ```bash 8 | yarn add observable-input 9 | ``` 10 | 11 | # Usage 12 | 13 | ```typescript 14 | import { Component, Input } from '@angular/core' 15 | import { Observable } from 'rxjs' 16 | import { ObservableInput } from 'observable-input' 17 | 18 | @Component({ 19 | templateUrl: './some-component.html', 20 | selector: 'app-some-component', 21 | }) 22 | class SomeComponent { 23 | @Input() @ObservableInput() 24 | private index: Observable 25 | } 26 | ``` 27 | 28 | It can be used like this with a non-observable input for `index`: 29 | ```html 30 | 31 | ``` 32 | 33 | # Details 34 | 35 | This decorator works by replacing the input with a property, the getter returns a value with type `Observable` while the setter expects a variable of type `T`. This introduces a few drawbacks: 36 | * While you should generally only be reading your input values and not setting them, the mismatch of types for the setter and getter here is still potentially a source of confusion. 37 | * For now the angular code (whether AOT compiled or not) only writes to a component's inputs (in this case via the setter) and never reads from them, if it did it would receive a value with type `Observable` when it expects a value of type `T`. 38 | * The angular compiler does not type check the values passed to a component match the types of the `@Input`, if it did it would raise an error indicating that the input should be of type `Observable` instead of `T`. 39 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { Observable, ReplaySubject } from 'rxjs' 2 | 3 | interface SubjectAndObservable { observable: Observable; subject: ReplaySubject } 4 | type ComponentSubjectsAndObservables = Map 5 | 6 | const subjectsAndObservables = new WeakMap() 7 | 8 | const getComponentSubjectsAndObservables = (instance: Object): ComponentSubjectsAndObservables => { 9 | const componentSubjectsAndObservables: ComponentSubjectsAndObservables = subjectsAndObservables.get(instance) 10 | if (componentSubjectsAndObservables) { 11 | return componentSubjectsAndObservables 12 | } 13 | const newComponentSubjectsAndObservables: ComponentSubjectsAndObservables = new Map() 14 | subjectsAndObservables.set(instance, newComponentSubjectsAndObservables) 15 | return newComponentSubjectsAndObservables 16 | } 17 | 18 | const getSubjectAndObservable = (instance: Object, propertyKey: string): SubjectAndObservable => { 19 | const componentSubjectsAndObservables = getComponentSubjectsAndObservables(instance) 20 | const subjectAndObservable = componentSubjectsAndObservables.get(propertyKey) 21 | if (subjectAndObservable) { 22 | return subjectAndObservable 23 | } 24 | const subject = new ReplaySubject(1) 25 | const newSubjectAndObservable = { observable: subject.asObservable(), subject } 26 | componentSubjectsAndObservables.set(propertyKey, newSubjectAndObservable) 27 | return newSubjectAndObservable 28 | } 29 | 30 | export function ObservableInput() { 31 | return (target, propertyKey) => { 32 | delete target[propertyKey] 33 | 34 | Object.defineProperty(target, propertyKey, { 35 | set(value) { 36 | getSubjectAndObservable(this, propertyKey).subject.next(value) 37 | }, 38 | get() { 39 | return getSubjectAndObservable(this, propertyKey).observable 40 | }, 41 | }) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "", 4 | "declaration": true, 5 | "emitDecoratorMetadata": true, 6 | "experimentalDecorators": true, 7 | "skipLibCheck": true, 8 | "lib": ["es6"], 9 | "module": "esnext", 10 | "moduleResolution": "node", 11 | "outDir": "../lib", 12 | "sourceMap": true, 13 | "target": "es5", 14 | "typeRoots": [ 15 | "../node_modules/@types" 16 | ] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/chai@*", "@types/chai@^4.0.4": 6 | version "4.0.4" 7 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.0.4.tgz#fe86315d9a66827feeb16f73bc954688ec950e18" 8 | 9 | "@types/mocha@^2.2.43": 10 | version "2.2.43" 11 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.43.tgz#03c54589c43ad048cbcbfd63999b55d0424eec27" 12 | 13 | "@types/sinon-chai@^2.7.29": 14 | version "2.7.29" 15 | resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-2.7.29.tgz#4db01497e2dd1908b2bd30d1782f456353f5f723" 16 | dependencies: 17 | "@types/chai" "*" 18 | "@types/sinon" "*" 19 | 20 | "@types/sinon@*", "@types/sinon@^2.3.3": 21 | version "2.3.3" 22 | resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-2.3.3.tgz#1f20b96f954b4997a09c1c0a20264aaba6b00147" 23 | 24 | ansi-regex@^0.2.0, ansi-regex@^0.2.1: 25 | version "0.2.1" 26 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" 27 | 28 | ansi-styles@^1.1.0: 29 | version "1.1.0" 30 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" 31 | 32 | assertion-error@^1.0.1: 33 | version "1.0.2" 34 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 35 | 36 | balanced-match@^1.0.0: 37 | version "1.0.0" 38 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 39 | 40 | brace-expansion@^1.1.7: 41 | version "1.1.8" 42 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 43 | dependencies: 44 | balanced-match "^1.0.0" 45 | concat-map "0.0.1" 46 | 47 | browser-stdout@1.3.0: 48 | version "1.3.0" 49 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 50 | 51 | chai@^4.1.2: 52 | version "4.1.2" 53 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" 54 | dependencies: 55 | assertion-error "^1.0.1" 56 | check-error "^1.0.1" 57 | deep-eql "^3.0.0" 58 | get-func-name "^2.0.0" 59 | pathval "^1.0.0" 60 | type-detect "^4.0.0" 61 | 62 | chalk@0.5.1: 63 | version "0.5.1" 64 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" 65 | dependencies: 66 | ansi-styles "^1.1.0" 67 | escape-string-regexp "^1.0.0" 68 | has-ansi "^0.1.0" 69 | strip-ansi "^0.3.0" 70 | supports-color "^0.2.0" 71 | 72 | check-error@^1.0.1: 73 | version "1.0.2" 74 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 75 | 76 | commander@2.6.0: 77 | version "2.6.0" 78 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" 79 | 80 | commander@2.9.0: 81 | version "2.9.0" 82 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 83 | dependencies: 84 | graceful-readlink ">= 1.0.0" 85 | 86 | concat-map@0.0.1: 87 | version "0.0.1" 88 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 89 | 90 | concurrently@^3.5.0: 91 | version "3.5.0" 92 | resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-3.5.0.tgz#8cf1b7707a6916a78a4ff5b77bb04dec54b379b2" 93 | dependencies: 94 | chalk "0.5.1" 95 | commander "2.6.0" 96 | date-fns "^1.23.0" 97 | lodash "^4.5.1" 98 | rx "2.3.24" 99 | spawn-command "^0.0.2-1" 100 | supports-color "^3.2.3" 101 | tree-kill "^1.1.0" 102 | 103 | date-fns@^1.23.0: 104 | version "1.28.5" 105 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.5.tgz#257cfc45d322df45ef5658665967ee841cd73faf" 106 | 107 | debug@2.6.8: 108 | version "2.6.8" 109 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 110 | dependencies: 111 | ms "2.0.0" 112 | 113 | deep-eql@^3.0.0: 114 | version "3.0.1" 115 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 116 | dependencies: 117 | type-detect "^4.0.0" 118 | 119 | diff@3.2.0: 120 | version "3.2.0" 121 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" 122 | 123 | diff@^3.1.0: 124 | version "3.3.1" 125 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" 126 | 127 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0: 128 | version "1.0.5" 129 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 130 | 131 | formatio@1.2.0, formatio@^1.2.0: 132 | version "1.2.0" 133 | resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" 134 | dependencies: 135 | samsam "1.x" 136 | 137 | fs.realpath@^1.0.0: 138 | version "1.0.0" 139 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 140 | 141 | get-func-name@^2.0.0: 142 | version "2.0.0" 143 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 144 | 145 | glob@7.1.1: 146 | version "7.1.1" 147 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 148 | dependencies: 149 | fs.realpath "^1.0.0" 150 | inflight "^1.0.4" 151 | inherits "2" 152 | minimatch "^3.0.2" 153 | once "^1.3.0" 154 | path-is-absolute "^1.0.0" 155 | 156 | "graceful-readlink@>= 1.0.0": 157 | version "1.0.1" 158 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 159 | 160 | growl@1.9.2: 161 | version "1.9.2" 162 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 163 | 164 | has-ansi@^0.1.0: 165 | version "0.1.0" 166 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" 167 | dependencies: 168 | ansi-regex "^0.2.0" 169 | 170 | has-flag@^1.0.0: 171 | version "1.0.0" 172 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 173 | 174 | he@1.1.1: 175 | version "1.1.1" 176 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 177 | 178 | inflight@^1.0.4: 179 | version "1.0.6" 180 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 181 | dependencies: 182 | once "^1.3.0" 183 | wrappy "1" 184 | 185 | inherits@2: 186 | version "2.0.3" 187 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 188 | 189 | isarray@0.0.1: 190 | version "0.0.1" 191 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 192 | 193 | json3@3.3.2: 194 | version "3.3.2" 195 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 196 | 197 | just-extend@^1.1.22: 198 | version "1.1.22" 199 | resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.22.tgz#3330af756cab6a542700c64b2e4e4aa062d52fff" 200 | 201 | lodash._baseassign@^3.0.0: 202 | version "3.2.0" 203 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 204 | dependencies: 205 | lodash._basecopy "^3.0.0" 206 | lodash.keys "^3.0.0" 207 | 208 | lodash._basecopy@^3.0.0: 209 | version "3.0.1" 210 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 211 | 212 | lodash._basecreate@^3.0.0: 213 | version "3.0.3" 214 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 215 | 216 | lodash._getnative@^3.0.0: 217 | version "3.9.1" 218 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 219 | 220 | lodash._isiterateecall@^3.0.0: 221 | version "3.0.9" 222 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 223 | 224 | lodash.create@3.1.1: 225 | version "3.1.1" 226 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 227 | dependencies: 228 | lodash._baseassign "^3.0.0" 229 | lodash._basecreate "^3.0.0" 230 | lodash._isiterateecall "^3.0.0" 231 | 232 | lodash.isarguments@^3.0.0: 233 | version "3.1.0" 234 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 235 | 236 | lodash.isarray@^3.0.0: 237 | version "3.0.4" 238 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 239 | 240 | lodash.keys@^3.0.0: 241 | version "3.1.2" 242 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 243 | dependencies: 244 | lodash._getnative "^3.0.0" 245 | lodash.isarguments "^3.0.0" 246 | lodash.isarray "^3.0.0" 247 | 248 | lodash@^4.5.1: 249 | version "4.17.4" 250 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 251 | 252 | lolex@^1.6.0: 253 | version "1.6.0" 254 | resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" 255 | 256 | lolex@^2.1.2: 257 | version "2.1.2" 258 | resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.1.2.tgz#2694b953c9ea4d013e5b8bfba891c991025b2629" 259 | 260 | minimatch@^3.0.2: 261 | version "3.0.4" 262 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 263 | dependencies: 264 | brace-expansion "^1.1.7" 265 | 266 | minimist@0.0.8: 267 | version "0.0.8" 268 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 269 | 270 | mkdirp@0.5.1: 271 | version "0.5.1" 272 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 273 | dependencies: 274 | minimist "0.0.8" 275 | 276 | mocha@^3.5.2: 277 | version "3.5.2" 278 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.2.tgz#3d5585cc6bd9e43a7c0bd251631abc0fbea0f032" 279 | dependencies: 280 | browser-stdout "1.3.0" 281 | commander "2.9.0" 282 | debug "2.6.8" 283 | diff "3.2.0" 284 | escape-string-regexp "1.0.5" 285 | glob "7.1.1" 286 | growl "1.9.2" 287 | he "1.1.1" 288 | json3 "3.3.2" 289 | lodash.create "3.1.1" 290 | mkdirp "0.5.1" 291 | supports-color "3.1.2" 292 | 293 | ms@2.0.0: 294 | version "2.0.0" 295 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 296 | 297 | native-promise-only@^0.8.1: 298 | version "0.8.1" 299 | resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" 300 | 301 | nise@^1.0.1: 302 | version "1.0.1" 303 | resolved "https://registry.yarnpkg.com/nise/-/nise-1.0.1.tgz#0da92b10a854e97c0f496f6c2845a301280b3eef" 304 | dependencies: 305 | formatio "^1.2.0" 306 | just-extend "^1.1.22" 307 | lolex "^1.6.0" 308 | path-to-regexp "^1.7.0" 309 | 310 | once@^1.3.0: 311 | version "1.4.0" 312 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 313 | dependencies: 314 | wrappy "1" 315 | 316 | path-is-absolute@^1.0.0: 317 | version "1.0.1" 318 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 319 | 320 | path-to-regexp@^1.7.0: 321 | version "1.7.0" 322 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" 323 | dependencies: 324 | isarray "0.0.1" 325 | 326 | pathval@^1.0.0: 327 | version "1.1.0" 328 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 329 | 330 | rx@2.3.24: 331 | version "2.3.24" 332 | resolved "https://registry.yarnpkg.com/rx/-/rx-2.3.24.tgz#14f950a4217d7e35daa71bbcbe58eff68ea4b2b7" 333 | 334 | rxjs@^5.4.3: 335 | version "5.4.3" 336 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.3.tgz#0758cddee6033d68e0fd53676f0f3596ce3d483f" 337 | dependencies: 338 | symbol-observable "^1.0.1" 339 | 340 | samsam@1.x, samsam@^1.1.3: 341 | version "1.2.1" 342 | resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67" 343 | 344 | sinon-chai@^2.13.0: 345 | version "2.13.0" 346 | resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.13.0.tgz#b9a42e801c20234bfc2f43b29e6f4f61b60990c4" 347 | 348 | sinon@^3.2.1: 349 | version "3.2.1" 350 | resolved "https://registry.yarnpkg.com/sinon/-/sinon-3.2.1.tgz#d8adabd900730fd497788a027049c64b08be91c2" 351 | dependencies: 352 | diff "^3.1.0" 353 | formatio "1.2.0" 354 | lolex "^2.1.2" 355 | native-promise-only "^0.8.1" 356 | nise "^1.0.1" 357 | path-to-regexp "^1.7.0" 358 | samsam "^1.1.3" 359 | text-encoding "0.6.4" 360 | type-detect "^4.0.0" 361 | 362 | spawn-command@^0.0.2-1: 363 | version "0.0.2" 364 | resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" 365 | 366 | strip-ansi@^0.3.0: 367 | version "0.3.0" 368 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" 369 | dependencies: 370 | ansi-regex "^0.2.1" 371 | 372 | supports-color@3.1.2: 373 | version "3.1.2" 374 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 375 | dependencies: 376 | has-flag "^1.0.0" 377 | 378 | supports-color@^0.2.0: 379 | version "0.2.0" 380 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" 381 | 382 | supports-color@^3.2.3: 383 | version "3.2.3" 384 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 385 | dependencies: 386 | has-flag "^1.0.0" 387 | 388 | symbol-observable@^1.0.1: 389 | version "1.0.4" 390 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" 391 | 392 | text-encoding@0.6.4: 393 | version "0.6.4" 394 | resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" 395 | 396 | tree-kill@^1.1.0: 397 | version "1.1.0" 398 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.1.0.tgz#c963dcf03722892ec59cba569e940b71954d1729" 399 | 400 | type-detect@^4.0.0: 401 | version "4.0.3" 402 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" 403 | 404 | typescript@^2.5.2: 405 | version "2.5.2" 406 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.2.tgz#038a95f7d9bbb420b1bf35ba31d4c5c1dd3ffe34" 407 | 408 | wrappy@1: 409 | version "1.0.2" 410 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 411 | --------------------------------------------------------------------------------