├── .eslintrc ├── .gitignore ├── .travis.yml ├── index.js ├── index.test.js ├── lib ├── ensure-array.js ├── ensure-valid-acl.js ├── ensure-valid-model.js ├── merge-array-unique.js ├── paginate.js ├── parse-where.js ├── parse-where.test.js ├── populate.js └── populate.test.js ├── package.json ├── readme.md ├── standard.test.js └── yarn.lock /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "standard" 4 | ], 5 | "env": { 6 | "mocha": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules 5 | 6 | # builds 7 | build 8 | dist 9 | 10 | # misc 11 | .DS_Store 12 | .env 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 12 4 | - 10 5 | cache: 6 | yarn: true 7 | directories: 8 | - node_modules 9 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const assert = require('assert') 4 | const stringify = require('json-array-stream') 5 | 6 | const ensureValidModel = require('./lib/ensure-valid-model') 7 | const ensureValidAcl = require('./lib/ensure-valid-acl') 8 | const mergeArrayUnique = require('./lib/merge-array-unique') 9 | 10 | exports.filter = require('filter-object') 11 | exports.flatten = require('flat') 12 | exports.parse = require('co-body') 13 | exports.through2 = require('through2').obj 14 | 15 | exports.paginate = require('./lib/paginate') 16 | exports.parseWhere = require('./lib/parse-where') 17 | exports.populate = require('./lib/populate') 18 | 19 | exports.create = (args = {}) => { 20 | const { 21 | model, 22 | acceptsPopulate, 23 | defaultPopulate = [], 24 | acl, 25 | label = 'create' 26 | } = args 27 | 28 | ensureValidModel(model) 29 | ensureValidAcl(acl) 30 | 31 | return async function create (ctx) { 32 | const data = await exports.parse(ctx) 33 | ctx.assert(data, 400) 34 | const safePathsForCreate = model.getSafePaths(label, ctx) 35 | ctx.assert(safePathsForCreate, 500, `${model.constructor.modelName}:${label} not configured properly`) 36 | const safeData = exports.filter(data, safePathsForCreate) 37 | 38 | if (acl) { 39 | const opts = { skip: false } 40 | await acl(ctx, safeData, opts) 41 | if (opts.skip) return 42 | } 43 | 44 | const doc = await model.create(safeData) 45 | 46 | await exports.populate(model, doc, defaultPopulate, acceptsPopulate && ctx.query.populate) 47 | 48 | const safePathsForRead = model.getSafePaths('read', ctx) 49 | ctx.assert(safePathsForRead, 500, `${model.constructor.modelName}:${label} not configured properly`) 50 | ctx.body = model.getPublicDocument(doc, safePathsForRead) 51 | return model 52 | } 53 | } 54 | 55 | exports.read = (args = {}) => { 56 | const { 57 | model, 58 | idParamName, 59 | acceptsPopulate, 60 | defaultPopulate = [], 61 | acl, 62 | label = 'read' 63 | } = args 64 | 65 | ensureValidModel(model) 66 | ensureValidAcl(acl) 67 | assert(idParamName, 'idParamName is required') 68 | 69 | return async function read (ctx) { 70 | const { [idParamName]: id } = ctx.params 71 | 72 | const doc = await model.findById(id).exec() 73 | ctx.assert(doc, 404, `${model.modelName} not found [${id}]`) 74 | const opts = { skip: false } 75 | if (acl) { 76 | await acl(ctx, doc, opts) 77 | if (opts.skip) return 78 | } 79 | 80 | await exports.populate(model, doc, defaultPopulate, acceptsPopulate && ctx.query.populate) 81 | 82 | const safePaths = model.getSafePaths(label, ctx) 83 | ctx.assert(safePaths, 500, `${model.constructor.modelName}:${label} not configured properly`) 84 | ctx.body = model.getPublicDocument(doc, safePaths) 85 | return model 86 | } 87 | } 88 | 89 | exports.update = (args = {}) => { 90 | const { 91 | model, 92 | idParamName, 93 | acceptsPopulate, 94 | defaultPopulate = [], 95 | acl, 96 | label = 'update' 97 | } = args 98 | 99 | ensureValidModel(model) 100 | ensureValidAcl(acl) 101 | assert(idParamName, 'idParamName is required') 102 | 103 | return async function update (ctx) { 104 | const { [idParamName]: id } = ctx.params 105 | 106 | const data = await exports.parse(ctx) 107 | ctx.assert(data, 400) 108 | const safePathsForUpdate = model.getSafePaths(label, ctx) 109 | ctx.assert(safePathsForUpdate, 500, `${model.constructor.modelName}:${label} not configured properly`) 110 | const safeData = exports.filter(data, safePathsForUpdate) 111 | 112 | if (acl) { 113 | const doc = await model.findById(id) 114 | ctx.assert(doc, 404, `${model.modelName} not found [${id}]`) 115 | const opts = { skip: false } 116 | await acl(ctx, doc, data, opts) 117 | if (opts.skip) return 118 | } 119 | 120 | const doc = await model.findByIdAndUpdate(id, safeData, { 121 | runValidators: true, 122 | new: true 123 | }).exec() 124 | ctx.assert(doc, 404, `${model.modelName} not found [${id}]`) 125 | 126 | await exports.populate(model, doc, defaultPopulate, acceptsPopulate && ctx.query.populate) 127 | 128 | const safePathsForRead = model.getSafePaths('read', ctx) 129 | ctx.assert(safePathsForRead, 500, `${model.constructor.modelName}:${label} not configured properly`) 130 | ctx.body = model.getPublicDocument(doc, safePathsForRead) 131 | return model 132 | } 133 | } 134 | 135 | exports.delete = (args = {}) => { 136 | const { 137 | model, 138 | idParamName, 139 | acceptsPopulate, 140 | defaultPopulate = [], 141 | acl 142 | } = args 143 | 144 | ensureValidModel(model) 145 | ensureValidAcl(acl) 146 | assert(idParamName, 'idParamName is required') 147 | 148 | return async function deleteAll (ctx) { 149 | const { [idParamName]: id } = ctx.params 150 | 151 | if (acl) { 152 | const doc = await model.findById(id) 153 | ctx.assert(doc, 404, `${model.modelName} not found [${id}]`) 154 | const opts = { skip: false } 155 | await acl(ctx, doc, opts) 156 | if (opts.skip) return 157 | } 158 | 159 | const doc = await model.findByIdAndRemove(id).exec() 160 | ctx.assert(doc, 404, `${model.modelName} not found [${id}]`) 161 | 162 | await exports.populate(model, doc, defaultPopulate, acceptsPopulate && ctx.query.populate) 163 | 164 | const safePathsForRead = model.getSafePaths('read', ctx) 165 | ctx.assert(safePathsForRead, 500, `${model.constructor.modelName}:read not configured properly`) 166 | ctx.body = model.getPublicDocument(doc, safePathsForRead) 167 | return model 168 | } 169 | } 170 | 171 | exports.upsert = (args = {}) => { 172 | const { 173 | model, 174 | acceptsPopulate, 175 | idParamName, 176 | defaultPopulate = [], 177 | acl, 178 | createLabel = 'create', 179 | updateLabel = 'update' 180 | } = args 181 | 182 | ensureValidModel(model) 183 | ensureValidAcl(acl) 184 | assert(idParamName, 'idParamName is required') 185 | 186 | return async function upsert (ctx) { 187 | const data = await exports.parse(ctx) 188 | ctx.assert(data, 400) 189 | const id = ctx.params[idParamName] || data._id 190 | let doc 191 | 192 | if (id) { 193 | if (acl) { 194 | const doc = await model.findById(id) 195 | ctx.assert(doc, 404, `${model.modelName} not found [${id}]`) 196 | const opts = { skip: false } 197 | await acl(ctx, doc, opts) 198 | if (opts.skip) return 199 | } 200 | 201 | const safePathsForUpdate = model.getSafePaths(updateLabel, ctx) 202 | ctx.assert(safePathsForUpdate, 500, `${model.constructor.modelName}:${updateLabel} not configured properly`) 203 | const safeData = exports.filter(data, safePathsForUpdate) 204 | doc = await model.findByIdAndUpdate(id, safeData, { 205 | new: true, 206 | runValidators: true 207 | }).exec() 208 | ctx.assert(doc, 404, `${model.modelName} not found [${id}]`) 209 | } else { 210 | const safePathsForCreate = model.getSafePaths(createLabel, ctx) 211 | ctx.assert(safePathsForCreate, 500, `${model.constructor.modelName}:${createLabel} not configured properly`) 212 | const safeData = exports.filter(data, safePathsForCreate) 213 | doc = await model.create(safeData) 214 | } 215 | 216 | await exports.populate(model, doc, defaultPopulate, acceptsPopulate && ctx.query.populate) 217 | 218 | const safePathsForRead = model.getSafePaths('read', ctx) 219 | ctx.assert(safePathsForRead, 500, `${model.constructor.modelName}:read not configured properly`) 220 | ctx.body = model.getPublicDocument(doc, safePathsForRead) 221 | return model 222 | } 223 | } 224 | 225 | exports.index = (args = {}) => { 226 | const { 227 | model, 228 | acceptsFilters, 229 | acceptsPopulate, 230 | acceptsPagination = true, 231 | defaultPopulate = [], 232 | defaultFilters = {}, 233 | acl, 234 | label = 'index' 235 | } = args 236 | 237 | ensureValidModel(model) 238 | ensureValidAcl(acl) 239 | 240 | return async function index (ctx) { 241 | const where = acceptsFilters 242 | ? Object.assign({}, exports.parseWhere(ctx.query.where), defaultFilters) 243 | : defaultFilters 244 | const { query: searchParams } = ctx 245 | 246 | const query = model.find(where) 247 | 248 | if (model.collation) { 249 | query.collation(model.collation) 250 | } 251 | 252 | if (acceptsPagination) { 253 | exports.paginate(query, searchParams) 254 | } 255 | 256 | const populate = acceptsPopulate 257 | ? mergeArrayUnique(searchParams.populate, defaultPopulate) 258 | : mergeArrayUnique(defaultPopulate) 259 | 260 | const safePaths = model.getSafePaths(label, ctx) || model.getSafePaths('read', ctx) 261 | ctx.assert(safePaths, 500, `${model.constructor.modelName}:${label} not configured properly`) 262 | 263 | ctx.type = 'json' 264 | ctx.body = query.cursor(query.options) 265 | .on('error', (err) => { 266 | ctx.status = 500 267 | ctx.body.end() 268 | 269 | throw err 270 | }) 271 | .pipe(exports.through2((doc, enc, done) => { 272 | const populateImpl = () => { 273 | exports.populate(model, doc, populate) 274 | .then(() => done(null, model.getPublicDocument(doc, safePaths))) 275 | .catch(done) 276 | } 277 | 278 | if (acl) { 279 | acl(ctx, doc) 280 | .then(populateImpl) 281 | .catch(done) 282 | } else { 283 | populateImpl() 284 | } 285 | })) 286 | .pipe(stringify()) 287 | } 288 | } 289 | 290 | exports.count = (args = {}) => { 291 | const { 292 | model, 293 | acceptsFilters, 294 | defaultFilters = {} 295 | } = args 296 | 297 | ensureValidModel(model) 298 | 299 | return async function count (ctx) { 300 | const where = acceptsFilters 301 | ? Object.assign({}, exports.parseWhere(ctx.query.where), defaultFilters) 302 | : defaultFilters 303 | 304 | ctx.body = { 305 | where, 306 | count: await model.count(where).exec() 307 | } 308 | } 309 | } 310 | 311 | exports.archive = (args = {}) => { 312 | const { 313 | model, 314 | idParamName, 315 | acceptsPopulate, 316 | defaultPopulate = [], 317 | acl 318 | } = args 319 | 320 | ensureValidModel(model) 321 | ensureValidAcl(acl) 322 | assert(idParamName, 'idParamName is required') 323 | 324 | return async function archive (ctx) { 325 | const { [idParamName]: id } = ctx.params 326 | 327 | if (acl) { 328 | const doc = await model.findById(id) 329 | ctx.assert(doc, 404, `${model.modelName} not found [${id}]`) 330 | const opts = { skip: false } 331 | await acl(ctx, doc, opts) 332 | if (opts.skip) return 333 | } 334 | 335 | const doc = await model.findByIdAndUpdate(id, { archived: true }).exec() 336 | ctx.assert(doc, 404, `${model.modelName} not found [${id}]`) 337 | 338 | await exports.populate(model, doc, defaultPopulate, acceptsPopulate && ctx.query.populate) 339 | 340 | const safePathsForRead = model.getSafePaths('read', ctx) 341 | ctx.assert(safePathsForRead, 500, `${model.constructor.modelName}:read not configured properly`) 342 | ctx.body = model.getPublicDocument(doc, safePathsForRead) 343 | return model 344 | } 345 | } 346 | 347 | exports.deleteByQuery = (args = {}) => { 348 | const { 349 | model, 350 | acceptsFilters, 351 | defaultFilters = {}, 352 | acl 353 | } = args 354 | 355 | ensureValidModel(model) 356 | ensureValidAcl(acl) 357 | 358 | return async function deleteByQuery (ctx) { 359 | const where = acceptsFilters 360 | ? Object.assign({}, exports.parseWhere(ctx.query.where), defaultFilters) 361 | : defaultFilters 362 | 363 | ctx.assert(Object.keys(where).length, 400, 'Querystring `where` parameter must not be empty') 364 | 365 | if (acl) { 366 | const docs = await model.find(where) 367 | for (const doc of docs) { 368 | await acl(ctx, doc) 369 | } 370 | } 371 | 372 | const { result } = await model.remove(where).exec() 373 | 374 | ctx.body = { 375 | where, 376 | deleted: result.n 377 | } 378 | } 379 | } 380 | -------------------------------------------------------------------------------- /index.test.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const crud = require('.') 4 | const assert = require('chai').assert 5 | const sinon = require('sinon') 6 | 7 | describe('koa2-mongoose-crud', () => { 8 | const sandbox = sinon.sandbox.create() 9 | 10 | const getCtx = (obj) => Object.assign({ 11 | query: {}, 12 | params: { id: 'id' }, 13 | throw: sandbox.stub().throws({ fakeError: true }), 14 | assert: sandbox.stub() 15 | }, obj) 16 | 17 | const getQuery = () => ({ 18 | find: sandbox.stub(), 19 | populate: sandbox.stub(), 20 | limit: sandbox.stub(), 21 | sort: sandbox.stub(), 22 | where: sandbox.stub(), 23 | exec: sandbox.stub().callsFake(() => Promise.resolve('exec')), 24 | cursor: sandbox.stub().callsFake(() => ({ 25 | on: sandbox.stub().callsFake(() => ({ 26 | pipe: sandbox.stub().callsFake(() => ({ 27 | pipe: sandbox.stub() 28 | })) 29 | })) 30 | })) 31 | }) 32 | 33 | const getModel = (query) => ({ 34 | schema: { methods: {} }, 35 | modelName: 'Testmodel', 36 | find: sandbox.stub().callsFake(() => query), 37 | findById: sandbox.stub().callsFake(() => query), 38 | findByIdAndUpdate: sandbox.stub().callsFake(() => query), 39 | findOneAndUpdate: sandbox.stub().callsFake(() => query), 40 | where: sandbox.stub().callsFake(() => query), 41 | populate: sandbox.stub(), 42 | create: sandbox.stub().callsFake(() => Promise.resolve('created-doc')), 43 | safeUpdate: sandbox.stub().callsFake(() => 'updated-doc'), 44 | getSafePaths: sandbox.stub().callsFake(() => 'getSafePaths'), 45 | getPublicDocument: sandbox.stub().callsFake(() => 'getPublicDocument'), 46 | remove: sandbox.stub().callsFake(() => ({ 47 | exec: sandbox.stub().callsFake(() => Promise.resolve({ result: { n: 10 } })) 48 | })), 49 | count: sandbox.stub().callsFake(() => query) 50 | }) 51 | 52 | before(() => { 53 | sandbox.stub(crud, 'parse') 54 | sandbox.stub(crud, 'paginate') 55 | sandbox.stub(crud, 'through2') 56 | sandbox.stub(crud, 'filter') 57 | sandbox.stub(crud, 'flatten') 58 | sandbox.stub(crud, 'populate') 59 | }) 60 | 61 | afterEach(() => sandbox.reset()) 62 | after(() => sandbox.restore()) 63 | 64 | describe('#index()', () => { 65 | it('should throw if not passing model', () => { 66 | assert.throw(() => crud.index(), /model/) 67 | }) 68 | 69 | it('should throw if getPublicDocument is not defined in model', () => { 70 | const model = getModel({}) 71 | model._getPublicDocument = model.getPublicDocument 72 | model.getPublicDocument = null 73 | assert.throw(() => crud.index({ model }), /getPublicDocument/) 74 | model.getPublicDocument = model._getPublicDocument 75 | }) 76 | 77 | it('should succeed', async () => { 78 | const ctx = getCtx({ 79 | query: { 80 | limit: 1, 81 | sort: '-bar', 82 | where: JSON.stringify({ foo: 'bar' }), 83 | populate: ['1', '3'] 84 | } 85 | }) 86 | 87 | const query = getQuery() 88 | const model = getModel(query) 89 | 90 | const opts = { 91 | model, 92 | acceptsFilters: true, 93 | acceptsPagination: true, 94 | acceptsPopulate: true, 95 | defaultFilters: { bar: 'foo' }, 96 | defaultPopulate: ['1', '2'], 97 | label: 'safe-path-label' 98 | } 99 | 100 | crud.through2.callsFake((fn) => fn('doc', 'enc', () => {})) 101 | crud.populate.callsFake(() => Promise.resolve()) 102 | 103 | await crud.index(opts)(ctx) 104 | 105 | assert.deepEqual(model.find.args[0], [{ foo: 'bar', bar: 'foo' }]) 106 | assert.deepEqual(model.getSafePaths.args[0], ['safe-path-label', ctx]) 107 | assert.deepEqual(crud.paginate.args[0], [query, ctx.query]) 108 | assert.deepEqual(crud.populate.args[0], [model, 'doc', ['1', '3', '2']]) 109 | assert.deepEqual(model.getPublicDocument.args[0], ['doc', 'getSafePaths']) 110 | }) 111 | 112 | it('should fail if qs.where is not a valid JSON', async () => { 113 | const ctx = getCtx({ 114 | query: { 115 | where: 'something{wrong' 116 | } 117 | }) 118 | 119 | await crud.index({ 120 | model: getModel(getQuery()), 121 | acceptsFilters: true 122 | })(ctx).then(() => { 123 | throw new Error('this should not be thrown') 124 | }).catch((err) => { 125 | assert.equal(err.status, 400) 126 | assert.match(err.message, /JSON/) 127 | }) 128 | }) 129 | }) 130 | 131 | describe('#count()', () => { 132 | it('should throw if not passing model', () => { 133 | assert.throw(() => crud.count(), /model/) 134 | }) 135 | 136 | it('should succeed', async () => { 137 | const ctx = getCtx({ 138 | query: { 139 | limit: 1, 140 | sort: '-bar', 141 | where: JSON.stringify({ foo: 'foo' }) 142 | } 143 | }) 144 | 145 | const model = getModel(getQuery()) 146 | 147 | await crud.count({ 148 | model, 149 | acceptsFilters: true, 150 | defaultFilters: { bar: 'bar' } 151 | })(ctx) 152 | 153 | assert.deepEqual(model.count.args[0], [{ foo: 'foo', bar: 'bar' }]) 154 | assert.deepEqual(ctx.body.where, { foo: 'foo', bar: 'bar' }) 155 | assert.deepEqual(ctx.body.count, 'exec') 156 | }) 157 | }) 158 | 159 | describe('#create()', () => { 160 | it('should throw if not passing model', () => { 161 | assert.throw(() => crud.create(), /model/) 162 | }) 163 | 164 | it('should throw if getPublicDocument is not defined in model', () => { 165 | const model = getModel(getQuery()) 166 | model._getPublicDocument = model.getPublicDocument 167 | model.getPublicDocument = null 168 | assert.throw(() => crud.create({ model }), /getPublicDocument/) 169 | model.getPublicDocument = model._getPublicDocument 170 | }) 171 | 172 | it('should succeed', async () => { 173 | const ctx = getCtx({ 174 | query: { 175 | populate: ['a', 'c'] 176 | } 177 | }) 178 | 179 | const query = getQuery() 180 | const model = getModel(query) 181 | 182 | crud.parse.callsFake(() => ({ name: 'fake-post' })) 183 | crud.filter.callsFake(() => 'safe-data') 184 | 185 | await crud.create({ 186 | model, 187 | acceptsPopulate: true, 188 | defaultPopulate: ['a', 'b'], 189 | label: 'label-create' 190 | })(ctx) 191 | 192 | assert.deepEqual(crud.parse.args[0], [ctx]) 193 | assert.deepEqual(model.getSafePaths.args[0], ['label-create', ctx]) 194 | assert.deepEqual(crud.filter.args[0], [{ name: 'fake-post' }, 'getSafePaths']) 195 | assert.deepEqual(model.create.args[0], ['safe-data']) 196 | assert.deepEqual(crud.populate.args[0], [model, 'created-doc', ['a', 'b'], ['a', 'c']]) 197 | assert.deepEqual(model.getSafePaths.args[1], ['read', ctx]) 198 | assert.deepEqual(model.getPublicDocument.args[0], ['created-doc', 'getSafePaths']) 199 | }) 200 | }) 201 | 202 | describe('#read()', () => { 203 | it('should throw if not passing model', () => { 204 | assert.throw(() => crud.read(), /model/) 205 | }) 206 | 207 | it('should throw if not passing idParamName', () => { 208 | const model = getModel(getQuery()) 209 | assert.throw(() => crud.read({ model }), /idParamName/) 210 | }) 211 | 212 | it('should throw if getPublicDocument is not defined in model', () => { 213 | const model = getModel(getQuery()) 214 | model._getPublicDocument = model.getPublicDocument 215 | model.getPublicDocument = null 216 | assert.throw(() => crud.read({ model }), /getPublicDocument/) 217 | model.getPublicDocument = model._getPublicDocument 218 | }) 219 | 220 | it('should succeed', async () => { 221 | const ctx = getCtx({ 222 | params: { 223 | foo: 'object-id' 224 | }, 225 | query: { 226 | populate: ['a'] 227 | } 228 | }) 229 | 230 | const query = getQuery() 231 | const model = getModel(query) 232 | 233 | query.exec.callsFake(() => 'found-doc') 234 | 235 | await crud.read({ 236 | model, 237 | idParamName: 'foo', 238 | acceptsPopulate: true, 239 | defaultPopulate: ['b', 'c'], 240 | label: 'label-read' 241 | })(ctx) 242 | 243 | assert.deepEqual(model.findById.args[0], ['object-id']) 244 | assert.deepEqual(ctx.assert.args[0], ['found-doc', 404, 'Testmodel not found [object-id]']) 245 | assert.deepEqual(crud.populate.args[0], [model, 'found-doc', ['b', 'c'], ['a']]) 246 | assert.deepEqual(model.getSafePaths.args[0], ['label-read', ctx]) 247 | assert.deepEqual(model.getPublicDocument.args[0], ['found-doc', 'getSafePaths']) 248 | assert.deepEqual(ctx.body, 'getPublicDocument') 249 | }) 250 | }) 251 | 252 | describe('#update()', () => { 253 | it('should throw if not passing model', () => { 254 | assert.throw(() => crud.update(), /model/) 255 | }) 256 | 257 | it('should throw if not passing idParamName', () => { 258 | const model = getModel(getQuery()) 259 | assert.throw(() => crud.update({ model }), /idParamName/) 260 | }) 261 | 262 | it('should throw if getPublicDocument is not defined in model', () => { 263 | const model = getModel(getQuery()) 264 | model._getPublicDocument = model.getPublicDocument 265 | model.getPublicDocument = null 266 | assert.throw(() => crud.update({ model }), /getPublicDocument/) 267 | model.getPublicDocument = model._getPublicDocument 268 | }) 269 | 270 | it('should succeed', async () => { 271 | const ctx = getCtx({ 272 | params: { 273 | foo: 'object-id' 274 | }, 275 | query: { 276 | populate: ['a'] 277 | } 278 | }) 279 | 280 | const query = getQuery() 281 | const model = getModel(query) 282 | 283 | const opts = { 284 | model, 285 | idParamName: 'foo', 286 | acceptsPopulate: true, 287 | defaultPopulate: ['b', 'c'], 288 | label: 'label-update' 289 | } 290 | 291 | query.exec.callsFake(() => 'doc') 292 | crud.parse.callsFake(() => ({ name: 'fake-post' })) 293 | crud.filter.callsFake(() => 'safe-data') 294 | 295 | await crud.update(opts)(ctx) 296 | 297 | assert.deepEqual(ctx.assert.args[2], ['doc', 404, 'Testmodel not found [object-id]']) 298 | assert.deepEqual(model.getSafePaths.args[0], ['label-update', ctx]) 299 | assert.deepEqual(crud.filter.args[0], [{ name: 'fake-post' }, 'getSafePaths']) 300 | assert.deepEqual(model.findByIdAndUpdate.args[0], [ 301 | 'object-id', 302 | 'safe-data', 303 | { runValidators: true, new: true } 304 | ]) 305 | assert.deepEqual(crud.populate.args[0], [model, 'doc', ['b', 'c'], ['a']]) 306 | assert.deepEqual(model.getSafePaths.args[1], ['read', ctx]) 307 | assert.deepEqual(model.getPublicDocument.args[0], ['doc', 'getSafePaths']) 308 | }) 309 | }) 310 | 311 | describe('#archive()', () => { 312 | it('should throw if not passing model', () => { 313 | assert.throw(() => crud.archive(), /model/) 314 | }) 315 | 316 | it('should throw if not passing idParamName', () => { 317 | const model = getModel(getQuery()) 318 | assert.throw(() => crud.archive({ model }), /idParamName/) 319 | }) 320 | 321 | it('should archive document', async () => { 322 | const ctx = getCtx({ 323 | params: { 324 | foo: 'object-id' 325 | }, 326 | query: { 327 | populate: ['a'] 328 | } 329 | }) 330 | 331 | const query = getQuery() 332 | const model = getModel(query) 333 | 334 | query.exec.callsFake(() => 'doc') 335 | crud.parse.callsFake(() => ({ name: 'fake-post' })) 336 | crud.filter.callsFake(() => 'safe-data') 337 | 338 | await crud.archive({ 339 | model, 340 | idParamName: 'foo', 341 | acceptsPopulate: true, 342 | defaultPopulate: ['b', 'c'] 343 | })(ctx) 344 | 345 | assert.deepEqual(model.findByIdAndUpdate.args[0], ['object-id', { archived: true }]) 346 | assert.deepEqual(ctx.assert.args[0], ['doc', 404, 'Testmodel not found [object-id]']) 347 | assert.deepEqual(crud.populate.args[0], [model, 'doc', ['b', 'c'], ['a']]) 348 | assert.deepEqual(model.getSafePaths.args[0], ['read', ctx]) 349 | assert.deepEqual(model.getPublicDocument.args[0], ['doc', 'getSafePaths']) 350 | }) 351 | }) 352 | 353 | describe('#deleteByQuery()', () => { 354 | it('should throw if not passing model', () => { 355 | assert.throw(() => crud.deleteByQuery(), /model/) 356 | }) 357 | 358 | it('should succeed', async () => { 359 | const ctx = getCtx({ 360 | query: { 361 | where: JSON.stringify({ foo: 'bar' }) 362 | } 363 | }) 364 | 365 | const query = getQuery() 366 | const model = getModel(query) 367 | 368 | query.exec.callsFake(() => 10) 369 | 370 | await crud.deleteByQuery({ 371 | model, 372 | acceptsFilters: true 373 | })(ctx) 374 | 375 | assert.deepEqual(model.remove.args[0], [{ foo: 'bar' }]) 376 | assert.deepEqual(ctx.assert.args[0][0], 1) 377 | assert.deepEqual(ctx.assert.args[0][1], 400) 378 | assert.deepEqual(ctx.body.where, { foo: 'bar' }) 379 | assert.deepEqual(ctx.body.deleted, 10) 380 | }) 381 | }) 382 | }) 383 | -------------------------------------------------------------------------------- /lib/ensure-array.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function ensureArray (val, defaultValue = [], defaultFn = (v) => v) { 4 | if (!val) return defaultFn(defaultValue) 5 | if (Array.isArray(val) && !val.length) return defaultFn(defaultValue) 6 | if (Array.isArray(val)) return defaultFn(val) 7 | return defaultFn([val]) 8 | } 9 | -------------------------------------------------------------------------------- /lib/ensure-valid-acl.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const assert = require('assert') 4 | 5 | module.exports = (acl) => { 6 | if (acl) { 7 | assert(typeof acl === 'function', 'validate must be an async function') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/ensure-valid-model.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const assert = require('assert') 4 | 5 | module.exports = (model) => { 6 | assert(model, 'model is required') 7 | assert(model.getSafePaths, `Please define ${model.modelName}.getSafePaths(label, ctx)`) 8 | assert(model.getPublicDocument, `Please define ${model.modelName}.getPublicDocument(doc, safePaths)`) 9 | } 10 | -------------------------------------------------------------------------------- /lib/merge-array-unique.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const ensureArray = require('./ensure-array') 4 | 5 | module.exports = (...arrays) => { 6 | const normalizedArrays = arrays.map((array) => ensureArray(array, [])) 7 | const mergedArrays = [].concat(...normalizedArrays) 8 | return [...new Set([...mergedArrays])] 9 | } 10 | -------------------------------------------------------------------------------- /lib/paginate.js: -------------------------------------------------------------------------------- 1 | module.exports = function paginate (query, opts) { 2 | const limit = parseInt(opts.limit) || 10 3 | const offset = parseInt(opts.offset) || 0 4 | const sort = opts.sort 5 | 6 | query.limit(limit) 7 | query.skip(offset) 8 | 9 | if (sort) { 10 | query.sort(sort) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/parse-where.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = (where = {}) => { 4 | try { 5 | if (typeof where === 'string') { 6 | return JSON.parse(where) 7 | } else if (typeof where === 'object') { 8 | return where 9 | } else { 10 | throw new Error('invalid where') 11 | } 12 | } catch (_) { 13 | const err = new Error('Querystring `where` parameter must be a valid JSON') 14 | err.status = 400 15 | throw err 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/parse-where.test.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | exports.parseWhere = (where) => { 4 | try { 5 | return JSON.parse(where) 6 | } catch (_) { 7 | const err = new Error('Querystring `where` parameter must be a valid JSON') 8 | err.status = 400 9 | throw err 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/populate.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const mergeArrayUnique = require('./merge-array-unique') 4 | 5 | module.exports = (model, doc, ...args) => { 6 | if (args && args.length) { 7 | const fields = mergeArrayUnique(args.filter(Boolean)) 8 | 9 | if (fields.length) { 10 | return Promise.all(fields.map(field => model.populate(doc, field))) 11 | } 12 | } 13 | 14 | return Promise.resolve() 15 | } 16 | -------------------------------------------------------------------------------- /lib/populate.test.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | exports.populate = async (ctx, doc, { model, populate }) => { 4 | if (populate && populate.length && ctx.query.populate) { 5 | await Promise.all(populate.map(field => model.populate(doc, field))) 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "koa2-mongoose-crud", 3 | "version": "1.1.4", 4 | "description": "Koa 2 CRUD middleware for Mongoose models.", 5 | "main": "index.js", 6 | "repository": "transitive-bullshit/koa2-mongoose-crud", 7 | "author": "Travis Fischer ", 8 | "license": "MIT", 9 | "engines": { 10 | "node": ">=8" 11 | }, 12 | "scripts": { 13 | "test": "NODE_ENV=test mocha './{,!(node_modules)/**/}*.test.js'", 14 | "test:watch": "NODE_ENV=test mocha './{,!(node_modules)/**/}*.test.js' --watch --bail" 15 | }, 16 | "dependencies": { 17 | "co-body": "^5.1.1", 18 | "filter-object": "^3.0.0", 19 | "flat": "^4.0.0", 20 | "json-array-stream": "^0.1.2", 21 | "through2": "^2.0.3" 22 | }, 23 | "devDependencies": { 24 | "chai": "^4.1.2", 25 | "mocha": "^5.1.0", 26 | "mocha-standard": "^1.0.0", 27 | "sinon": "^4.5.0", 28 | "standard": "^11.0.0" 29 | }, 30 | "keywords": [ 31 | "koa", 32 | "koa2", 33 | "mongoose", 34 | "crud", 35 | "middleware" 36 | ], 37 | "standard": { 38 | "globals": [ 39 | "after", 40 | "afterEach", 41 | "before", 42 | "beforeEach", 43 | "context", 44 | "describe", 45 | "it" 46 | ] 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # koa2-mongoose-crud 2 | 3 | > [Koa 2](http://koajs.com/) CRUD middleware for [Mongoose](http://mongoosejs.com/) models. 4 | 5 | [![NPM](https://img.shields.io/npm/v/koa2-mongoose-crud.svg)](https://www.npmjs.com/package/koa2-mongoose-crud) [![Build Status](https://travis-ci.com/transitive-bullshit/koa2-mongoose-crud.svg?branch=master)](https://travis-ci.com/transitive-bullshit/koa2-mongoose-crud) [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) 6 | 7 | ## Installation 8 | 9 | ``` 10 | npm install --save koa2-mongoose-crud 11 | ``` 12 | 13 | This module uses async await and therefore requires node >= 8. 14 | 15 | ## Usage 16 | 17 | ```js 18 | const crud = require('koa2-mongoose-crud') 19 | const mongoose = require('mongoose') 20 | 21 | // setup minimal koa application 22 | const Koa = require('koa') 23 | const app = new Koa() 24 | 25 | // setup basic mongoose model 26 | const fooSchema = mongoose.Schema({ 27 | name: String 28 | }) 29 | const Foo = mongoose.model('Foo', fooSchema) 30 | 31 | { // setup basic CRUD REST API for Foo model 32 | const Router = require('koa-router') 33 | const router = new Router() 34 | 35 | const model = Foo 36 | const idParamName = 'foo' 37 | 38 | router.get('/foo/:foo', crud.read({ model, idParamName })) 39 | router.post('/foo', crud.create({ model, idParamName })) 40 | router.put('/foo/:foo', crud.update({ model, idParamName })) 41 | router.del('/foo/:foo', crud.delete({ model, idParamName })) 42 | 43 | app.use(router.middleware()) 44 | } 45 | 46 | app.listen(3000) 47 | ``` 48 | 49 | Note that any model used with `koa2-mongoose-crud` must implement `model.getSafePaths(label, ctx)` and `model.getPublicDocument(doc, safePaths)` for basic filtering of readable / writable properties on different operations where label can be something like `create`, `read`, `update`, or `delete`. 50 | 51 | ## API 52 | 53 | ### CRUD 54 | 55 | * `crud.create = ({ model, label = 'create', acceptsPopulate, defaultPopulate = [], acl } = {})` 56 | * `crud.read = ({ model, idParamName, label = 'read', acceptsPopulate, defaultPopulate = [], acl } = {})` 57 | * `crud.update = ({ model, idParamName, label = 'update', acceptsPopulate, defaultPopulate = [], acl } = {})` 58 | * `crud.delete = ({ model, idParamName, label = 'archive', acl } = {})` 59 | 60 | ### CRUD++ 61 | 62 | * `crud.upsert = ({ model, idParamName, updateLabel = 'update', createLabel = 'create', acceptsPopulate, defaultPopulate = [], acl } = {})` 63 | * `crud.index = ({ model, acceptsFilters, canPaginate, defaultFilters, label = 'index', acceptsPopulate, defaultPopulate = [], acl } = {})` 64 | * `crud.count = ({ model, acceptsFilters, acl } = {})` 65 | * `crud.archive = ({ model, idParamName, label = 'archive', acl } = {})` 66 | * `crud.deleteByQuery = ({ model, acceptsFilters, acl } = {})` 67 | 68 | ### ACLs 69 | 70 | You may pass an `acl` parameter (short for Access Control List) to any of the crud functions which has the signature `async function (ctx: Koa.Context, doc: mongoose.Document): Promise`. 71 | 72 | For all the methods aside from `create`, `acl` will be passed a mongoose document which matched the crud operation, and you may perform access control to verify, for example, that the currently authenticated user is authorized to perform the crud operation on that document. 73 | 74 | For `create`, you can use this to overwrite the document before it's created in Mongo. This is useful, for example, to ensure that the currently authenticated user is stored on a new doocument as it's created for future authorization control. 75 | 76 | ![](https://media.giphy.com/media/l3V0mgFspVuDAJK9y/giphy.gif) 77 | 78 | ## License 79 | 80 | MIT © [Travis Fischer](https://transitivebullsh.it) 81 | 82 | Support my OSS work by following me on twitter twitter 83 | -------------------------------------------------------------------------------- /standard.test.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | describe('JavaScript codebase', function () { 4 | this.timeout(10000) 5 | it('conforms to javascript standard style (http://standardjs.com)', require('mocha-standard')) 6 | }) 7 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@sinonjs/formatio@^2.0.0": 6 | version "2.0.0" 7 | resolved "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" 8 | dependencies: 9 | samsam "1.3.0" 10 | 11 | acorn-jsx@^3.0.0: 12 | version "3.0.1" 13 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 14 | dependencies: 15 | acorn "^3.0.4" 16 | 17 | acorn@^3.0.4: 18 | version "3.3.0" 19 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 20 | 21 | acorn@^5.5.0: 22 | version "5.5.3" 23 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" 24 | 25 | ajv-keywords@^2.1.0: 26 | version "2.1.1" 27 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 28 | 29 | ajv@^5.2.3, ajv@^5.3.0: 30 | version "5.5.2" 31 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 32 | dependencies: 33 | co "^4.6.0" 34 | fast-deep-equal "^1.0.0" 35 | fast-json-stable-stringify "^2.0.0" 36 | json-schema-traverse "^0.3.0" 37 | 38 | ansi-escapes@^3.0.0: 39 | version "3.1.0" 40 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" 41 | 42 | ansi-regex@^2.0.0: 43 | version "2.1.1" 44 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 45 | 46 | ansi-regex@^3.0.0: 47 | version "3.0.0" 48 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 49 | 50 | ansi-styles@^2.2.1: 51 | version "2.2.1" 52 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 53 | 54 | ansi-styles@^3.2.1: 55 | version "3.2.1" 56 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 57 | dependencies: 58 | color-convert "^1.9.0" 59 | 60 | argparse@^1.0.7: 61 | version "1.0.9" 62 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 63 | dependencies: 64 | sprintf-js "~1.0.2" 65 | 66 | arr-diff@^2.0.0: 67 | version "2.0.0" 68 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 69 | dependencies: 70 | arr-flatten "^1.0.1" 71 | 72 | arr-diff@^4.0.0: 73 | version "4.0.0" 74 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 75 | 76 | arr-flatten@^1.0.1: 77 | version "1.0.3" 78 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" 79 | 80 | arr-flatten@^1.1.0: 81 | version "1.1.0" 82 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 83 | 84 | arr-union@^3.1.0: 85 | version "3.1.0" 86 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 87 | 88 | arr-unique@^1.0.2: 89 | version "1.0.2" 90 | resolved "https://registry.yarnpkg.com/arr-unique/-/arr-unique-1.0.2.tgz#ee1c47a83b64de54c3b07e658bc9bf81e2096372" 91 | dependencies: 92 | deep-equal "^1.0.1" 93 | 94 | array-includes@^3.0.3: 95 | version "3.0.3" 96 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" 97 | dependencies: 98 | define-properties "^1.1.2" 99 | es-abstract "^1.7.0" 100 | 101 | array-union@^1.0.1: 102 | version "1.0.2" 103 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 104 | dependencies: 105 | array-uniq "^1.0.1" 106 | 107 | array-uniq@^1.0.1: 108 | version "1.0.3" 109 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 110 | 111 | array-unique@^0.2.1: 112 | version "0.2.1" 113 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 114 | 115 | array-unique@^0.3.2: 116 | version "0.3.2" 117 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 118 | 119 | arrify@^1.0.0: 120 | version "1.0.1" 121 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 122 | 123 | asap@~2.0.3: 124 | version "2.0.6" 125 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 126 | 127 | assertion-error@^1.0.1: 128 | version "1.0.2" 129 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 130 | 131 | assign-symbols@^1.0.0: 132 | version "1.0.0" 133 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 134 | 135 | atob@^2.0.0: 136 | version "2.1.0" 137 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.0.tgz#ab2b150e51d7b122b9efc8d7340c06b6c41076bc" 138 | 139 | babel-code-frame@^6.22.0: 140 | version "6.26.0" 141 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 142 | dependencies: 143 | chalk "^1.1.3" 144 | esutils "^2.0.2" 145 | js-tokens "^3.0.2" 146 | 147 | balanced-match@^0.4.1: 148 | version "0.4.2" 149 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 150 | 151 | base@^0.11.1: 152 | version "0.11.2" 153 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 154 | dependencies: 155 | cache-base "^1.0.1" 156 | class-utils "^0.3.5" 157 | component-emitter "^1.2.1" 158 | define-property "^1.0.0" 159 | isobject "^3.0.1" 160 | mixin-deep "^1.2.0" 161 | pascalcase "^0.1.1" 162 | 163 | brace-expansion@^1.1.7: 164 | version "1.1.7" 165 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" 166 | dependencies: 167 | balanced-match "^0.4.1" 168 | concat-map "0.0.1" 169 | 170 | braces@^1.8.2: 171 | version "1.8.5" 172 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 173 | dependencies: 174 | expand-range "^1.8.1" 175 | preserve "^0.2.0" 176 | repeat-element "^1.1.2" 177 | 178 | braces@^2.3.1: 179 | version "2.3.2" 180 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 181 | dependencies: 182 | arr-flatten "^1.1.0" 183 | array-unique "^0.3.2" 184 | extend-shallow "^2.0.1" 185 | fill-range "^4.0.0" 186 | isobject "^3.0.1" 187 | repeat-element "^1.1.2" 188 | snapdragon "^0.8.1" 189 | snapdragon-node "^2.0.1" 190 | split-string "^3.0.2" 191 | to-regex "^3.0.1" 192 | 193 | browser-stdout@1.3.1: 194 | version "1.3.1" 195 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 196 | 197 | buffer-from@^1.0.0: 198 | version "1.0.0" 199 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" 200 | 201 | buffer-shims@~1.0.0: 202 | version "1.0.0" 203 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 204 | 205 | builtin-modules@^1.0.0, builtin-modules@^1.1.1: 206 | version "1.1.1" 207 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 208 | 209 | bytes@2.4.0: 210 | version "2.4.0" 211 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" 212 | 213 | cache-base@^1.0.1: 214 | version "1.0.1" 215 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 216 | dependencies: 217 | collection-visit "^1.0.0" 218 | component-emitter "^1.2.1" 219 | get-value "^2.0.6" 220 | has-value "^1.0.0" 221 | isobject "^3.0.1" 222 | set-value "^2.0.0" 223 | to-object-path "^0.3.0" 224 | union-value "^1.0.0" 225 | unset-value "^1.0.0" 226 | 227 | caller-path@^0.1.0: 228 | version "0.1.0" 229 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 230 | dependencies: 231 | callsites "^0.2.0" 232 | 233 | callsites@^0.2.0: 234 | version "0.2.0" 235 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 236 | 237 | chai@^4.1.2: 238 | version "4.1.2" 239 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" 240 | dependencies: 241 | assertion-error "^1.0.1" 242 | check-error "^1.0.1" 243 | deep-eql "^3.0.0" 244 | get-func-name "^2.0.0" 245 | pathval "^1.0.0" 246 | type-detect "^4.0.0" 247 | 248 | chalk@^1.1.3: 249 | version "1.1.3" 250 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 251 | dependencies: 252 | ansi-styles "^2.2.1" 253 | escape-string-regexp "^1.0.2" 254 | has-ansi "^2.0.0" 255 | strip-ansi "^3.0.0" 256 | supports-color "^2.0.0" 257 | 258 | chalk@^2.0.0, chalk@^2.1.0: 259 | version "2.4.0" 260 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.0.tgz#a060a297a6b57e15b61ca63ce84995daa0fe6e52" 261 | dependencies: 262 | ansi-styles "^3.2.1" 263 | escape-string-regexp "^1.0.5" 264 | supports-color "^5.3.0" 265 | 266 | chardet@^0.4.0: 267 | version "0.4.2" 268 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" 269 | 270 | check-error@^1.0.1: 271 | version "1.0.2" 272 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 273 | 274 | circular-json@^0.3.1: 275 | version "0.3.1" 276 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 277 | 278 | class-utils@^0.3.5: 279 | version "0.3.6" 280 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 281 | dependencies: 282 | arr-union "^3.1.0" 283 | define-property "^0.2.5" 284 | isobject "^3.0.0" 285 | static-extend "^0.1.1" 286 | 287 | cli-cursor@^2.1.0: 288 | version "2.1.0" 289 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 290 | dependencies: 291 | restore-cursor "^2.0.0" 292 | 293 | cli-width@^2.0.0: 294 | version "2.1.0" 295 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 296 | 297 | clone-deep@^0.3.0: 298 | version "0.3.0" 299 | resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8" 300 | dependencies: 301 | for-own "^1.0.0" 302 | is-plain-object "^2.0.1" 303 | kind-of "^3.2.2" 304 | shallow-clone "^0.1.2" 305 | 306 | co-body@^5.1.1: 307 | version "5.1.1" 308 | resolved "https://registry.yarnpkg.com/co-body/-/co-body-5.1.1.tgz#d97781d1e3344ba4a820fd1806bddf8341505236" 309 | dependencies: 310 | inflation "^2.0.0" 311 | qs "^6.4.0" 312 | raw-body "^2.2.0" 313 | type-is "^1.6.14" 314 | 315 | co@^4.6.0: 316 | version "4.6.0" 317 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 318 | 319 | collection-visit@^1.0.0: 320 | version "1.0.0" 321 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 322 | dependencies: 323 | map-visit "^1.0.0" 324 | object-visit "^1.0.0" 325 | 326 | color-convert@^1.9.0: 327 | version "1.9.1" 328 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 329 | dependencies: 330 | color-name "^1.1.1" 331 | 332 | color-name@^1.1.1: 333 | version "1.1.3" 334 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 335 | 336 | commander@2.11.0: 337 | version "2.11.0" 338 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" 339 | 340 | component-emitter@^1.2.1: 341 | version "1.2.1" 342 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 343 | 344 | concat-map@0.0.1: 345 | version "0.0.1" 346 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 347 | 348 | concat-stream@^1.6.0: 349 | version "1.6.2" 350 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 351 | dependencies: 352 | buffer-from "^1.0.0" 353 | inherits "^2.0.3" 354 | readable-stream "^2.2.2" 355 | typedarray "^0.0.6" 356 | 357 | contains-path@^0.1.0: 358 | version "0.1.0" 359 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 360 | 361 | copy-descriptor@^0.1.0: 362 | version "0.1.1" 363 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 364 | 365 | core-js@^1.0.0: 366 | version "1.2.7" 367 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" 368 | 369 | core-util-is@~1.0.0: 370 | version "1.0.2" 371 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 372 | 373 | cross-spawn@^5.1.0: 374 | version "5.1.0" 375 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 376 | dependencies: 377 | lru-cache "^4.0.1" 378 | shebang-command "^1.2.0" 379 | which "^1.2.9" 380 | 381 | debug-log@^1.0.0: 382 | version "1.0.1" 383 | resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" 384 | 385 | debug@3.1.0, debug@^3.1.0: 386 | version "3.1.0" 387 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 388 | dependencies: 389 | ms "2.0.0" 390 | 391 | debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: 392 | version "2.6.9" 393 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 394 | dependencies: 395 | ms "2.0.0" 396 | 397 | decode-uri-component@^0.2.0: 398 | version "0.2.0" 399 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 400 | 401 | deep-eql@^3.0.0: 402 | version "3.0.1" 403 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 404 | dependencies: 405 | type-detect "^4.0.0" 406 | 407 | deep-equal@^1.0.1: 408 | version "1.0.1" 409 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 410 | 411 | deep-is@~0.1.3: 412 | version "0.1.3" 413 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 414 | 415 | define-properties@^1.1.2: 416 | version "1.1.2" 417 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 418 | dependencies: 419 | foreach "^2.0.5" 420 | object-keys "^1.0.8" 421 | 422 | define-property@^0.2.5: 423 | version "0.2.5" 424 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 425 | dependencies: 426 | is-descriptor "^0.1.0" 427 | 428 | define-property@^1.0.0: 429 | version "1.0.0" 430 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 431 | dependencies: 432 | is-descriptor "^1.0.0" 433 | 434 | define-property@^2.0.2: 435 | version "2.0.2" 436 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 437 | dependencies: 438 | is-descriptor "^1.0.2" 439 | isobject "^3.0.1" 440 | 441 | deglob@^2.1.0: 442 | version "2.1.0" 443 | resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.1.0.tgz#4d44abe16ef32c779b4972bd141a80325029a14a" 444 | dependencies: 445 | find-root "^1.0.0" 446 | glob "^7.0.5" 447 | ignore "^3.0.9" 448 | pkg-config "^1.1.0" 449 | run-parallel "^1.1.2" 450 | uniq "^1.0.1" 451 | 452 | del@^2.0.2: 453 | version "2.2.2" 454 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 455 | dependencies: 456 | globby "^5.0.0" 457 | is-path-cwd "^1.0.0" 458 | is-path-in-cwd "^1.0.0" 459 | object-assign "^4.0.1" 460 | pify "^2.0.0" 461 | pinkie-promise "^2.0.0" 462 | rimraf "^2.2.8" 463 | 464 | diff@3.5.0: 465 | version "3.5.0" 466 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 467 | 468 | diff@^3.1.0: 469 | version "3.2.0" 470 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" 471 | 472 | doctrine@1.5.0: 473 | version "1.5.0" 474 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 475 | dependencies: 476 | esutils "^2.0.2" 477 | isarray "^1.0.0" 478 | 479 | doctrine@^2.0.2, doctrine@^2.1.0: 480 | version "2.1.0" 481 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 482 | dependencies: 483 | esutils "^2.0.2" 484 | 485 | encoding@^0.1.11: 486 | version "0.1.12" 487 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 488 | dependencies: 489 | iconv-lite "~0.4.13" 490 | 491 | error-ex@^1.2.0: 492 | version "1.3.1" 493 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 494 | dependencies: 495 | is-arrayish "^0.2.1" 496 | 497 | es-abstract@^1.7.0: 498 | version "1.7.0" 499 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" 500 | dependencies: 501 | es-to-primitive "^1.1.1" 502 | function-bind "^1.1.0" 503 | is-callable "^1.1.3" 504 | is-regex "^1.0.3" 505 | 506 | es-to-primitive@^1.1.1: 507 | version "1.1.1" 508 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 509 | dependencies: 510 | is-callable "^1.1.1" 511 | is-date-object "^1.0.1" 512 | is-symbol "^1.0.1" 513 | 514 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 515 | version "1.0.5" 516 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 517 | 518 | eslint-config-standard-jsx@5.0.0: 519 | version "5.0.0" 520 | resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-5.0.0.tgz#4abfac554f38668e0078c664569e7b2384e5d2aa" 521 | 522 | eslint-config-standard@11.0.0: 523 | version "11.0.0" 524 | resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz#87ee0d3c9d95382dc761958cbb23da9eea31e0ba" 525 | 526 | eslint-import-resolver-node@^0.3.1: 527 | version "0.3.2" 528 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" 529 | dependencies: 530 | debug "^2.6.9" 531 | resolve "^1.5.0" 532 | 533 | eslint-module-utils@^2.1.1: 534 | version "2.2.0" 535 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" 536 | dependencies: 537 | debug "^2.6.8" 538 | pkg-dir "^1.0.0" 539 | 540 | eslint-plugin-import@~2.9.0: 541 | version "2.9.0" 542 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz#26002efbfca5989b7288ac047508bd24f217b169" 543 | dependencies: 544 | builtin-modules "^1.1.1" 545 | contains-path "^0.1.0" 546 | debug "^2.6.8" 547 | doctrine "1.5.0" 548 | eslint-import-resolver-node "^0.3.1" 549 | eslint-module-utils "^2.1.1" 550 | has "^1.0.1" 551 | lodash "^4.17.4" 552 | minimatch "^3.0.3" 553 | read-pkg-up "^2.0.0" 554 | 555 | eslint-plugin-node@~6.0.0: 556 | version "6.0.1" 557 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" 558 | dependencies: 559 | ignore "^3.3.6" 560 | minimatch "^3.0.4" 561 | resolve "^1.3.3" 562 | semver "^5.4.1" 563 | 564 | eslint-plugin-promise@~3.7.0: 565 | version "3.7.0" 566 | resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz#f4bde5c2c77cdd69557a8f69a24d1ad3cfc9e67e" 567 | 568 | eslint-plugin-react@~7.7.0: 569 | version "7.7.0" 570 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz#f606c719dbd8a1a2b3d25c16299813878cca0160" 571 | dependencies: 572 | doctrine "^2.0.2" 573 | has "^1.0.1" 574 | jsx-ast-utils "^2.0.1" 575 | prop-types "^15.6.0" 576 | 577 | eslint-plugin-standard@~3.0.1: 578 | version "3.0.1" 579 | resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2" 580 | 581 | eslint-scope@^3.7.1: 582 | version "3.7.1" 583 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 584 | dependencies: 585 | esrecurse "^4.1.0" 586 | estraverse "^4.1.1" 587 | 588 | eslint-visitor-keys@^1.0.0: 589 | version "1.0.0" 590 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 591 | 592 | eslint@~4.18.0: 593 | version "4.18.2" 594 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.18.2.tgz#0f81267ad1012e7d2051e186a9004cc2267b8d45" 595 | dependencies: 596 | ajv "^5.3.0" 597 | babel-code-frame "^6.22.0" 598 | chalk "^2.1.0" 599 | concat-stream "^1.6.0" 600 | cross-spawn "^5.1.0" 601 | debug "^3.1.0" 602 | doctrine "^2.1.0" 603 | eslint-scope "^3.7.1" 604 | eslint-visitor-keys "^1.0.0" 605 | espree "^3.5.2" 606 | esquery "^1.0.0" 607 | esutils "^2.0.2" 608 | file-entry-cache "^2.0.0" 609 | functional-red-black-tree "^1.0.1" 610 | glob "^7.1.2" 611 | globals "^11.0.1" 612 | ignore "^3.3.3" 613 | imurmurhash "^0.1.4" 614 | inquirer "^3.0.6" 615 | is-resolvable "^1.0.0" 616 | js-yaml "^3.9.1" 617 | json-stable-stringify-without-jsonify "^1.0.1" 618 | levn "^0.3.0" 619 | lodash "^4.17.4" 620 | minimatch "^3.0.2" 621 | mkdirp "^0.5.1" 622 | natural-compare "^1.4.0" 623 | optionator "^0.8.2" 624 | path-is-inside "^1.0.2" 625 | pluralize "^7.0.0" 626 | progress "^2.0.0" 627 | require-uncached "^1.0.3" 628 | semver "^5.3.0" 629 | strip-ansi "^4.0.0" 630 | strip-json-comments "~2.0.1" 631 | table "4.0.2" 632 | text-table "~0.2.0" 633 | 634 | espree@^3.5.2: 635 | version "3.5.4" 636 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" 637 | dependencies: 638 | acorn "^5.5.0" 639 | acorn-jsx "^3.0.0" 640 | 641 | esprima@^4.0.0: 642 | version "4.0.0" 643 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 644 | 645 | esquery@^1.0.0: 646 | version "1.0.0" 647 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" 648 | dependencies: 649 | estraverse "^4.0.0" 650 | 651 | esrecurse@^4.1.0: 652 | version "4.1.0" 653 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" 654 | dependencies: 655 | estraverse "~4.1.0" 656 | object-assign "^4.0.1" 657 | 658 | estraverse@^4.0.0, estraverse@^4.1.1: 659 | version "4.2.0" 660 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 661 | 662 | estraverse@~4.1.0: 663 | version "4.1.1" 664 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" 665 | 666 | esutils@^2.0.2: 667 | version "2.0.2" 668 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 669 | 670 | expand-brackets@^0.1.4: 671 | version "0.1.5" 672 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 673 | dependencies: 674 | is-posix-bracket "^0.1.0" 675 | 676 | expand-brackets@^2.1.4: 677 | version "2.1.4" 678 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 679 | dependencies: 680 | debug "^2.3.3" 681 | define-property "^0.2.5" 682 | extend-shallow "^2.0.1" 683 | posix-character-classes "^0.1.0" 684 | regex-not "^1.0.0" 685 | snapdragon "^0.8.1" 686 | to-regex "^3.0.1" 687 | 688 | expand-range@^1.8.1: 689 | version "1.8.2" 690 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 691 | dependencies: 692 | fill-range "^2.1.0" 693 | 694 | extend-shallow@^2.0.1: 695 | version "2.0.1" 696 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 697 | dependencies: 698 | is-extendable "^0.1.0" 699 | 700 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 701 | version "3.0.2" 702 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 703 | dependencies: 704 | assign-symbols "^1.0.0" 705 | is-extendable "^1.0.1" 706 | 707 | external-editor@^2.0.4: 708 | version "2.2.0" 709 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" 710 | dependencies: 711 | chardet "^0.4.0" 712 | iconv-lite "^0.4.17" 713 | tmp "^0.0.33" 714 | 715 | extglob@^0.3.1: 716 | version "0.3.2" 717 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 718 | dependencies: 719 | is-extglob "^1.0.0" 720 | 721 | extglob@^2.0.4: 722 | version "2.0.4" 723 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 724 | dependencies: 725 | array-unique "^0.3.2" 726 | define-property "^1.0.0" 727 | expand-brackets "^2.1.4" 728 | extend-shallow "^2.0.1" 729 | fragment-cache "^0.2.1" 730 | regex-not "^1.0.0" 731 | snapdragon "^0.8.1" 732 | to-regex "^3.0.1" 733 | 734 | fast-deep-equal@^1.0.0: 735 | version "1.1.0" 736 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 737 | 738 | fast-json-stable-stringify@^2.0.0: 739 | version "2.0.0" 740 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 741 | 742 | fast-levenshtein@~2.0.4: 743 | version "2.0.6" 744 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 745 | 746 | fbjs@^0.8.16: 747 | version "0.8.16" 748 | resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" 749 | dependencies: 750 | core-js "^1.0.0" 751 | isomorphic-fetch "^2.1.1" 752 | loose-envify "^1.0.0" 753 | object-assign "^4.1.0" 754 | promise "^7.1.1" 755 | setimmediate "^1.0.5" 756 | ua-parser-js "^0.7.9" 757 | 758 | figures@^2.0.0: 759 | version "2.0.0" 760 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 761 | dependencies: 762 | escape-string-regexp "^1.0.5" 763 | 764 | file-entry-cache@^2.0.0: 765 | version "2.0.0" 766 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 767 | dependencies: 768 | flat-cache "^1.2.1" 769 | object-assign "^4.0.1" 770 | 771 | filename-regex@^2.0.0: 772 | version "2.0.1" 773 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 774 | 775 | fill-range@^2.1.0: 776 | version "2.2.3" 777 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 778 | dependencies: 779 | is-number "^2.1.0" 780 | isobject "^2.0.0" 781 | randomatic "^1.1.3" 782 | repeat-element "^1.1.2" 783 | repeat-string "^1.5.2" 784 | 785 | fill-range@^4.0.0: 786 | version "4.0.0" 787 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 788 | dependencies: 789 | extend-shallow "^2.0.1" 790 | is-number "^3.0.0" 791 | repeat-string "^1.6.1" 792 | to-regex-range "^2.1.0" 793 | 794 | filter-object@^3.0.0: 795 | version "3.0.0" 796 | resolved "https://registry.yarnpkg.com/filter-object/-/filter-object-3.0.0.tgz#eb4932f7e3d9becd4208f12ee836f164b4997546" 797 | dependencies: 798 | filter-values "^0.4.1" 799 | glob-object "^1.0.0" 800 | isobject "^3.0.0" 801 | 802 | filter-values@^0.4.1: 803 | version "0.4.1" 804 | resolved "https://registry.yarnpkg.com/filter-values/-/filter-values-0.4.1.tgz#59e6dbd5d3fd6302bd2db15c28e71bc1610ee84b" 805 | dependencies: 806 | for-own "^0.1.3" 807 | is-match "^0.4.0" 808 | 809 | find-root@^1.0.0: 810 | version "1.0.0" 811 | resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.0.0.tgz#962ff211aab25c6520feeeb8d6287f8f6e95807a" 812 | 813 | find-up@^1.0.0: 814 | version "1.1.2" 815 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 816 | dependencies: 817 | path-exists "^2.0.0" 818 | pinkie-promise "^2.0.0" 819 | 820 | find-up@^2.0.0: 821 | version "2.1.0" 822 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 823 | dependencies: 824 | locate-path "^2.0.0" 825 | 826 | flat-cache@^1.2.1: 827 | version "1.2.2" 828 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" 829 | dependencies: 830 | circular-json "^0.3.1" 831 | del "^2.0.2" 832 | graceful-fs "^4.1.2" 833 | write "^0.2.1" 834 | 835 | flat@^4.0.0: 836 | version "4.0.0" 837 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.0.0.tgz#3abc7f3b588e64ce77dc42fd59aa35806622fea8" 838 | dependencies: 839 | is-buffer "~1.1.5" 840 | 841 | for-in@^0.1.3: 842 | version "0.1.8" 843 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" 844 | 845 | for-in@^1.0.1, for-in@^1.0.2: 846 | version "1.0.2" 847 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 848 | 849 | for-own@^0.1.3, for-own@^0.1.4: 850 | version "0.1.5" 851 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 852 | dependencies: 853 | for-in "^1.0.1" 854 | 855 | for-own@^1.0.0: 856 | version "1.0.0" 857 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" 858 | dependencies: 859 | for-in "^1.0.1" 860 | 861 | foreach@^2.0.5: 862 | version "2.0.5" 863 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 864 | 865 | fragment-cache@^0.2.1: 866 | version "0.2.1" 867 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 868 | dependencies: 869 | map-cache "^0.2.2" 870 | 871 | fs.realpath@^1.0.0: 872 | version "1.0.0" 873 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 874 | 875 | function-bind@^1.0.2, function-bind@^1.1.0: 876 | version "1.1.0" 877 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 878 | 879 | functional-red-black-tree@^1.0.1: 880 | version "1.0.1" 881 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 882 | 883 | get-func-name@^2.0.0: 884 | version "2.0.0" 885 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 886 | 887 | get-stdin@^6.0.0: 888 | version "6.0.0" 889 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 890 | 891 | get-value@^2.0.3, get-value@^2.0.6: 892 | version "2.0.6" 893 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 894 | 895 | glob-base@^0.3.0: 896 | version "0.3.0" 897 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 898 | dependencies: 899 | glob-parent "^2.0.0" 900 | is-glob "^2.0.0" 901 | 902 | glob-object@^1.0.0: 903 | version "1.0.0" 904 | resolved "https://registry.yarnpkg.com/glob-object/-/glob-object-1.0.0.tgz#701682a89c7d13e18f40e80be3fe3a9e4d944f8d" 905 | dependencies: 906 | arr-unique "^1.0.2" 907 | clone-deep "^0.3.0" 908 | get-value "^2.0.6" 909 | micromatch "^3.0.3" 910 | set-value "^1.0.0" 911 | stringify-keys "^0.3.0" 912 | unset-value "^1.0.0" 913 | 914 | glob-parent@^2.0.0: 915 | version "2.0.0" 916 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 917 | dependencies: 918 | is-glob "^2.0.0" 919 | 920 | glob@7.1.2, glob@^7.1.2: 921 | version "7.1.2" 922 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 923 | dependencies: 924 | fs.realpath "^1.0.0" 925 | inflight "^1.0.4" 926 | inherits "2" 927 | minimatch "^3.0.4" 928 | once "^1.3.0" 929 | path-is-absolute "^1.0.0" 930 | 931 | glob@^7.0.3, glob@^7.0.5: 932 | version "7.1.1" 933 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 934 | dependencies: 935 | fs.realpath "^1.0.0" 936 | inflight "^1.0.4" 937 | inherits "2" 938 | minimatch "^3.0.2" 939 | once "^1.3.0" 940 | path-is-absolute "^1.0.0" 941 | 942 | globals@^11.0.1: 943 | version "11.4.0" 944 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.4.0.tgz#b85c793349561c16076a3c13549238a27945f1bc" 945 | 946 | globby@^5.0.0: 947 | version "5.0.0" 948 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 949 | dependencies: 950 | array-union "^1.0.1" 951 | arrify "^1.0.0" 952 | glob "^7.0.3" 953 | object-assign "^4.0.1" 954 | pify "^2.0.0" 955 | pinkie-promise "^2.0.0" 956 | 957 | graceful-fs@^4.1.2: 958 | version "4.1.11" 959 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 960 | 961 | growl@1.10.3: 962 | version "1.10.3" 963 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" 964 | 965 | has-ansi@^2.0.0: 966 | version "2.0.0" 967 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 968 | dependencies: 969 | ansi-regex "^2.0.0" 970 | 971 | has-flag@^2.0.0: 972 | version "2.0.0" 973 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 974 | 975 | has-flag@^3.0.0: 976 | version "3.0.0" 977 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 978 | 979 | has-value@^0.3.1: 980 | version "0.3.1" 981 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 982 | dependencies: 983 | get-value "^2.0.3" 984 | has-values "^0.1.4" 985 | isobject "^2.0.0" 986 | 987 | has-value@^1.0.0: 988 | version "1.0.0" 989 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 990 | dependencies: 991 | get-value "^2.0.6" 992 | has-values "^1.0.0" 993 | isobject "^3.0.0" 994 | 995 | has-values@^0.1.4: 996 | version "0.1.4" 997 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 998 | 999 | has-values@^1.0.0: 1000 | version "1.0.0" 1001 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 1002 | dependencies: 1003 | is-number "^3.0.0" 1004 | kind-of "^4.0.0" 1005 | 1006 | has@^1.0.1: 1007 | version "1.0.1" 1008 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 1009 | dependencies: 1010 | function-bind "^1.0.2" 1011 | 1012 | he@1.1.1: 1013 | version "1.1.1" 1014 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 1015 | 1016 | hosted-git-info@^2.1.4: 1017 | version "2.6.0" 1018 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" 1019 | 1020 | iconv-lite@0.4.15: 1021 | version "0.4.15" 1022 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" 1023 | 1024 | iconv-lite@^0.4.17, iconv-lite@~0.4.13: 1025 | version "0.4.21" 1026 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" 1027 | dependencies: 1028 | safer-buffer "^2.1.0" 1029 | 1030 | ignore@^3.0.9: 1031 | version "3.3.0" 1032 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.0.tgz#3812d22cbe9125f2c2b4915755a1b8abd745a001" 1033 | 1034 | ignore@^3.3.3, ignore@^3.3.6: 1035 | version "3.3.7" 1036 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" 1037 | 1038 | imurmurhash@^0.1.4: 1039 | version "0.1.4" 1040 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1041 | 1042 | inflation@^2.0.0: 1043 | version "2.0.0" 1044 | resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" 1045 | 1046 | inflight@^1.0.4: 1047 | version "1.0.6" 1048 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1049 | dependencies: 1050 | once "^1.3.0" 1051 | wrappy "1" 1052 | 1053 | inherits@2, inherits@^2.0.3, inherits@~2.0.1: 1054 | version "2.0.3" 1055 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1056 | 1057 | inquirer@^3.0.6: 1058 | version "3.3.0" 1059 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" 1060 | dependencies: 1061 | ansi-escapes "^3.0.0" 1062 | chalk "^2.0.0" 1063 | cli-cursor "^2.1.0" 1064 | cli-width "^2.0.0" 1065 | external-editor "^2.0.4" 1066 | figures "^2.0.0" 1067 | lodash "^4.3.0" 1068 | mute-stream "0.0.7" 1069 | run-async "^2.2.0" 1070 | rx-lite "^4.0.8" 1071 | rx-lite-aggregates "^4.0.8" 1072 | string-width "^2.1.0" 1073 | strip-ansi "^4.0.0" 1074 | through "^2.3.6" 1075 | 1076 | is-accessor-descriptor@^0.1.6: 1077 | version "0.1.6" 1078 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 1079 | dependencies: 1080 | kind-of "^3.0.2" 1081 | 1082 | is-accessor-descriptor@^1.0.0: 1083 | version "1.0.0" 1084 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 1085 | dependencies: 1086 | kind-of "^6.0.0" 1087 | 1088 | is-arrayish@^0.2.1: 1089 | version "0.2.1" 1090 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1091 | 1092 | is-buffer@^1.0.2, is-buffer@^1.1.5: 1093 | version "1.1.5" 1094 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 1095 | 1096 | is-buffer@~1.1.5: 1097 | version "1.1.6" 1098 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1099 | 1100 | is-builtin-module@^1.0.0: 1101 | version "1.0.0" 1102 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1103 | dependencies: 1104 | builtin-modules "^1.0.0" 1105 | 1106 | is-callable@^1.1.1, is-callable@^1.1.3: 1107 | version "1.1.3" 1108 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 1109 | 1110 | is-data-descriptor@^0.1.4: 1111 | version "0.1.4" 1112 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 1113 | dependencies: 1114 | kind-of "^3.0.2" 1115 | 1116 | is-data-descriptor@^1.0.0: 1117 | version "1.0.0" 1118 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 1119 | dependencies: 1120 | kind-of "^6.0.0" 1121 | 1122 | is-date-object@^1.0.1: 1123 | version "1.0.1" 1124 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 1125 | 1126 | is-descriptor@^0.1.0: 1127 | version "0.1.6" 1128 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 1129 | dependencies: 1130 | is-accessor-descriptor "^0.1.6" 1131 | is-data-descriptor "^0.1.4" 1132 | kind-of "^5.0.0" 1133 | 1134 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 1135 | version "1.0.2" 1136 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 1137 | dependencies: 1138 | is-accessor-descriptor "^1.0.0" 1139 | is-data-descriptor "^1.0.0" 1140 | kind-of "^6.0.2" 1141 | 1142 | is-dotfile@^1.0.0: 1143 | version "1.0.2" 1144 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 1145 | 1146 | is-equal-shallow@^0.1.3: 1147 | version "0.1.3" 1148 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1149 | dependencies: 1150 | is-primitive "^2.0.0" 1151 | 1152 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1153 | version "0.1.1" 1154 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1155 | 1156 | is-extendable@^1.0.1: 1157 | version "1.0.1" 1158 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 1159 | dependencies: 1160 | is-plain-object "^2.0.4" 1161 | 1162 | is-extglob@^1.0.0: 1163 | version "1.0.0" 1164 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1165 | 1166 | is-fullwidth-code-point@^2.0.0: 1167 | version "2.0.0" 1168 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1169 | 1170 | is-glob@^2.0.0, is-glob@^2.0.1: 1171 | version "2.0.1" 1172 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1173 | dependencies: 1174 | is-extglob "^1.0.0" 1175 | 1176 | is-match@^0.4.0: 1177 | version "0.4.1" 1178 | resolved "https://registry.yarnpkg.com/is-match/-/is-match-0.4.1.tgz#fb5f6c6709a1543b7c7efa7d9530e5b776f61f83" 1179 | dependencies: 1180 | deep-equal "^1.0.1" 1181 | is-extendable "^0.1.1" 1182 | is-glob "^2.0.1" 1183 | micromatch "^2.3.7" 1184 | 1185 | is-number@^2.0.2, is-number@^2.1.0: 1186 | version "2.1.0" 1187 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1188 | dependencies: 1189 | kind-of "^3.0.2" 1190 | 1191 | is-number@^3.0.0: 1192 | version "3.0.0" 1193 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1194 | dependencies: 1195 | kind-of "^3.0.2" 1196 | 1197 | is-number@^4.0.0: 1198 | version "4.0.0" 1199 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" 1200 | 1201 | is-odd@^2.0.0: 1202 | version "2.0.0" 1203 | resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" 1204 | dependencies: 1205 | is-number "^4.0.0" 1206 | 1207 | is-path-cwd@^1.0.0: 1208 | version "1.0.0" 1209 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 1210 | 1211 | is-path-in-cwd@^1.0.0: 1212 | version "1.0.0" 1213 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 1214 | dependencies: 1215 | is-path-inside "^1.0.0" 1216 | 1217 | is-path-inside@^1.0.0: 1218 | version "1.0.0" 1219 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 1220 | dependencies: 1221 | path-is-inside "^1.0.1" 1222 | 1223 | is-plain-object@^1.0.0: 1224 | version "1.0.0" 1225 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-1.0.0.tgz#ff5f752db71c3328afd5e685eb6adddd3eaffab7" 1226 | dependencies: 1227 | isobject "^0.2.0" 1228 | 1229 | is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1230 | version "2.0.4" 1231 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1232 | dependencies: 1233 | isobject "^3.0.1" 1234 | 1235 | is-posix-bracket@^0.1.0: 1236 | version "0.1.1" 1237 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1238 | 1239 | is-primitive@^2.0.0: 1240 | version "2.0.0" 1241 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1242 | 1243 | is-promise@^2.1.0: 1244 | version "2.1.0" 1245 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 1246 | 1247 | is-regex@^1.0.3: 1248 | version "1.0.4" 1249 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 1250 | dependencies: 1251 | has "^1.0.1" 1252 | 1253 | is-resolvable@^1.0.0: 1254 | version "1.0.0" 1255 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 1256 | dependencies: 1257 | tryit "^1.0.1" 1258 | 1259 | is-stream@^1.0.1: 1260 | version "1.1.0" 1261 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1262 | 1263 | is-symbol@^1.0.1: 1264 | version "1.0.1" 1265 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 1266 | 1267 | is-windows@^1.0.2: 1268 | version "1.0.2" 1269 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1270 | 1271 | isarray@0.0.1: 1272 | version "0.0.1" 1273 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1274 | 1275 | isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 1276 | version "1.0.0" 1277 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1278 | 1279 | isexe@^2.0.0: 1280 | version "2.0.0" 1281 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1282 | 1283 | isobject@^0.2.0: 1284 | version "0.2.0" 1285 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-0.2.0.tgz#a3432192f39b910b5f02cc989487836ec70aa85e" 1286 | 1287 | isobject@^2.0.0: 1288 | version "2.1.0" 1289 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1290 | dependencies: 1291 | isarray "1.0.0" 1292 | 1293 | isobject@^3.0.0, isobject@^3.0.1: 1294 | version "3.0.1" 1295 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1296 | 1297 | isomorphic-fetch@^2.1.1: 1298 | version "2.2.1" 1299 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 1300 | dependencies: 1301 | node-fetch "^1.0.1" 1302 | whatwg-fetch ">=0.10.0" 1303 | 1304 | js-tokens@^3.0.0: 1305 | version "3.0.1" 1306 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 1307 | 1308 | js-tokens@^3.0.2: 1309 | version "3.0.2" 1310 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1311 | 1312 | js-yaml@^3.9.1: 1313 | version "3.11.0" 1314 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" 1315 | dependencies: 1316 | argparse "^1.0.7" 1317 | esprima "^4.0.0" 1318 | 1319 | json-array-stream@^0.1.2: 1320 | version "0.1.2" 1321 | resolved "https://registry.yarnpkg.com/json-array-stream/-/json-array-stream-0.1.2.tgz#d3d897340aedfa2dc5db5798b3d7c286f213aaf5" 1322 | 1323 | json-schema-traverse@^0.3.0: 1324 | version "0.3.1" 1325 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 1326 | 1327 | json-stable-stringify-without-jsonify@^1.0.1: 1328 | version "1.0.1" 1329 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1330 | 1331 | jsx-ast-utils@^2.0.1: 1332 | version "2.0.1" 1333 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" 1334 | dependencies: 1335 | array-includes "^3.0.3" 1336 | 1337 | just-extend@^1.1.27: 1338 | version "1.1.27" 1339 | resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" 1340 | 1341 | kind-of@^2.0.1: 1342 | version "2.0.1" 1343 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" 1344 | dependencies: 1345 | is-buffer "^1.0.2" 1346 | 1347 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0, kind-of@^3.2.2: 1348 | version "3.2.2" 1349 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1350 | dependencies: 1351 | is-buffer "^1.1.5" 1352 | 1353 | kind-of@^4.0.0: 1354 | version "4.0.0" 1355 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1356 | dependencies: 1357 | is-buffer "^1.1.5" 1358 | 1359 | kind-of@^5.0.0: 1360 | version "5.1.0" 1361 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 1362 | 1363 | kind-of@^6.0.0, kind-of@^6.0.2: 1364 | version "6.0.2" 1365 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 1366 | 1367 | lazy-cache@^0.2.3: 1368 | version "0.2.7" 1369 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" 1370 | 1371 | levn@^0.3.0, levn@~0.3.0: 1372 | version "0.3.0" 1373 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1374 | dependencies: 1375 | prelude-ls "~1.1.2" 1376 | type-check "~0.3.2" 1377 | 1378 | load-json-file@^2.0.0: 1379 | version "2.0.0" 1380 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 1381 | dependencies: 1382 | graceful-fs "^4.1.2" 1383 | parse-json "^2.2.0" 1384 | pify "^2.0.0" 1385 | strip-bom "^3.0.0" 1386 | 1387 | locate-path@^2.0.0: 1388 | version "2.0.0" 1389 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1390 | dependencies: 1391 | p-locate "^2.0.0" 1392 | path-exists "^3.0.0" 1393 | 1394 | lodash.get@^4.4.2: 1395 | version "4.4.2" 1396 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 1397 | 1398 | lodash@^4.17.4: 1399 | version "4.17.5" 1400 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" 1401 | 1402 | lodash@^4.3.0: 1403 | version "4.17.4" 1404 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1405 | 1406 | lolex@^2.2.0, lolex@^2.3.2: 1407 | version "2.3.2" 1408 | resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.2.tgz#85f9450425103bf9e7a60668ea25dc43274ca807" 1409 | 1410 | loose-envify@^1.0.0, loose-envify@^1.3.1: 1411 | version "1.3.1" 1412 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1413 | dependencies: 1414 | js-tokens "^3.0.0" 1415 | 1416 | lru-cache@^4.0.1: 1417 | version "4.1.2" 1418 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" 1419 | dependencies: 1420 | pseudomap "^1.0.2" 1421 | yallist "^2.1.2" 1422 | 1423 | map-cache@^0.2.2: 1424 | version "0.2.2" 1425 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1426 | 1427 | map-visit@^1.0.0: 1428 | version "1.0.0" 1429 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 1430 | dependencies: 1431 | object-visit "^1.0.0" 1432 | 1433 | media-typer@0.3.0: 1434 | version "0.3.0" 1435 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1436 | 1437 | micromatch@^2.3.7: 1438 | version "2.3.11" 1439 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1440 | dependencies: 1441 | arr-diff "^2.0.0" 1442 | array-unique "^0.2.1" 1443 | braces "^1.8.2" 1444 | expand-brackets "^0.1.4" 1445 | extglob "^0.3.1" 1446 | filename-regex "^2.0.0" 1447 | is-extglob "^1.0.0" 1448 | is-glob "^2.0.1" 1449 | kind-of "^3.0.2" 1450 | normalize-path "^2.0.1" 1451 | object.omit "^2.0.0" 1452 | parse-glob "^3.0.4" 1453 | regex-cache "^0.4.2" 1454 | 1455 | micromatch@^3.0.3: 1456 | version "3.1.10" 1457 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 1458 | dependencies: 1459 | arr-diff "^4.0.0" 1460 | array-unique "^0.3.2" 1461 | braces "^2.3.1" 1462 | define-property "^2.0.2" 1463 | extend-shallow "^3.0.2" 1464 | extglob "^2.0.4" 1465 | fragment-cache "^0.2.1" 1466 | kind-of "^6.0.2" 1467 | nanomatch "^1.2.9" 1468 | object.pick "^1.3.0" 1469 | regex-not "^1.0.0" 1470 | snapdragon "^0.8.1" 1471 | to-regex "^3.0.2" 1472 | 1473 | mime-db@~1.27.0: 1474 | version "1.27.0" 1475 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" 1476 | 1477 | mime-types@~2.1.15: 1478 | version "2.1.15" 1479 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" 1480 | dependencies: 1481 | mime-db "~1.27.0" 1482 | 1483 | mimic-fn@^1.0.0: 1484 | version "1.2.0" 1485 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 1486 | 1487 | minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: 1488 | version "3.0.4" 1489 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1490 | dependencies: 1491 | brace-expansion "^1.1.7" 1492 | 1493 | minimist@0.0.8: 1494 | version "0.0.8" 1495 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1496 | 1497 | minimist@^1.1.0: 1498 | version "1.2.0" 1499 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1500 | 1501 | mixin-deep@^1.2.0: 1502 | version "1.3.1" 1503 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" 1504 | dependencies: 1505 | for-in "^1.0.2" 1506 | is-extendable "^1.0.1" 1507 | 1508 | mixin-object@^2.0.1: 1509 | version "2.0.1" 1510 | resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" 1511 | dependencies: 1512 | for-in "^0.1.3" 1513 | is-extendable "^0.1.1" 1514 | 1515 | mkdirp@0.5.1, mkdirp@^0.5.1: 1516 | version "0.5.1" 1517 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1518 | dependencies: 1519 | minimist "0.0.8" 1520 | 1521 | mocha-standard@^1.0.0: 1522 | version "1.0.0" 1523 | resolved "https://registry.yarnpkg.com/mocha-standard/-/mocha-standard-1.0.0.tgz#12150cfdce405564068bac3f9e66661c3ccd15f8" 1524 | 1525 | mocha@^5.1.0: 1526 | version "5.1.0" 1527 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.1.0.tgz#5ff11cc39c0bb65330ac6c41f9086634e3e3f686" 1528 | dependencies: 1529 | browser-stdout "1.3.1" 1530 | commander "2.11.0" 1531 | debug "3.1.0" 1532 | diff "3.5.0" 1533 | escape-string-regexp "1.0.5" 1534 | glob "7.1.2" 1535 | growl "1.10.3" 1536 | he "1.1.1" 1537 | minimatch "3.0.4" 1538 | mkdirp "0.5.1" 1539 | supports-color "4.4.0" 1540 | 1541 | ms@2.0.0: 1542 | version "2.0.0" 1543 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1544 | 1545 | mute-stream@0.0.7: 1546 | version "0.0.7" 1547 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 1548 | 1549 | nanomatch@^1.2.9: 1550 | version "1.2.9" 1551 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" 1552 | dependencies: 1553 | arr-diff "^4.0.0" 1554 | array-unique "^0.3.2" 1555 | define-property "^2.0.2" 1556 | extend-shallow "^3.0.2" 1557 | fragment-cache "^0.2.1" 1558 | is-odd "^2.0.0" 1559 | is-windows "^1.0.2" 1560 | kind-of "^6.0.2" 1561 | object.pick "^1.3.0" 1562 | regex-not "^1.0.0" 1563 | snapdragon "^0.8.1" 1564 | to-regex "^3.0.1" 1565 | 1566 | natural-compare@^1.4.0: 1567 | version "1.4.0" 1568 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1569 | 1570 | nise@^1.2.0: 1571 | version "1.3.2" 1572 | resolved "https://registry.yarnpkg.com/nise/-/nise-1.3.2.tgz#fd6fd8dc040dfb3c0a45252feb6ff21832309b14" 1573 | dependencies: 1574 | "@sinonjs/formatio" "^2.0.0" 1575 | just-extend "^1.1.27" 1576 | lolex "^2.3.2" 1577 | path-to-regexp "^1.7.0" 1578 | text-encoding "^0.6.4" 1579 | 1580 | node-fetch@^1.0.1: 1581 | version "1.7.3" 1582 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 1583 | dependencies: 1584 | encoding "^0.1.11" 1585 | is-stream "^1.0.1" 1586 | 1587 | normalize-package-data@^2.3.2: 1588 | version "2.4.0" 1589 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 1590 | dependencies: 1591 | hosted-git-info "^2.1.4" 1592 | is-builtin-module "^1.0.0" 1593 | semver "2 || 3 || 4 || 5" 1594 | validate-npm-package-license "^3.0.1" 1595 | 1596 | normalize-path@^2.0.1: 1597 | version "2.1.1" 1598 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1599 | dependencies: 1600 | remove-trailing-separator "^1.0.1" 1601 | 1602 | object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 1603 | version "4.1.1" 1604 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1605 | 1606 | object-copy@^0.1.0: 1607 | version "0.1.0" 1608 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 1609 | dependencies: 1610 | copy-descriptor "^0.1.0" 1611 | define-property "^0.2.5" 1612 | kind-of "^3.0.3" 1613 | 1614 | object-keys@^1.0.8: 1615 | version "1.0.11" 1616 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 1617 | 1618 | object-visit@^1.0.0: 1619 | version "1.0.1" 1620 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 1621 | dependencies: 1622 | isobject "^3.0.0" 1623 | 1624 | object.omit@^2.0.0: 1625 | version "2.0.1" 1626 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1627 | dependencies: 1628 | for-own "^0.1.4" 1629 | is-extendable "^0.1.1" 1630 | 1631 | object.pick@^1.3.0: 1632 | version "1.3.0" 1633 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1634 | dependencies: 1635 | isobject "^3.0.1" 1636 | 1637 | once@^1.3.0: 1638 | version "1.4.0" 1639 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1640 | dependencies: 1641 | wrappy "1" 1642 | 1643 | onetime@^2.0.0: 1644 | version "2.0.1" 1645 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1646 | dependencies: 1647 | mimic-fn "^1.0.0" 1648 | 1649 | optionator@^0.8.2: 1650 | version "0.8.2" 1651 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1652 | dependencies: 1653 | deep-is "~0.1.3" 1654 | fast-levenshtein "~2.0.4" 1655 | levn "~0.3.0" 1656 | prelude-ls "~1.1.2" 1657 | type-check "~0.3.2" 1658 | wordwrap "~1.0.0" 1659 | 1660 | os-tmpdir@~1.0.2: 1661 | version "1.0.2" 1662 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1663 | 1664 | p-limit@^1.1.0: 1665 | version "1.1.0" 1666 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" 1667 | 1668 | p-locate@^2.0.0: 1669 | version "2.0.0" 1670 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1671 | dependencies: 1672 | p-limit "^1.1.0" 1673 | 1674 | parse-glob@^3.0.4: 1675 | version "3.0.4" 1676 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1677 | dependencies: 1678 | glob-base "^0.3.0" 1679 | is-dotfile "^1.0.0" 1680 | is-extglob "^1.0.0" 1681 | is-glob "^2.0.0" 1682 | 1683 | parse-json@^2.2.0: 1684 | version "2.2.0" 1685 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1686 | dependencies: 1687 | error-ex "^1.2.0" 1688 | 1689 | pascalcase@^0.1.1: 1690 | version "0.1.1" 1691 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 1692 | 1693 | path-exists@^2.0.0: 1694 | version "2.1.0" 1695 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1696 | dependencies: 1697 | pinkie-promise "^2.0.0" 1698 | 1699 | path-exists@^3.0.0: 1700 | version "3.0.0" 1701 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1702 | 1703 | path-is-absolute@^1.0.0: 1704 | version "1.0.1" 1705 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1706 | 1707 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 1708 | version "1.0.2" 1709 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1710 | 1711 | path-parse@^1.0.5: 1712 | version "1.0.5" 1713 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1714 | 1715 | path-to-regexp@^1.7.0: 1716 | version "1.7.0" 1717 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" 1718 | dependencies: 1719 | isarray "0.0.1" 1720 | 1721 | path-type@^2.0.0: 1722 | version "2.0.0" 1723 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 1724 | dependencies: 1725 | pify "^2.0.0" 1726 | 1727 | pathval@^1.0.0: 1728 | version "1.1.0" 1729 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 1730 | 1731 | pify@^2.0.0: 1732 | version "2.3.0" 1733 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1734 | 1735 | pinkie-promise@^2.0.0: 1736 | version "2.0.1" 1737 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1738 | dependencies: 1739 | pinkie "^2.0.0" 1740 | 1741 | pinkie@^2.0.0: 1742 | version "2.0.4" 1743 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1744 | 1745 | pkg-conf@^2.0.0: 1746 | version "2.0.0" 1747 | resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.0.0.tgz#071c87650403bccfb9c627f58751bfe47c067279" 1748 | dependencies: 1749 | find-up "^2.0.0" 1750 | load-json-file "^2.0.0" 1751 | 1752 | pkg-config@^1.1.0: 1753 | version "1.1.1" 1754 | resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" 1755 | dependencies: 1756 | debug-log "^1.0.0" 1757 | find-root "^1.0.0" 1758 | xtend "^4.0.1" 1759 | 1760 | pkg-dir@^1.0.0: 1761 | version "1.0.0" 1762 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 1763 | dependencies: 1764 | find-up "^1.0.0" 1765 | 1766 | pluralize@^7.0.0: 1767 | version "7.0.0" 1768 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 1769 | 1770 | posix-character-classes@^0.1.0: 1771 | version "0.1.1" 1772 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 1773 | 1774 | prelude-ls@~1.1.2: 1775 | version "1.1.2" 1776 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1777 | 1778 | preserve@^0.2.0: 1779 | version "0.2.0" 1780 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1781 | 1782 | process-nextick-args@~1.0.6: 1783 | version "1.0.7" 1784 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1785 | 1786 | progress@^2.0.0: 1787 | version "2.0.0" 1788 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 1789 | 1790 | promise@^7.1.1: 1791 | version "7.3.1" 1792 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 1793 | dependencies: 1794 | asap "~2.0.3" 1795 | 1796 | prop-types@^15.6.0: 1797 | version "15.6.1" 1798 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" 1799 | dependencies: 1800 | fbjs "^0.8.16" 1801 | loose-envify "^1.3.1" 1802 | object-assign "^4.1.1" 1803 | 1804 | pseudomap@^1.0.2: 1805 | version "1.0.2" 1806 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1807 | 1808 | qs@^6.4.0: 1809 | version "6.4.0" 1810 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 1811 | 1812 | randomatic@^1.1.3: 1813 | version "1.1.6" 1814 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" 1815 | dependencies: 1816 | is-number "^2.0.2" 1817 | kind-of "^3.0.2" 1818 | 1819 | raw-body@^2.2.0: 1820 | version "2.2.0" 1821 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" 1822 | dependencies: 1823 | bytes "2.4.0" 1824 | iconv-lite "0.4.15" 1825 | unpipe "1.0.0" 1826 | 1827 | read-pkg-up@^2.0.0: 1828 | version "2.0.0" 1829 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1830 | dependencies: 1831 | find-up "^2.0.0" 1832 | read-pkg "^2.0.0" 1833 | 1834 | read-pkg@^2.0.0: 1835 | version "2.0.0" 1836 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1837 | dependencies: 1838 | load-json-file "^2.0.0" 1839 | normalize-package-data "^2.3.2" 1840 | path-type "^2.0.0" 1841 | 1842 | readable-stream@^2.1.5, readable-stream@^2.2.2: 1843 | version "2.2.9" 1844 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" 1845 | dependencies: 1846 | buffer-shims "~1.0.0" 1847 | core-util-is "~1.0.0" 1848 | inherits "~2.0.1" 1849 | isarray "~1.0.0" 1850 | process-nextick-args "~1.0.6" 1851 | string_decoder "~1.0.0" 1852 | util-deprecate "~1.0.1" 1853 | 1854 | regex-cache@^0.4.2: 1855 | version "0.4.3" 1856 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1857 | dependencies: 1858 | is-equal-shallow "^0.1.3" 1859 | is-primitive "^2.0.0" 1860 | 1861 | regex-not@^1.0.0, regex-not@^1.0.2: 1862 | version "1.0.2" 1863 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 1864 | dependencies: 1865 | extend-shallow "^3.0.2" 1866 | safe-regex "^1.1.0" 1867 | 1868 | remove-trailing-separator@^1.0.1: 1869 | version "1.0.1" 1870 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" 1871 | 1872 | repeat-element@^1.1.2: 1873 | version "1.1.2" 1874 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1875 | 1876 | repeat-string@^1.5.2, repeat-string@^1.6.1: 1877 | version "1.6.1" 1878 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1879 | 1880 | require-uncached@^1.0.3: 1881 | version "1.0.3" 1882 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1883 | dependencies: 1884 | caller-path "^0.1.0" 1885 | resolve-from "^1.0.0" 1886 | 1887 | resolve-from@^1.0.0: 1888 | version "1.0.1" 1889 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1890 | 1891 | resolve-url@^0.2.1: 1892 | version "0.2.1" 1893 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 1894 | 1895 | resolve@^1.3.3, resolve@^1.5.0: 1896 | version "1.7.1" 1897 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" 1898 | dependencies: 1899 | path-parse "^1.0.5" 1900 | 1901 | restore-cursor@^2.0.0: 1902 | version "2.0.0" 1903 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1904 | dependencies: 1905 | onetime "^2.0.0" 1906 | signal-exit "^3.0.2" 1907 | 1908 | ret@~0.1.10: 1909 | version "0.1.15" 1910 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 1911 | 1912 | rimraf@^2.2.8: 1913 | version "2.6.1" 1914 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1915 | dependencies: 1916 | glob "^7.0.5" 1917 | 1918 | run-async@^2.2.0: 1919 | version "2.3.0" 1920 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1921 | dependencies: 1922 | is-promise "^2.1.0" 1923 | 1924 | run-parallel@^1.1.2: 1925 | version "1.1.6" 1926 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.6.tgz#29003c9a2163e01e2d2dfc90575f2c6c1d61a039" 1927 | 1928 | rx-lite-aggregates@^4.0.8: 1929 | version "4.0.8" 1930 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 1931 | dependencies: 1932 | rx-lite "*" 1933 | 1934 | rx-lite@*, rx-lite@^4.0.8: 1935 | version "4.0.8" 1936 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 1937 | 1938 | safe-regex@^1.1.0: 1939 | version "1.1.0" 1940 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 1941 | dependencies: 1942 | ret "~0.1.10" 1943 | 1944 | safer-buffer@^2.1.0: 1945 | version "2.1.2" 1946 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1947 | 1948 | samsam@1.3.0: 1949 | version "1.3.0" 1950 | resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" 1951 | 1952 | "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: 1953 | version "5.5.0" 1954 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 1955 | 1956 | set-value@^0.4.3: 1957 | version "0.4.3" 1958 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 1959 | dependencies: 1960 | extend-shallow "^2.0.1" 1961 | is-extendable "^0.1.1" 1962 | is-plain-object "^2.0.1" 1963 | to-object-path "^0.3.0" 1964 | 1965 | set-value@^1.0.0: 1966 | version "1.0.0" 1967 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-1.0.0.tgz#bcc76f71a0f1e07a24b987d0a02afec9f665304f" 1968 | dependencies: 1969 | extend-shallow "^2.0.1" 1970 | is-extendable "^0.1.1" 1971 | is-plain-object "^2.0.1" 1972 | to-object-path "^0.3.0" 1973 | 1974 | set-value@^2.0.0: 1975 | version "2.0.0" 1976 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 1977 | dependencies: 1978 | extend-shallow "^2.0.1" 1979 | is-extendable "^0.1.1" 1980 | is-plain-object "^2.0.3" 1981 | split-string "^3.0.1" 1982 | 1983 | setimmediate@^1.0.5: 1984 | version "1.0.5" 1985 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1986 | 1987 | shallow-clone@^0.1.2: 1988 | version "0.1.2" 1989 | resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" 1990 | dependencies: 1991 | is-extendable "^0.1.1" 1992 | kind-of "^2.0.1" 1993 | lazy-cache "^0.2.3" 1994 | mixin-object "^2.0.1" 1995 | 1996 | shebang-command@^1.2.0: 1997 | version "1.2.0" 1998 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1999 | dependencies: 2000 | shebang-regex "^1.0.0" 2001 | 2002 | shebang-regex@^1.0.0: 2003 | version "1.0.0" 2004 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2005 | 2006 | signal-exit@^3.0.2: 2007 | version "3.0.2" 2008 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2009 | 2010 | sinon@^4.5.0: 2011 | version "4.5.0" 2012 | resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.5.0.tgz#427ae312a337d3c516804ce2754e8c0d5028cb04" 2013 | dependencies: 2014 | "@sinonjs/formatio" "^2.0.0" 2015 | diff "^3.1.0" 2016 | lodash.get "^4.4.2" 2017 | lolex "^2.2.0" 2018 | nise "^1.2.0" 2019 | supports-color "^5.1.0" 2020 | type-detect "^4.0.5" 2021 | 2022 | slice-ansi@1.0.0: 2023 | version "1.0.0" 2024 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 2025 | dependencies: 2026 | is-fullwidth-code-point "^2.0.0" 2027 | 2028 | snapdragon-node@^2.0.1: 2029 | version "2.1.1" 2030 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 2031 | dependencies: 2032 | define-property "^1.0.0" 2033 | isobject "^3.0.0" 2034 | snapdragon-util "^3.0.1" 2035 | 2036 | snapdragon-util@^3.0.1: 2037 | version "3.0.1" 2038 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 2039 | dependencies: 2040 | kind-of "^3.2.0" 2041 | 2042 | snapdragon@^0.8.1: 2043 | version "0.8.2" 2044 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 2045 | dependencies: 2046 | base "^0.11.1" 2047 | debug "^2.2.0" 2048 | define-property "^0.2.5" 2049 | extend-shallow "^2.0.1" 2050 | map-cache "^0.2.2" 2051 | source-map "^0.5.6" 2052 | source-map-resolve "^0.5.0" 2053 | use "^3.1.0" 2054 | 2055 | source-map-resolve@^0.5.0: 2056 | version "0.5.1" 2057 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" 2058 | dependencies: 2059 | atob "^2.0.0" 2060 | decode-uri-component "^0.2.0" 2061 | resolve-url "^0.2.1" 2062 | source-map-url "^0.4.0" 2063 | urix "^0.1.0" 2064 | 2065 | source-map-url@^0.4.0: 2066 | version "0.4.0" 2067 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 2068 | 2069 | source-map@^0.5.6: 2070 | version "0.5.7" 2071 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2072 | 2073 | spdx-correct@^3.0.0: 2074 | version "3.0.0" 2075 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" 2076 | dependencies: 2077 | spdx-expression-parse "^3.0.0" 2078 | spdx-license-ids "^3.0.0" 2079 | 2080 | spdx-exceptions@^2.1.0: 2081 | version "2.1.0" 2082 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" 2083 | 2084 | spdx-expression-parse@^3.0.0: 2085 | version "3.0.0" 2086 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 2087 | dependencies: 2088 | spdx-exceptions "^2.1.0" 2089 | spdx-license-ids "^3.0.0" 2090 | 2091 | spdx-license-ids@^3.0.0: 2092 | version "3.0.0" 2093 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" 2094 | 2095 | split-string@^3.0.1, split-string@^3.0.2: 2096 | version "3.1.0" 2097 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 2098 | dependencies: 2099 | extend-shallow "^3.0.0" 2100 | 2101 | sprintf-js@~1.0.2: 2102 | version "1.0.3" 2103 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2104 | 2105 | standard-engine@~8.0.0: 2106 | version "8.0.1" 2107 | resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-8.0.1.tgz#0b77be8d7ab963675717dbeac1ef1d6675fb62f0" 2108 | dependencies: 2109 | deglob "^2.1.0" 2110 | get-stdin "^6.0.0" 2111 | minimist "^1.1.0" 2112 | pkg-conf "^2.0.0" 2113 | 2114 | standard@^11.0.0: 2115 | version "11.0.1" 2116 | resolved "https://registry.yarnpkg.com/standard/-/standard-11.0.1.tgz#49be40c76f1d564964b22bbf7309929ad0335e29" 2117 | dependencies: 2118 | eslint "~4.18.0" 2119 | eslint-config-standard "11.0.0" 2120 | eslint-config-standard-jsx "5.0.0" 2121 | eslint-plugin-import "~2.9.0" 2122 | eslint-plugin-node "~6.0.0" 2123 | eslint-plugin-promise "~3.7.0" 2124 | eslint-plugin-react "~7.7.0" 2125 | eslint-plugin-standard "~3.0.1" 2126 | standard-engine "~8.0.0" 2127 | 2128 | static-extend@^0.1.1: 2129 | version "0.1.2" 2130 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 2131 | dependencies: 2132 | define-property "^0.2.5" 2133 | object-copy "^0.1.0" 2134 | 2135 | string-width@^2.1.0, string-width@^2.1.1: 2136 | version "2.1.1" 2137 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2138 | dependencies: 2139 | is-fullwidth-code-point "^2.0.0" 2140 | strip-ansi "^4.0.0" 2141 | 2142 | string_decoder@~1.0.0: 2143 | version "1.0.0" 2144 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" 2145 | dependencies: 2146 | buffer-shims "~1.0.0" 2147 | 2148 | stringify-keys@^0.3.0: 2149 | version "0.3.0" 2150 | resolved "https://registry.yarnpkg.com/stringify-keys/-/stringify-keys-0.3.0.tgz#5a8f09dc7612d1a5cf502d5e7a5a149302fe09be" 2151 | dependencies: 2152 | is-plain-object "^1.0.0" 2153 | 2154 | strip-ansi@^3.0.0: 2155 | version "3.0.1" 2156 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2157 | dependencies: 2158 | ansi-regex "^2.0.0" 2159 | 2160 | strip-ansi@^4.0.0: 2161 | version "4.0.0" 2162 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2163 | dependencies: 2164 | ansi-regex "^3.0.0" 2165 | 2166 | strip-bom@^3.0.0: 2167 | version "3.0.0" 2168 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2169 | 2170 | strip-json-comments@~2.0.1: 2171 | version "2.0.1" 2172 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2173 | 2174 | supports-color@4.4.0: 2175 | version "4.4.0" 2176 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" 2177 | dependencies: 2178 | has-flag "^2.0.0" 2179 | 2180 | supports-color@^2.0.0: 2181 | version "2.0.0" 2182 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2183 | 2184 | supports-color@^5.1.0, supports-color@^5.3.0: 2185 | version "5.4.0" 2186 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 2187 | dependencies: 2188 | has-flag "^3.0.0" 2189 | 2190 | table@4.0.2: 2191 | version "4.0.2" 2192 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 2193 | dependencies: 2194 | ajv "^5.2.3" 2195 | ajv-keywords "^2.1.0" 2196 | chalk "^2.1.0" 2197 | lodash "^4.17.4" 2198 | slice-ansi "1.0.0" 2199 | string-width "^2.1.1" 2200 | 2201 | text-encoding@^0.6.4: 2202 | version "0.6.4" 2203 | resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" 2204 | 2205 | text-table@~0.2.0: 2206 | version "0.2.0" 2207 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2208 | 2209 | through2@^2.0.3: 2210 | version "2.0.3" 2211 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 2212 | dependencies: 2213 | readable-stream "^2.1.5" 2214 | xtend "~4.0.1" 2215 | 2216 | through@^2.3.6: 2217 | version "2.3.8" 2218 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2219 | 2220 | tmp@^0.0.33: 2221 | version "0.0.33" 2222 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 2223 | dependencies: 2224 | os-tmpdir "~1.0.2" 2225 | 2226 | to-object-path@^0.3.0: 2227 | version "0.3.0" 2228 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 2229 | dependencies: 2230 | kind-of "^3.0.2" 2231 | 2232 | to-regex-range@^2.1.0: 2233 | version "2.1.1" 2234 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 2235 | dependencies: 2236 | is-number "^3.0.0" 2237 | repeat-string "^1.6.1" 2238 | 2239 | to-regex@^3.0.1, to-regex@^3.0.2: 2240 | version "3.0.2" 2241 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 2242 | dependencies: 2243 | define-property "^2.0.2" 2244 | extend-shallow "^3.0.2" 2245 | regex-not "^1.0.2" 2246 | safe-regex "^1.1.0" 2247 | 2248 | tryit@^1.0.1: 2249 | version "1.0.3" 2250 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 2251 | 2252 | type-check@~0.3.2: 2253 | version "0.3.2" 2254 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2255 | dependencies: 2256 | prelude-ls "~1.1.2" 2257 | 2258 | type-detect@^4.0.0, type-detect@^4.0.5: 2259 | version "4.0.8" 2260 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 2261 | 2262 | type-is@^1.6.14: 2263 | version "1.6.15" 2264 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" 2265 | dependencies: 2266 | media-typer "0.3.0" 2267 | mime-types "~2.1.15" 2268 | 2269 | typedarray@^0.0.6: 2270 | version "0.0.6" 2271 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2272 | 2273 | ua-parser-js@^0.7.9: 2274 | version "0.7.17" 2275 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" 2276 | 2277 | union-value@^1.0.0: 2278 | version "1.0.0" 2279 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 2280 | dependencies: 2281 | arr-union "^3.1.0" 2282 | get-value "^2.0.6" 2283 | is-extendable "^0.1.1" 2284 | set-value "^0.4.3" 2285 | 2286 | uniq@^1.0.1: 2287 | version "1.0.1" 2288 | resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 2289 | 2290 | unpipe@1.0.0: 2291 | version "1.0.0" 2292 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2293 | 2294 | unset-value@^1.0.0: 2295 | version "1.0.0" 2296 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 2297 | dependencies: 2298 | has-value "^0.3.1" 2299 | isobject "^3.0.0" 2300 | 2301 | urix@^0.1.0: 2302 | version "0.1.0" 2303 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 2304 | 2305 | use@^3.1.0: 2306 | version "3.1.0" 2307 | resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" 2308 | dependencies: 2309 | kind-of "^6.0.2" 2310 | 2311 | util-deprecate@~1.0.1: 2312 | version "1.0.2" 2313 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2314 | 2315 | validate-npm-package-license@^3.0.1: 2316 | version "3.0.3" 2317 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" 2318 | dependencies: 2319 | spdx-correct "^3.0.0" 2320 | spdx-expression-parse "^3.0.0" 2321 | 2322 | whatwg-fetch@>=0.10.0: 2323 | version "2.0.4" 2324 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" 2325 | 2326 | which@^1.2.9: 2327 | version "1.3.0" 2328 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 2329 | dependencies: 2330 | isexe "^2.0.0" 2331 | 2332 | wordwrap@~1.0.0: 2333 | version "1.0.0" 2334 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2335 | 2336 | wrappy@1: 2337 | version "1.0.2" 2338 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2339 | 2340 | write@^0.2.1: 2341 | version "0.2.1" 2342 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 2343 | dependencies: 2344 | mkdirp "^0.5.1" 2345 | 2346 | xtend@^4.0.1, xtend@~4.0.1: 2347 | version "4.0.1" 2348 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2349 | 2350 | yallist@^2.1.2: 2351 | version "2.1.2" 2352 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 2353 | --------------------------------------------------------------------------------