Comparing version 1.4.1 to 2.0.0
@@ -1,18 +0,12 @@ | ||
/* | ||
* Copyright (c) 2015 TechnologyAdvice | ||
*/ | ||
// Libs | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', { | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.obey = exports.adapter = exports.model = exports.use = undefined; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | ||
var _model = require('./lib/model'); | ||
var _libModel = require('./lib/model'); | ||
var _adapter = require('./lib/adapter'); | ||
var _libAdapter = require('./lib/adapter'); | ||
var _lodash = require('lodash'); | ||
@@ -22,2 +16,4 @@ | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
/** | ||
@@ -36,8 +32,13 @@ * Adds plugins for extending core functionality | ||
*/ | ||
/* | ||
* Copyright (c) 2015 TechnologyAdvice | ||
*/ | ||
// Libs | ||
var use = function use(modelName, adapterName) { | ||
// Initialize model and adapter | ||
var m = _libModel.model.init(modelName); | ||
var a = _libAdapter.adapter.init(adapterName); | ||
var m = _model.model.init(modelName); | ||
var a = _adapter.adapter.init(adapterName); | ||
// Return extended (in case model has arbitrary properties/methods) | ||
return _lodash2['default'].extend(a, m, { plugin: pluginFn }); | ||
return _lodash2.default.extend(a, m, { plugin: pluginFn }); | ||
}; | ||
@@ -49,4 +50,4 @@ | ||
exports.use = use; | ||
exports.model = _libModel.model; | ||
exports.adapter = _libAdapter.adapter; | ||
exports.Joi = _libModel.Joi; | ||
exports.model = _model.model; | ||
exports.adapter = _adapter.adapter; | ||
exports.obey = _model.obey; |
@@ -0,1 +1,6 @@ | ||
'use strict'; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
/** | ||
@@ -5,10 +10,4 @@ * Exports the core adapter object | ||
*/ | ||
'use strict'; | ||
var adapter = exports.adapter = {}; | ||
Object.defineProperty(exports, '__esModule', { | ||
value: true | ||
}); | ||
var adapter = {}; | ||
exports.adapter = adapter; | ||
/** | ||
@@ -15,0 +14,0 @@ * Stores the adapters in memory |
@@ -1,12 +0,11 @@ | ||
/** | ||
* Exports Joi so no additional import/require needed | ||
*/ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', { | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
var Joi = require('joi'); | ||
/** | ||
* Exports Joi so no additional import/require needed | ||
*/ | ||
var obey = exports.obey = require('obey'); | ||
exports.Joi = Joi; | ||
/** | ||
@@ -16,5 +15,4 @@ * Exports the core model object | ||
*/ | ||
var model = {}; | ||
var model = exports.model = {}; | ||
exports.model = model; | ||
/** | ||
@@ -44,3 +42,8 @@ * Stores the models and their versions in memory | ||
if (prop !== 'version' && prop !== 'name') { | ||
modelObj[prop] = m[prop]; | ||
if (prop === 'schema' && typeof m.schema.validate !== 'function') { | ||
// Build model | ||
modelObj.schema = obey.model(m.schema); | ||
} else { | ||
modelObj[prop] = m[prop]; | ||
} | ||
} | ||
@@ -69,7 +72,4 @@ }); | ||
// Return validation | ||
return Joi.validate(data, Joi.object().keys(this.schemas[v].schema), function (err) { | ||
if (err) { | ||
return model.formatValidationError(err); | ||
} | ||
return null; | ||
return this.schemas[v].schema.validate(data).catch(function (err) { | ||
return model.formatValidationError(err.collection); | ||
}); | ||
@@ -81,4 +81,4 @@ }, | ||
for (var prop in dataNode) { | ||
if (schemaNode[prop] && ({}).toString.call(dataNode[prop]).match(/\s([a-zA-Z]+)/)[1].toLowerCase() === 'object') { | ||
itt(schemaNode[prop], dataNode[prop]); | ||
if (schemaNode[prop] && {}.toString.call(dataNode[prop]).match(/\s([a-zA-Z]+)/)[1].toLowerCase() === 'object') { | ||
itt(schemaNode[prop].keys, dataNode[prop]); | ||
} else if (!schemaNode[prop]) { | ||
@@ -90,3 +90,3 @@ delete dataNode[prop]; | ||
}; | ||
return itt(this.schemas[v].schema, data); | ||
return itt(this.schemas[v].schema.def.keys, data); | ||
} | ||
@@ -105,5 +105,5 @@ }; | ||
// A custom formatter is defined | ||
return model.customValidationError(err); | ||
throw model.customValidationError(err); | ||
} | ||
return err; | ||
throw err; | ||
}; | ||
@@ -110,0 +110,0 @@ |
{ | ||
"name": "modli", | ||
"version": "1.4.1", | ||
"version": "2.0.0", | ||
"description": "A module for building models and adapters for multiple data sources", | ||
@@ -17,12 +17,8 @@ "main": "build/index.js", | ||
"scripts": { | ||
"all": "make", | ||
"start": "make start", | ||
"clean": "make clean", | ||
"build": "make build", | ||
"test": "make test", | ||
"test-libs": "make test-libs", | ||
"test-adapters": "make test-adapters", | ||
"test-integration": "make test-integration", | ||
"test-cover": "make test-cover", | ||
"lint": "make lint" | ||
"clean": "rm -rf node_modules", | ||
"build": "babel ./src --out-dir ./build", | ||
"test": "npm run lint && npm run cover", | ||
"mocha": "babel-node node_modules/.bin/_mocha", | ||
"cover": "babel-node node_modules/isparta/bin/isparta cover node_modules/mocha/bin/_mocha", | ||
"lint": "eslint ./src ./test --fix" | ||
}, | ||
@@ -32,24 +28,30 @@ "license": "MIT", | ||
"assert": "^1.3.0", | ||
"babel": "^5.6.14", | ||
"babel-eslint": "^4.0.5", | ||
"babel-istanbul": "^0.3.17", | ||
"body-parser": "^1.13.3", | ||
"chai": "^3.0.0", | ||
"eslint": "^1.2.1", | ||
"express": "^4.13.3", | ||
"istanbul-harmony": "^0.3.16", | ||
"mocha": "^2.2.5", | ||
"modli-nedb": "^1.2.0", | ||
"pre-commit": "^1.1.1", | ||
"should": "^7.0.2" | ||
"mocha": "~2.2.5", | ||
"modli-nedb": "^2.0.1", | ||
"pre-commit": "~1.1.1", | ||
"babel-cli": "~6.1.4", | ||
"babel-core": "~6.1.4", | ||
"babel-eslint": "~4.1.7", | ||
"babel-preset-es2015": "^6.5.0", | ||
"chai": "~3.0.0", | ||
"chai-as-promised": "^5.2.0", | ||
"eslint": "~2.1.0", | ||
"isparta": "~4.0.0", | ||
"sinon": "~1.15.4", | ||
"sinon-chai": "~2.8.0" | ||
}, | ||
"dependencies": { | ||
"bluebird": "^2.9.34", | ||
"joi": "^6.6.1", | ||
"obey": "^0.9.0", | ||
"lodash": "^3.10.1" | ||
}, | ||
"pre-commit": [ | ||
"lint", | ||
"test" | ||
] | ||
], | ||
"babel": { | ||
"presets": [ | ||
"es2015" | ||
] | ||
} | ||
} |
@@ -30,3 +30,3 @@ [![wercker status](https://app.wercker.com/status/f3739d627fd42f6eb10bf5e1a1c09a84/s/master "wercker status")](https://app.wercker.com/project/bykey/f3739d627fd42f6eb10bf5e1a1c09a84) | ||
// Import all the Modli methods | ||
import { model, adapter, use, Joi } from 'modli'; | ||
import { model, adapter, use } from 'modli'; | ||
// Import the adapter to use | ||
@@ -54,6 +54,6 @@ import nedb from 'modli-nedb'; | ||
schema: { | ||
id: Joi.number().integer(), | ||
fname: Joi.string().min(3).max(30), | ||
lname: Joi.string().min(3).max(30), | ||
email: Joi.string().email().min(3).max(254).required() | ||
id: { type: 'number', required: true }, | ||
fname: { type: 'string' }, | ||
lname: { type: 'string' }, | ||
email: { type: 'email', required: true } | ||
} | ||
@@ -159,3 +159,3 @@ }); | ||
i.e. create and update procedures. The adapter inherits the model's `validate` | ||
method which utilizes the [Joi](https://github.com/hapijs/joi) library to ensure | ||
method which utilizes the [Obey](https://github.com/TechnologyAdvice/obey) library to ensure | ||
properties are correct. | ||
@@ -165,3 +165,3 @@ | ||
By default, the `validation` method's `fail` response will return the Joi error | ||
By default, the `validation` method's `fail` response will return the Obey error | ||
object. This can be overridden using the following: | ||
@@ -179,3 +179,3 @@ | ||
model.customValidationError = (err) => { | ||
return err.details[0].message; | ||
return err[0].message; | ||
} | ||
@@ -182,0 +182,0 @@ ``` |
@@ -6,5 +6,5 @@ /* | ||
// Libs | ||
import { model, Joi } from './lib/model'; | ||
import { adapter } from './lib/adapter'; | ||
import _ from 'lodash'; | ||
import { model, obey } from './lib/model' | ||
import { adapter } from './lib/adapter' | ||
import _ from 'lodash' | ||
@@ -15,5 +15,5 @@ /** | ||
*/ | ||
const pluginFn = function (plugin) { | ||
this[plugin.name] = plugin; | ||
}; | ||
const pluginFn = function(plugin) { | ||
this[plugin.name] = plugin | ||
} | ||
@@ -27,7 +27,7 @@ /** | ||
// Initialize model and adapter | ||
const m = model.init(modelName); | ||
const a = adapter.init(adapterName); | ||
const m = model.init(modelName) | ||
const a = adapter.init(adapterName) | ||
// Return extended (in case model has arbitrary properties/methods) | ||
return _.extend(a, m, { plugin: pluginFn }); | ||
}; | ||
return _.extend(a, m, { plugin: pluginFn }) | ||
} | ||
@@ -38,3 +38,3 @@ /** | ||
export { | ||
use, model, adapter, Joi | ||
}; | ||
use, model, adapter, obey | ||
} |
@@ -5,3 +5,3 @@ /** | ||
*/ | ||
export const adapter = {}; | ||
export const adapter = {} | ||
@@ -12,3 +12,3 @@ /** | ||
*/ | ||
adapter.store = {}; | ||
adapter.store = {} | ||
@@ -26,3 +26,3 @@ /** | ||
config: a.config | ||
})); | ||
})) | ||
} | ||
@@ -33,4 +33,4 @@ // Add to memory | ||
config: a.config | ||
}; | ||
}; | ||
} | ||
} | ||
@@ -44,15 +44,15 @@ /** | ||
adapter.init = (a) => { | ||
let adapterObj; | ||
let adapterObj | ||
// Ensure model is defined | ||
if (!adapter.store[a]) { | ||
throw new Error('Adapter not defined'); | ||
throw new Error('Adapter not defined') | ||
} | ||
const source = adapter.store[a].source; | ||
const source = adapter.store[a].source | ||
if (typeof source === 'function') { | ||
adapterObj = source; | ||
adapterObj = source | ||
} else { | ||
adapterObj = require(source); | ||
adapterObj = require(source) | ||
} | ||
// Instantiate adapter | ||
return new adapterObj(adapter.store[a].config); | ||
}; | ||
return new adapterObj(adapter.store[a].config) | ||
} |
/** | ||
* Exports Joi so no additional import/require needed | ||
*/ | ||
export const Joi = require('joi'); | ||
export const obey = require('obey') | ||
@@ -10,3 +10,3 @@ /** | ||
*/ | ||
export const model = {}; | ||
export const model = {} | ||
@@ -17,3 +17,3 @@ /** | ||
*/ | ||
model.store = {}; | ||
model.store = {} | ||
@@ -27,3 +27,3 @@ /** | ||
if (!m.name || !m.version || !m.schema) { | ||
throw new Error('Model must contain a name, version and schema'); | ||
throw new Error('Model must contain a name, version and schema') | ||
} | ||
@@ -33,14 +33,19 @@ // Check if model exists | ||
// Create new store entry | ||
model.store[m.name] = {}; | ||
model.store[m.name] = {} | ||
} | ||
// Build model object | ||
let modelObj = {}; | ||
let modelObj = {} | ||
Object.keys(m).forEach((prop) => { | ||
if (prop !== 'version' && prop !== 'name') { | ||
modelObj[prop] = m[prop]; | ||
if (prop === 'schema' && typeof m.schema.validate !== 'function') { | ||
// Build model | ||
modelObj.schema = obey.model(m.schema) | ||
} else { | ||
modelObj[prop] = m[prop] | ||
} | ||
} | ||
}); | ||
}) | ||
// Append to existing store entry with version and schema | ||
model.store[m.name][m.version] = modelObj; | ||
}; | ||
model.store[m.name][m.version] = modelObj | ||
} | ||
@@ -55,3 +60,3 @@ /** | ||
if (!model.store[m]) { | ||
throw new Error('Model not defined'); | ||
throw new Error('Model not defined') | ||
} | ||
@@ -62,28 +67,24 @@ // Get model object | ||
schemas: model.store[m], | ||
validate: function (data, version) { | ||
const v = version || this.defaultVersion; | ||
validate: function(data, version) { | ||
const v = version || this.defaultVersion | ||
// Return validation | ||
return Joi.validate(data, Joi.object().keys(this.schemas[v].schema), (err) => { | ||
if (err) { | ||
return model.formatValidationError(err); | ||
} | ||
return null; | ||
}); | ||
return this.schemas[v].schema.validate(data) | ||
.catch(err => model.formatValidationError(err.collection)) | ||
}, | ||
sanitize: function (data, version) { | ||
const v = version || this.defaultVersion; | ||
sanitize: function(data, version) { | ||
const v = version || this.defaultVersion | ||
const itt = (schemaNode, dataNode) => { | ||
for (let prop in dataNode) { | ||
if (schemaNode[prop] && ({}).toString.call(dataNode[prop]).match(/\s([a-zA-Z]+)/)[1].toLowerCase() === 'object') { | ||
itt(schemaNode[prop], dataNode[prop]); | ||
if (schemaNode[prop] && {}.toString.call(dataNode[prop]).match(/\s([a-zA-Z]+)/)[1].toLowerCase() === 'object') { | ||
itt(schemaNode[prop].keys, dataNode[prop]) | ||
} else if (!schemaNode[prop]) { | ||
delete dataNode[prop]; | ||
delete dataNode[prop] | ||
} | ||
} | ||
return dataNode; | ||
}; | ||
return itt(this.schemas[v].schema, data); | ||
return dataNode | ||
} | ||
return itt(this.schemas[v].schema.def.keys, data) | ||
} | ||
}; | ||
}; | ||
} | ||
} | ||
@@ -99,6 +100,6 @@ /** | ||
// A custom formatter is defined | ||
return model.customValidationError(err); | ||
throw model.customValidationError(err) | ||
} | ||
return err; | ||
}; | ||
throw err | ||
} | ||
@@ -109,2 +110,2 @@ /** | ||
*/ | ||
model.customValidationError = false; | ||
model.customValidationError = false |
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
102767
25
1034
0
15
+ Addedobey@^0.9.0
+ Addedbluebird@3.7.2(transitive)
+ Addedlodash@4.17.21(transitive)
+ Addedobey@0.9.1(transitive)
- Removedjoi@^6.6.1
- Removedhoek@2.16.3(transitive)
- Removedisemail@1.2.0(transitive)
- Removedjoi@6.10.1(transitive)
- Removedmoment@2.30.1(transitive)
- Removedtopo@1.1.0(transitive)