js-data-rethinkdb
Advanced tools
Comparing version 3.0.0-beta.5 to 3.0.0-beta.6
@@ -0,1 +1,6 @@ | ||
##### 3.0.0-beta.6 - 17 May 2016 | ||
###### Backwards compatible changes | ||
- Added support for grouped "where" clauses | ||
##### 3.0.0-beta.5 - 10 May 2016 | ||
@@ -2,0 +7,0 @@ |
@@ -32,2 +32,3 @@ 'use strict'; | ||
* @name module:js-data-rethinkdb.OPERATORS | ||
* @property {Function} = Equality operator. | ||
* @property {Function} == Equality operator. | ||
@@ -53,2 +54,3 @@ * @property {Function} != Inequality operator. | ||
var OPERATORS = { | ||
'=': equal, | ||
'==': equal, | ||
@@ -481,8 +483,91 @@ '===': equal, | ||
}, | ||
selectDb: function selectDb(opts) { | ||
return this.r.db(jsData.utils.isUndefined(opts.db) ? this.rOpts.db : opts.db); | ||
_applyWhereFromObject: function _applyWhereFromObject(where) { | ||
var fields = []; | ||
var ops = []; | ||
var predicates = []; | ||
jsData.utils.forOwn(where, function (clause, field) { | ||
if (!jsData.utils.isObject(clause)) { | ||
clause = { | ||
'==': clause | ||
}; | ||
} | ||
jsData.utils.forOwn(clause, function (expr, op) { | ||
fields.push(field); | ||
ops.push(op); | ||
predicates.push(expr); | ||
}); | ||
}); | ||
return { | ||
fields: fields, | ||
ops: ops, | ||
predicates: predicates | ||
}; | ||
}, | ||
selectTable: function selectTable(mapper, opts) { | ||
return this.selectDb(opts).table(mapper.table || underscore(mapper.name)); | ||
_applyWhereFromArray: function _applyWhereFromArray(where) { | ||
var _this8 = this; | ||
var groups = []; | ||
where.forEach(function (_where, i) { | ||
if (jsData.utils.isString(_where)) { | ||
return; | ||
} | ||
var prev = where[i - 1]; | ||
var parser = jsData.utils.isArray(_where) ? _this8._applyWhereFromArray : _this8._applyWhereFromObject; | ||
var group = parser.call(_this8, _where); | ||
if (prev === 'or') { | ||
group.isOr = true; | ||
} | ||
groups.push(group); | ||
}); | ||
groups.isArray = true; | ||
return groups; | ||
}, | ||
_testObjectGroup: function _testObjectGroup(rql, group, row, opts) { | ||
var i = void 0; | ||
var r = this.r; | ||
var fields = group.fields; | ||
var ops = group.ops; | ||
var predicates = group.predicates; | ||
var len = ops.length; | ||
for (i = 0; i < len; i++) { | ||
var op = ops[i]; | ||
var isOr = op.charAt(0) === '|'; | ||
op = isOr ? op.substr(1) : op; | ||
var predicateFn = this.getOperator(op, opts); | ||
if (predicateFn) { | ||
var predicateResult = predicateFn(r, row, fields[i], predicates[i]); | ||
if (isOr) { | ||
rql = rql ? rql.or(predicateResult) : predicateResult; | ||
} else { | ||
rql = rql ? rql.and(predicateResult) : predicateResult; | ||
} | ||
} else { | ||
throw new Error('Operator ' + op + ' not supported!'); | ||
} | ||
} | ||
return rql; | ||
}, | ||
_testArrayGroup: function _testArrayGroup(rql, groups, row, opts) { | ||
var i = void 0; | ||
var len = groups.length; | ||
for (i = 0; i < len; i++) { | ||
var group = groups[i]; | ||
var subQuery = void 0; | ||
if (group.isArray) { | ||
subQuery = this._testArrayGroup(rql, group, row, opts); | ||
} else { | ||
subQuery = this._testObjectGroup(null, group, row, opts); | ||
} | ||
if (groups[i - 1]) { | ||
if (group.isOr) { | ||
rql = rql.or(subQuery); | ||
} else { | ||
rql = rql.and(subQuery); | ||
} | ||
} else { | ||
rql = rql ? rql.and(subQuery) : subQuery; | ||
} | ||
} | ||
return rql; | ||
}, | ||
@@ -508,3 +593,3 @@ | ||
filterSequence: function filterSequence(sequence, query, opts) { | ||
var _this8 = this; | ||
var _this9 = this; | ||
@@ -538,32 +623,13 @@ var r = this.r; | ||
// Filter | ||
if (Object.keys(query.where).length !== 0) { | ||
// Filter sequence using filter function | ||
var groups = void 0; | ||
if (jsData.utils.isObject(query.where) && Object.keys(query.where).length !== 0) { | ||
groups = this._applyWhereFromArray([query.where]); | ||
} else if (jsData.utils.isArray(query.where)) { | ||
groups = this._applyWhereFromArray(query.where); | ||
} | ||
if (groups) { | ||
rql = rql.filter(function (row) { | ||
var subQuery = void 0; | ||
// Apply filter for each field | ||
jsData.utils.forOwn(query.where, function (criteria, field) { | ||
if (!jsData.utils.isObject(criteria)) { | ||
criteria = { '==': criteria }; | ||
} | ||
// Apply filter for each operator | ||
jsData.utils.forOwn(criteria, function (value, operator) { | ||
var isOr = false; | ||
if (operator && operator[0] === '|') { | ||
operator = operator.substr(1); | ||
isOr = true; | ||
} | ||
var predicateFn = _this8.getOperator(operator, opts); | ||
if (predicateFn) { | ||
var predicateResult = predicateFn(r, row, field, value); | ||
if (isOr) { | ||
subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult; | ||
} else { | ||
subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult; | ||
} | ||
} else { | ||
throw new Error('Operator ' + operator + ' not supported!'); | ||
} | ||
}); | ||
}); | ||
return subQuery || true; | ||
return _this9._testArrayGroup(null, groups, row, opts) || true; | ||
}); | ||
@@ -597,2 +663,8 @@ } | ||
}, | ||
selectDb: function selectDb(opts) { | ||
return this.r.db(jsData.utils.isUndefined(opts.db) ? this.rOpts.db : opts.db); | ||
}, | ||
selectTable: function selectTable(mapper, opts) { | ||
return this.selectDb(opts).table(mapper.table || underscore(mapper.name)); | ||
}, | ||
waitForDb: function waitForDb(opts) { | ||
@@ -607,3 +679,3 @@ opts || (opts = {}); | ||
waitForTable: function waitForTable(mapper, opts) { | ||
var _this9 = this; | ||
var _this10 = this; | ||
@@ -614,11 +686,11 @@ opts || (opts = {}); | ||
return this.waitForDb(opts).then(function () { | ||
_this9.tables[db] = _this9.tables[db] || {}; | ||
if (!_this9.tables[db][table]) { | ||
_this9.tables[db][table] = _this9.r.branch(_this9.r.db(db).tableList().contains(table), true, _this9.r.db(db).tableCreate(table)).run(); | ||
_this10.tables[db] = _this10.tables[db] || {}; | ||
if (!_this10.tables[db][table]) { | ||
_this10.tables[db][table] = _this10.r.branch(_this10.r.db(db).tableList().contains(table), true, _this10.r.db(db).tableCreate(table)).run(); | ||
} | ||
return _this9.tables[db][table]; | ||
return _this10.tables[db][table]; | ||
}); | ||
}, | ||
waitForIndex: function waitForIndex(table, index, opts) { | ||
var _this10 = this; | ||
var _this11 = this; | ||
@@ -628,12 +700,12 @@ opts || (opts = {}); | ||
return this.waitForDb(opts).then(function () { | ||
return _this10.waitForTable(table, opts); | ||
return _this11.waitForTable(table, opts); | ||
}).then(function () { | ||
_this10.indices[db] = _this10.indices[db] || {}; | ||
_this10.indices[db][table] = _this10.indices[db][table] || {}; | ||
if (!_this10.tables[db][table][index]) { | ||
_this10.tables[db][table][index] = _this10.r.branch(_this10.r.db(db).table(table).indexList().contains(index), true, _this10.r.db(db).table(table).indexCreate(index)).run().then(function () { | ||
return _this10.r.db(db).table(table).indexWait(index).run(); | ||
_this11.indices[db] = _this11.indices[db] || {}; | ||
_this11.indices[db][table] = _this11.indices[db][table] || {}; | ||
if (!_this11.tables[db][table][index]) { | ||
_this11.tables[db][table][index] = _this11.r.branch(_this11.r.db(db).table(table).indexList().contains(index), true, _this11.r.db(db).table(table).indexCreate(index)).run().then(function () { | ||
return _this11.r.db(db).table(table).indexWait(index).run(); | ||
}); | ||
} | ||
return _this10.tables[db][table][index]; | ||
return _this11.tables[db][table][index]; | ||
}); | ||
@@ -665,3 +737,3 @@ }, | ||
count: function count(mapper, query, opts) { | ||
var _this11 = this; | ||
var _this12 = this; | ||
@@ -672,3 +744,3 @@ opts || (opts = {}); | ||
return this.waitForTable(mapper, opts).then(function () { | ||
return __super__.count.call(_this11, mapper, query, opts); | ||
return __super__.count.call(_this12, mapper, query, opts); | ||
}); | ||
@@ -693,3 +765,3 @@ }, | ||
create: function create(mapper, props, opts) { | ||
var _this12 = this; | ||
var _this13 = this; | ||
@@ -700,3 +772,3 @@ props || (props = {}); | ||
return this.waitForTable(mapper, opts).then(function () { | ||
return __super__.create.call(_this12, mapper, props, opts); | ||
return __super__.create.call(_this13, mapper, props, opts); | ||
}); | ||
@@ -721,3 +793,3 @@ }, | ||
createMany: function createMany(mapper, props, opts) { | ||
var _this13 = this; | ||
var _this14 = this; | ||
@@ -728,3 +800,3 @@ props || (props = {}); | ||
return this.waitForTable(mapper, opts).then(function () { | ||
return __super__.createMany.call(_this13, mapper, props, opts); | ||
return __super__.createMany.call(_this14, mapper, props, opts); | ||
}); | ||
@@ -749,3 +821,3 @@ }, | ||
destroy: function destroy(mapper, id, opts) { | ||
var _this14 = this; | ||
var _this15 = this; | ||
@@ -755,3 +827,3 @@ opts || (opts = {}); | ||
return this.waitForTable(mapper, opts).then(function () { | ||
return __super__.destroy.call(_this14, mapper, id, opts); | ||
return __super__.destroy.call(_this15, mapper, id, opts); | ||
}); | ||
@@ -784,3 +856,3 @@ }, | ||
destroyAll: function destroyAll(mapper, query, opts) { | ||
var _this15 = this; | ||
var _this16 = this; | ||
@@ -791,3 +863,3 @@ opts || (opts = {}); | ||
return this.waitForTable(mapper, opts).then(function () { | ||
return __super__.destroyAll.call(_this15, mapper, query, opts); | ||
return __super__.destroyAll.call(_this16, mapper, query, opts); | ||
}); | ||
@@ -812,3 +884,3 @@ }, | ||
find: function find(mapper, id, opts) { | ||
var _this16 = this; | ||
var _this17 = this; | ||
@@ -829,5 +901,5 @@ opts || (opts = {}); | ||
if (def.type === 'belongsTo') { | ||
tasks.push(_this16.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts)); | ||
tasks.push(_this17.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts)); | ||
} else { | ||
tasks.push(_this16.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)); | ||
tasks.push(_this17.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)); | ||
} | ||
@@ -837,3 +909,3 @@ } | ||
return Promise.all(tasks).then(function () { | ||
return __super__.find.call(_this16, mapper, id, opts); | ||
return __super__.find.call(_this17, mapper, id, opts); | ||
}); | ||
@@ -866,3 +938,3 @@ }, | ||
findAll: function findAll(mapper, query, opts) { | ||
var _this17 = this; | ||
var _this18 = this; | ||
@@ -884,5 +956,5 @@ opts || (opts = {}); | ||
if (def.type === 'belongsTo') { | ||
tasks.push(_this17.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts)); | ||
tasks.push(_this18.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts)); | ||
} else { | ||
tasks.push(_this17.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)); | ||
tasks.push(_this18.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)); | ||
} | ||
@@ -892,3 +964,3 @@ } | ||
return Promise.all(tasks).then(function () { | ||
return __super__.findAll.call(_this17, mapper, query, opts); | ||
return __super__.findAll.call(_this18, mapper, query, opts); | ||
}); | ||
@@ -942,3 +1014,3 @@ }, | ||
sum: function sum(mapper, field, query, opts) { | ||
var _this18 = this; | ||
var _this19 = this; | ||
@@ -949,3 +1021,3 @@ opts || (opts = {}); | ||
return this.waitForTable(mapper, opts).then(function () { | ||
return __super__.sum.call(_this18, mapper, field, query, opts); | ||
return __super__.sum.call(_this19, mapper, field, query, opts); | ||
}); | ||
@@ -971,3 +1043,3 @@ }, | ||
update: function update(mapper, id, props, opts) { | ||
var _this19 = this; | ||
var _this20 = this; | ||
@@ -978,3 +1050,3 @@ props || (props = {}); | ||
return this.waitForTable(mapper, opts).then(function () { | ||
return __super__.update.call(_this19, mapper, id, props, opts); | ||
return __super__.update.call(_this20, mapper, id, props, opts); | ||
}); | ||
@@ -1008,3 +1080,3 @@ }, | ||
updateAll: function updateAll(mapper, props, query, opts) { | ||
var _this20 = this; | ||
var _this21 = this; | ||
@@ -1016,3 +1088,3 @@ props || (props = {}); | ||
return this.waitForTable(mapper, opts).then(function () { | ||
return __super__.updateAll.call(_this20, mapper, props, query, opts); | ||
return __super__.updateAll.call(_this21, mapper, props, query, opts); | ||
}); | ||
@@ -1037,3 +1109,3 @@ }, | ||
updateMany: function updateMany(mapper, records, opts) { | ||
var _this21 = this; | ||
var _this22 = this; | ||
@@ -1044,3 +1116,3 @@ records || (records = []); | ||
return this.waitForTable(mapper, opts).then(function () { | ||
return __super__.updateMany.call(_this21, mapper, records, opts); | ||
return __super__.updateMany.call(_this22, mapper, records, opts); | ||
}); | ||
@@ -1073,4 +1145,4 @@ } | ||
var version = { | ||
beta: 5, | ||
full: '3.0.0-beta.5', | ||
beta: 6, | ||
full: '3.0.0-beta.6', | ||
major: 3, | ||
@@ -1077,0 +1149,0 @@ minor: 0, |
{ | ||
"name": "js-data-rethinkdb", | ||
"description": "RethinkDB adapter for js-data.", | ||
"version": "3.0.0-beta.5", | ||
"version": "3.0.0-beta.6", | ||
"homepage": "https://github.com/js-data/js-data-rethinkdb", | ||
@@ -48,6 +48,2 @@ "repository": { | ||
"es2015" | ||
], | ||
"plugins": [ | ||
"syntax-async-functions", | ||
"transform-regenerator" | ||
] | ||
@@ -67,20 +63,12 @@ }, | ||
"dependencies": { | ||
"js-data-adapter": "~0.6.1", | ||
"js-data-adapter": "~0.7.2", | ||
"mout": "1.0.0" | ||
}, | ||
"peerDependencies": { | ||
"js-data": "^3.0.0-beta.5", | ||
"js-data": "^3.0.0-beta.6", | ||
"rethinkdbdash": ">=2.0.0" | ||
}, | ||
"devDependencies": { | ||
"babel-polyfill": "6.8.0", | ||
"babel-preset-es2015-rollup": "1.1.1", | ||
"js-data-adapter-tests": "^2.0.0-alpha.20", | ||
"js-data-repo-tools": "0.5.1", | ||
"nyc": "6.4.4", | ||
"rollup": "0.26.2", | ||
"rollup-plugin-babel": "2.4.0", | ||
"source-map-support": "0.4.0", | ||
"watch": "0.18.0" | ||
"js-data-repo-tools": "0.5.2" | ||
} | ||
} |
142
src/index.js
@@ -31,2 +31,3 @@ import {utils} from 'js-data' | ||
* @name module:js-data-rethinkdb.OPERATORS | ||
* @property {Function} = Equality operator. | ||
* @property {Function} == Equality operator. | ||
@@ -52,2 +53,3 @@ * @property {Function} != Inequality operator. | ||
export const OPERATORS = { | ||
'=': equal, | ||
'==': equal, | ||
@@ -498,10 +500,93 @@ '===': equal, | ||
selectDb (opts) { | ||
return this.r.db(utils.isUndefined(opts.db) ? this.rOpts.db : opts.db) | ||
_applyWhereFromObject (where) { | ||
const fields = [] | ||
const ops = [] | ||
const predicates = [] | ||
utils.forOwn(where, (clause, field) => { | ||
if (!utils.isObject(clause)) { | ||
clause = { | ||
'==': clause | ||
} | ||
} | ||
utils.forOwn(clause, (expr, op) => { | ||
fields.push(field) | ||
ops.push(op) | ||
predicates.push(expr) | ||
}) | ||
}) | ||
return { | ||
fields, | ||
ops, | ||
predicates | ||
} | ||
}, | ||
selectTable (mapper, opts) { | ||
return this.selectDb(opts).table(mapper.table || underscore(mapper.name)) | ||
_applyWhereFromArray (where) { | ||
const groups = [] | ||
where.forEach((_where, i) => { | ||
if (utils.isString(_where)) { | ||
return | ||
} | ||
const prev = where[i - 1] | ||
const parser = utils.isArray(_where) ? this._applyWhereFromArray : this._applyWhereFromObject | ||
const group = parser.call(this, _where) | ||
if (prev === 'or') { | ||
group.isOr = true | ||
} | ||
groups.push(group) | ||
}) | ||
groups.isArray = true | ||
return groups | ||
}, | ||
_testObjectGroup (rql, group, row, opts) { | ||
let i | ||
const r = this.r | ||
const fields = group.fields | ||
const ops = group.ops | ||
const predicates = group.predicates | ||
const len = ops.length | ||
for (i = 0; i < len; i++) { | ||
let op = ops[i] | ||
const isOr = op.charAt(0) === '|' | ||
op = isOr ? op.substr(1) : op | ||
const predicateFn = this.getOperator(op, opts) | ||
if (predicateFn) { | ||
const predicateResult = predicateFn(r, row, fields[i], predicates[i]) | ||
if (isOr) { | ||
rql = rql ? rql.or(predicateResult) : predicateResult | ||
} else { | ||
rql = rql ? rql.and(predicateResult) : predicateResult | ||
} | ||
} else { | ||
throw new Error(`Operator ${op} not supported!`) | ||
} | ||
} | ||
return rql | ||
}, | ||
_testArrayGroup (rql, groups, row, opts) { | ||
let i | ||
const len = groups.length | ||
for (i = 0; i < len; i++) { | ||
const group = groups[i] | ||
let subQuery | ||
if (group.isArray) { | ||
subQuery = this._testArrayGroup(rql, group, row, opts) | ||
} else { | ||
subQuery = this._testObjectGroup(null, group, row, opts) | ||
} | ||
if (groups[i - 1]) { | ||
if (group.isOr) { | ||
rql = rql.or(subQuery) | ||
} else { | ||
rql = rql.and(subQuery) | ||
} | ||
} else { | ||
rql = rql ? rql.and(subQuery) : subQuery | ||
} | ||
} | ||
return rql | ||
}, | ||
/** | ||
@@ -552,35 +637,14 @@ * Apply the specified selection query to the provided RQL sequence. | ||
// Filter | ||
if (Object.keys(query.where).length !== 0) { | ||
// Filter sequence using filter function | ||
rql = rql.filter((row) => { | ||
let subQuery | ||
// Apply filter for each field | ||
utils.forOwn(query.where, (criteria, field) => { | ||
if (!utils.isObject(criteria)) { | ||
criteria = { '==': criteria } | ||
} | ||
// Apply filter for each operator | ||
utils.forOwn(criteria, (value, operator) => { | ||
let isOr = false | ||
if (operator && operator[0] === '|') { | ||
operator = operator.substr(1) | ||
isOr = true | ||
} | ||
let predicateFn = this.getOperator(operator, opts) | ||
if (predicateFn) { | ||
const predicateResult = predicateFn(r, row, field, value) | ||
if (isOr) { | ||
subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult | ||
} else { | ||
subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult | ||
} | ||
} else { | ||
throw new Error(`Operator ${operator} not supported!`) | ||
} | ||
}) | ||
}) | ||
return subQuery || true | ||
}) | ||
let groups | ||
if (utils.isObject(query.where) && Object.keys(query.where).length !== 0) { | ||
groups = this._applyWhereFromArray([query.where]) | ||
} else if (utils.isArray(query.where)) { | ||
groups = this._applyWhereFromArray(query.where) | ||
} | ||
if (groups) { | ||
rql = rql.filter((row) => this._testArrayGroup(null, groups, row, opts) || true) | ||
} | ||
// Sort | ||
@@ -614,2 +678,10 @@ if (query.orderBy) { | ||
selectDb (opts) { | ||
return this.r.db(utils.isUndefined(opts.db) ? this.rOpts.db : opts.db) | ||
}, | ||
selectTable (mapper, opts) { | ||
return this.selectDb(opts).table(mapper.table || underscore(mapper.name)) | ||
}, | ||
waitForDb (opts) { | ||
@@ -616,0 +688,0 @@ opts || (opts = {}) |
Sorry, the diff of this file is not supported yet
141603
1
2104
+ Addedassertion-error@1.1.0(transitive)
+ Addedavailable-typed-arrays@1.0.7(transitive)
+ Addedcall-bind@1.0.8(transitive)
+ Addedcall-bind-apply-helpers@1.0.2(transitive)
+ Addedcall-bound@1.0.3(transitive)
+ Addedchai@3.5.0(transitive)
+ Addedcommander@0.6.12.3.0(transitive)
+ Addeddebug@2.2.0(transitive)
+ Addeddeep-eql@0.1.3(transitive)
+ Addeddefine-data-property@1.1.4(transitive)
+ Addeddiff@1.4.0(transitive)
+ Addeddunder-proto@1.0.1(transitive)
+ Addedes-define-property@1.0.1(transitive)
+ Addedes-errors@1.3.0(transitive)
+ Addedes-object-atoms@1.1.1(transitive)
+ Addedescape-string-regexp@1.0.2(transitive)
+ Addedfor-each@0.3.5(transitive)
+ Addedformatio@1.1.1(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedget-intrinsic@1.2.7(transitive)
+ Addedget-proto@1.0.1(transitive)
+ Addedglob@3.2.11(transitive)
+ Addedgopd@1.2.0(transitive)
+ Addedgrowl@1.9.2(transitive)
+ Addedhas-property-descriptors@1.0.2(transitive)
+ Addedhas-symbols@1.1.0(transitive)
+ Addedhas-tostringtag@1.0.2(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedis-arguments@1.2.0(transitive)
+ Addedis-callable@1.2.7(transitive)
+ Addedis-generator-function@1.1.0(transitive)
+ Addedis-regex@1.2.1(transitive)
+ Addedis-typed-array@1.1.15(transitive)
+ Addedjade@0.26.3(transitive)
+ Addedjs-data-adapter@0.7.4(transitive)
+ Addedlolex@1.3.2(transitive)
+ Addedlru-cache@2.7.3(transitive)
+ Addedmath-intrinsics@1.1.0(transitive)
+ Addedminimatch@0.3.0(transitive)
+ Addedminimist@0.0.8(transitive)
+ Addedmkdirp@0.3.00.5.1(transitive)
+ Addedmocha@2.5.3(transitive)
+ Addedms@0.7.1(transitive)
+ Addedpossible-typed-array-names@1.1.0(transitive)
+ Addedsafe-regex-test@1.1.0(transitive)
+ Addedsamsam@1.1.2(transitive)
+ Addedset-function-length@1.2.2(transitive)
+ Addedsigmund@1.0.1(transitive)
+ Addedsinon@1.17.7(transitive)
+ Addedsupports-color@1.2.0(transitive)
+ Addedto-iso-string@0.0.2(transitive)
+ Addedtype-detect@0.1.11.0.0(transitive)
+ Addedutil@0.12.5(transitive)
+ Addedwhich-typed-array@1.1.18(transitive)
- Removedjs-data-adapter@0.6.2(transitive)
Updatedjs-data-adapter@~0.7.2