├── .gitignore ├── README.md ├── package.json ├── src ├── GraphQLDataSource.ts └── index.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/* 2 | !.vscode/settings.json 3 | !.vscode/tasks.json 4 | !.vscode/launch.json 5 | !.vscode/extensions.json 6 | 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | 11 | dist/ 12 | node_modules/ 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # apollo-datasource-graphql 2 | 3 | Connect your GraphQL server to an existing GraphQL API using DataSources. 4 | 5 | **Note: This is designed to work with [Apollo Server 2.0](https://www.apollographql.com/docs/apollo-server/whats-new.html) and [Data Sources](https://www.apollographql.com/docs/apollo-server/features/data-sources.html)** 6 | 7 | ## GraphQL Data Source 8 | 9 | ### Install 10 | 11 | ``` 12 | yarn add apollo-datasource-graphql 13 | ``` 14 | 15 | or 16 | 17 | ``` 18 | npm i apollo-datasource-graphql --save 19 | ``` 20 | 21 | ### Usage 22 | 23 | Define a data source by extending the `GraphQLDataSource` class. You can then implement the queries and mutations that your resolvers require. 24 | 25 | 26 | ```javascript 27 | import { GraphQLDataSource } from 'apollo-datasource-graphql'; 28 | import { gql } from 'apollo-server-express'; 29 | 30 | const CRAFT_BEERS = gql` 31 | query { 32 | craftBeers { 33 | name 34 | style 35 | abv 36 | brewery { 37 | name 38 | } 39 | } 40 | } 41 | `; 42 | 43 | export class CraftBeerGraphQLAPI extends GraphQLDataSource { 44 | baseURL = 'https//craft-beer-api.example/graphql'; 45 | 46 | async getCraftBeers() { 47 | try { 48 | const response = await this.query(CRAFT_BEERS); 49 | 50 | return response.data.craftBeers; 51 | } catch (error) { 52 | console.error(error); 53 | } 54 | } 55 | } 56 | ``` 57 | 58 | ### GraphQL Operations 59 | 60 | The `query` and `mutation` methods on the `GraphQLDataSource` make a request to the GraphQL server. Both accepts a second parameter, `options`, which can be used to pass variables, context, etc. 61 | 62 | ```javascript 63 | async searchCraftBeerByName(name) { 64 | try { 65 | const response = await this.query(CRAFT_BEERS, { 66 | variables: { 67 | name, 68 | }, 69 | }); 70 | 71 | return response.data.craftBeer; 72 | } catch (error) { 73 | console.error(error); 74 | } 75 | } 76 | ``` 77 | 78 | |Parameter |Description |Required| 79 | |---|---|---| 80 | |graphQLDocument|A GraphQL document|true| 81 | |options|An object that defines options to pass with the GraphQL request|false| 82 | 83 | 84 | |Options |Description |Required| 85 | |---|---|---| 86 | |variables|A GraphQL document|false| 87 | |operationName|A string name of the query if it is named, otherwise it is null|false| 88 | |context|Metadata to be passed between Apollo Links|false| 89 | |extensions|A map to store extensions data to be sent to the server|false| 90 | 91 | ### Intercepting Operations 92 | 93 | You can intercept the request to set headers on an outgoing request. Since Apollo Data Sources have access to GraphQL context, you can store a user token or other information you need to have available when making a request. 94 | 95 | Add the method `willSendRequest` to your class which will receive the `request` object. Here, you can modify the request to meet your needs. 96 | 97 | ```javascript 98 | willSendRequest(request) { 99 | const { accessToken } = this.context; 100 | 101 | if (!request.headers) { 102 | request.headers = {}; 103 | } 104 | 105 | request.headers.authorization = accessToken; 106 | } 107 | ``` 108 | 109 | ## TODO 110 | 111 | - [x] Complete README 112 | - [x] Mutation method 113 | - [ ] Test Suite 114 | - [ ] Request caching 115 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "apollo-datasource-graphql", 3 | "version": "1.3.2", 4 | "license": "MIT", 5 | "description": "Create Apollo DataSource to connect to a GraphQL API", 6 | "main": "dist/index.js", 7 | "author": "Kristy Miller", 8 | "contributors": [ 9 | "Kristy Miller " 10 | ], 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/poetic/apollo-datasource-graphql" 14 | }, 15 | "scripts": { 16 | "build": "rm -rf dist/ && tsc", 17 | "lint": "tslint -p tsconfig.json -c tslint.json", 18 | "prepublishOnly": "yarn build", 19 | "start": "ts-node src/index.ts" 20 | }, 21 | "keywords": [ 22 | "apollo", 23 | "apollo", 24 | "datasource", 25 | "graphql" 26 | ], 27 | "dependencies": { 28 | "apollo-cache-inmemory": "^1.2.5", 29 | "apollo-datasource": "^0.1.3", 30 | "apollo-link": "^1.2.2", 31 | "apollo-link-context": "^1.0.8", 32 | "apollo-link-error": "^1.1.0", 33 | "apollo-link-http": "^1.5.4", 34 | "apollo-server-errors": "^2.0.0-rc.1", 35 | "await-to-js": "^2.0.1", 36 | "graphql": "^0.13.2", 37 | "isomorphic-fetch": "^2.2.1" 38 | }, 39 | "devDependencies": { 40 | "@types/isomorphic-fetch": "^0.0.34", 41 | "@types/lodash": "^4.14.112", 42 | "@types/node": "^10.5.2", 43 | "ts-node": "^7.0.0", 44 | "tslint": "^5.11.0", 45 | "tslint-config-airbnb": "^5.11.1", 46 | "typescript": "^3.4.4" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/GraphQLDataSource.ts: -------------------------------------------------------------------------------- 1 | import { DataSourceConfig } from 'apollo-datasource'; 2 | import { ApolloLink, execute, GraphQLRequest, makePromise } from 'apollo-link'; 3 | import { setContext } from 'apollo-link-context'; 4 | import { onError } from 'apollo-link-error'; 5 | import { createHttpLink } from 'apollo-link-http'; 6 | import { ApolloError, AuthenticationError, ForbiddenError } from 'apollo-server-errors'; 7 | import to from 'await-to-js'; 8 | import { DocumentNode } from 'graphql'; 9 | import fetch from 'isomorphic-fetch'; 10 | 11 | export class GraphQLDataSource { 12 | public baseURL!: string; 13 | public context!: TContext; 14 | 15 | public initialize(config: DataSourceConfig): void { 16 | this.context = config.context; 17 | } 18 | 19 | public async mutation(mutation: DocumentNode, options?: GraphQLRequest) { 20 | // GraphQL request requires the DocumentNode property to be named query 21 | return this.executeSingleOperation({ ...options, query: mutation }); 22 | } 23 | 24 | public async query(query: DocumentNode, options?: GraphQLRequest) { 25 | return this.executeSingleOperation({ ...options, query }); 26 | } 27 | 28 | protected willSendRequest?(request: any): any; 29 | 30 | private composeLinks(): ApolloLink { 31 | const uri = this.resolveUri(); 32 | 33 | return ApolloLink.from([ 34 | this.onErrorLink(), 35 | this.onRequestLink(), 36 | createHttpLink({ fetch, uri }), 37 | ]); 38 | } 39 | 40 | private didEncounterError(error: any) { 41 | const status = error.statusCode ? error.statusCode : null; 42 | const message = error.bodyText ? error.bodyText : null; 43 | 44 | let apolloError: ApolloError; 45 | 46 | switch (status) { 47 | case 401: 48 | apolloError = new AuthenticationError(message); 49 | break; 50 | case 403: 51 | apolloError = new ForbiddenError(message); 52 | break; 53 | case 502: 54 | apolloError = new ApolloError('Bad Gateway', status); 55 | break; 56 | default: 57 | apolloError = new ApolloError(message, status); 58 | } 59 | 60 | throw apolloError; 61 | } 62 | 63 | private async executeSingleOperation(operation: GraphQLRequest) { 64 | const link = this.composeLinks(); 65 | 66 | const [error, response] = await to(makePromise(execute(link, operation))); 67 | 68 | if (error) { 69 | this.didEncounterError(error); 70 | } 71 | 72 | return response; 73 | } 74 | 75 | private resolveUri(): string { 76 | const baseURL = this.baseURL; 77 | 78 | if (!baseURL) { 79 | throw new ApolloError('Cannot make request to GraphQL API, missing baseURL'); 80 | } 81 | 82 | return baseURL; 83 | } 84 | 85 | private onRequestLink() { 86 | return setContext((_, request) => { 87 | if (this.willSendRequest) { 88 | this.willSendRequest(request); 89 | } 90 | 91 | return request; 92 | }); 93 | } 94 | 95 | private onErrorLink() { 96 | return onError(({ graphQLErrors, networkError }) => { 97 | if (graphQLErrors) { 98 | graphQLErrors.map(graphqlError => 99 | console.error( 100 | `[GraphQL error]: ${graphqlError.message}`, 101 | ), 102 | ); 103 | } 104 | 105 | if (networkError) { 106 | console.log(`[Network Error]: ${networkError}`); 107 | } 108 | }); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { GraphQLDataSource as default, GraphQLDataSource } from './GraphQLDataSource'; 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": true, 4 | "declaration": false, 5 | "esModuleInterop": true, 6 | "lib": ["esnext", "dom"], 7 | "module": "commonjs", 8 | "noUnusedLocals": true, 9 | "outDir": "dist", 10 | "sourceMap": false, 11 | "target": "esnext", 12 | "strict": true 13 | }, 14 | "include": [ 15 | "src/**/*" 16 | ], 17 | "exclude": [ 18 | "node_modules" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": ["tslint:recommended", "tslint-config-airbnb"], 4 | "jsRules": {}, 5 | "rules": { 6 | "import-name": false, 7 | "no-console": false, 8 | "object-literal-sort-keys": [true, "shorthand-first"], 9 | "prefer-array-literal": false, 10 | "variable-name": [true, "allow-pascal-case"] 11 | }, 12 | "rulesDirectory": [] 13 | } 14 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@fimbul/bifrost@^0.17.0": 6 | version "0.17.0" 7 | resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.17.0.tgz#f0383ba7e40992e3193dc87e2ddfde2ad62a9cf4" 8 | integrity sha512-gVTkJAOef5HtN6LPmrtt5fAUmBywwlgmObsU3FBhPoNeXPLaIl2zywXkJEtvvVLQnaFmtff3x+wIj5lHRCDE3Q== 9 | dependencies: 10 | "@fimbul/ymir" "^0.17.0" 11 | get-caller-file "^2.0.0" 12 | tslib "^1.8.1" 13 | tsutils "^3.5.0" 14 | 15 | "@fimbul/ymir@^0.17.0": 16 | version "0.17.0" 17 | resolved "https://registry.yarnpkg.com/@fimbul/ymir/-/ymir-0.17.0.tgz#4f28389b9f804d1cd202e11983af1743488b7815" 18 | integrity sha512-xMXM9KTXRLHLVS6dnX1JhHNEkmWHcAVCQ/4+DA1KKwC/AFnGHzu/7QfQttEPgw3xplT+ILf9e3i64jrFwB3JtA== 19 | dependencies: 20 | inversify "^5.0.0" 21 | reflect-metadata "^0.1.12" 22 | tslib "^1.8.1" 23 | 24 | "@types/graphql@0.12.6": 25 | version "0.12.6" 26 | resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.12.6.tgz#3d619198585fcabe5f4e1adfb5cf5f3388c66c13" 27 | 28 | "@types/isomorphic-fetch@^0.0.34": 29 | version "0.0.34" 30 | resolved "https://registry.yarnpkg.com/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.34.tgz#3c3483e606c041378438e951464f00e4e60706d6" 31 | 32 | "@types/lodash@^4.14.112": 33 | version "4.14.112" 34 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.112.tgz#4a8d8e5716b97a1ac01fe1931ad1e4cba719de5a" 35 | 36 | "@types/node@^10.5.2": 37 | version "10.5.2" 38 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.2.tgz#f19f05314d5421fe37e74153254201a7bf00a707" 39 | 40 | ansi-regex@^2.0.0: 41 | version "2.1.1" 42 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 43 | 44 | ansi-styles@^2.2.1: 45 | version "2.2.1" 46 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 47 | 48 | ansi-styles@^3.2.1: 49 | version "3.2.1" 50 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 51 | dependencies: 52 | color-convert "^1.9.0" 53 | 54 | apollo-cache-inmemory@^1.2.5: 55 | version "1.2.5" 56 | resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.2.5.tgz#b57951947b1db486a60db11c7dcfc6b112e5abe9" 57 | dependencies: 58 | apollo-cache "^1.1.12" 59 | apollo-utilities "^1.0.16" 60 | graphql-anywhere "^4.1.14" 61 | 62 | apollo-cache@^1.1.12: 63 | version "1.1.12" 64 | resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.1.12.tgz#070015c9051b2ebb69676beb10466a9c0b259f91" 65 | dependencies: 66 | apollo-utilities "^1.0.16" 67 | 68 | apollo-datasource@^0.1.3: 69 | version "0.1.3" 70 | resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.1.3.tgz#e7ae9d20f29a8a35f239b02f0c47169cfd78d70b" 71 | dependencies: 72 | apollo-server-caching "0.1.2" 73 | apollo-server-env "2.0.3" 74 | 75 | apollo-link-context@^1.0.8: 76 | version "1.0.8" 77 | resolved "https://registry.yarnpkg.com/apollo-link-context/-/apollo-link-context-1.0.8.tgz#c967a56ac6ed32add748937735bcb57c5cc64c95" 78 | dependencies: 79 | apollo-link "^1.2.2" 80 | 81 | apollo-link-error@^1.1.0: 82 | version "1.1.0" 83 | resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.0.tgz#ef8a64411361314364db40c1d4023b987a84860f" 84 | dependencies: 85 | apollo-link "^1.2.2" 86 | 87 | apollo-link-http-common@^0.2.4: 88 | version "0.2.4" 89 | resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.4.tgz#877603f7904dc8f70242cac61808b1f8d034b2c3" 90 | dependencies: 91 | apollo-link "^1.2.2" 92 | 93 | apollo-link-http@^1.5.4: 94 | version "1.5.4" 95 | resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.4.tgz#b80b7b4b342c655b6a5614624b076a36be368f43" 96 | dependencies: 97 | apollo-link "^1.2.2" 98 | apollo-link-http-common "^0.2.4" 99 | 100 | apollo-link@^1.2.2: 101 | version "1.2.2" 102 | resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.2.tgz#54c84199b18ac1af8d63553a68ca389c05217a03" 103 | dependencies: 104 | "@types/graphql" "0.12.6" 105 | apollo-utilities "^1.0.0" 106 | zen-observable-ts "^0.8.9" 107 | 108 | apollo-server-caching@0.1.2: 109 | version "0.1.2" 110 | resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.1.2.tgz#f5b85701945110a5fca1956450e8553576635936" 111 | dependencies: 112 | lru-cache "^4.1.3" 113 | 114 | apollo-server-env@2.0.3: 115 | version "2.0.3" 116 | resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.0.3.tgz#3c13552cd33f400160076cf8e1c9b24be4d27e13" 117 | dependencies: 118 | node-fetch "^2.1.2" 119 | util.promisify "^1.0.0" 120 | 121 | apollo-server-errors@^2.0.0-rc.1: 122 | version "2.0.0-rc.1" 123 | resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.0.0-rc.1.tgz#3e7c64431ecea086b6c8296fb7fa6a65ea46985b" 124 | 125 | apollo-utilities@^1.0.0, apollo-utilities@^1.0.16: 126 | version "1.0.16" 127 | resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.16.tgz#787310df4c3900a68c0beb3d351c59725a588cdb" 128 | dependencies: 129 | fast-json-stable-stringify "^2.0.0" 130 | 131 | argparse@^1.0.7: 132 | version "1.0.10" 133 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 134 | dependencies: 135 | sprintf-js "~1.0.2" 136 | 137 | arrify@^1.0.0: 138 | version "1.0.1" 139 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 140 | 141 | await-to-js@^2.0.1: 142 | version "2.0.1" 143 | resolved "https://registry.yarnpkg.com/await-to-js/-/await-to-js-2.0.1.tgz#fcb8a2178c763e2970aef1da9daf5c493e3653e0" 144 | 145 | babel-code-frame@^6.22.0: 146 | version "6.26.0" 147 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 148 | dependencies: 149 | chalk "^1.1.3" 150 | esutils "^2.0.2" 151 | js-tokens "^3.0.2" 152 | 153 | balanced-match@^1.0.0: 154 | version "1.0.0" 155 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 156 | 157 | brace-expansion@^1.1.7: 158 | version "1.1.11" 159 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 160 | dependencies: 161 | balanced-match "^1.0.0" 162 | concat-map "0.0.1" 163 | 164 | buffer-from@^1.0.0, buffer-from@^1.1.0: 165 | version "1.1.0" 166 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" 167 | 168 | builtin-modules@^1.1.1: 169 | version "1.1.1" 170 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 171 | 172 | chalk@^1.1.3: 173 | version "1.1.3" 174 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 175 | dependencies: 176 | ansi-styles "^2.2.1" 177 | escape-string-regexp "^1.0.2" 178 | has-ansi "^2.0.0" 179 | strip-ansi "^3.0.0" 180 | supports-color "^2.0.0" 181 | 182 | chalk@^2.3.0: 183 | version "2.4.1" 184 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 185 | dependencies: 186 | ansi-styles "^3.2.1" 187 | escape-string-regexp "^1.0.5" 188 | supports-color "^5.3.0" 189 | 190 | color-convert@^1.9.0: 191 | version "1.9.2" 192 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" 193 | dependencies: 194 | color-name "1.1.1" 195 | 196 | color-name@1.1.1: 197 | version "1.1.1" 198 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" 199 | 200 | commander@^2.12.1: 201 | version "2.16.0" 202 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" 203 | 204 | concat-map@0.0.1: 205 | version "0.0.1" 206 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 207 | 208 | define-properties@^1.1.2: 209 | version "1.1.3" 210 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 211 | dependencies: 212 | object-keys "^1.0.12" 213 | 214 | diff@^3.1.0, diff@^3.2.0: 215 | version "3.5.0" 216 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 217 | 218 | doctrine@0.7.2: 219 | version "0.7.2" 220 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" 221 | integrity sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM= 222 | dependencies: 223 | esutils "^1.1.6" 224 | isarray "0.0.1" 225 | 226 | encoding@^0.1.11: 227 | version "0.1.12" 228 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 229 | dependencies: 230 | iconv-lite "~0.4.13" 231 | 232 | es-abstract@^1.5.1: 233 | version "1.12.0" 234 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" 235 | dependencies: 236 | es-to-primitive "^1.1.1" 237 | function-bind "^1.1.1" 238 | has "^1.0.1" 239 | is-callable "^1.1.3" 240 | is-regex "^1.0.4" 241 | 242 | es-to-primitive@^1.1.1: 243 | version "1.2.0" 244 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" 245 | dependencies: 246 | is-callable "^1.1.4" 247 | is-date-object "^1.0.1" 248 | is-symbol "^1.0.2" 249 | 250 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 251 | version "1.0.5" 252 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 253 | 254 | esprima@^4.0.0: 255 | version "4.0.1" 256 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 257 | 258 | esutils@^1.1.6: 259 | version "1.1.6" 260 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" 261 | integrity sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U= 262 | 263 | esutils@^2.0.2: 264 | version "2.0.2" 265 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 266 | 267 | fast-json-stable-stringify@^2.0.0: 268 | version "2.0.0" 269 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 270 | 271 | fs.realpath@^1.0.0: 272 | version "1.0.0" 273 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 274 | 275 | function-bind@^1.1.1: 276 | version "1.1.1" 277 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 278 | 279 | get-caller-file@^2.0.0: 280 | version "2.0.5" 281 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 282 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 283 | 284 | glob@^7.1.1: 285 | version "7.1.2" 286 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 287 | dependencies: 288 | fs.realpath "^1.0.0" 289 | inflight "^1.0.4" 290 | inherits "2" 291 | minimatch "^3.0.4" 292 | once "^1.3.0" 293 | path-is-absolute "^1.0.0" 294 | 295 | graphql-anywhere@^4.1.14: 296 | version "4.1.14" 297 | resolved "https://registry.yarnpkg.com/graphql-anywhere/-/graphql-anywhere-4.1.14.tgz#89664cb885faaec1cbc66905351fadae8cc85a04" 298 | dependencies: 299 | apollo-utilities "^1.0.16" 300 | 301 | graphql@^0.13.2: 302 | version "0.13.2" 303 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.2.tgz#4c740ae3c222823e7004096f832e7b93b2108270" 304 | dependencies: 305 | iterall "^1.2.1" 306 | 307 | has-ansi@^2.0.0: 308 | version "2.0.0" 309 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 310 | dependencies: 311 | ansi-regex "^2.0.0" 312 | 313 | has-flag@^3.0.0: 314 | version "3.0.0" 315 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 316 | 317 | has-symbols@^1.0.0: 318 | version "1.0.0" 319 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 320 | 321 | has@^1.0.1: 322 | version "1.0.3" 323 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 324 | dependencies: 325 | function-bind "^1.1.1" 326 | 327 | iconv-lite@~0.4.13: 328 | version "0.4.23" 329 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 330 | dependencies: 331 | safer-buffer ">= 2.1.2 < 3" 332 | 333 | inflight@^1.0.4: 334 | version "1.0.6" 335 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 336 | dependencies: 337 | once "^1.3.0" 338 | wrappy "1" 339 | 340 | inherits@2: 341 | version "2.0.3" 342 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 343 | 344 | inversify@^5.0.0: 345 | version "5.0.1" 346 | resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.0.1.tgz#500d709b1434896ce5a0d58915c4a4210e34fb6e" 347 | integrity sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ== 348 | 349 | is-callable@^1.1.3, is-callable@^1.1.4: 350 | version "1.1.4" 351 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 352 | 353 | is-date-object@^1.0.1: 354 | version "1.0.1" 355 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 356 | 357 | is-regex@^1.0.4: 358 | version "1.0.4" 359 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 360 | dependencies: 361 | has "^1.0.1" 362 | 363 | is-stream@^1.0.1: 364 | version "1.1.0" 365 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 366 | 367 | is-symbol@^1.0.2: 368 | version "1.0.2" 369 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" 370 | dependencies: 371 | has-symbols "^1.0.0" 372 | 373 | isarray@0.0.1: 374 | version "0.0.1" 375 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 376 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 377 | 378 | isomorphic-fetch@^2.2.1: 379 | version "2.2.1" 380 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 381 | dependencies: 382 | node-fetch "^1.0.1" 383 | whatwg-fetch ">=0.10.0" 384 | 385 | iterall@^1.2.1: 386 | version "1.2.2" 387 | resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" 388 | 389 | js-tokens@^3.0.2: 390 | version "3.0.2" 391 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 392 | 393 | js-yaml@^3.7.0: 394 | version "3.12.0" 395 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 396 | dependencies: 397 | argparse "^1.0.7" 398 | esprima "^4.0.0" 399 | 400 | lru-cache@^4.1.3: 401 | version "4.1.3" 402 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" 403 | dependencies: 404 | pseudomap "^1.0.2" 405 | yallist "^2.1.2" 406 | 407 | make-error@^1.1.1: 408 | version "1.3.4" 409 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" 410 | 411 | minimatch@^3.0.4: 412 | version "3.0.4" 413 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 414 | dependencies: 415 | brace-expansion "^1.1.7" 416 | 417 | minimist@0.0.8: 418 | version "0.0.8" 419 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 420 | 421 | minimist@^1.2.0: 422 | version "1.2.0" 423 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 424 | 425 | mkdirp@^0.5.1: 426 | version "0.5.1" 427 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 428 | dependencies: 429 | minimist "0.0.8" 430 | 431 | node-fetch@^1.0.1: 432 | version "1.7.3" 433 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 434 | dependencies: 435 | encoding "^0.1.11" 436 | is-stream "^1.0.1" 437 | 438 | node-fetch@^2.1.2: 439 | version "2.2.0" 440 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.2.0.tgz#4ee79bde909262f9775f731e3656d0db55ced5b5" 441 | 442 | object-keys@^1.0.12: 443 | version "1.0.12" 444 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" 445 | 446 | object.getownpropertydescriptors@^2.0.3: 447 | version "2.0.3" 448 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" 449 | dependencies: 450 | define-properties "^1.1.2" 451 | es-abstract "^1.5.1" 452 | 453 | once@^1.3.0: 454 | version "1.4.0" 455 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 456 | dependencies: 457 | wrappy "1" 458 | 459 | path-is-absolute@^1.0.0: 460 | version "1.0.1" 461 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 462 | 463 | path-parse@^1.0.5: 464 | version "1.0.5" 465 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 466 | 467 | pseudomap@^1.0.2: 468 | version "1.0.2" 469 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 470 | 471 | reflect-metadata@^0.1.12: 472 | version "0.1.13" 473 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" 474 | integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== 475 | 476 | resolve@^1.3.2: 477 | version "1.8.1" 478 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 479 | dependencies: 480 | path-parse "^1.0.5" 481 | 482 | "safer-buffer@>= 2.1.2 < 3": 483 | version "2.1.2" 484 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 485 | 486 | semver@^5.3.0: 487 | version "5.5.0" 488 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 489 | 490 | source-map-support@^0.5.6: 491 | version "0.5.6" 492 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" 493 | dependencies: 494 | buffer-from "^1.0.0" 495 | source-map "^0.6.0" 496 | 497 | source-map@^0.6.0: 498 | version "0.6.1" 499 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 500 | 501 | sprintf-js@~1.0.2: 502 | version "1.0.3" 503 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 504 | 505 | strip-ansi@^3.0.0: 506 | version "3.0.1" 507 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 508 | dependencies: 509 | ansi-regex "^2.0.0" 510 | 511 | supports-color@^2.0.0: 512 | version "2.0.0" 513 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 514 | 515 | supports-color@^5.3.0: 516 | version "5.4.0" 517 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 518 | dependencies: 519 | has-flag "^3.0.0" 520 | 521 | ts-node@^7.0.0: 522 | version "7.0.0" 523 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.0.tgz#a94a13c75e5e1aa6b82814b84c68deb339ba7bff" 524 | dependencies: 525 | arrify "^1.0.0" 526 | buffer-from "^1.1.0" 527 | diff "^3.1.0" 528 | make-error "^1.1.1" 529 | minimist "^1.2.0" 530 | mkdirp "^0.5.1" 531 | source-map-support "^0.5.6" 532 | yn "^2.0.0" 533 | 534 | tslib@1.9.0: 535 | version "1.9.0" 536 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" 537 | integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== 538 | 539 | tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1: 540 | version "1.9.3" 541 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 542 | 543 | tslint-config-airbnb@^5.11.1: 544 | version "5.11.1" 545 | resolved "https://registry.yarnpkg.com/tslint-config-airbnb/-/tslint-config-airbnb-5.11.1.tgz#51a27fbb8bf24c144d064a274a71da47e7ece617" 546 | integrity sha512-hkaittm2607vVMe8eotANGN1CimD5tor7uoY3ypg2VTtEcDB/KGWYbJOz58t8LI4cWSyWtgqYQ5F0HwKxxhlkQ== 547 | dependencies: 548 | tslint-consistent-codestyle "^1.14.1" 549 | tslint-eslint-rules "^5.4.0" 550 | tslint-microsoft-contrib "~5.2.1" 551 | 552 | tslint-consistent-codestyle@^1.14.1: 553 | version "1.15.1" 554 | resolved "https://registry.yarnpkg.com/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.15.1.tgz#a0c5cd5a5860d40b659c490d8013c5732e02af8c" 555 | integrity sha512-38Y3Dz4zcABe/PlPAQSGNEWPGVq0OzcIQR7SEU6dNujp/SgvhxhJOhIhI9gY4r0I3/TNtvVQwARWor9O9LPZWg== 556 | dependencies: 557 | "@fimbul/bifrost" "^0.17.0" 558 | tslib "^1.7.1" 559 | tsutils "^2.29.0" 560 | 561 | tslint-eslint-rules@^5.4.0: 562 | version "5.4.0" 563 | resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5" 564 | integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w== 565 | dependencies: 566 | doctrine "0.7.2" 567 | tslib "1.9.0" 568 | tsutils "^3.0.0" 569 | 570 | tslint-microsoft-contrib@~5.2.1: 571 | version "5.2.1" 572 | resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz#a6286839f800e2591d041ea2800c77487844ad81" 573 | integrity sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA== 574 | dependencies: 575 | tsutils "^2.27.2 <2.29.0" 576 | 577 | tslint@^5.11.0: 578 | version "5.11.0" 579 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" 580 | dependencies: 581 | babel-code-frame "^6.22.0" 582 | builtin-modules "^1.1.1" 583 | chalk "^2.3.0" 584 | commander "^2.12.1" 585 | diff "^3.2.0" 586 | glob "^7.1.1" 587 | js-yaml "^3.7.0" 588 | minimatch "^3.0.4" 589 | resolve "^1.3.2" 590 | semver "^5.3.0" 591 | tslib "^1.8.0" 592 | tsutils "^2.27.2" 593 | 594 | tsutils@^2.27.2, "tsutils@^2.27.2 <2.29.0": 595 | version "2.28.0" 596 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1" 597 | dependencies: 598 | tslib "^1.8.1" 599 | 600 | tsutils@^2.29.0: 601 | version "2.29.0" 602 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 603 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 604 | dependencies: 605 | tslib "^1.8.1" 606 | 607 | tsutils@^3.0.0, tsutils@^3.5.0: 608 | version "3.10.0" 609 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.10.0.tgz#6f1c95c94606e098592b0dff06590cf9659227d6" 610 | integrity sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q== 611 | dependencies: 612 | tslib "^1.8.1" 613 | 614 | typescript@^3.4.4: 615 | version "3.4.4" 616 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.4.tgz#aac4a08abecab8091a75f10842ffa0631818f785" 617 | integrity sha512-xt5RsIRCEaf6+j9AyOBgvVuAec0i92rgCaS3S+UVf5Z/vF2Hvtsw08wtUTJqp4djwznoAgjSxeCcU4r+CcDBJA== 618 | 619 | util.promisify@^1.0.0: 620 | version "1.0.0" 621 | resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" 622 | dependencies: 623 | define-properties "^1.1.2" 624 | object.getownpropertydescriptors "^2.0.3" 625 | 626 | whatwg-fetch@>=0.10.0: 627 | version "2.0.4" 628 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" 629 | 630 | wrappy@1: 631 | version "1.0.2" 632 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 633 | 634 | yallist@^2.1.2: 635 | version "2.1.2" 636 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 637 | 638 | yn@^2.0.0: 639 | version "2.0.0" 640 | resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" 641 | 642 | zen-observable-ts@^0.8.9: 643 | version "0.8.9" 644 | resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.9.tgz#d3c97af08c0afdca37ebcadf7cc3ee96bda9bab1" 645 | dependencies: 646 | zen-observable "^0.8.0" 647 | 648 | zen-observable@^0.8.0: 649 | version "0.8.8" 650 | resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.8.tgz#1ea93995bf098754a58215a1e0a7309e5749ec42" 651 | --------------------------------------------------------------------------------