├── .gitignore ├── .npmignore ├── README.md ├── package.json ├── shrinkwrap.yaml ├── src ├── index.ts ├── loader.ts └── select.ts ├── tests ├── common │ ├── seed.ts │ └── util.ts ├── entity │ ├── Node.ts │ ├── Post.ts │ └── User.ts ├── schema │ └── index.ts ├── test_entity.ts └── test_grapql.ts ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | npm-*.log 4 | *.sqlite3 5 | .idea 6 | ts-node-*/ 7 | yarn-*.log 8 | 9 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | **/*.ts 3 | !**/*.d.ts 4 | **/*.tsx 5 | !**/*.d.tsx 6 | **/test_*.js 7 | **/test_*.js.map 8 | tsconfig.json 9 | typings.json 10 | typings/ 11 | *.sqlite3 12 | dist/tests/ 13 | tests/ 14 | .git 15 | .idea 16 | ts-node-*/ 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Archived 2 | 3 | ## This package is deprecated, please use: https://gitlab.com/Mando75/typeorm-graphql-loader/ 4 | 5 | # typeorm-loader 6 | A database-aware data-loader for use with GraphQL and TypeORM. 7 | 8 | ## Description 9 | 10 | This package exports `GraphQLDatabaseLoader`, which is a caching loader that folds a batch of different database queries into a singular database request. 11 | 12 | ## Installation 13 | 14 | ``` 15 | npm install typeorm-loader --save 16 | ``` 17 | 18 | ## Usage 19 | 20 | You should instantiate a new loader per session (just to be on the safe side, you don't want data leaking between user sessions), you instantiate it by passing the TypeORM connection as the first argument. 21 | 22 | ```ts 23 | import { GraphQLDatabaseLoader } from 'typeorm-loader'; 24 | 25 | const connection = createConnection({ ... }); 26 | const loader = new GraphQLDatabaseLoader(connection); 27 | ``` 28 | 29 | After which you would use it like so: 30 | 31 | ```ts 32 | Query: { 33 | getUserById: async (_: any, args: { id: string }, context: any, info: GraphQLResolveInfo) => { 34 | const result = await loader.loadOne(User, { id }, info); 35 | return result; 36 | } 37 | } 38 | ``` 39 | 40 | ## API 41 | 42 | ```ts 43 | 44 | /** 45 | * Load an entity from the database. 46 | * @param {typeof BaseEntity} entity The entity type to load. 47 | * @param where Query conditions. 48 | * @param {GraphQLResolveInfo} info (optional) GraphQL resolver information. If not provided, all fields are returned. 49 | * @returns {Promise} 50 | */ 51 | async loadOne(entity: Function, where: Partial, info?: GraphQLResolveInfo): Promise; 52 | 53 | /** 54 | * Load multiple entities that meet the same criteria . 55 | * @param {Function} entity The entity type to load. 56 | * @param {Partial} where The conditions to match. 57 | * @param {GraphQLResolveInfo} info (optional) GraphQL resolver information. If not provided, all fields are returned. 58 | * @returns {Promise} 59 | */ 60 | async loadMany(entity: Function, where: Partial, info?: GraphQLResolveInfo): Promise<(T|undefined)[]>; 61 | 62 | /** 63 | * Load multiple entities with different criteria. 64 | * @param {Function} entity The entity type to load. 65 | * @param {Partial[]} where A series of conditions to match. 66 | * @param {GraphQLResolveInfo} info (optional) GraphQL resolver information. If not provided, all fields are returned. 67 | * @returns {Promise} 68 | */ 69 | async batchLoadMany(entity: Function, where: Partial[], info?: GraphQLResolveInfo): Promise<(T|undefined)[]>; 70 | 71 | /** 72 | * Clears the loader cache. 73 | */ 74 | clear(): void; 75 | 76 | ``` 77 | 78 | ## License (MIT) 79 | 80 | Copyright 2017 Abdullah Ali 81 | 82 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 83 | 84 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 85 | 86 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 87 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typeorm-loader", 3 | "version": "0.0.1-0.5", 4 | "description": "A database-aware data-loader for use with GraphQL and TypeORM.", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "scripts": { 8 | "prepare": "npm run test", 9 | "build": "tsc", 10 | "test": "npm run build && [ -d tests ] && NODE_ENV=test mocha $NODE_DEBUG_OPTION -r ts-node/register -r tslib tests/test_**.ts" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/Webtomizer/typeorm-loader.git" 15 | }, 16 | "keywords": [ 17 | "typeorm", 18 | "database", 19 | "graphql", 20 | "data", 21 | "loader", 22 | "batching", 23 | "caching" 24 | ], 25 | "author": "Abdullah Ali", 26 | "license": "MIT", 27 | "bugs": { 28 | "url": "https://github.com/Webtomizer/typeorm-loader/issues" 29 | }, 30 | "homepage": "https://github.com/Webtomizer/typeorm-loader#readme", 31 | "dependencies": { 32 | "deep-equal": "^1.0.1", 33 | "object-path": "^0.11.4", 34 | "tslib": "^1.9.3" 35 | }, 36 | "devDependencies": { 37 | "@types/chai": "^4.1.7", 38 | "@types/chance": "^1.0.1", 39 | "@types/deep-equal": "^1.0.1", 40 | "@types/mocha": "^5.2.5", 41 | "@types/node": "^10.12.1", 42 | "@types/object-path": "^0.9.29", 43 | "chai": "^4.2.0", 44 | "chance": "^1.0.16", 45 | "graphql": "^14.0.2", 46 | "metanoia": "^1.0.1", 47 | "mocha": "^5.2.0", 48 | "sqlite3": "^4.0.3", 49 | "ts-node": "^7.0.1", 50 | "typeorm": "^0.2.8", 51 | "typescript": "^3.1.3" 52 | }, 53 | "peerDependencies": { 54 | "typeorm": ">=0.2.8" 55 | }, 56 | "optionalDependencies": { 57 | "@types/graphql": "^14.0.3" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /shrinkwrap.yaml: -------------------------------------------------------------------------------- 1 | dependencies: 2 | deep-equal: 1.0.1 3 | object-path: 0.11.4 4 | tslib: 1.8.0 5 | devDependencies: 6 | '@types/chai': 4.0.5 7 | '@types/chance': 0.7.35 8 | '@types/deep-equal': 1.0.1 9 | '@types/mocha': 2.2.44 10 | '@types/node': 8.0.53 11 | '@types/object-path': 0.9.29 12 | chai: 4.1.2 13 | chance: 1.0.12 14 | graphql: 0.11.7 15 | mocha: 4.0.1 16 | sqlite3: 3.1.13 17 | ts-node: 3.3.0 18 | typeorm: 0.1.6 19 | typescript: 2.6.1 20 | optionalDependencies: 21 | '@types/graphql': 0.11.6 22 | packages: 23 | /@types/chai/4.0.5: 24 | dev: true 25 | resolution: 26 | integrity: sha512-ZC4tZU+3rDblhVy9cUQp5u+Zw9M0geGY8tzUQgc+4CMIWQLUFpgvrHhaYrSq1TK2m0DjaYIp9yJPyTHN+qhBZg== 27 | /@types/chance/0.7.35: 28 | dev: true 29 | resolution: 30 | integrity: sha512-Z73eQbPSX99GNBbv2Zq3xAeG+2sTRIP0u0GNWnpl9sx19J4ATGE+MY952jIyGqu3x/+E7pVNQUd6WNx02jpuUA== 31 | /@types/deep-equal/1.0.1: 32 | dev: true 33 | resolution: 34 | integrity: sha512-mMUu4nWHLBlHtxXY17Fg6+ucS/MnndyOWyOe7MmwkoMYxvfQU2ajtRaEvqSUv+aVkMqH/C0NCI8UoVfRNQ10yg== 35 | /@types/graphql/0.11.6: 36 | optional: true 37 | resolution: 38 | integrity: sha512-7o0FPK9QUZvFaR9h5Qd2uLyk6VdS3Z4cJNIjkxO55FLndW8zWd3DlPR2owdKwgnSJFELj5mY0U4zmU9fj6Zowg== 39 | /@types/mocha/2.2.44: 40 | dev: true 41 | resolution: 42 | integrity: sha512-k2tWTQU8G4+iSMvqKi0Q9IIsWAp/n8xzdZS4Q4YVIltApoMA00wFBFdlJnmoaK1/z7B0Cy0yPe6GgXteSmdUNw== 43 | /@types/node/8.0.53: 44 | dev: true 45 | resolution: 46 | integrity: sha512-54Dm6NwYeiSQmRB1BLXKr5GELi0wFapR1npi8bnZhEcu84d/yQKqnwwXQ56hZ0RUbTG6L5nqDZaN3dgByQXQRQ== 47 | /@types/object-path/0.9.29: 48 | dev: true 49 | resolution: 50 | integrity: sha512-txsii9cwD2OUOPukfPu3Jpoi3CnznBAwRX3JF26EC4p5T6IA8AaL6PBilACyY2fJkk+ydDNo4BJrJOo/OmNaZw== 51 | /ansi-regex/2.1.1: 52 | dev: true 53 | engines: 54 | node: '>=0.10.0' 55 | resolution: 56 | integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 57 | /ansi-regex/3.0.0: 58 | dev: true 59 | engines: 60 | node: '>=4' 61 | resolution: 62 | integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 63 | /ansi-styles/2.2.1: 64 | dev: true 65 | engines: 66 | node: '>=0.10.0' 67 | resolution: 68 | integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 69 | /ansi-styles/3.2.0: 70 | dependencies: 71 | color-convert: 1.9.1 72 | dev: true 73 | engines: 74 | node: '>=4' 75 | resolution: 76 | integrity: sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug== 77 | /any-promise/1.3.0: 78 | dev: true 79 | resolution: 80 | integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8= 81 | /app-root-path/2.0.1: 82 | dev: true 83 | engines: 84 | node: '>= 4.0.0' 85 | resolution: 86 | integrity: sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y= 87 | /argparse/1.0.9: 88 | dependencies: 89 | sprintf-js: 1.0.3 90 | dev: true 91 | resolution: 92 | integrity: sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY= 93 | /arrify/1.0.1: 94 | dev: true 95 | engines: 96 | node: '>=0.10.0' 97 | resolution: 98 | integrity: sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= 99 | /assertion-error/1.0.2: 100 | dev: true 101 | resolution: 102 | integrity: sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw= 103 | /balanced-match/1.0.0: 104 | dev: true 105 | resolution: 106 | integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 107 | /brace-expansion/1.1.8: 108 | dependencies: 109 | balanced-match: 1.0.0 110 | concat-map: 0.0.1 111 | dev: true 112 | resolution: 113 | integrity: sha1-wHshHHyVLsH479Uad+8NHTmQopI= 114 | /browser-stdout/1.3.0: 115 | dev: true 116 | resolution: 117 | integrity: sha1-81HTKWnTL6XXpVZxVCY9korjvR8= 118 | /builtin-modules/1.1.1: 119 | dev: true 120 | engines: 121 | node: '>=0.10.0' 122 | resolution: 123 | integrity: sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 124 | /camelcase/4.1.0: 125 | dev: true 126 | engines: 127 | node: '>=4' 128 | resolution: 129 | integrity: sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= 130 | /chai/4.1.2: 131 | dependencies: 132 | assertion-error: 1.0.2 133 | check-error: 1.0.2 134 | deep-eql: 3.0.1 135 | get-func-name: 2.0.0 136 | pathval: 1.1.0 137 | type-detect: 4.0.5 138 | dev: true 139 | engines: 140 | node: '>=4' 141 | resolution: 142 | integrity: sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw= 143 | /chalk/1.1.3: 144 | dependencies: 145 | ansi-styles: 2.2.1 146 | escape-string-regexp: 1.0.5 147 | has-ansi: 2.0.0 148 | strip-ansi: 3.0.1 149 | supports-color: 2.0.0 150 | dev: true 151 | engines: 152 | node: '>=0.10.0' 153 | resolution: 154 | integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 155 | /chalk/2.3.0: 156 | dependencies: 157 | ansi-styles: 3.2.0 158 | escape-string-regexp: 1.0.5 159 | supports-color: 4.5.0 160 | dev: true 161 | engines: 162 | node: '>=4' 163 | resolution: 164 | integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== 165 | /chance/1.0.12: 166 | dev: true 167 | resolution: 168 | integrity: sha512-W99uMuboG5CT1iToDmizEH6yQYqICzZnrSRbbXPuJErzFWLPaoiEDvwnKbESjDo/8st1n3pyh70VBMmfqPmf+Q== 169 | /check-error/1.0.2: 170 | dev: true 171 | resolution: 172 | integrity: sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 173 | /cli-highlight/1.2.0: 174 | dependencies: 175 | chalk: 2.3.0 176 | highlight.js: 9.12.0 177 | mz: 2.7.0 178 | parse5: 3.0.3 179 | yargs: 10.0.3 180 | dev: true 181 | engines: 182 | node: '>=4.0.0' 183 | resolution: 184 | integrity: sha512-KqaVCjloA4zMquLTyOA5MWWGtp5fQO3dtjAPzYtwHM+U2VMiJ838M4rBzWG0kQ8W9Rhe0/9V5blXyQedRu8jxQ== 185 | /cliui/3.2.0: 186 | dependencies: 187 | string-width: 1.0.2 188 | strip-ansi: 3.0.1 189 | wrap-ansi: 2.1.0 190 | dev: true 191 | resolution: 192 | integrity: sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= 193 | /code-point-at/1.1.0: 194 | dev: true 195 | engines: 196 | node: '>=0.10.0' 197 | resolution: 198 | integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 199 | /color-convert/1.9.1: 200 | dependencies: 201 | color-name: 1.1.3 202 | dev: true 203 | resolution: 204 | integrity: sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== 205 | /color-name/1.1.3: 206 | dev: true 207 | resolution: 208 | integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 209 | /commander/2.11.0: 210 | dev: true 211 | resolution: 212 | integrity: sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== 213 | /concat-map/0.0.1: 214 | dev: true 215 | resolution: 216 | integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 217 | /cross-spawn/5.1.0: 218 | dependencies: 219 | lru-cache: 4.1.1 220 | shebang-command: 1.2.0 221 | which: 1.3.0 222 | dev: true 223 | resolution: 224 | integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 225 | /debug/3.1.0: 226 | dependencies: 227 | ms: 2.0.0 228 | dev: true 229 | resolution: 230 | integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 231 | /decamelize/1.2.0: 232 | dev: true 233 | engines: 234 | node: '>=0.10.0' 235 | resolution: 236 | integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 237 | /deep-eql/3.0.1: 238 | dependencies: 239 | type-detect: 4.0.5 240 | dev: true 241 | engines: 242 | node: '>=0.12' 243 | resolution: 244 | integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 245 | /deep-equal/1.0.1: 246 | dev: false 247 | resolution: 248 | integrity: sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= 249 | /diff/3.3.1: 250 | dev: true 251 | engines: 252 | node: '>=0.3.1' 253 | resolution: 254 | integrity: sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww== 255 | /diff/3.4.0: 256 | dev: true 257 | engines: 258 | node: '>=0.3.1' 259 | resolution: 260 | integrity: sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA== 261 | /dotenv/4.0.0: 262 | dev: true 263 | engines: 264 | node: '>=4.6.0' 265 | resolution: 266 | integrity: sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0= 267 | /error-ex/1.3.1: 268 | dependencies: 269 | is-arrayish: 0.2.1 270 | dev: true 271 | resolution: 272 | integrity: sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= 273 | /escape-string-regexp/1.0.5: 274 | dev: true 275 | engines: 276 | node: '>=0.8.0' 277 | resolution: 278 | integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 279 | /esprima/4.0.0: 280 | dev: true 281 | engines: 282 | node: '>=4' 283 | resolution: 284 | integrity: sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw== 285 | /execa/0.7.0: 286 | dependencies: 287 | cross-spawn: 5.1.0 288 | get-stream: 3.0.0 289 | is-stream: 1.1.0 290 | npm-run-path: 2.0.2 291 | p-finally: 1.0.0 292 | signal-exit: 3.0.2 293 | strip-eof: 1.0.0 294 | dev: true 295 | engines: 296 | node: '>=4' 297 | resolution: 298 | integrity: sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= 299 | /figlet/1.2.0: 300 | dev: true 301 | engines: 302 | node: '>= 0.4.0' 303 | resolution: 304 | integrity: sha1-bEZTc3j6tkkUa1phQ92gGbQwtBA= 305 | /find-up/2.1.0: 306 | dependencies: 307 | locate-path: 2.0.0 308 | dev: true 309 | engines: 310 | node: '>=4' 311 | resolution: 312 | integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c= 313 | /fs.realpath/1.0.0: 314 | dev: true 315 | resolution: 316 | integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 317 | /get-caller-file/1.0.2: 318 | dev: true 319 | resolution: 320 | integrity: sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= 321 | /get-func-name/2.0.0: 322 | dev: true 323 | resolution: 324 | integrity: sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 325 | /get-stream/3.0.0: 326 | dev: true 327 | engines: 328 | node: '>=4' 329 | resolution: 330 | integrity: sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= 331 | /glob/7.1.2: 332 | dependencies: 333 | fs.realpath: 1.0.0 334 | inflight: 1.0.6 335 | inherits: 2.0.3 336 | minimatch: 3.0.4 337 | once: 1.4.0 338 | path-is-absolute: 1.0.1 339 | dev: true 340 | resolution: 341 | integrity: sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== 342 | /graceful-fs/4.1.11: 343 | dev: true 344 | engines: 345 | node: '>=0.4.0' 346 | resolution: 347 | integrity: sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= 348 | /graphql/0.11.7: 349 | dependencies: 350 | iterall: 1.1.3 351 | dev: true 352 | resolution: 353 | integrity: sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw== 354 | /growl/1.10.3: 355 | dev: true 356 | engines: 357 | node: '>=4.x' 358 | resolution: 359 | integrity: sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q== 360 | /has-ansi/2.0.0: 361 | dependencies: 362 | ansi-regex: 2.1.1 363 | dev: true 364 | engines: 365 | node: '>=0.10.0' 366 | resolution: 367 | integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 368 | /has-flag/2.0.0: 369 | dev: true 370 | engines: 371 | node: '>=0.10.0' 372 | resolution: 373 | integrity: sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= 374 | /he/1.1.1: 375 | dev: true 376 | resolution: 377 | integrity: sha1-k0EP0hsAlzUVH4howvJx80J+I/0= 378 | /highlight.js/9.12.0: 379 | dev: true 380 | resolution: 381 | integrity: sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4= 382 | /homedir-polyfill/1.0.1: 383 | dependencies: 384 | parse-passwd: 1.0.0 385 | dev: true 386 | engines: 387 | node: '>=0.10.0' 388 | resolution: 389 | integrity: sha1-TCu8inWJmP7r9e1oWA921GdotLw= 390 | /hosted-git-info/2.5.0: 391 | dev: true 392 | resolution: 393 | integrity: sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg== 394 | /inflight/1.0.6: 395 | dependencies: 396 | once: 1.4.0 397 | wrappy: 1.0.2 398 | dev: true 399 | resolution: 400 | integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 401 | /inherits/2.0.3: 402 | dev: true 403 | resolution: 404 | integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 405 | /invert-kv/1.0.0: 406 | dev: true 407 | engines: 408 | node: '>=0.10.0' 409 | resolution: 410 | integrity: sha1-EEqOSqym09jNFXqO+L+rLXo//bY= 411 | /is-arrayish/0.2.1: 412 | dev: true 413 | resolution: 414 | integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 415 | /is-builtin-module/1.0.0: 416 | dependencies: 417 | builtin-modules: 1.1.1 418 | dev: true 419 | engines: 420 | node: '>=0.10.0' 421 | resolution: 422 | integrity: sha1-VAVy0096wxGfj3bDDLwbHgN6/74= 423 | /is-fullwidth-code-point/1.0.0: 424 | dependencies: 425 | number-is-nan: 1.0.1 426 | dev: true 427 | engines: 428 | node: '>=0.10.0' 429 | resolution: 430 | integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 431 | /is-fullwidth-code-point/2.0.0: 432 | dev: true 433 | engines: 434 | node: '>=4' 435 | resolution: 436 | integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 437 | /is-stream/1.1.0: 438 | dev: true 439 | engines: 440 | node: '>=0.10.0' 441 | resolution: 442 | integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 443 | /isexe/2.0.0: 444 | dev: true 445 | resolution: 446 | integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 447 | /iterall/1.1.3: 448 | dev: true 449 | resolution: 450 | integrity: sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ== 451 | /js-yaml/3.10.0: 452 | dependencies: 453 | argparse: 1.0.9 454 | esprima: 4.0.0 455 | dev: true 456 | resolution: 457 | integrity: sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== 458 | /lcid/1.0.0: 459 | dependencies: 460 | invert-kv: 1.0.0 461 | dev: true 462 | engines: 463 | node: '>=0.10.0' 464 | resolution: 465 | integrity: sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= 466 | /load-json-file/2.0.0: 467 | dependencies: 468 | graceful-fs: 4.1.11 469 | parse-json: 2.2.0 470 | pify: 2.3.0 471 | strip-bom: 3.0.0 472 | dev: true 473 | engines: 474 | node: '>=4' 475 | resolution: 476 | integrity: sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= 477 | /locate-path/2.0.0: 478 | dependencies: 479 | p-locate: 2.0.0 480 | path-exists: 3.0.0 481 | dev: true 482 | engines: 483 | node: '>=4' 484 | resolution: 485 | integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= 486 | /lru-cache/4.1.1: 487 | dependencies: 488 | pseudomap: 1.0.2 489 | yallist: 2.1.2 490 | dev: true 491 | resolution: 492 | integrity: sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew== 493 | /make-error/1.3.0: 494 | dev: true 495 | resolution: 496 | integrity: sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y= 497 | /mem/1.1.0: 498 | dependencies: 499 | mimic-fn: 1.1.0 500 | dev: true 501 | engines: 502 | node: '>=4' 503 | resolution: 504 | integrity: sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= 505 | /mimic-fn/1.1.0: 506 | dev: true 507 | engines: 508 | node: '>=4' 509 | resolution: 510 | integrity: sha1-5md4PZLonb00KBi1IwudYqZyrRg= 511 | /minimatch/3.0.4: 512 | dependencies: 513 | brace-expansion: 1.1.8 514 | dev: true 515 | resolution: 516 | integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 517 | /minimist/0.0.8: 518 | dev: true 519 | resolution: 520 | integrity: sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 521 | /minimist/1.2.0: 522 | dev: true 523 | resolution: 524 | integrity: sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 525 | /mkdirp/0.5.1: 526 | dependencies: 527 | minimist: 0.0.8 528 | dev: true 529 | resolution: 530 | integrity: sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 531 | /mocha/4.0.1: 532 | dependencies: 533 | browser-stdout: 1.3.0 534 | commander: 2.11.0 535 | debug: 3.1.0 536 | diff: 3.3.1 537 | escape-string-regexp: 1.0.5 538 | glob: 7.1.2 539 | growl: 1.10.3 540 | he: 1.1.1 541 | mkdirp: 0.5.1 542 | supports-color: 4.4.0 543 | dev: true 544 | engines: 545 | node: '>= 4.0.0' 546 | npm: '>= 2.15.11' 547 | resolution: 548 | integrity: sha512-evDmhkoA+cBNiQQQdSKZa2b9+W2mpLoj50367lhy+Klnx9OV8XlCIhigUnn1gaTFLQCa0kdNhEGDr0hCXOQFDw== 549 | /ms/2.0.0: 550 | dev: true 551 | resolution: 552 | integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 553 | /mz/2.7.0: 554 | dependencies: 555 | any-promise: 1.3.0 556 | object-assign: 4.1.1 557 | thenify-all: 1.6.0 558 | dev: true 559 | resolution: 560 | integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== 561 | /nan/2.7.0: 562 | dev: true 563 | resolution: 564 | integrity: sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY= 565 | /normalize-package-data/2.4.0: 566 | dependencies: 567 | hosted-git-info: 2.5.0 568 | is-builtin-module: 1.0.0 569 | semver: 5.4.1 570 | validate-npm-package-license: 3.0.1 571 | dev: true 572 | resolution: 573 | integrity: sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== 574 | /npm-run-path/2.0.2: 575 | dependencies: 576 | path-key: 2.0.1 577 | dev: true 578 | engines: 579 | node: '>=4' 580 | resolution: 581 | integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 582 | /number-is-nan/1.0.1: 583 | dev: true 584 | engines: 585 | node: '>=0.10.0' 586 | resolution: 587 | integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 588 | /object-assign/4.1.1: 589 | dev: true 590 | engines: 591 | node: '>=0.10.0' 592 | resolution: 593 | integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 594 | /object-path/0.11.4: 595 | dev: false 596 | engines: 597 | node: '>=0.10.0' 598 | resolution: 599 | integrity: sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= 600 | /once/1.4.0: 601 | dependencies: 602 | wrappy: 1.0.2 603 | dev: true 604 | resolution: 605 | integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 606 | /os-locale/2.1.0: 607 | dependencies: 608 | execa: 0.7.0 609 | lcid: 1.0.0 610 | mem: 1.1.0 611 | dev: true 612 | engines: 613 | node: '>=4' 614 | resolution: 615 | integrity: sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== 616 | /p-finally/1.0.0: 617 | dev: true 618 | engines: 619 | node: '>=4' 620 | resolution: 621 | integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 622 | /p-limit/1.1.0: 623 | dev: true 624 | engines: 625 | node: '>=4' 626 | resolution: 627 | integrity: sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw= 628 | /p-locate/2.0.0: 629 | dependencies: 630 | p-limit: 1.1.0 631 | dev: true 632 | engines: 633 | node: '>=4' 634 | resolution: 635 | integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= 636 | /parent-require/1.0.0: 637 | dev: true 638 | engines: 639 | node: '>= 0.4.0' 640 | resolution: 641 | integrity: sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc= 642 | /parse-json/2.2.0: 643 | dependencies: 644 | error-ex: 1.3.1 645 | dev: true 646 | engines: 647 | node: '>=0.10.0' 648 | resolution: 649 | integrity: sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 650 | /parse-passwd/1.0.0: 651 | dev: true 652 | engines: 653 | node: '>=0.10.0' 654 | resolution: 655 | integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= 656 | /parse5/3.0.3: 657 | dependencies: 658 | '@types/node': 8.0.53 659 | dev: true 660 | resolution: 661 | integrity: sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== 662 | /path-exists/3.0.0: 663 | dev: true 664 | engines: 665 | node: '>=4' 666 | resolution: 667 | integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 668 | /path-is-absolute/1.0.1: 669 | dev: true 670 | engines: 671 | node: '>=0.10.0' 672 | resolution: 673 | integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 674 | /path-key/2.0.1: 675 | dev: true 676 | engines: 677 | node: '>=4' 678 | resolution: 679 | integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 680 | /path-type/2.0.0: 681 | dependencies: 682 | pify: 2.3.0 683 | dev: true 684 | engines: 685 | node: '>=4' 686 | resolution: 687 | integrity: sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= 688 | /pathval/1.1.0: 689 | dev: true 690 | resolution: 691 | integrity: sha1-uULm1L3mUwBe9rcTYd74cn0GReA= 692 | /pify/2.3.0: 693 | dev: true 694 | engines: 695 | node: '>=0.10.0' 696 | resolution: 697 | integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 698 | /pseudomap/1.0.2: 699 | dev: true 700 | resolution: 701 | integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 702 | /read-pkg-up/2.0.0: 703 | dependencies: 704 | find-up: 2.1.0 705 | read-pkg: 2.0.0 706 | dev: true 707 | engines: 708 | node: '>=4' 709 | resolution: 710 | integrity: sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= 711 | /read-pkg/2.0.0: 712 | dependencies: 713 | load-json-file: 2.0.0 714 | normalize-package-data: 2.4.0 715 | path-type: 2.0.0 716 | dev: true 717 | engines: 718 | node: '>=4' 719 | resolution: 720 | integrity: sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= 721 | /reflect-metadata/0.1.10: 722 | dev: true 723 | resolution: 724 | integrity: sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo= 725 | /require-directory/2.1.1: 726 | dev: true 727 | engines: 728 | node: '>=0.10.0' 729 | resolution: 730 | integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 731 | /require-main-filename/1.0.1: 732 | dev: true 733 | resolution: 734 | integrity: sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= 735 | /sax/1.2.4: 736 | dev: true 737 | resolution: 738 | integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 739 | /semver/5.4.1: 740 | dev: true 741 | resolution: 742 | integrity: sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== 743 | /set-blocking/2.0.0: 744 | dev: true 745 | resolution: 746 | integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 747 | /shebang-command/1.2.0: 748 | dependencies: 749 | shebang-regex: 1.0.0 750 | dev: true 751 | engines: 752 | node: '>=0.10.0' 753 | resolution: 754 | integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 755 | /shebang-regex/1.0.0: 756 | dev: true 757 | engines: 758 | node: '>=0.10.0' 759 | resolution: 760 | integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 761 | /signal-exit/3.0.2: 762 | dev: true 763 | resolution: 764 | integrity: sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 765 | /source-map-support/0.4.18: 766 | dependencies: 767 | source-map: 0.5.7 768 | dev: true 769 | resolution: 770 | integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== 771 | /source-map/0.5.7: 772 | dev: true 773 | engines: 774 | node: '>=0.10.0' 775 | resolution: 776 | integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 777 | /spdx-correct/1.0.2: 778 | dependencies: 779 | spdx-license-ids: 1.2.2 780 | dev: true 781 | resolution: 782 | integrity: sha1-SzBz2TP/UfORLwOsVRlJikFQ20A= 783 | /spdx-expression-parse/1.0.4: 784 | dev: true 785 | resolution: 786 | integrity: sha1-m98vIOH0DtRH++JzJmGR/O1RYmw= 787 | /spdx-license-ids/1.2.2: 788 | dev: true 789 | resolution: 790 | integrity: sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc= 791 | /sprintf-js/1.0.3: 792 | dev: true 793 | resolution: 794 | integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 795 | /sqlite3/3.1.13: 796 | bundledDependencies: 797 | - node-pre-gyp 798 | dependencies: 799 | nan: 2.7.0 800 | dev: true 801 | resolution: 802 | integrity: sha512-JxXKPJnkZ6NuHRojq+g2WXWBt3M1G9sjZaYiHEWSTGijDM3cwju/0T2XbWqMXFmPqDgw+iB7zKQvnns4bvzXlw== 803 | /string-width/1.0.2: 804 | dependencies: 805 | code-point-at: 1.1.0 806 | is-fullwidth-code-point: 1.0.0 807 | strip-ansi: 3.0.1 808 | dev: true 809 | engines: 810 | node: '>=0.10.0' 811 | resolution: 812 | integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 813 | /string-width/2.1.1: 814 | dependencies: 815 | is-fullwidth-code-point: 2.0.0 816 | strip-ansi: 4.0.0 817 | dev: true 818 | engines: 819 | node: '>=4' 820 | resolution: 821 | integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 822 | /strip-ansi/3.0.1: 823 | dependencies: 824 | ansi-regex: 2.1.1 825 | dev: true 826 | engines: 827 | node: '>=0.10.0' 828 | resolution: 829 | integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 830 | /strip-ansi/4.0.0: 831 | dependencies: 832 | ansi-regex: 3.0.0 833 | dev: true 834 | engines: 835 | node: '>=4' 836 | resolution: 837 | integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8= 838 | /strip-bom/3.0.0: 839 | dev: true 840 | engines: 841 | node: '>=4' 842 | resolution: 843 | integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 844 | /strip-eof/1.0.0: 845 | dev: true 846 | engines: 847 | node: '>=0.10.0' 848 | resolution: 849 | integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 850 | /strip-json-comments/2.0.1: 851 | dev: true 852 | engines: 853 | node: '>=0.10.0' 854 | resolution: 855 | integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo= 856 | /supports-color/2.0.0: 857 | dev: true 858 | engines: 859 | node: '>=0.8.0' 860 | resolution: 861 | integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 862 | /supports-color/4.4.0: 863 | dependencies: 864 | has-flag: 2.0.0 865 | dev: true 866 | engines: 867 | node: '>=4' 868 | resolution: 869 | integrity: sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ== 870 | /supports-color/4.5.0: 871 | dependencies: 872 | has-flag: 2.0.0 873 | dev: true 874 | engines: 875 | node: '>=4' 876 | resolution: 877 | integrity: sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= 878 | /thenify-all/1.6.0: 879 | dependencies: 880 | thenify: 3.3.0 881 | dev: true 882 | engines: 883 | node: '>=0.8' 884 | resolution: 885 | integrity: sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= 886 | /thenify/3.3.0: 887 | dependencies: 888 | any-promise: 1.3.0 889 | dev: true 890 | resolution: 891 | integrity: sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= 892 | /ts-node/3.3.0: 893 | dependencies: 894 | arrify: 1.0.1 895 | chalk: 2.3.0 896 | diff: 3.4.0 897 | make-error: 1.3.0 898 | minimist: 1.2.0 899 | mkdirp: 0.5.1 900 | source-map-support: 0.4.18 901 | tsconfig: 6.0.0 902 | v8flags: 3.0.1 903 | yn: 2.0.0 904 | dev: true 905 | engines: 906 | node: '>=4.2.0' 907 | resolution: 908 | integrity: sha1-wTxqMCTjC+EYDdUwOPwgkonUv2k= 909 | /tsconfig/6.0.0: 910 | dependencies: 911 | strip-bom: 3.0.0 912 | strip-json-comments: 2.0.1 913 | dev: true 914 | resolution: 915 | integrity: sha1-aw6DdgA9evGGT434+J3QBZ/80DI= 916 | /tslib/1.8.0: 917 | dev: false 918 | resolution: 919 | integrity: sha512-ymKWWZJST0/CkgduC2qkzjMOWr4bouhuURNXCn/inEX0L57BnRG6FhX76o7FOnsjHazCjfU2LKeSrlS2sIKQJg== 920 | /type-detect/4.0.5: 921 | dev: true 922 | engines: 923 | node: '>=4' 924 | resolution: 925 | integrity: sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ== 926 | /typeorm/0.1.6: 927 | dependencies: 928 | app-root-path: 2.0.1 929 | chalk: 2.3.0 930 | cli-highlight: 1.2.0 931 | dotenv: 4.0.0 932 | glob: 7.1.2 933 | js-yaml: 3.10.0 934 | mkdirp: 0.5.1 935 | reflect-metadata: 0.1.10 936 | xml2js: 0.4.19 937 | yargonaut: 1.1.2 938 | yargs: 9.0.1 939 | dev: true 940 | resolution: 941 | integrity: sha512-Mw6A15/tfBVnfe7HcYpMzuT4YtgCj5YzH9G1grJXMRY2ZaV3eZEX5Ka4k0vYQYSgNEaFkLaxAUmj+j2JXRTq7g== 942 | /typescript/2.6.1: 943 | dev: true 944 | engines: 945 | node: '>=4.2.0' 946 | resolution: 947 | integrity: sha1-7znN6ierrAtQAkLWcmq5DgyEZjE= 948 | /v8flags/3.0.1: 949 | dependencies: 950 | homedir-polyfill: 1.0.1 951 | dev: true 952 | engines: 953 | node: '>= 0.10.0' 954 | resolution: 955 | integrity: sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s= 956 | /validate-npm-package-license/3.0.1: 957 | dependencies: 958 | spdx-correct: 1.0.2 959 | spdx-expression-parse: 1.0.4 960 | dev: true 961 | resolution: 962 | integrity: sha1-KAS6vnEq0zeUWaz74kdGqywwP7w= 963 | /which-module/2.0.0: 964 | dev: true 965 | resolution: 966 | integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 967 | /which/1.3.0: 968 | dependencies: 969 | isexe: 2.0.0 970 | dev: true 971 | resolution: 972 | integrity: sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== 973 | /wrap-ansi/2.1.0: 974 | dependencies: 975 | string-width: 1.0.2 976 | strip-ansi: 3.0.1 977 | dev: true 978 | engines: 979 | node: '>=0.10.0' 980 | resolution: 981 | integrity: sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= 982 | /wrappy/1.0.2: 983 | dev: true 984 | resolution: 985 | integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 986 | /xml2js/0.4.19: 987 | dependencies: 988 | sax: 1.2.4 989 | xmlbuilder: 9.0.4 990 | dev: true 991 | resolution: 992 | integrity: sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== 993 | /xmlbuilder/9.0.4: 994 | dev: true 995 | engines: 996 | node: '>=4.0' 997 | resolution: 998 | integrity: sha1-UZy0ymhtAFqEINNJbz8MruzKWA8= 999 | /y18n/3.2.1: 1000 | dev: true 1001 | resolution: 1002 | integrity: sha1-bRX7qITAhnnA136I53WegR4H+kE= 1003 | /yallist/2.1.2: 1004 | dev: true 1005 | resolution: 1006 | integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 1007 | /yargonaut/1.1.2: 1008 | dependencies: 1009 | chalk: 1.1.3 1010 | figlet: 1.2.0 1011 | parent-require: 1.0.0 1012 | dev: true 1013 | resolution: 1014 | integrity: sha1-7nuJ6YEho/JB+pJqKm4bZkHIGz8= 1015 | /yargs-parser/7.0.0: 1016 | dependencies: 1017 | camelcase: 4.1.0 1018 | dev: true 1019 | resolution: 1020 | integrity: sha1-jQrELxbqVd69MyyvTEA4s+P139k= 1021 | /yargs-parser/8.0.0: 1022 | dependencies: 1023 | camelcase: 4.1.0 1024 | dev: true 1025 | resolution: 1026 | integrity: sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY= 1027 | /yargs/10.0.3: 1028 | dependencies: 1029 | cliui: 3.2.0 1030 | decamelize: 1.2.0 1031 | find-up: 2.1.0 1032 | get-caller-file: 1.0.2 1033 | os-locale: 2.1.0 1034 | require-directory: 2.1.1 1035 | require-main-filename: 1.0.1 1036 | set-blocking: 2.0.0 1037 | string-width: 2.1.1 1038 | which-module: 2.0.0 1039 | y18n: 3.2.1 1040 | yargs-parser: 8.0.0 1041 | dev: true 1042 | resolution: 1043 | integrity: sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw== 1044 | /yargs/9.0.1: 1045 | dependencies: 1046 | camelcase: 4.1.0 1047 | cliui: 3.2.0 1048 | decamelize: 1.2.0 1049 | get-caller-file: 1.0.2 1050 | os-locale: 2.1.0 1051 | read-pkg-up: 2.0.0 1052 | require-directory: 2.1.1 1053 | require-main-filename: 1.0.1 1054 | set-blocking: 2.0.0 1055 | string-width: 2.1.1 1056 | which-module: 2.0.0 1057 | y18n: 3.2.1 1058 | yargs-parser: 7.0.0 1059 | dev: true 1060 | resolution: 1061 | integrity: sha1-UqzCP+7Kw0BCB47njAwAf1CF20w= 1062 | /yn/2.0.0: 1063 | dev: true 1064 | engines: 1065 | node: '>=4' 1066 | resolution: 1067 | integrity: sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= 1068 | registry: 'https://registry.npmjs.org/' 1069 | shrinkwrapMinorVersion: 4 1070 | shrinkwrapVersion: 3 1071 | specifiers: 1072 | '@types/chai': ^4.0.5 1073 | '@types/chance': ^0.7.35 1074 | '@types/deep-equal': ^1.0.1 1075 | '@types/graphql': ^0.11.6 1076 | '@types/mocha': ^2.2.44 1077 | '@types/node': ^8.0.53 1078 | '@types/object-path': ^0.9.29 1079 | chai: ^4.1.2 1080 | chance: ^1.0.12 1081 | deep-equal: ^1.0.1 1082 | graphql: ^0.11.7 1083 | mocha: ^4.0.1 1084 | object-path: ^0.11.4 1085 | sqlite3: ^3.1.13 1086 | ts-node: ^3.3.0 1087 | tslib: ^1.8.0 1088 | typeorm: ^0.1.6 1089 | typescript: ^2.6.1 1090 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { GraphQLDatabaseLoader } from './loader'; -------------------------------------------------------------------------------- /src/loader.ts: -------------------------------------------------------------------------------- 1 | import { Connection, BaseEntity, SelectQueryBuilder } from 'typeorm'; 2 | import { GraphQLResolveInfo, validate } from 'graphql'; 3 | import * as crypto from 'crypto'; 4 | import { set } from 'object-path'; 5 | 6 | import { select, graphqlFields, Selection } from './select'; 7 | 8 | export type LoaderOptions = { 9 | /** 10 | * Time-to-live for cache. 11 | */ 12 | ttl?: number; 13 | } 14 | 15 | type QueueItem = { 16 | many: boolean; 17 | key: string; 18 | batchIdx: number; 19 | fields: Selection | null; 20 | where: any; 21 | resolve: (value?: any) => any, 22 | reject: (reason: any) => void, 23 | entity: Function|string 24 | }; 25 | 26 | /** 27 | * GraphQLDatabaseLoader is a caching loader that folds a batch of different database queries into a singular query. 28 | */ 29 | export class GraphQLDatabaseLoader { 30 | 31 | private _queue: QueueItem[] = []; 32 | private _cache: Map> = new Map(); 33 | private _immediate?: NodeJS.Immediate; 34 | 35 | /** 36 | * Constructs an instance. 37 | * @param {Connection} connection The database connection. 38 | * @param {LoaderOptions} options (optional) Loader options. 39 | */ 40 | constructor(public connection: Connection, public options: LoaderOptions = {}) { } 41 | 42 | /** 43 | * Load an entity from the database. 44 | * @param {typeof BaseEntity|string} entity The entity type to load. 45 | * @param where Query conditions. 46 | * @param {GraphQLResolveInfo} info (optional) GraphQL resolver information. If not provided, all fields are returned. 47 | * @returns {Promise} 48 | */ 49 | async loadOne(entity: Function|string, where: Partial, info?: GraphQLResolveInfo): Promise { 50 | // Create a md5 hash. 51 | const hash = crypto.createHash('md5'); 52 | // Get the fields queried by GraphQL. 53 | const fields = info ? graphqlFields(info) : null; 54 | // Generate a key hash from the query parameters. 55 | const key = hash.update(JSON.stringify([ where, fields ])) 56 | .digest().toString('hex'); 57 | // If the key matches a cache entry, return it. 58 | if (this._cache.has(key)) 59 | return this._cache.get(key); 60 | // If we have an immediate scheduled, cancel it. 61 | if (this._immediate) { 62 | clearImmediate(this._immediate); 63 | } 64 | // Create a promise. 65 | const promise = new Promise((resolve, reject) => { 66 | // Push resolve/reject to the queue. 67 | this._queue.push({ many: false, batchIdx: this._queue.length, 68 | key, where, fields, resolve, reject, entity }); 69 | }); 70 | // Set a new immediate. 71 | this._immediate = setImmediate(() => this.processAll()); 72 | // Cache the promise. 73 | this._cache.set(key, promise); 74 | // Return the promise. 75 | return promise; 76 | } 77 | 78 | /** 79 | * Load multiple entities that meet the same criteria . 80 | * @param {Function|string} entity The entity type to load. 81 | * @param {Partial} where The conditions to match. 82 | * @param {GraphQLResolveInfo} info (optional) GraphQL resolver information. If not provided, all fields are returned. 83 | * @returns {Promise} 84 | */ 85 | async loadMany(entity: Function|string, where: Partial, info?: GraphQLResolveInfo): Promise<(T|undefined)[]> { 86 | // Create a md5 hash. 87 | const hash = crypto.createHash('md5'); 88 | // Get the fields queried by GraphQL. 89 | const fields = info ? graphqlFields(info) : null; 90 | // Generate a key hash from the query parameters. 91 | const key = hash.update(JSON.stringify([ where, fields ])).digest().toString('hex'); 92 | // If the key matches a cache entry, return it. 93 | if (this._cache.has(key)) 94 | return this._cache.get(key); 95 | // If we have an immediate scheduled, cancel it. 96 | if (this._immediate) { 97 | clearImmediate(this._immediate); 98 | } 99 | // Create a promise. 100 | const promise = new Promise<(T|undefined)[]>((resolve, reject) => { 101 | // Push resolve/reject to the queue. 102 | this._queue.push({ many: true, batchIdx: this._queue.length, 103 | key, where, fields, resolve, reject, entity }); 104 | }); 105 | // Set a new immediate. 106 | this._immediate = setImmediate(() => this.processAll()); 107 | // Cache the promise. 108 | this._cache.set(key, promise); 109 | // Return the promise. 110 | return promise; 111 | } 112 | 113 | /** 114 | * Load multiple entities with different criteria. 115 | * @param {Function|string} entity The entity type to load. 116 | * @param {Partial[]} where A series of conditions to match. 117 | * @param {GraphQLResolveInfo} info (optional) GraphQL resolver information. If not provided, all fields are returned. 118 | * @returns {Promise} 119 | */ 120 | async batchLoadMany(entity: Function|string, where: Partial[], info?: GraphQLResolveInfo): Promise<(T|undefined)[]> { 121 | return await Promise.all(where.map(w => this.loadOne(entity, w, info))); 122 | } 123 | 124 | /** 125 | * Clears the loader cache. 126 | */ 127 | clear() { 128 | this._cache.clear(); 129 | } 130 | 131 | /** 132 | * Process and clear the current queue. 133 | * @returns {Promise} 134 | */ 135 | protected async processAll() { 136 | // Clear and capture the current queue. 137 | const queue = this._queue.splice(0, this._queue.length); 138 | try { 139 | // Create a new QueryBuilder instance. 140 | return await this.connection.transaction(async entityManager => { 141 | // const now = Date.now().toString(16); 142 | return queue.map(q => { 143 | const name = typeof q.entity == 'string' ? q.entity : q.entity.name; 144 | const alias = "Q"; 145 | let qb = entityManager.getRepository(name).createQueryBuilder(alias); //.getRepository(q.entity).createQueryBuilder(); 146 | // qb = qb.from(name, alias); 147 | qb = select(name, q.fields, entityManager.connection, 148 | qb as any, alias); 149 | qb = qb.where(q.where); 150 | const promise = q.many ? qb.getMany() : qb.getOne(); 151 | return promise.then(q.resolve, q.reject).finally(() => { 152 | this._cache.delete(q.key); 153 | }); 154 | }); 155 | }); 156 | } catch (e) { 157 | // An error occurred, reject the entire queue. 158 | queue.forEach(q => { 159 | q.reject(e); 160 | this._cache.delete(q.key); 161 | }); 162 | } 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /src/select.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ASTNode, 3 | FieldNode, 4 | GraphQLResolveInfo, 5 | Kind, 6 | OperationDefinitionNode, 7 | SelectionNode, 8 | ValueNode 9 | } from 'graphql'; 10 | import { BaseEntity, Connection, SelectQueryBuilder } from 'typeorm'; 11 | import { RelationMetadata } from 'typeorm/metadata/RelationMetadata'; 12 | 13 | export type Hash = { 14 | [key: string]: T; 15 | } 16 | 17 | export type Selection = { 18 | arguments?: Hash<{ name: string, value: any }>; 19 | children?: Hash; 20 | } 21 | 22 | function parseLiteral(ast: ValueNode): any { 23 | switch (ast.kind) { 24 | case Kind.STRING: 25 | case Kind.BOOLEAN: 26 | return ast.value; 27 | case Kind.INT: 28 | case Kind.FLOAT: 29 | return parseFloat(ast.value); 30 | case Kind.OBJECT: 31 | { 32 | const value = Object.create(null); 33 | ast.fields.forEach((field) => { 34 | value[field.name.value] = parseLiteral(field.value); 35 | }); 36 | return value; 37 | } 38 | case Kind.LIST: 39 | return ast.values.map(parseLiteral); 40 | default: 41 | return null; 42 | } 43 | } 44 | 45 | function getSelections(ast: OperationDefinitionNode): ReadonlyArray { 46 | if (ast && 47 | ast.selectionSet && 48 | ast.selectionSet.selections && 49 | ast.selectionSet.selections.length) 50 | { 51 | return ast.selectionSet.selections; 52 | } 53 | return []; 54 | } 55 | 56 | function isFragment(ast: ASTNode) { 57 | return ast.kind === 'InlineFragment' || ast.kind === 'FragmentSpread'; 58 | } 59 | 60 | function getAST(ast: ASTNode, info: GraphQLResolveInfo) { 61 | if (ast.kind === 'FragmentSpread') { 62 | const fragmentName = ast.name.value; 63 | return info.fragments[fragmentName]; 64 | } 65 | return ast; 66 | } 67 | 68 | function flattenAST(ast: ASTNode, info: GraphQLResolveInfo, obj: Hash = {}): Hash { 69 | return getSelections(ast as OperationDefinitionNode).reduce((flattened, n) => { 70 | if (isFragment(n)) { 71 | flattened = flattenAST(getAST(n, info), info, flattened); 72 | } 73 | else { 74 | const node: FieldNode = n as FieldNode; 75 | const name = (node as FieldNode).name.value; 76 | if (flattened[name]) { 77 | Object.assign(flattened[name].children, flattenAST(node, info, flattened[name].children)); 78 | } 79 | else { 80 | flattened[name] = { 81 | arguments: node.arguments ? node.arguments.map(({ name, value }) => 82 | ({ [name.value]: parseLiteral(value) })).reduce((p, n) => ({ ...p, ...n }), {}) : {}, 83 | children: flattenAST(node, info) 84 | }; 85 | } 86 | } 87 | return flattened; 88 | }, obj); 89 | } 90 | 91 | export function graphqlFields(info: GraphQLResolveInfo, obj: Hash = {}): Selection { 92 | const fields = info.fieldNodes; 93 | return { children: fields.reduce((o, ast) => flattenAST(ast, info, o), obj) }; 94 | } 95 | 96 | export function select(model: Function | string, selection: Selection | null, 97 | connection: Connection, qb: SelectQueryBuilder, 98 | alias: string, history?: Set) 99 | { 100 | const meta = connection.getMetadata(model); 101 | if (selection && selection.children) { 102 | const fields = meta.columns 103 | .filter(field => { 104 | return field.propertyName in selection.children!; 105 | }); 106 | fields.forEach(field => qb = qb.addSelect(`${alias}.${field.propertyName}`, 107 | `${alias}_${field.propertyName}`)); 108 | const relations = meta.relations; 109 | relations.forEach(relation => { 110 | if (relation.propertyName in selection.children!) { 111 | const target = connection.getRepository(relation.target).target; 112 | const name = typeof target == 'string' ? target : target.name; 113 | const childAlias = alias + '_' + name; 114 | if (relation.inverseRelation) { 115 | qb = qb.addFrom(relation.inverseRelation.entityMetadata.targetName, 116 | relation.inverseRelation.entityMetadata.targetName); 117 | qb = qb.leftJoin(alias + '.' + relation.propertyName, childAlias); 118 | qb = select(relation.inverseEntityMetadata.target, 119 | selection.children![relation.propertyName], connection, qb, childAlias); 120 | } 121 | } 122 | }); 123 | } 124 | else if (selection === null) { 125 | history = history || new Set(); 126 | const relations = meta.relations; 127 | relations.forEach(relation => { 128 | const childAlias = `${alias}_${relation.propertyName}`; 129 | if (relation.inverseRelation) { 130 | if (history!.has(relation.inverseRelation)) { 131 | qb = qb.addSelect(alias); 132 | return; 133 | } 134 | history!.add(relation); 135 | qb = qb.addFrom(relation.inverseRelation.entityMetadata.targetName, 136 | relation.inverseEntityMetadata.targetName); 137 | qb = qb.leftJoin(alias + '.' + relation.propertyName, childAlias); 138 | qb = select(relation.inverseEntityMetadata.targetName, null, 139 | connection, qb, childAlias, history); 140 | } else { 141 | qb = qb.addSelect(`${alias}.${relation.propertyName}`, childAlias); 142 | } 143 | }); 144 | } 145 | return qb; 146 | } 147 | 148 | -------------------------------------------------------------------------------- /tests/common/seed.ts: -------------------------------------------------------------------------------- 1 | 2 | import { Chance } from 'chance'; 3 | import { Connection } from 'typeorm'; 4 | import { Post } from '../entity/Post'; 5 | import { User } from '../entity/User'; 6 | 7 | export async function seedDatabase(connection: Connection) { 8 | 9 | let UserRepo = connection.getRepository(User); 10 | let PostRepo = connection.getRepository(Post); 11 | 12 | const chance = new Chance(); 13 | 14 | let users: User[] = []; 15 | let posts: Post[] = []; 16 | 17 | if (await UserRepo.count() === 0) { 18 | await connection.transaction(async entityManager => 19 | { 20 | UserRepo = entityManager.getRepository(User); 21 | for (let i = 0; i < 50; i++) { 22 | const user = UserRepo.create({ 23 | email: chance.email(), 24 | firstName: chance.first(), 25 | lastName: chance.last(), 26 | age: chance.age() 27 | }); 28 | users.push(user); 29 | users = await entityManager.save(users); 30 | } 31 | }) 32 | } 33 | 34 | if (await PostRepo.count() === 0) { 35 | await connection.transaction(async entityManager => { 36 | PostRepo = entityManager.getRepository(Post); 37 | for (let i = 0; i < 1000; i++) { 38 | const post = PostRepo.create({ 39 | title: chance.sentence(), 40 | content: chance.paragraph({ sentences: chance.integer({ min: 1, max: 4 }) }), 41 | owner: chance.pickone(users) 42 | }); 43 | posts.push(post); 44 | } 45 | await entityManager.save(posts); 46 | }) 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /tests/common/util.ts: -------------------------------------------------------------------------------- 1 | export function toPlain(object: any) { 2 | return JSON.parse(JSON.stringify(object)); 3 | } 4 | -------------------------------------------------------------------------------- /tests/entity/Node.ts: -------------------------------------------------------------------------------- 1 | import { GraphQLID, GraphQLString } from 'graphql'; 2 | import { BaseEntity, PrimaryGeneratedColumn } from 'typeorm'; 3 | import { builder } from '../schema'; 4 | 5 | @builder.interface({ resolveType: (value: Node) => value.kind }) 6 | export class Node extends BaseEntity { 7 | /** 8 | * The most basic attribute identifying a node: its type (class name). 9 | * @type {string} 10 | */ 11 | @builder.field(GraphQLString) // define as a `String` field 12 | @builder.nonNull() // define as not nullable 13 | // attach a description, this will appear in your schema definition 14 | @builder.description('Type of this Node.') 15 | kind: string = this.constructor.name; 16 | 17 | /** 18 | * The unique ID of this node. 19 | * @type {string} 20 | */ 21 | @builder.nonNull() // this can not be null! 22 | @builder.field(GraphQLID) // define the field with a type of ID 23 | @builder.description('A unique ID for this object.') 24 | @PrimaryGeneratedColumn() 25 | id!: string|number; 26 | } 27 | -------------------------------------------------------------------------------- /tests/entity/Post.ts: -------------------------------------------------------------------------------- 1 | import { GraphQLID, GraphQLResolveInfo, GraphQLString } from 'graphql'; 2 | import { Entity, Column, ManyToOne, JoinColumn } from 'typeorm'; 3 | import { GraphQLDatabaseLoader } from '../../src'; 4 | import { builder } from '../schema/index'; 5 | 6 | import { Node } from './Node'; 7 | import { User } from './User'; 8 | 9 | @builder.input() 10 | class PostInput { 11 | 12 | @builder.field(GraphQLID) 13 | id!: string|number; 14 | 15 | @builder.field(GraphQLString) 16 | title!: string; 17 | 18 | @builder.field(GraphQLString) 19 | content!: string; 20 | 21 | @builder.field(GraphQLID) 22 | owner!: string|number; 23 | } 24 | 25 | @Entity() 26 | @builder.type() 27 | export class Post extends Node { 28 | 29 | @builder.nonNull() 30 | @builder.field(GraphQLString) 31 | @Column('varchar') 32 | title!: string; 33 | 34 | @builder.nonNull() 35 | @builder.field(GraphQLString) 36 | @Column('text') 37 | content!: string; 38 | 39 | @ManyToOne(type => User, user => user.posts) 40 | @JoinColumn() 41 | @builder.nonNull() 42 | @builder.field(() => User) 43 | owner!: User; 44 | 45 | @builder.query({ 46 | returnType: { 47 | type: () => Post, list: true, nonNullItems: true, nonNull: true 48 | }, 49 | args: { 50 | where: { 51 | type: () => PostInput, 52 | defaultValue: {} 53 | } 54 | } 55 | }) 56 | async posts(rootValue: any, args: any, context: { loader: GraphQLDatabaseLoader }, 57 | info: GraphQLResolveInfo) 58 | { 59 | return context.loader.loadMany(Post, args.where, info); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /tests/entity/User.ts: -------------------------------------------------------------------------------- 1 | import { GraphQLInt, GraphQLResolveInfo, GraphQLString } from 'graphql'; 2 | import { Entity, Column, ManyToOne, OneToMany, Connection } from 'typeorm'; 3 | import { GraphQLDatabaseLoader } from '../../src'; 4 | import { builder } from '../schema/index'; 5 | import { Node } from './Node'; 6 | import { Post } from './Post'; 7 | 8 | @Entity() 9 | @builder.type() 10 | export class User extends Node { 11 | 12 | @builder.nonNull() 13 | @builder.field(GraphQLString) 14 | @Column('varchar') 15 | email!: string; 16 | 17 | @builder.nonNull() 18 | @builder.field(GraphQLString) 19 | @Column('varchar') 20 | firstName!: string; 21 | 22 | @builder.nonNull() 23 | @builder.field(GraphQLString) 24 | @Column('varchar') 25 | lastName!: string; 26 | 27 | @builder.nonNull() 28 | @builder.field(GraphQLInt) 29 | @Column('int') 30 | age!: number; 31 | 32 | @builder.nonNull() 33 | @builder.nonNullItems() 34 | @builder.list(() => Post) 35 | @OneToMany(type => Post, post => post.owner) 36 | posts!: Post[]; 37 | 38 | @builder.query({ 39 | returnType: { 40 | type: () => User, list: true, nonNullItems: true, nonNull: true 41 | } 42 | }) 43 | async users(rootValue: any, args: any, context: { loader: GraphQLDatabaseLoader }, 44 | info: GraphQLResolveInfo) 45 | { 46 | return context.loader.loadMany(User, {}, info); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /tests/schema/index.ts: -------------------------------------------------------------------------------- 1 | import { SchemaBuilder } from 'metanoia'; 2 | 3 | export const builder = new SchemaBuilder(); 4 | -------------------------------------------------------------------------------- /tests/test_entity.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { Chance } from 'chance'; 3 | import { Connection, createConnection, Repository } from 'typeorm'; 4 | 5 | import { GraphQLDatabaseLoader } from '../src'; 6 | import { seedDatabase } from './common/seed'; 7 | import { toPlain } from './common/util'; 8 | import { Post } from './entity/Post'; 9 | import { User } from './entity/User'; 10 | 11 | let connection: Connection; 12 | let Posts: Post[], Users: User[]; 13 | 14 | describe('Entity loading', async function () { 15 | 16 | let userRepo: Repository, postRepo: Repository; 17 | 18 | before(async () => { 19 | connection = await createConnection({ 20 | name: 'entity', 21 | type: 'sqlite', 22 | database: 'test_entity.sqlite3', 23 | synchronize: true, 24 | dropSchema: false, 25 | entities: [Post, User], 26 | logging: false 27 | }); 28 | 29 | await seedDatabase(connection); 30 | 31 | userRepo = connection.getRepository(User); 32 | postRepo = connection.getRepository(Post); 33 | 34 | Users = await userRepo.find({ relations: ['posts'] }); 35 | Posts = await postRepo.find({ relations: ['owner'] }); 36 | }); 37 | 38 | const chance = new Chance(); 39 | 40 | it('should construct correctly', () => { 41 | const loader = new GraphQLDatabaseLoader(connection); 42 | expect(loader).to.be.instanceof(GraphQLDatabaseLoader); 43 | }); 44 | 45 | it('should load a single item by id', async () => { 46 | const loader = new GraphQLDatabaseLoader(connection); 47 | const post = chance.pickone(Posts); 48 | const result = await loader.loadOne('Post', { id: post.id }); 49 | expect(toPlain(result)).to.deep.equals(toPlain(post)); 50 | }); 51 | 52 | it('should batch-load many by ids', async () => { 53 | const loader = new GraphQLDatabaseLoader(connection); 54 | const posts = chance.pickset(Posts, 4); 55 | const result = await loader.batchLoadMany('Post', posts.map(post => ({ id: post.id }))); 56 | expect(toPlain(result)).to.deep.equals(toPlain(posts)); 57 | }); 58 | 59 | it('should batch-load many by title and owner', async () => { 60 | const loader = new GraphQLDatabaseLoader(connection); 61 | const posts = chance.pickset(Posts, 4); 62 | const result = await loader.batchLoadMany('Post', 63 | posts.map(post => ({ title: post.title, owner: post.owner }))); 64 | expect(toPlain(result)).to.deep.equals(toPlain(posts)); 65 | }); 66 | 67 | it('should load many by owner', async () => { 68 | const loader = new GraphQLDatabaseLoader(connection); 69 | const user = chance.pickone(Users); 70 | const owned = Posts.filter(p => p.owner.id == user.id); 71 | const results = await loader.loadMany('Post', { owner: { id: user.id } }); 72 | expect(results).to.deep.include.members(owned); 73 | }); 74 | 75 | it('should batch unrelated requests', async () => { 76 | const batchLoader = new GraphQLDatabaseLoader(connection); 77 | const randomPost = chance.pickone(Posts); 78 | const randomUser = chance.pickone(Users); 79 | const owned = randomUser.posts.map( 80 | post => Posts.find(p => p.id === post.id)); 81 | const expected = [randomPost, randomUser, owned]; 82 | const promises: Promise[] = [ 83 | batchLoader.loadOne('Post', { id: randomPost.id }), 84 | batchLoader.loadOne('User', { id: randomUser.id }), 85 | batchLoader.loadMany('Post', { owner: { id: randomUser.id } }) 86 | ]; 87 | const results = await Promise.all(promises); 88 | expect(toPlain(results)) 89 | .to.deep.equal(toPlain(expected)); 90 | }); 91 | 92 | }); 93 | -------------------------------------------------------------------------------- /tests/test_grapql.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { Chance } from 'chance'; 3 | import { graphql, GraphQLSchema } from 'graphql'; 4 | import { Connection, createConnection } from 'typeorm'; 5 | import { GraphQLDatabaseLoader } from '../src'; 6 | 7 | import { seedDatabase } from './common/seed'; 8 | import { Post } from './entity/Post'; 9 | import { User } from './entity/User'; 10 | import { builder } from './schema'; 11 | 12 | let connection: Connection; 13 | let Posts: Post[], Users: User[]; 14 | 15 | describe('GraphQL resolvers', function () { 16 | 17 | let schema: GraphQLSchema; 18 | let loader: GraphQLDatabaseLoader; 19 | 20 | before(async () => { 21 | connection = await createConnection({ 22 | name: 'graphql', 23 | type: 'sqlite', 24 | database: 'test_graphql.sqlite3', 25 | synchronize: true, 26 | dropSchema: true, 27 | entities: [Post, User], 28 | logging: false 29 | }); 30 | 31 | await seedDatabase(connection); 32 | 33 | Users = await connection.getRepository(User).find({ relations: ['posts'] }); 34 | Posts = await connection.getRepository(Post).find({ relations: ['owner'] }); 35 | 36 | schema = builder.build(); 37 | loader = new GraphQLDatabaseLoader(connection); 38 | }); 39 | 40 | it('can make a simple query', async () => { 41 | // const loader = new GraphQLDatabaseLoader(connection); 42 | const result = await graphql(schema, '{ users { id } }', {}, { 43 | loader 44 | }); 45 | expect(result.errors || []).to.deep.equal([]); 46 | expect(result).to.not.have.key('errors'); 47 | expect(result.data).to.deep.equal({ 48 | users: Users.map(({ id }) => ({ id: id.toString() })) 49 | }); 50 | }); 51 | 52 | it('can batch multiple queries', async () => { 53 | const results = await Promise.all([ 54 | graphql(schema, '{ users { id } }', {}, { 55 | loader 56 | }), 57 | graphql(schema, '{ posts { id, owner { id } } }', {}, { 58 | loader 59 | }) 60 | ]); 61 | const expected = [ 62 | { 63 | data: { 64 | users: Users.map(({ id }) => ({ id: id.toString() })) 65 | } 66 | }, 67 | { 68 | data: { 69 | posts: Posts.map(({ id, owner }) => ({ 70 | id: id.toString(), owner: { id: owner.id.toString() } 71 | })) 72 | } 73 | } 74 | ]; 75 | for (let result of results) { 76 | expect(result.errors || []).to.deep.equal([]); 77 | expect(result).to.not.have.key('errors'); 78 | } 79 | expect(results).to.deep.equal(expected); 80 | }); 81 | 82 | 83 | }); 84 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ 5 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 6 | "lib": ["esnext", "esnext.asynciterable"], /* Specify library files to be included in the compilation: */ 7 | // "allowJs": true, /* Allow javascript files to be compiled. */ 8 | // "checkJs": true, /* Report errors in .js files. */ 9 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 10 | "declaration": true, /* Generates corresponding '.d.ts' file. */ 11 | "sourceMap": true, /* Generates corresponding '.map' file. */ 12 | // "outFile": "./", /* Concatenate and emit output to single file. */ 13 | "outDir": "dist/", /* Redirect output structure to the directory. */ 14 | "rootDir": "src/", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 15 | // "removeComments": true, /* Do not emit comments to output. */ 16 | // "noEmit": true, /* Do not emit outputs. */ 17 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 18 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 19 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 20 | 21 | /* Strict Type-Checking Options */ 22 | "strict": true, /* Enable all strict type-checking options. */ 23 | "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 24 | "strictNullChecks": true, /* Enable strict null checks. */ 25 | "strictFunctionTypes": true, /* Enable strict checking of function types. */ 26 | "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 27 | "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 28 | 29 | /* Additional Checks */ 30 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 31 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 32 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 33 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 34 | 35 | /* Module Resolution Options */ 36 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 37 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 38 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 39 | // "rootDirs": ["src/"], /* List of root folders whose combined content represents the structure of the project at runtime. */ 40 | // "typeRoots": [], /* List of folders to include type definitions from. */ 41 | // "types": [], /* Type declaration files to be included in compilation. */ 42 | "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 43 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 44 | 45 | /* Source Map Options */ 46 | // "sourceRoot": "./", /* Specify the location options debugger should locate TypeScript files instead of source locations. */ 47 | // "mapRoot": "./", /* Specify the location options debugger should locate map files instead of generated locations. */ 48 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 49 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 50 | 51 | /* Experimental Options */ 52 | "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 53 | "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */ 54 | }, 55 | "include": ["src"], 56 | "exclude": ["tests"] 57 | } 58 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/chai@^4.1.7": 6 | version "4.1.7" 7 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a" 8 | 9 | "@types/chance@^1.0.1": 10 | version "1.0.1" 11 | resolved "https://registry.yarnpkg.com/@types/chance/-/chance-1.0.1.tgz#c10703020369602c40dd9428cc6e1437027116df" 12 | 13 | "@types/deep-equal@^1.0.1": 14 | version "1.0.1" 15 | resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03" 16 | 17 | "@types/graphql@^14.0.3": 18 | version "14.0.3" 19 | resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-14.0.3.tgz#389e2e5b83ecdb376d9f98fae2094297bc112c1c" 20 | 21 | "@types/mocha@^5.2.5": 22 | version "5.2.5" 23 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073" 24 | 25 | "@types/node@*": 26 | version "10.12.0" 27 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235" 28 | 29 | "@types/node@^10.12.1": 30 | version "10.12.1" 31 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.1.tgz#da61b64a2930a80fa708e57c45cd5441eb379d5b" 32 | 33 | "@types/object-path@^0.9.29": 34 | version "0.9.29" 35 | resolved "https://registry.yarnpkg.com/@types/object-path/-/object-path-0.9.29.tgz#fca97eef86e8d78f3d5ada611b30289ec7cc90e8" 36 | 37 | abbrev@1: 38 | version "1.1.1" 39 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 40 | 41 | ajv@^5.3.0: 42 | version "5.5.2" 43 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 44 | dependencies: 45 | co "^4.6.0" 46 | fast-deep-equal "^1.0.0" 47 | fast-json-stable-stringify "^2.0.0" 48 | json-schema-traverse "^0.3.0" 49 | 50 | ansi-regex@^2.0.0: 51 | version "2.1.1" 52 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 53 | 54 | ansi-regex@^3.0.0: 55 | version "3.0.0" 56 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 57 | 58 | ansi-styles@^2.2.1: 59 | version "2.2.1" 60 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 61 | 62 | ansi-styles@^3.2.1: 63 | version "3.2.1" 64 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 65 | dependencies: 66 | color-convert "^1.9.0" 67 | 68 | any-promise@^1.0.0: 69 | version "1.3.0" 70 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 71 | 72 | app-root-path@^2.0.1: 73 | version "2.1.0" 74 | resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.1.0.tgz#98bf6599327ecea199309866e8140368fd2e646a" 75 | 76 | aproba@^1.0.3: 77 | version "1.2.0" 78 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 79 | 80 | are-we-there-yet@~1.1.2: 81 | version "1.1.5" 82 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 83 | dependencies: 84 | delegates "^1.0.0" 85 | readable-stream "^2.0.6" 86 | 87 | argparse@^1.0.7: 88 | version "1.0.10" 89 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 90 | dependencies: 91 | sprintf-js "~1.0.2" 92 | 93 | arrify@^1.0.0: 94 | version "1.0.1" 95 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 96 | 97 | asn1@~0.2.3: 98 | version "0.2.4" 99 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 100 | dependencies: 101 | safer-buffer "~2.1.0" 102 | 103 | assert-plus@1.0.0, assert-plus@^1.0.0: 104 | version "1.0.0" 105 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 106 | 107 | assertion-error@^1.1.0: 108 | version "1.1.0" 109 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 110 | 111 | asynckit@^0.4.0: 112 | version "0.4.0" 113 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 114 | 115 | aws-sign2@~0.7.0: 116 | version "0.7.0" 117 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 118 | 119 | aws4@^1.8.0: 120 | version "1.8.0" 121 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 122 | 123 | balanced-match@^1.0.0: 124 | version "1.0.0" 125 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 126 | 127 | base64-js@^1.0.2: 128 | version "1.3.0" 129 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" 130 | 131 | bcrypt-pbkdf@^1.0.0: 132 | version "1.0.2" 133 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 134 | dependencies: 135 | tweetnacl "^0.14.3" 136 | 137 | brace-expansion@^1.1.7: 138 | version "1.1.11" 139 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 140 | dependencies: 141 | balanced-match "^1.0.0" 142 | concat-map "0.0.1" 143 | 144 | browser-stdout@1.3.1: 145 | version "1.3.1" 146 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 147 | 148 | buffer-from@^1.0.0, buffer-from@^1.1.0: 149 | version "1.1.1" 150 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 151 | 152 | buffer@^5.1.0: 153 | version "5.2.1" 154 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" 155 | dependencies: 156 | base64-js "^1.0.2" 157 | ieee754 "^1.1.4" 158 | 159 | camelcase@^4.1.0: 160 | version "4.1.0" 161 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 162 | 163 | caseless@~0.12.0: 164 | version "0.12.0" 165 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 166 | 167 | chai@^4.2.0: 168 | version "4.2.0" 169 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" 170 | dependencies: 171 | assertion-error "^1.1.0" 172 | check-error "^1.0.2" 173 | deep-eql "^3.0.1" 174 | get-func-name "^2.0.0" 175 | pathval "^1.1.0" 176 | type-detect "^4.0.5" 177 | 178 | chalk@^1.1.1: 179 | version "1.1.3" 180 | resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 181 | dependencies: 182 | ansi-styles "^2.2.1" 183 | escape-string-regexp "^1.0.2" 184 | has-ansi "^2.0.0" 185 | strip-ansi "^3.0.0" 186 | supports-color "^2.0.0" 187 | 188 | chalk@^2.3.0, chalk@^2.3.2: 189 | version "2.4.1" 190 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 191 | dependencies: 192 | ansi-styles "^3.2.1" 193 | escape-string-regexp "^1.0.5" 194 | supports-color "^5.3.0" 195 | 196 | chance@^1.0.16: 197 | version "1.0.16" 198 | resolved "https://registry.yarnpkg.com/chance/-/chance-1.0.16.tgz#bd61912716b0010c3dca8e3948a960efcaa7bb1b" 199 | 200 | check-error@^1.0.2: 201 | version "1.0.2" 202 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 203 | 204 | chownr@^1.0.1: 205 | version "1.1.1" 206 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" 207 | 208 | cli-highlight@^1.2.3: 209 | version "1.2.3" 210 | resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-1.2.3.tgz#b200f97ed0e43d24633e89de0f489a48bb87d2bf" 211 | dependencies: 212 | chalk "^2.3.0" 213 | highlight.js "^9.6.0" 214 | mz "^2.4.0" 215 | parse5 "^3.0.3" 216 | yargs "^10.0.3" 217 | 218 | cliui@^4.0.0: 219 | version "4.1.0" 220 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" 221 | dependencies: 222 | string-width "^2.1.1" 223 | strip-ansi "^4.0.0" 224 | wrap-ansi "^2.0.0" 225 | 226 | co@^4.6.0: 227 | version "4.6.0" 228 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 229 | 230 | code-point-at@^1.0.0: 231 | version "1.1.0" 232 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 233 | 234 | color-convert@^1.9.0: 235 | version "1.9.3" 236 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 237 | dependencies: 238 | color-name "1.1.3" 239 | 240 | color-name@1.1.3: 241 | version "1.1.3" 242 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 243 | 244 | combined-stream@^1.0.6, combined-stream@~1.0.6: 245 | version "1.0.7" 246 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" 247 | dependencies: 248 | delayed-stream "~1.0.0" 249 | 250 | commander@2.15.1: 251 | version "2.15.1" 252 | resolved "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" 253 | 254 | concat-map@0.0.1: 255 | version "0.0.1" 256 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 257 | 258 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 259 | version "1.1.0" 260 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 261 | 262 | core-util-is@1.0.2, core-util-is@~1.0.0: 263 | version "1.0.2" 264 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 265 | 266 | cross-spawn@^5.0.1: 267 | version "5.1.0" 268 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 269 | dependencies: 270 | lru-cache "^4.0.1" 271 | shebang-command "^1.2.0" 272 | which "^1.2.9" 273 | 274 | dashdash@^1.12.0: 275 | version "1.14.1" 276 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 277 | dependencies: 278 | assert-plus "^1.0.0" 279 | 280 | debug@3.1.0: 281 | version "3.1.0" 282 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 283 | dependencies: 284 | ms "2.0.0" 285 | 286 | debug@^2.1.2: 287 | version "2.6.9" 288 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 289 | dependencies: 290 | ms "2.0.0" 291 | 292 | debug@^3.1.0: 293 | version "3.2.6" 294 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 295 | dependencies: 296 | ms "^2.1.1" 297 | 298 | decamelize@^1.1.1: 299 | version "1.2.0" 300 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 301 | 302 | deep-eql@^3.0.1: 303 | version "3.0.1" 304 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 305 | dependencies: 306 | type-detect "^4.0.0" 307 | 308 | deep-equal@^1.0.1: 309 | version "1.0.1" 310 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 311 | 312 | deep-extend@^0.6.0: 313 | version "0.6.0" 314 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 315 | 316 | delayed-stream@~1.0.0: 317 | version "1.0.0" 318 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 319 | 320 | delegates@^1.0.0: 321 | version "1.0.0" 322 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 323 | 324 | detect-libc@^1.0.2: 325 | version "1.0.3" 326 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 327 | 328 | diff@3.5.0, diff@^3.1.0: 329 | version "3.5.0" 330 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 331 | 332 | dotenv@^5.0.1: 333 | version "5.0.1" 334 | resolved "http://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" 335 | 336 | ecc-jsbn@~0.1.1: 337 | version "0.1.2" 338 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 339 | dependencies: 340 | jsbn "~0.1.0" 341 | safer-buffer "^2.1.0" 342 | 343 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 344 | version "1.0.5" 345 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 346 | 347 | esprima@^4.0.0: 348 | version "4.0.1" 349 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 350 | 351 | execa@^0.7.0: 352 | version "0.7.0" 353 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 354 | dependencies: 355 | cross-spawn "^5.0.1" 356 | get-stream "^3.0.0" 357 | is-stream "^1.1.0" 358 | npm-run-path "^2.0.0" 359 | p-finally "^1.0.0" 360 | signal-exit "^3.0.0" 361 | strip-eof "^1.0.0" 362 | 363 | extend@~3.0.2: 364 | version "3.0.2" 365 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 366 | 367 | extsprintf@1.3.0: 368 | version "1.3.0" 369 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 370 | 371 | extsprintf@^1.2.0: 372 | version "1.4.0" 373 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 374 | 375 | fast-deep-equal@^1.0.0: 376 | version "1.1.0" 377 | resolved "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 378 | 379 | fast-json-stable-stringify@^2.0.0: 380 | version "2.0.0" 381 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 382 | 383 | figlet@^1.1.1: 384 | version "1.2.1" 385 | resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.2.1.tgz#48d35df9d9b10b1b3888302e6e57904a0b00509c" 386 | 387 | find-up@^2.1.0: 388 | version "2.1.0" 389 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 390 | dependencies: 391 | locate-path "^2.0.0" 392 | 393 | forever-agent@~0.6.1: 394 | version "0.6.1" 395 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 396 | 397 | form-data@~2.3.2: 398 | version "2.3.3" 399 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 400 | dependencies: 401 | asynckit "^0.4.0" 402 | combined-stream "^1.0.6" 403 | mime-types "^2.1.12" 404 | 405 | fs-minipass@^1.2.5: 406 | version "1.2.5" 407 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 408 | dependencies: 409 | minipass "^2.2.1" 410 | 411 | fs.realpath@^1.0.0: 412 | version "1.0.0" 413 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 414 | 415 | gauge@~2.7.3: 416 | version "2.7.4" 417 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 418 | dependencies: 419 | aproba "^1.0.3" 420 | console-control-strings "^1.0.0" 421 | has-unicode "^2.0.0" 422 | object-assign "^4.1.0" 423 | signal-exit "^3.0.0" 424 | string-width "^1.0.1" 425 | strip-ansi "^3.0.1" 426 | wide-align "^1.1.0" 427 | 428 | get-caller-file@^1.0.1: 429 | version "1.0.3" 430 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 431 | 432 | get-func-name@^2.0.0: 433 | version "2.0.0" 434 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 435 | 436 | get-stream@^3.0.0: 437 | version "3.0.0" 438 | resolved "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 439 | 440 | getpass@^0.1.1: 441 | version "0.1.7" 442 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 443 | dependencies: 444 | assert-plus "^1.0.0" 445 | 446 | glob@7.1.2: 447 | version "7.1.2" 448 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 449 | dependencies: 450 | fs.realpath "^1.0.0" 451 | inflight "^1.0.4" 452 | inherits "2" 453 | minimatch "^3.0.4" 454 | once "^1.3.0" 455 | path-is-absolute "^1.0.0" 456 | 457 | glob@^7.0.5, glob@^7.1.2: 458 | version "7.1.3" 459 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 460 | dependencies: 461 | fs.realpath "^1.0.0" 462 | inflight "^1.0.4" 463 | inherits "2" 464 | minimatch "^3.0.4" 465 | once "^1.3.0" 466 | path-is-absolute "^1.0.0" 467 | 468 | graphql@^14.0.2: 469 | version "14.0.2" 470 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.0.2.tgz#7dded337a4c3fd2d075692323384034b357f5650" 471 | dependencies: 472 | iterall "^1.2.2" 473 | 474 | growl@1.10.5: 475 | version "1.10.5" 476 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 477 | 478 | har-schema@^2.0.0: 479 | version "2.0.0" 480 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 481 | 482 | har-validator@~5.1.0: 483 | version "5.1.0" 484 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" 485 | dependencies: 486 | ajv "^5.3.0" 487 | har-schema "^2.0.0" 488 | 489 | has-ansi@^2.0.0: 490 | version "2.0.0" 491 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 492 | dependencies: 493 | ansi-regex "^2.0.0" 494 | 495 | has-flag@^3.0.0: 496 | version "3.0.0" 497 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 498 | 499 | has-unicode@^2.0.0: 500 | version "2.0.1" 501 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 502 | 503 | he@1.1.1: 504 | version "1.1.1" 505 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 506 | 507 | highlight.js@^9.6.0: 508 | version "9.13.1" 509 | resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" 510 | 511 | http-signature@~1.2.0: 512 | version "1.2.0" 513 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 514 | dependencies: 515 | assert-plus "^1.0.0" 516 | jsprim "^1.2.2" 517 | sshpk "^1.7.0" 518 | 519 | iconv-lite@^0.4.4: 520 | version "0.4.24" 521 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 522 | dependencies: 523 | safer-buffer ">= 2.1.2 < 3" 524 | 525 | ieee754@^1.1.4: 526 | version "1.1.12" 527 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" 528 | 529 | ignore-walk@^3.0.1: 530 | version "3.0.1" 531 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 532 | dependencies: 533 | minimatch "^3.0.4" 534 | 535 | inflight@^1.0.4: 536 | version "1.0.6" 537 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 538 | dependencies: 539 | once "^1.3.0" 540 | wrappy "1" 541 | 542 | inherits@2, inherits@~2.0.3: 543 | version "2.0.3" 544 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 545 | 546 | ini@~1.3.0: 547 | version "1.3.5" 548 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 549 | 550 | invert-kv@^1.0.0: 551 | version "1.0.0" 552 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 553 | 554 | is-fullwidth-code-point@^1.0.0: 555 | version "1.0.0" 556 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 557 | dependencies: 558 | number-is-nan "^1.0.0" 559 | 560 | is-fullwidth-code-point@^2.0.0: 561 | version "2.0.0" 562 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 563 | 564 | is-stream@^1.1.0: 565 | version "1.1.0" 566 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 567 | 568 | is-typedarray@~1.0.0: 569 | version "1.0.0" 570 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 571 | 572 | isarray@~1.0.0: 573 | version "1.0.0" 574 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 575 | 576 | isexe@^2.0.0: 577 | version "2.0.0" 578 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 579 | 580 | isstream@~0.1.2: 581 | version "0.1.2" 582 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 583 | 584 | iterall@^1.2.2: 585 | version "1.2.2" 586 | resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" 587 | 588 | js-yaml@^3.11.0: 589 | version "3.12.0" 590 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 591 | dependencies: 592 | argparse "^1.0.7" 593 | esprima "^4.0.0" 594 | 595 | jsbn@~0.1.0: 596 | version "0.1.1" 597 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 598 | 599 | json-schema-traverse@^0.3.0: 600 | version "0.3.1" 601 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 602 | 603 | json-schema@0.2.3: 604 | version "0.2.3" 605 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 606 | 607 | json-stringify-safe@~5.0.1: 608 | version "5.0.1" 609 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 610 | 611 | jsprim@^1.2.2: 612 | version "1.4.1" 613 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 614 | dependencies: 615 | assert-plus "1.0.0" 616 | extsprintf "1.3.0" 617 | json-schema "0.2.3" 618 | verror "1.10.0" 619 | 620 | lcid@^1.0.0: 621 | version "1.0.0" 622 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 623 | dependencies: 624 | invert-kv "^1.0.0" 625 | 626 | locate-path@^2.0.0: 627 | version "2.0.0" 628 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 629 | dependencies: 630 | p-locate "^2.0.0" 631 | path-exists "^3.0.0" 632 | 633 | lru-cache@^4.0.1: 634 | version "4.1.3" 635 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" 636 | dependencies: 637 | pseudomap "^1.0.2" 638 | yallist "^2.1.2" 639 | 640 | make-error@^1.1.1: 641 | version "1.3.5" 642 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" 643 | 644 | mem@^1.1.0: 645 | version "1.1.0" 646 | resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" 647 | dependencies: 648 | mimic-fn "^1.0.0" 649 | 650 | metanoia@^1.0.1: 651 | version "1.0.1" 652 | resolved "https://registry.yarnpkg.com/metanoia/-/metanoia-1.0.1.tgz#8089f5ec5e637b118e750a511b183a1bf533a6e4" 653 | 654 | mime-db@~1.37.0: 655 | version "1.37.0" 656 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" 657 | 658 | mime-types@^2.1.12, mime-types@~2.1.19: 659 | version "2.1.21" 660 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" 661 | dependencies: 662 | mime-db "~1.37.0" 663 | 664 | mimic-fn@^1.0.0: 665 | version "1.2.0" 666 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 667 | 668 | minimatch@3.0.4, minimatch@^3.0.4: 669 | version "3.0.4" 670 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 671 | dependencies: 672 | brace-expansion "^1.1.7" 673 | 674 | minimist@0.0.8: 675 | version "0.0.8" 676 | resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 677 | 678 | minimist@^1.2.0: 679 | version "1.2.0" 680 | resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 681 | 682 | minipass@^2.2.1, minipass@^2.3.3: 683 | version "2.3.5" 684 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" 685 | dependencies: 686 | safe-buffer "^5.1.2" 687 | yallist "^3.0.0" 688 | 689 | minizlib@^1.1.0: 690 | version "1.1.1" 691 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" 692 | dependencies: 693 | minipass "^2.2.1" 694 | 695 | mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: 696 | version "0.5.1" 697 | resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 698 | dependencies: 699 | minimist "0.0.8" 700 | 701 | mocha@^5.2.0: 702 | version "5.2.0" 703 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" 704 | dependencies: 705 | browser-stdout "1.3.1" 706 | commander "2.15.1" 707 | debug "3.1.0" 708 | diff "3.5.0" 709 | escape-string-regexp "1.0.5" 710 | glob "7.1.2" 711 | growl "1.10.5" 712 | he "1.1.1" 713 | minimatch "3.0.4" 714 | mkdirp "0.5.1" 715 | supports-color "5.4.0" 716 | 717 | ms@2.0.0: 718 | version "2.0.0" 719 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 720 | 721 | ms@^2.1.1: 722 | version "2.1.1" 723 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 724 | 725 | mz@^2.4.0: 726 | version "2.7.0" 727 | resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 728 | dependencies: 729 | any-promise "^1.0.0" 730 | object-assign "^4.0.1" 731 | thenify-all "^1.0.0" 732 | 733 | nan@~2.10.0: 734 | version "2.10.0" 735 | resolved "http://registry.npmjs.org/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" 736 | 737 | needle@^2.2.1: 738 | version "2.2.4" 739 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" 740 | dependencies: 741 | debug "^2.1.2" 742 | iconv-lite "^0.4.4" 743 | sax "^1.2.4" 744 | 745 | node-pre-gyp@^0.10.3: 746 | version "0.10.3" 747 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" 748 | dependencies: 749 | detect-libc "^1.0.2" 750 | mkdirp "^0.5.1" 751 | needle "^2.2.1" 752 | nopt "^4.0.1" 753 | npm-packlist "^1.1.6" 754 | npmlog "^4.0.2" 755 | rc "^1.2.7" 756 | rimraf "^2.6.1" 757 | semver "^5.3.0" 758 | tar "^4" 759 | 760 | nopt@^4.0.1: 761 | version "4.0.1" 762 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 763 | dependencies: 764 | abbrev "1" 765 | osenv "^0.1.4" 766 | 767 | npm-bundled@^1.0.1: 768 | version "1.0.5" 769 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" 770 | 771 | npm-packlist@^1.1.6: 772 | version "1.1.12" 773 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" 774 | dependencies: 775 | ignore-walk "^3.0.1" 776 | npm-bundled "^1.0.1" 777 | 778 | npm-run-path@^2.0.0: 779 | version "2.0.2" 780 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 781 | dependencies: 782 | path-key "^2.0.0" 783 | 784 | npmlog@^4.0.2: 785 | version "4.1.2" 786 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 787 | dependencies: 788 | are-we-there-yet "~1.1.2" 789 | console-control-strings "~1.1.0" 790 | gauge "~2.7.3" 791 | set-blocking "~2.0.0" 792 | 793 | number-is-nan@^1.0.0: 794 | version "1.0.1" 795 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 796 | 797 | oauth-sign@~0.9.0: 798 | version "0.9.0" 799 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 800 | 801 | object-assign@^4.0.1, object-assign@^4.1.0: 802 | version "4.1.1" 803 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 804 | 805 | object-path@^0.11.4: 806 | version "0.11.4" 807 | resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" 808 | 809 | once@^1.3.0: 810 | version "1.4.0" 811 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 812 | dependencies: 813 | wrappy "1" 814 | 815 | os-homedir@^1.0.0: 816 | version "1.0.2" 817 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 818 | 819 | os-locale@^2.0.0: 820 | version "2.1.0" 821 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" 822 | dependencies: 823 | execa "^0.7.0" 824 | lcid "^1.0.0" 825 | mem "^1.1.0" 826 | 827 | os-tmpdir@^1.0.0: 828 | version "1.0.2" 829 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 830 | 831 | osenv@^0.1.4: 832 | version "0.1.5" 833 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 834 | dependencies: 835 | os-homedir "^1.0.0" 836 | os-tmpdir "^1.0.0" 837 | 838 | p-finally@^1.0.0: 839 | version "1.0.0" 840 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 841 | 842 | p-limit@^1.1.0: 843 | version "1.3.0" 844 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 845 | dependencies: 846 | p-try "^1.0.0" 847 | 848 | p-locate@^2.0.0: 849 | version "2.0.0" 850 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 851 | dependencies: 852 | p-limit "^1.1.0" 853 | 854 | p-try@^1.0.0: 855 | version "1.0.0" 856 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 857 | 858 | parent-require@^1.0.0: 859 | version "1.0.0" 860 | resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" 861 | 862 | parse5@^3.0.3: 863 | version "3.0.3" 864 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" 865 | dependencies: 866 | "@types/node" "*" 867 | 868 | path-exists@^3.0.0: 869 | version "3.0.0" 870 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 871 | 872 | path-is-absolute@^1.0.0: 873 | version "1.0.1" 874 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 875 | 876 | path-key@^2.0.0: 877 | version "2.0.1" 878 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 879 | 880 | pathval@^1.1.0: 881 | version "1.1.0" 882 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 883 | 884 | performance-now@^2.1.0: 885 | version "2.1.0" 886 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 887 | 888 | process-nextick-args@~2.0.0: 889 | version "2.0.0" 890 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 891 | 892 | pseudomap@^1.0.2: 893 | version "1.0.2" 894 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 895 | 896 | psl@^1.1.24: 897 | version "1.1.29" 898 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" 899 | 900 | punycode@^1.4.1: 901 | version "1.4.1" 902 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 903 | 904 | qs@~6.5.2: 905 | version "6.5.2" 906 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 907 | 908 | rc@^1.2.7: 909 | version "1.2.8" 910 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 911 | dependencies: 912 | deep-extend "^0.6.0" 913 | ini "~1.3.0" 914 | minimist "^1.2.0" 915 | strip-json-comments "~2.0.1" 916 | 917 | readable-stream@^2.0.6: 918 | version "2.3.6" 919 | resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 920 | dependencies: 921 | core-util-is "~1.0.0" 922 | inherits "~2.0.3" 923 | isarray "~1.0.0" 924 | process-nextick-args "~2.0.0" 925 | safe-buffer "~5.1.1" 926 | string_decoder "~1.1.1" 927 | util-deprecate "~1.0.1" 928 | 929 | reflect-metadata@^0.1.12: 930 | version "0.1.12" 931 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" 932 | 933 | request@^2.87.0: 934 | version "2.88.0" 935 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 936 | dependencies: 937 | aws-sign2 "~0.7.0" 938 | aws4 "^1.8.0" 939 | caseless "~0.12.0" 940 | combined-stream "~1.0.6" 941 | extend "~3.0.2" 942 | forever-agent "~0.6.1" 943 | form-data "~2.3.2" 944 | har-validator "~5.1.0" 945 | http-signature "~1.2.0" 946 | is-typedarray "~1.0.0" 947 | isstream "~0.1.2" 948 | json-stringify-safe "~5.0.1" 949 | mime-types "~2.1.19" 950 | oauth-sign "~0.9.0" 951 | performance-now "^2.1.0" 952 | qs "~6.5.2" 953 | safe-buffer "^5.1.2" 954 | tough-cookie "~2.4.3" 955 | tunnel-agent "^0.6.0" 956 | uuid "^3.3.2" 957 | 958 | require-directory@^2.1.1: 959 | version "2.1.1" 960 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 961 | 962 | require-main-filename@^1.0.1: 963 | version "1.0.1" 964 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 965 | 966 | rimraf@^2.6.1: 967 | version "2.6.2" 968 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 969 | dependencies: 970 | glob "^7.0.5" 971 | 972 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 973 | version "5.1.2" 974 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 975 | 976 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 977 | version "2.1.2" 978 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 979 | 980 | sax@>=0.6.0, sax@^1.2.4: 981 | version "1.2.4" 982 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 983 | 984 | semver@^5.3.0: 985 | version "5.6.0" 986 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 987 | 988 | set-blocking@^2.0.0, set-blocking@~2.0.0: 989 | version "2.0.0" 990 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 991 | 992 | shebang-command@^1.2.0: 993 | version "1.2.0" 994 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 995 | dependencies: 996 | shebang-regex "^1.0.0" 997 | 998 | shebang-regex@^1.0.0: 999 | version "1.0.0" 1000 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1001 | 1002 | signal-exit@^3.0.0: 1003 | version "3.0.2" 1004 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1005 | 1006 | source-map-support@^0.5.6: 1007 | version "0.5.9" 1008 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" 1009 | dependencies: 1010 | buffer-from "^1.0.0" 1011 | source-map "^0.6.0" 1012 | 1013 | source-map@^0.6.0: 1014 | version "0.6.1" 1015 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1016 | 1017 | sprintf-js@~1.0.2: 1018 | version "1.0.3" 1019 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1020 | 1021 | sqlite3@^4.0.3: 1022 | version "4.0.3" 1023 | resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.3.tgz#da8c167a87941657fd22e27b248aa371e192b715" 1024 | dependencies: 1025 | nan "~2.10.0" 1026 | node-pre-gyp "^0.10.3" 1027 | request "^2.87.0" 1028 | 1029 | sshpk@^1.7.0: 1030 | version "1.15.1" 1031 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.1.tgz#b79a089a732e346c6e0714830f36285cd38191a2" 1032 | dependencies: 1033 | asn1 "~0.2.3" 1034 | assert-plus "^1.0.0" 1035 | bcrypt-pbkdf "^1.0.0" 1036 | dashdash "^1.12.0" 1037 | ecc-jsbn "~0.1.1" 1038 | getpass "^0.1.1" 1039 | jsbn "~0.1.0" 1040 | safer-buffer "^2.0.2" 1041 | tweetnacl "~0.14.0" 1042 | 1043 | string-width@^1.0.1: 1044 | version "1.0.2" 1045 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1046 | dependencies: 1047 | code-point-at "^1.0.0" 1048 | is-fullwidth-code-point "^1.0.0" 1049 | strip-ansi "^3.0.0" 1050 | 1051 | "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: 1052 | version "2.1.1" 1053 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1054 | dependencies: 1055 | is-fullwidth-code-point "^2.0.0" 1056 | strip-ansi "^4.0.0" 1057 | 1058 | string_decoder@~1.1.1: 1059 | version "1.1.1" 1060 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1061 | dependencies: 1062 | safe-buffer "~5.1.0" 1063 | 1064 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1065 | version "3.0.1" 1066 | resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1067 | dependencies: 1068 | ansi-regex "^2.0.0" 1069 | 1070 | strip-ansi@^4.0.0: 1071 | version "4.0.0" 1072 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1073 | dependencies: 1074 | ansi-regex "^3.0.0" 1075 | 1076 | strip-eof@^1.0.0: 1077 | version "1.0.0" 1078 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1079 | 1080 | strip-json-comments@~2.0.1: 1081 | version "2.0.1" 1082 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1083 | 1084 | supports-color@5.4.0: 1085 | version "5.4.0" 1086 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 1087 | dependencies: 1088 | has-flag "^3.0.0" 1089 | 1090 | supports-color@^2.0.0: 1091 | version "2.0.0" 1092 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1093 | 1094 | supports-color@^5.3.0: 1095 | version "5.5.0" 1096 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1097 | dependencies: 1098 | has-flag "^3.0.0" 1099 | 1100 | tar@^4: 1101 | version "4.4.6" 1102 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" 1103 | dependencies: 1104 | chownr "^1.0.1" 1105 | fs-minipass "^1.2.5" 1106 | minipass "^2.3.3" 1107 | minizlib "^1.1.0" 1108 | mkdirp "^0.5.0" 1109 | safe-buffer "^5.1.2" 1110 | yallist "^3.0.2" 1111 | 1112 | thenify-all@^1.0.0: 1113 | version "1.6.0" 1114 | resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 1115 | dependencies: 1116 | thenify ">= 3.1.0 < 4" 1117 | 1118 | "thenify@>= 3.1.0 < 4": 1119 | version "3.3.0" 1120 | resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" 1121 | dependencies: 1122 | any-promise "^1.0.0" 1123 | 1124 | tough-cookie@~2.4.3: 1125 | version "2.4.3" 1126 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 1127 | dependencies: 1128 | psl "^1.1.24" 1129 | punycode "^1.4.1" 1130 | 1131 | ts-node@^7.0.1: 1132 | version "7.0.1" 1133 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" 1134 | dependencies: 1135 | arrify "^1.0.0" 1136 | buffer-from "^1.1.0" 1137 | diff "^3.1.0" 1138 | make-error "^1.1.1" 1139 | minimist "^1.2.0" 1140 | mkdirp "^0.5.1" 1141 | source-map-support "^0.5.6" 1142 | yn "^2.0.0" 1143 | 1144 | tslib@^1.9.3: 1145 | version "1.9.3" 1146 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 1147 | 1148 | tunnel-agent@^0.6.0: 1149 | version "0.6.0" 1150 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1151 | dependencies: 1152 | safe-buffer "^5.0.1" 1153 | 1154 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1155 | version "0.14.5" 1156 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1157 | 1158 | type-detect@^4.0.0, type-detect@^4.0.5: 1159 | version "4.0.8" 1160 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1161 | 1162 | typeorm@^0.2.8: 1163 | version "0.2.8" 1164 | resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.8.tgz#b8f7e0809ad7b2c03c03ff101fadf1b90e4083a3" 1165 | dependencies: 1166 | app-root-path "^2.0.1" 1167 | buffer "^5.1.0" 1168 | chalk "^2.3.2" 1169 | cli-highlight "^1.2.3" 1170 | debug "^3.1.0" 1171 | dotenv "^5.0.1" 1172 | glob "^7.1.2" 1173 | js-yaml "^3.11.0" 1174 | mkdirp "^0.5.1" 1175 | reflect-metadata "^0.1.12" 1176 | xml2js "^0.4.17" 1177 | yargonaut "^1.1.2" 1178 | yargs "^11.1.0" 1179 | 1180 | typescript@^3.1.3: 1181 | version "3.1.3" 1182 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.3.tgz#01b70247a6d3c2467f70c45795ef5ea18ce191d5" 1183 | 1184 | util-deprecate@~1.0.1: 1185 | version "1.0.2" 1186 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1187 | 1188 | uuid@^3.3.2: 1189 | version "3.3.2" 1190 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 1191 | 1192 | verror@1.10.0: 1193 | version "1.10.0" 1194 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1195 | dependencies: 1196 | assert-plus "^1.0.0" 1197 | core-util-is "1.0.2" 1198 | extsprintf "^1.2.0" 1199 | 1200 | which-module@^2.0.0: 1201 | version "2.0.0" 1202 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1203 | 1204 | which@^1.2.9: 1205 | version "1.3.1" 1206 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1207 | dependencies: 1208 | isexe "^2.0.0" 1209 | 1210 | wide-align@^1.1.0: 1211 | version "1.1.3" 1212 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1213 | dependencies: 1214 | string-width "^1.0.2 || 2" 1215 | 1216 | wrap-ansi@^2.0.0: 1217 | version "2.1.0" 1218 | resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 1219 | dependencies: 1220 | string-width "^1.0.1" 1221 | strip-ansi "^3.0.1" 1222 | 1223 | wrappy@1: 1224 | version "1.0.2" 1225 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1226 | 1227 | xml2js@^0.4.17: 1228 | version "0.4.19" 1229 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" 1230 | dependencies: 1231 | sax ">=0.6.0" 1232 | xmlbuilder "~9.0.1" 1233 | 1234 | xmlbuilder@~9.0.1: 1235 | version "9.0.7" 1236 | resolved "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" 1237 | 1238 | y18n@^3.2.1: 1239 | version "3.2.1" 1240 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 1241 | 1242 | yallist@^2.1.2: 1243 | version "2.1.2" 1244 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1245 | 1246 | yallist@^3.0.0, yallist@^3.0.2: 1247 | version "3.0.2" 1248 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" 1249 | 1250 | yargonaut@^1.1.2: 1251 | version "1.1.4" 1252 | resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c" 1253 | dependencies: 1254 | chalk "^1.1.1" 1255 | figlet "^1.1.1" 1256 | parent-require "^1.0.0" 1257 | 1258 | yargs-parser@^8.1.0: 1259 | version "8.1.0" 1260 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" 1261 | dependencies: 1262 | camelcase "^4.1.0" 1263 | 1264 | yargs-parser@^9.0.2: 1265 | version "9.0.2" 1266 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" 1267 | dependencies: 1268 | camelcase "^4.1.0" 1269 | 1270 | yargs@^10.0.3: 1271 | version "10.1.2" 1272 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" 1273 | dependencies: 1274 | cliui "^4.0.0" 1275 | decamelize "^1.1.1" 1276 | find-up "^2.1.0" 1277 | get-caller-file "^1.0.1" 1278 | os-locale "^2.0.0" 1279 | require-directory "^2.1.1" 1280 | require-main-filename "^1.0.1" 1281 | set-blocking "^2.0.0" 1282 | string-width "^2.0.0" 1283 | which-module "^2.0.0" 1284 | y18n "^3.2.1" 1285 | yargs-parser "^8.1.0" 1286 | 1287 | yargs@^11.1.0: 1288 | version "11.1.0" 1289 | resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" 1290 | dependencies: 1291 | cliui "^4.0.0" 1292 | decamelize "^1.1.1" 1293 | find-up "^2.1.0" 1294 | get-caller-file "^1.0.1" 1295 | os-locale "^2.0.0" 1296 | require-directory "^2.1.1" 1297 | require-main-filename "^1.0.1" 1298 | set-blocking "^2.0.0" 1299 | string-width "^2.0.0" 1300 | which-module "^2.0.0" 1301 | y18n "^3.2.1" 1302 | yargs-parser "^9.0.2" 1303 | 1304 | yn@^2.0.0: 1305 | version "2.0.0" 1306 | resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" 1307 | --------------------------------------------------------------------------------