├── .circleci └── config.yml ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── package.json ├── renovate.json ├── src ├── index.ts └── prepare.ts ├── tsconfig.json └── yarn.lock /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | jobs: 3 | build: 4 | working_directory: ~/graphql-cli-prepare 5 | docker: 6 | - image: circleci/node:latest 7 | steps: 8 | - checkout 9 | - run: sudo npm install -g yarn semantic-release 10 | - run: yarn install 11 | - run: yarn test 12 | - run: semantic-release 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | .circleci 3 | renovate.json -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 SuperGraph 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 | # graphql-cli-prepare [![npm](https://img.shields.io/npm/v/graphql-cli-prepare.svg?style=flat-square)](https://www.npmjs.com/package/graphql-cli-prepare) 2 | [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg?style=flat-square)](https://github.com/semantic-release/semantic-release)[![CircleCI](https://img.shields.io/circleci/project/github/supergraphql/graphql-cli-prepare.svg?style=flat-square)](https://circleci.com/gh/supergraphql/graphql-cli-prepare)[![Greenkeeper badge](https://img.shields.io/badge/renovate-enabled-brightgreen.svg?style=flat-square)](https://renovateapp.com/)[![Code Climate](https://img.shields.io/codeclimate/maintainability/supergraphql/graphql-cli-prepare.svg?style=flat-square)](https://codeclimate.com/github/supergraphql/graphql-cli-prepare) 3 | Plugin for [`graphql-cli`](https://github.com/graphql-cli/graphql-cli) to bundle schemas using [`graphql-import`](https://github.com/graphcool/graphql-import) and generate bindings using [`graphql-static-binding`](https://github.com/supergraphql/graphql-static-binding). 4 | 5 | ## Installation 6 | 7 | The `graphql-cli-prepare` plugin is shipped with `graphql-cli`. 8 | 9 | ## Usage 10 | ``` 11 | graphql prepare 12 | 13 | Bundle schemas and generate bindings 14 | 15 | Options: 16 | --dotenv Path to .env file [string] 17 | -p, --project Project name [string] 18 | --output, -o Output folder [string] 19 | --save, -s Save settings to config file [boolean] [default: "false"] 20 | --bundle Process schema imports [boolean] [default: "false"] 21 | --bindings Generate bindings [boolean] [default: "false"] 22 | --generator, -g Generator used to generate bindings [string] 23 | --verbose Show verbose output messages [boolean] [default: "false"] 24 | -h, --help Show help [boolean] 25 | -v, --version Show version number [boolean] 26 | ``` 27 | 28 | ### Schema bundling 29 | Schema bundling is the processing of `import` statements in a GraphQL schema. For more information, see [`graphql-import`](https://github.com/graphcool/graphql-import). 30 | The first time you use schema bundling on a project, you need to provide the output folder where the processed schema will be stored: 31 | ```shell 32 | $ graphql prepare -p app -o src/generated --bundle --save 33 | √ Bundled schema for project app written to src/generated/app.graphql 34 | ``` 35 | This will also save the configuration in your `.graphqlconfig` file (see below). 36 | 37 | ### Binding generation 38 | Binding generation is a code generation process. A binding file will be generated for use with [`graphql-yoga`](https://github.com/graphcool/graphql-yoga/). This binding provides type safe delegation of GraphQL queries and mutations in your resolvers. See [`graphcool-binding`](https://github.com/graphcool/graphcool-binding) for more information. 39 | The first time you use binding generation in your project, you need to provide an output folder for your generated binding files, and the generator you want to use: 40 | ```shell 41 | $ graphql prepare -p database -o src/generated -g graphcool-ts --bindings --save 42 | √ Bindings for project database written to src/generated/database.ts 43 | ``` 44 | This will also save the configuration in your `.graphqlconfig` file (see below). 45 | 46 | ### Automating `graphql prepare` 47 | After you have set up bundling and binding generation for all projects, you can simply run `graphql prepare` without any parameters to process all projects: 48 | ```shell 49 | $ graphql prepare 50 | √ Bundled schema for project app written to src/generated/app.graphql 51 | √ Bindings for project database written to src/generated/database.ts 52 | ``` 53 | ## Advanced topics 54 | 55 | ### Available generators 56 | Out of the box, the following generators are provided by [`graphql-static-binding`](https://github.com/supergraphql/graphql-static-binding): 57 | 58 | | Generator | Purpose | 59 | | ------------ | -------------------------------------------- | 60 | | prisma-ts | Typescript bindings for Prisma endpoints | 61 | | prisma-js | Javascript bindings for Prisma endpoints | 62 | | binding-ts | Typescript bindings for any GraphQL endpoint | 63 | | binding-js | Javascript bindings for any GraphQL endpoint | 64 | 65 | ### Using your own generator 66 | You can also use your own generator. To do so, you can pass a file path to the `--generator` parameter: 67 | ```shell 68 | $ graphql prepare -p database --bindings -g ./myGenerator.js 69 | ``` 70 | >More instructions for creating your own generator are coming soon in [`graphql-static-binding`](https://github.com/supergraphql/graphql-static-binding). 71 | 72 | ### `graphql-config` extensions 73 | 74 | To store the project configuration for bundling and bindings, `graphql-cli-prepare` uses two extension keys in the `graphql-config` configuration file. These keys can be set manually, or using the `--save` parameter. 75 | ```diff 76 | # ./.graphqlconfig.yml 77 | projects: 78 | app: 79 | schemaPath: src/schema.graphql 80 | extensions: 81 | endpoints: 82 | default: 'http://localhost:4000' 83 | + prepare-bundle: src/generated/app.graphql 84 | database: 85 | schemaPath: src/generated/prisma.graphql 86 | extensions: 87 | prisma: prisma.yml 88 | + prepare-binding: 89 | + output: src/generated/prisma.ts 90 | + generator: prisma-ts 91 | 92 | ``` 93 | 94 |
95 |

96 | 97 |

98 | 99 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graphql-cli-prepare", 3 | "version": "0.0.0-development", 4 | "description": "Plugin for graphql-cli to bundle schemas and generate bindings", 5 | "main": "dist/index.js", 6 | "typings": "dist/index.d.ts", 7 | "scripts": { 8 | "prepublish": "npm run build", 9 | "build": "tsc -d", 10 | "pretest": "npm run build", 11 | "test": "tslint src/**/*.ts" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/graphql-cli/graphql-cli-prepare.git" 16 | }, 17 | "keywords": [ 18 | "graphql", 19 | "graphql-cli" 20 | ], 21 | "author": "Kim Brandwijk ", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/graphql-cli/graphql-cli-prepare/issues" 25 | }, 26 | "homepage": "https://github.com/graphql-cli/graphql-cli-prepare#readme", 27 | "devDependencies": { 28 | "@types/fs-extra": "5.0.1", 29 | "@types/inquirer": "0.0.36", 30 | "@types/node": "9.4.6", 31 | "@types/yargs": "11.0.0", 32 | "graphql": "0.13.1", 33 | "graphql-config": "2.0.1", 34 | "tslint": "5.9.1", 35 | "typescript": "2.7.2" 36 | }, 37 | "release": { 38 | "branch": "master" 39 | }, 40 | "dependencies": { 41 | "chalk": "2.3.1", 42 | "fs-extra": "5.0.0", 43 | "graphql-import": "0.4.5", 44 | "graphql-static-binding": "0.9.3", 45 | "lodash": "4.17.5" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "semanticCommits": true, 3 | "automerge": true, 4 | "extends": [ 5 | "config:base" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { Prepare } from './prepare' 2 | import { CommandBuilder } from 'yargs' 3 | 4 | const command: { 5 | command: string 6 | describe?: string 7 | handler: (context: any, argv: any) => any 8 | builder?: CommandBuilder 9 | } = { 10 | command: 'prepare', 11 | describe: 'Bundle schemas and generate bindings', 12 | 13 | builder: { 14 | output: { 15 | alias: 'o', 16 | describe: 'Output folder', 17 | type: 'string' 18 | }, 19 | save: { 20 | alias: 's', 21 | describe: 'Save settings to config file', 22 | type: 'boolean', 23 | default: 'false' 24 | }, 25 | bundle: { 26 | describe: 'Process schema imports', 27 | type: 'boolean', 28 | default: 'false' 29 | }, 30 | bindings: { 31 | describe: 'Generate bindings', 32 | type: 'boolean', 33 | default: 'false' 34 | }, 35 | generator: { 36 | alias: 'g', 37 | describe: 'Generator used to generate bindings', 38 | type: 'string' 39 | }, 40 | verbose: { 41 | describe: 'Show verbose output messages', 42 | type: 'boolean', 43 | default: 'false' 44 | } 45 | }, 46 | 47 | handler: async (context: any, argv) => { 48 | if (!argv.bundle && !argv.bindings) { 49 | argv.bundle = argv.bindings = true 50 | } 51 | 52 | const prepare = new Prepare(context, argv) 53 | await prepare.handle() 54 | } 55 | } 56 | 57 | export = command 58 | -------------------------------------------------------------------------------- /src/prepare.ts: -------------------------------------------------------------------------------- 1 | import chalk from 'chalk' 2 | import * as fs from 'fs-extra' 3 | import { GraphQLConfig, GraphQLProjectConfig } from 'graphql-config' 4 | import { importSchema } from 'graphql-import' 5 | import { generateCode } from 'graphql-static-binding' 6 | import { get, has, merge } from 'lodash' 7 | import * as path from 'path' 8 | import { Arguments } from 'yargs' 9 | 10 | export class Prepare { 11 | private config: GraphQLConfig 12 | private bundleExtensionConfig: { 'prepare-bundle': string } | undefined 13 | private projectName: string 14 | private project: GraphQLProjectConfig 15 | 16 | constructor(private context: any, private argv: Arguments) {} 17 | 18 | public async handle() { 19 | this.config = await this.context.getConfig() 20 | 21 | // Get projects 22 | const projects: { [name: string]: GraphQLProjectConfig } = this.getProjectConfig() 23 | 24 | // Process each project 25 | for (const projectName of Object.keys(projects)) { 26 | const project: GraphQLProjectConfig = projects[projectName] 27 | 28 | this.setCurrentProject(project, projectName) 29 | if (this.argv.bundle) { 30 | this.bundle() 31 | } 32 | if (this.argv.bindings) { 33 | this.bindings() 34 | } 35 | this.save() 36 | } 37 | } 38 | 39 | private setCurrentProject(project: GraphQLProjectConfig, projectName: string): void { 40 | this.project = project 41 | this.projectName = projectName 42 | this.bundleExtensionConfig = undefined 43 | } 44 | 45 | private bindings() { 46 | let bindingExtensionConfig: { 'prepare-binding': { output: string; generator: string } } | undefined 47 | 48 | if ( 49 | this.argv.project || 50 | (!this.argv.project && 51 | (has(this.project.config, 'extensions.prepare-binding') || 52 | has(this.project.config, 'extensions.binding'))) 53 | ) { 54 | this.context.spinner.start(`Generating bindings for project ${this.projectDisplayName()}...`) 55 | bindingExtensionConfig = this.processBindings( 56 | this.bundleExtensionConfig ? this.bundleExtensionConfig['prepare-bundle'] : undefined 57 | ) 58 | merge(this.project.extensions, bindingExtensionConfig) 59 | this.context.spinner.succeed( 60 | `Bindings for project ${this.projectDisplayName()} written to ${chalk.green( 61 | bindingExtensionConfig['prepare-binding'].output 62 | )}` 63 | ) 64 | } else if (this.argv.verbose) { 65 | this.context.spinner.info( 66 | `Binding not configured for project ${this.projectDisplayName()}. Skipping` 67 | ) 68 | } 69 | } 70 | 71 | private bundle() { 72 | if ( 73 | this.argv.project || 74 | (!this.argv.project && 75 | (has(this.project.config, 'extensions.prepare-bundle') || 76 | has(this.project.config, 'extensions.bundle'))) 77 | ) { 78 | this.context.spinner.start(`Processing schema imports for project ${this.projectDisplayName()}...`) 79 | this.bundleExtensionConfig = this.processBundle() 80 | merge(this.project.extensions, this.bundleExtensionConfig) 81 | this.context.spinner.succeed( 82 | `Bundled schema for project ${this.projectDisplayName()} written to ${chalk.green( 83 | this.bundleExtensionConfig['prepare-bundle'] 84 | )}` 85 | ) 86 | } else if (this.argv.verbose) { 87 | this.context.spinner.info( 88 | `Bundling not configured for project ${this.projectDisplayName()}. Skipping` 89 | ) 90 | } 91 | } 92 | 93 | private save() { 94 | if (this.argv.save) { 95 | const configFile = path.basename(this.config.configPath) 96 | this.context.spinner.start( 97 | `Saving configuration for project ${this.projectDisplayName()} to ${chalk.green(configFile)}...` 98 | ) 99 | this.saveConfig() 100 | this.context.spinner.succeed( 101 | `Configuration for project ${this.projectDisplayName()} saved to ${chalk.green(configFile)}` 102 | ) 103 | } 104 | } 105 | 106 | private getProjectConfig(): { [name: string]: GraphQLProjectConfig } { 107 | let projects: { [name: string]: GraphQLProjectConfig } | undefined 108 | if (this.argv.project) { 109 | if (Array.isArray(this.argv.project)) { 110 | projects = {} 111 | this.argv.project.map((p: string) => merge(projects, { [p]: this.config.getProjectConfig(p) })) 112 | } else { 113 | // Single project mode 114 | projects = { [this.argv.project]: this.config.getProjectConfig(this.argv.project) } 115 | } 116 | } else { 117 | // Process all projects 118 | projects = this.config.getProjects() 119 | } 120 | 121 | if (!projects) { 122 | throw new Error('No projects defined in config file') 123 | } 124 | 125 | return projects 126 | } 127 | 128 | private processBundle(): { 'prepare-bundle': string } { 129 | const outputPath: string = this.determineBundleOutputPath() 130 | const schemaPath: string = this.determineSchemaPath() 131 | 132 | const finalSchema = importSchema(schemaPath) 133 | 134 | fs.writeFileSync(outputPath, finalSchema, { flag: 'w' }) 135 | 136 | return { 'prepare-bundle': outputPath } 137 | } 138 | 139 | private processBindings( 140 | schemaPath: string | undefined 141 | ): { 'prepare-binding': { output: string; generator: string } } { 142 | const generator: string = this.determineGenerator() 143 | // TODO: This does not support custom generators 144 | const extension = generator.endsWith('ts') ? 'ts' : 'js' 145 | const outputPath: string = this.determineBindingOutputPath(extension) 146 | const schema: string = this.determineInputSchema(schemaPath) 147 | 148 | const schemaContents: string = importSchema(schema) 149 | const finalSchema: string = generateCode(schemaContents, generator) 150 | fs.writeFileSync(outputPath, finalSchema, { flag: 'w' }) 151 | 152 | return { 'prepare-binding': { output: outputPath, generator: generator } } 153 | } 154 | 155 | private saveConfig() { 156 | if (has(this.project.config, 'extensions.bundle')) { 157 | delete this.project.config.extensions!.bundle 158 | } 159 | if (has(this.project.config, 'extensions.binding')) { 160 | delete this.project.config.extensions!.binding 161 | } 162 | this.config.saveConfig(this.project.config, this.projectName) 163 | } 164 | 165 | /** 166 | * Determine input schema path for binding. It uses the resulting schema from bundling (if available), 167 | * then looks at bundle extension (in case bundling ran before), then takes the project schemaPath. 168 | * Also checks if the file exists, otherwise it throws and error. 169 | * 170 | * @param {(string | undefined)} schemaPath Schema path from bundling 171 | * @returns {string} Input schema path to be used for binding generatio. 172 | */ 173 | private determineInputSchema(schemaPath: string | undefined): string { 174 | const bundleDefined = has(this.project.config, 'extensions.prepare-bundle.output') 175 | const oldBundleDefined = has(this.project.config, 'extensions.bundle.output') 176 | // schemaPath is only set when bundle ran 177 | if (!schemaPath) { 178 | if (bundleDefined) { 179 | // Otherwise, use bundle output schema if defined 180 | schemaPath = get(this.project.config, 'extensions.prepare-bundle.output') 181 | } else if (oldBundleDefined) { 182 | schemaPath = get(this.project.config, 'extensions.bundle.output') 183 | } else if (this.project.schemaPath) { 184 | // Otherwise, use project schemaPath 185 | schemaPath = this.project.schemaPath 186 | } else { 187 | throw new Error(`Input schema cannot be determined.`) 188 | } 189 | } 190 | 191 | if (fs.existsSync(schemaPath!)) { 192 | return schemaPath! 193 | } else { 194 | throw new Error( 195 | `Schema '${schemaPath!}' not found.${bundleDefined ? ' Did you run bundle first?' : ''}` 196 | ) 197 | } 198 | } 199 | 200 | /** 201 | * Determine input schema path for bundling. 202 | * 203 | * @returns {string} Input schema path for bundling 204 | */ 205 | private determineSchemaPath(): string { 206 | if (this.project.schemaPath) { 207 | return this.project.schemaPath 208 | } 209 | throw new Error(`No schemaPath defined for project '${this.projectName}' in config file.`) 210 | } 211 | 212 | /** 213 | * Determine generator. Provided generator takes precedence over value from config 214 | * 215 | * @param {string} generator Command line parameter for generator 216 | * @returns {string} Generator to be used 217 | */ 218 | private determineGenerator(): string { 219 | if (this.argv.generator) { 220 | return this.argv.generator 221 | } 222 | if (has(this.project.config, 'extensions.binding.generator')) { 223 | if (!this.argv.save) { 224 | this.context.spinner.warn( 225 | `Deprecated extension key 'binding.generator' found in config file. Use '--save' to update to 'prepare-binding.generator'.` 226 | ) 227 | } 228 | return get(this.project.config, 'extensions.binding.generator') 229 | } 230 | if (has(this.project.config, 'extensions.prepare-binding.generator')) { 231 | return get(this.project.config, 'extensions.prepare-binding.generator') 232 | } 233 | throw new Error( 234 | 'Generator cannot be determined. No existing configuration found and no generator parameter specified.' 235 | ) 236 | } 237 | 238 | /** 239 | * Determine output path for binding. Provided path takes precedence over value from config 240 | * 241 | * @param {string} extension File extension for output file 242 | * @returns Output path 243 | */ 244 | private determineBindingOutputPath(extension: string) { 245 | let outputPath: string 246 | if (this.argv.output) { 247 | outputPath = path.join(this.argv.output, `${this.projectName}.${extension}`) 248 | } else if (has(this.project.config, `extensions.binding.output`)) { 249 | if (!this.argv.save) { 250 | this.context.spinner.warn( 251 | `Deprecated extension key 'binding.output' found in config file. Use '--save' to update to 'prepare-binding.output'.` 252 | ) 253 | } 254 | outputPath = get(this.project.config, `extensions.binding.output`) 255 | } else if (has(this.project.config, `extensions.prepare-binding.output`)) { 256 | outputPath = get(this.project.config, `extensions.prepare-binding.output`) 257 | } else { 258 | throw new Error( 259 | 'Output path cannot be determined. No existing configuration found and no output parameter specified.' 260 | ) 261 | } 262 | 263 | fs.ensureDirSync(path.dirname(outputPath)) 264 | return outputPath 265 | } 266 | 267 | /** 268 | * Determine output path for bundle. Provided path takes precedence over value from config 269 | * 270 | * @returns Output path 271 | */ 272 | private determineBundleOutputPath() { 273 | let outputPath: string 274 | if (this.argv.output) { 275 | outputPath = path.join(this.argv.output, `${this.projectName}.graphql`) 276 | } else if (has(this.project.config, `extensions.bundle`)) { 277 | if (!this.argv.save) { 278 | this.context.spinner.warn( 279 | `Deprecated extension key 'bundle' found in config file. Use '--save' to update to 'prepare-bundle'.` 280 | ) 281 | } 282 | outputPath = get(this.project.config, `extensions.bundle`) 283 | } else if (has(this.project.config, `extensions.prepare-bundle`)) { 284 | outputPath = get(this.project.config, `extensions.prepare-bundle`) 285 | } else { 286 | throw new Error( 287 | 'Output path cannot be determined. No existing configuration found and no output parameter specified.' 288 | ) 289 | } 290 | 291 | fs.ensureDirSync(path.dirname(outputPath)) 292 | return outputPath 293 | } 294 | 295 | private projectDisplayName = () => chalk.green(this.projectName) 296 | } 297 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "preserveConstEnums": true, 4 | "strictNullChecks": true, 5 | "sourceMap": true, 6 | "target": "es5", 7 | "outDir": "dist", 8 | "moduleResolution": "node", 9 | "lib": [ 10 | "es2017", 11 | "esnext.asynciterable", 12 | "dom" 13 | ] 14 | }, 15 | "exclude": [ 16 | "node_modules", 17 | "dist" 18 | ], 19 | "include": [ 20 | "./src/**/*.ts" 21 | ] 22 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/fs-extra@5.0.1": 6 | version "5.0.1" 7 | resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.1.tgz#cd856fbbdd6af2c11f26f8928fd8644c9e9616c9" 8 | dependencies: 9 | "@types/node" "*" 10 | 11 | "@types/inquirer@0.0.36": 12 | version "0.0.36" 13 | resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-0.0.36.tgz#d27aae262b127ffc2e6dbf8e14e8caf7f7c059a3" 14 | dependencies: 15 | "@types/rx" "*" 16 | "@types/through" "*" 17 | 18 | "@types/node@*": 19 | version "8.5.2" 20 | resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.2.tgz#83b8103fa9a2c2e83d78f701a9aa7c9539739aa5" 21 | 22 | "@types/node@9.4.6": 23 | version "9.4.6" 24 | resolved "https://registry.yarnpkg.com/@types/node/-/node-9.4.6.tgz#d8176d864ee48753d053783e4e463aec86b8d82e" 25 | 26 | "@types/rx-core-binding@*": 27 | version "4.0.4" 28 | resolved "https://registry.yarnpkg.com/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz#d969d32f15a62b89e2862c17b3ee78fe329818d3" 29 | dependencies: 30 | "@types/rx-core" "*" 31 | 32 | "@types/rx-core@*": 33 | version "4.0.3" 34 | resolved "https://registry.yarnpkg.com/@types/rx-core/-/rx-core-4.0.3.tgz#0b3354b1238cedbe2b74f6326f139dbc7a591d60" 35 | 36 | "@types/rx-lite-aggregates@*": 37 | version "4.0.3" 38 | resolved "https://registry.yarnpkg.com/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz#6efb2b7f3d5f07183a1cb2bd4b1371d7073384c2" 39 | dependencies: 40 | "@types/rx-lite" "*" 41 | 42 | "@types/rx-lite-async@*": 43 | version "4.0.2" 44 | resolved "https://registry.yarnpkg.com/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz#27fbf0caeff029f41e2d2aae638b05e91ceb600c" 45 | dependencies: 46 | "@types/rx-lite" "*" 47 | 48 | "@types/rx-lite-backpressure@*": 49 | version "4.0.3" 50 | resolved "https://registry.yarnpkg.com/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz#05abb19bdf87cc740196c355e5d0b37bb50b5d56" 51 | dependencies: 52 | "@types/rx-lite" "*" 53 | 54 | "@types/rx-lite-coincidence@*": 55 | version "4.0.3" 56 | resolved "https://registry.yarnpkg.com/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz#80bd69acc4054a15cdc1638e2dc8843498cd85c0" 57 | dependencies: 58 | "@types/rx-lite" "*" 59 | 60 | "@types/rx-lite-experimental@*": 61 | version "4.0.1" 62 | resolved "https://registry.yarnpkg.com/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz#c532f5cbdf3f2c15da16ded8930d1b2984023cbd" 63 | dependencies: 64 | "@types/rx-lite" "*" 65 | 66 | "@types/rx-lite-joinpatterns@*": 67 | version "4.0.1" 68 | resolved "https://registry.yarnpkg.com/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz#f70fe370518a8432f29158cc92ffb56b4e4afc3e" 69 | dependencies: 70 | "@types/rx-lite" "*" 71 | 72 | "@types/rx-lite-testing@*": 73 | version "4.0.1" 74 | resolved "https://registry.yarnpkg.com/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz#21b19d11f4dfd6ffef5a9d1648e9c8879bfe21e9" 75 | dependencies: 76 | "@types/rx-lite-virtualtime" "*" 77 | 78 | "@types/rx-lite-time@*": 79 | version "4.0.3" 80 | resolved "https://registry.yarnpkg.com/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz#0eda65474570237598f3448b845d2696f2dbb1c4" 81 | dependencies: 82 | "@types/rx-lite" "*" 83 | 84 | "@types/rx-lite-virtualtime@*": 85 | version "4.0.3" 86 | resolved "https://registry.yarnpkg.com/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz#4b30cacd0fe2e53af29f04f7438584c7d3959537" 87 | dependencies: 88 | "@types/rx-lite" "*" 89 | 90 | "@types/rx-lite@*": 91 | version "4.0.5" 92 | resolved "https://registry.yarnpkg.com/@types/rx-lite/-/rx-lite-4.0.5.tgz#b3581525dff69423798daa9a0d33c1e66a5e8c4c" 93 | dependencies: 94 | "@types/rx-core" "*" 95 | "@types/rx-core-binding" "*" 96 | 97 | "@types/rx@*": 98 | version "4.1.1" 99 | resolved "https://registry.yarnpkg.com/@types/rx/-/rx-4.1.1.tgz#598fc94a56baed975f194574e0f572fd8e627a48" 100 | dependencies: 101 | "@types/rx-core" "*" 102 | "@types/rx-core-binding" "*" 103 | "@types/rx-lite" "*" 104 | "@types/rx-lite-aggregates" "*" 105 | "@types/rx-lite-async" "*" 106 | "@types/rx-lite-backpressure" "*" 107 | "@types/rx-lite-coincidence" "*" 108 | "@types/rx-lite-experimental" "*" 109 | "@types/rx-lite-joinpatterns" "*" 110 | "@types/rx-lite-testing" "*" 111 | "@types/rx-lite-time" "*" 112 | "@types/rx-lite-virtualtime" "*" 113 | 114 | "@types/through@*": 115 | version "0.0.29" 116 | resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.29.tgz#72943aac922e179339c651fa34a4428a4d722f93" 117 | dependencies: 118 | "@types/node" "*" 119 | 120 | "@types/yargs@11.0.0": 121 | version "11.0.0" 122 | resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-11.0.0.tgz#124b9ed9c65b7091cc36da59ae12cbd47d8745ea" 123 | 124 | ansi-regex@^2.0.0: 125 | version "2.1.1" 126 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 127 | 128 | ansi-styles@^2.2.1: 129 | version "2.2.1" 130 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 131 | 132 | ansi-styles@^3.1.0, ansi-styles@^3.2.0: 133 | version "3.2.0" 134 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 135 | dependencies: 136 | color-convert "^1.9.0" 137 | 138 | argparse@^1.0.7: 139 | version "1.0.9" 140 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 141 | dependencies: 142 | sprintf-js "~1.0.2" 143 | 144 | babel-code-frame@^6.22.0: 145 | version "6.26.0" 146 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 147 | dependencies: 148 | chalk "^1.1.3" 149 | esutils "^2.0.2" 150 | js-tokens "^3.0.2" 151 | 152 | balanced-match@^1.0.0: 153 | version "1.0.0" 154 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 155 | 156 | brace-expansion@^1.1.7: 157 | version "1.1.8" 158 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 159 | dependencies: 160 | balanced-match "^1.0.0" 161 | concat-map "0.0.1" 162 | 163 | builtin-modules@^1.1.1: 164 | version "1.1.1" 165 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 166 | 167 | chalk@2.3.1: 168 | version "2.3.1" 169 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" 170 | dependencies: 171 | ansi-styles "^3.2.0" 172 | escape-string-regexp "^1.0.5" 173 | supports-color "^5.2.0" 174 | 175 | chalk@^1.1.3: 176 | version "1.1.3" 177 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 178 | dependencies: 179 | ansi-styles "^2.2.1" 180 | escape-string-regexp "^1.0.2" 181 | has-ansi "^2.0.0" 182 | strip-ansi "^3.0.0" 183 | supports-color "^2.0.0" 184 | 185 | chalk@^2.3.0: 186 | version "2.3.0" 187 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" 188 | dependencies: 189 | ansi-styles "^3.1.0" 190 | escape-string-regexp "^1.0.5" 191 | supports-color "^4.0.0" 192 | 193 | color-convert@^1.9.0: 194 | version "1.9.1" 195 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 196 | dependencies: 197 | color-name "^1.1.1" 198 | 199 | color-name@^1.1.1: 200 | version "1.1.3" 201 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 202 | 203 | commander@^2.12.1: 204 | version "2.12.2" 205 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" 206 | 207 | concat-map@0.0.1: 208 | version "0.0.1" 209 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 210 | 211 | cross-fetch@2.0.0: 212 | version "2.0.0" 213 | resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.0.0.tgz#a17475449561e0f325146cea636a8619efb9b382" 214 | dependencies: 215 | node-fetch "2.0.0" 216 | whatwg-fetch "2.0.3" 217 | 218 | cucumber-html-reporter@^3.0.4: 219 | version "3.0.4" 220 | resolved "https://registry.yarnpkg.com/cucumber-html-reporter/-/cucumber-html-reporter-3.0.4.tgz#1be0dee83f30a2f4719207859a5440ce082ffadd" 221 | dependencies: 222 | find "^0.2.7" 223 | fs-extra "^3.0.1" 224 | js-base64 "^2.3.2" 225 | jsonfile "^3.0.0" 226 | lodash "^4.17.2" 227 | open "0.0.5" 228 | 229 | diff@^3.2.0: 230 | version "3.4.0" 231 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" 232 | 233 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 234 | version "1.0.5" 235 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 236 | 237 | esprima@^4.0.0: 238 | version "4.0.0" 239 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 240 | 241 | esutils@^2.0.2: 242 | version "2.0.2" 243 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 244 | 245 | find@^0.2.7: 246 | version "0.2.7" 247 | resolved "https://registry.yarnpkg.com/find/-/find-0.2.7.tgz#7afbd00f8f08c5b622f97cda6f714173d547bb3f" 248 | dependencies: 249 | traverse-chain "~0.1.0" 250 | 251 | fs-extra@5.0.0: 252 | version "5.0.0" 253 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" 254 | dependencies: 255 | graceful-fs "^4.1.2" 256 | jsonfile "^4.0.0" 257 | universalify "^0.1.0" 258 | 259 | fs-extra@^3.0.1: 260 | version "3.0.1" 261 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" 262 | dependencies: 263 | graceful-fs "^4.1.2" 264 | jsonfile "^3.0.0" 265 | universalify "^0.1.0" 266 | 267 | fs.realpath@^1.0.0: 268 | version "1.0.0" 269 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 270 | 271 | glob@^7.1.1: 272 | version "7.1.2" 273 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 274 | dependencies: 275 | fs.realpath "^1.0.0" 276 | inflight "^1.0.4" 277 | inherits "2" 278 | minimatch "^3.0.4" 279 | once "^1.3.0" 280 | path-is-absolute "^1.0.0" 281 | 282 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 283 | version "4.1.11" 284 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 285 | 286 | graphql-config@2.0.1: 287 | version "2.0.1" 288 | resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-2.0.1.tgz#d34a9bdf1d7360af7b01db9b20260a342ddc7390" 289 | dependencies: 290 | graphql-import "^0.4.4" 291 | graphql-request "^1.5.0" 292 | js-yaml "^3.10.0" 293 | lodash "^4.17.4" 294 | minimatch "^3.0.4" 295 | 296 | graphql-import@0.4.5, graphql-import@^0.4.4: 297 | version "0.4.5" 298 | resolved "https://registry.yarnpkg.com/graphql-import/-/graphql-import-0.4.5.tgz#e2f18c28d335733f46df8e0733d8deb1c6e2a645" 299 | dependencies: 300 | lodash "^4.17.4" 301 | 302 | graphql-request@^1.5.0: 303 | version "1.5.1" 304 | resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-1.5.1.tgz#cccdf5cce6432ca062b90f7b63793c77c821ff9a" 305 | dependencies: 306 | cross-fetch "2.0.0" 307 | 308 | graphql-static-binding@0.9.3: 309 | version "0.9.3" 310 | resolved "https://registry.yarnpkg.com/graphql-static-binding/-/graphql-static-binding-0.9.3.tgz#67a51ed2e720edda5a250898af037ebf9dac57cf" 311 | dependencies: 312 | cucumber-html-reporter "^3.0.4" 313 | 314 | graphql@0.13.1: 315 | version "0.13.1" 316 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.1.tgz#9b3db3d8e40d1827e4172404bfdd2e4e17a58b55" 317 | dependencies: 318 | iterall "^1.2.0" 319 | 320 | has-ansi@^2.0.0: 321 | version "2.0.0" 322 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 323 | dependencies: 324 | ansi-regex "^2.0.0" 325 | 326 | has-flag@^2.0.0: 327 | version "2.0.0" 328 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 329 | 330 | has-flag@^3.0.0: 331 | version "3.0.0" 332 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 333 | 334 | inflight@^1.0.4: 335 | version "1.0.6" 336 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 337 | dependencies: 338 | once "^1.3.0" 339 | wrappy "1" 340 | 341 | inherits@2: 342 | version "2.0.3" 343 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 344 | 345 | iterall@^1.2.0: 346 | version "1.2.2" 347 | resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" 348 | 349 | js-base64@^2.3.2: 350 | version "2.4.0" 351 | resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa" 352 | 353 | js-tokens@^3.0.2: 354 | version "3.0.2" 355 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 356 | 357 | js-yaml@^3.10.0, js-yaml@^3.7.0: 358 | version "3.10.0" 359 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" 360 | dependencies: 361 | argparse "^1.0.7" 362 | esprima "^4.0.0" 363 | 364 | jsonfile@^3.0.0: 365 | version "3.0.1" 366 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" 367 | optionalDependencies: 368 | graceful-fs "^4.1.6" 369 | 370 | jsonfile@^4.0.0: 371 | version "4.0.0" 372 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 373 | optionalDependencies: 374 | graceful-fs "^4.1.6" 375 | 376 | lodash@4.17.5: 377 | version "4.17.5" 378 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" 379 | 380 | lodash@^4.17.2, lodash@^4.17.4: 381 | version "4.17.4" 382 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 383 | 384 | minimatch@^3.0.4: 385 | version "3.0.4" 386 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 387 | dependencies: 388 | brace-expansion "^1.1.7" 389 | 390 | node-fetch@2.0.0: 391 | version "2.0.0" 392 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.0.0.tgz#982bba43ecd4f2922a29cc186a6bbb0bb73fcba6" 393 | 394 | once@^1.3.0: 395 | version "1.4.0" 396 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 397 | dependencies: 398 | wrappy "1" 399 | 400 | open@0.0.5: 401 | version "0.0.5" 402 | resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" 403 | 404 | path-is-absolute@^1.0.0: 405 | version "1.0.1" 406 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 407 | 408 | path-parse@^1.0.5: 409 | version "1.0.5" 410 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 411 | 412 | resolve@^1.3.2: 413 | version "1.5.0" 414 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" 415 | dependencies: 416 | path-parse "^1.0.5" 417 | 418 | semver@^5.3.0: 419 | version "5.4.1" 420 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 421 | 422 | sprintf-js@~1.0.2: 423 | version "1.0.3" 424 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 425 | 426 | strip-ansi@^3.0.0: 427 | version "3.0.1" 428 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 429 | dependencies: 430 | ansi-regex "^2.0.0" 431 | 432 | supports-color@^2.0.0: 433 | version "2.0.0" 434 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 435 | 436 | supports-color@^4.0.0: 437 | version "4.5.0" 438 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 439 | dependencies: 440 | has-flag "^2.0.0" 441 | 442 | supports-color@^5.2.0: 443 | version "5.2.0" 444 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" 445 | dependencies: 446 | has-flag "^3.0.0" 447 | 448 | traverse-chain@~0.1.0: 449 | version "0.1.0" 450 | resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" 451 | 452 | tslib@^1.8.0: 453 | version "1.8.1" 454 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.1.tgz#6946af2d1d651a7b1863b531d6e5afa41aa44eac" 455 | 456 | tslint@5.9.1: 457 | version "5.9.1" 458 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.9.1.tgz#1255f87a3ff57eb0b0e1f0e610a8b4748046c9ae" 459 | dependencies: 460 | babel-code-frame "^6.22.0" 461 | builtin-modules "^1.1.1" 462 | chalk "^2.3.0" 463 | commander "^2.12.1" 464 | diff "^3.2.0" 465 | glob "^7.1.1" 466 | js-yaml "^3.7.0" 467 | minimatch "^3.0.4" 468 | resolve "^1.3.2" 469 | semver "^5.3.0" 470 | tslib "^1.8.0" 471 | tsutils "^2.12.1" 472 | 473 | tsutils@^2.12.1: 474 | version "2.14.0" 475 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.14.0.tgz#bc5291622aa2448c1baffc544bcc14ecfa528fb7" 476 | dependencies: 477 | tslib "^1.8.0" 478 | 479 | typescript@2.7.2: 480 | version "2.7.2" 481 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836" 482 | 483 | universalify@^0.1.0: 484 | version "0.1.1" 485 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" 486 | 487 | whatwg-fetch@2.0.3: 488 | version "2.0.3" 489 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" 490 | 491 | wrappy@1: 492 | version "1.0.2" 493 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 494 | --------------------------------------------------------------------------------