Skip to content

Commit

Permalink
Merge major with latest changes (#80)
Browse files Browse the repository at this point in the history
  • Loading branch information
daffl committed Aug 19, 2018
1 parent 29f83d1 commit ddbb995
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 166 deletions.
3 changes: 3 additions & 0 deletions packages/commons/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,6 @@ node_modules

# Users Environment Variables
.lock-wscript

# IDEs
.idea
63 changes: 24 additions & 39 deletions packages/commons/lib/arguments.js
Original file line number Diff line number Diff line change
@@ -1,56 +1,41 @@
const paramCounts = {
find: 1,
get: 2,
create: 2,
update: 3,
patch: 3,
remove: 2
};

function isObjectOrArray (value) {
return typeof value === 'object' && value !== null;
}

exports.validateArguments = function validateArguments (method, args) {
exports.validateArguments = function validateArguments (argsOrders, method, args) {
// Check if the last argument is a callback which are no longer supported
if (typeof args[args.length - 1] === 'function') {
throw new Error('Callbacks are no longer supported. Use Promises or async/await instead.');
}

const methodParamCount = paramCounts[method];
const methodArgs = argsOrders[method] || ['params'];
const methodParamCount = methodArgs.length;

// Check the number of arguments and throw an error if too many are provided
if (methodParamCount && args.length > methodParamCount) {
throw new Error(`Too many arguments for '${method}' method`);
}

// `params` is always the last argument
const params = args[methodParamCount - 1];

// Check if `params` is an object (can be undefined though)
if (params !== undefined && !isObjectOrArray(params)) {
throw new Error(`Params for '${method}' method must be an object`);
}

// Validate other arguments for each method
switch (method) {
case 'create':
if (!isObjectOrArray(args[0])) {
throw new Error(`A data object must be provided to the 'create' method`);
}
break;
case 'get':
case 'remove':
case 'update':
case 'patch':
if (args[0] === undefined) {
throw new Error(`An id must be provided to the '${method}' method`);
}

if ((method === 'update' || method === 'patch') && !isObjectOrArray(args[1])) {
throw new Error(`A data object must be provided to the '${method}' method`);
}
}

return true;
return methodArgs.every((argName, index) => {
switch (argName) {
case 'id':
if (args[index] === undefined) {
throw new Error(`An id must be provided to the '${method}' method`);
}
break;
case 'data':
if (!isObjectOrArray(args[index])) {
throw new Error(`A data object must be provided to the '${method}' method`);
}
break;
case 'params':
if (args[index] !== undefined && !isObjectOrArray(args[index])) {
throw new Error(`Params for '${method}' method must be an object`);
}
break;
}

return true;
});
};
27 changes: 2 additions & 25 deletions packages/commons/lib/hooks.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,8 @@ const SKIP = exports.SKIP = typeof Symbol !== 'undefined'
? Symbol('__feathersSkipHooks')
: '__feathersSkipHooks';

const convertGetOrRemove = ([ id, params = {} ]) => ({ id, params });
const convertUpdateOrPatch = ([ id, data, params = {} ]) => ({ id, data, params });

// Converters from service method arguments to hook object properties
exports.converters = {
find (args) {
const [ params = {} ] = args;

return { params };
},
create (args) {
const [ data, params = {} ] = args;

return { data, params };
},
get: convertGetOrRemove,
remove: convertGetOrRemove,
update: convertUpdateOrPatch,
patch: convertUpdateOrPatch
};

// Create a hook object for a method with arguments `args`
// `data` is additional data that will be added
exports.createHookObject = function createHookObject (method, args, data = {}) {
const hook = exports.converters[method](args);
exports.createHookObject = function createHookObject (method, data = {}) {
const hook = {};

Object.defineProperty(hook, 'toJSON', {
value () {
Expand Down
48 changes: 12 additions & 36 deletions packages/commons/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 26 additions & 17 deletions packages/commons/test/arguments.test.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
const { expect } = require('chai');
const { validateArguments } = require('../lib/arguments');

const argumentsOrders = {
find: [ 'params' ],
get: [ 'id', 'params' ],
create: [ 'data', 'params' ],
update: [ 'id', 'data', 'params' ],
patch: [ 'id', 'data', 'params' ],
remove: [ 'id', 'params' ]
};

describe('.validateArguments', () => {
it('throws an error for callbacks', () => {
try {
validateArguments('find', [{}, function () {}]);
validateArguments(argumentsOrders, 'find', [{}, function () {}]);
throw new Error('Should never get here');
} catch (e) {
expect(e.message).to.equal('Callbacks are no longer supported. Use Promises or async/await instead.');
Expand All @@ -14,7 +23,7 @@ describe('.validateArguments', () => {
it('errors with invalid parameter count', () => {
const check = (method, args) => {
try {
validateArguments(method, args);
validateArguments(argumentsOrders, method, args);
throw new Error('Should never get here');
} catch (e) {
expect(e.message).to.equal(`Too many arguments for '${method}' method`);
Expand All @@ -32,7 +41,7 @@ describe('.validateArguments', () => {
it('errors if params is not an object', () => {
const check = (method, args) => {
try {
validateArguments(method, args);
validateArguments(argumentsOrders, method, args);
throw new Error('Should never get here');
} catch (e) {
expect(e.message).to.equal(`Params for '${method}' method must be an object`);
Expand All @@ -50,15 +59,15 @@ describe('.validateArguments', () => {
it('throws method specific errors', () => {
const checkId = (method, args) => {
try {
validateArguments(method, args);
validateArguments(argumentsOrders, method, args);
throw new Error('Should never get here');
} catch (e) {
expect(e.message).to.equal(`An id must be provided to the '${method}' method`);
}
};
const checkData = (method, args) => {
try {
validateArguments(method, args);
validateArguments(argumentsOrders, method, args);
throw new Error('Should never get here');
} catch (e) {
expect(e.message).to.equal(`A data object must be provided to the '${method}' method`);
Expand All @@ -76,34 +85,34 @@ describe('.validateArguments', () => {
});

it('passes for valid arguments', () => {
let result = validateArguments('find', [ {} ]);
let result = validateArguments(argumentsOrders, 'find', [ {} ]);
expect(result).to.equal(true);
result = validateArguments('find', []);
result = validateArguments(argumentsOrders, 'find', []);
expect(result).to.equal(true);

result = validateArguments('get', [ 1, {} ]);
result = validateArguments(argumentsOrders, 'get', [ 1, {} ]);
expect(result).to.equal(true);
result = validateArguments('get', [ 1 ]);
result = validateArguments(argumentsOrders, 'get', [ 1 ]);
expect(result).to.equal(true);

result = validateArguments('create', [ {}, {} ]);
result = validateArguments(argumentsOrders, 'create', [ {}, {} ]);
expect(result).to.equal(true);
result = validateArguments('create', [ {} ]);
result = validateArguments(argumentsOrders, 'create', [ {} ]);
expect(result).to.equal(true);

result = validateArguments('update', [ 1, {}, {} ]);
result = validateArguments(argumentsOrders, 'update', [ 1, {}, {} ]);
expect(result).to.equal(true);
result = validateArguments('update', [ 1, {} ]);
result = validateArguments(argumentsOrders, 'update', [ 1, {} ]);
expect(result).to.equal(true);

result = validateArguments('patch', [ 1, {}, {} ]);
result = validateArguments(argumentsOrders, 'patch', [ 1, {}, {} ]);
expect(result).to.equal(true);
result = validateArguments('patch', [ 1, {} ]);
result = validateArguments(argumentsOrders, 'patch', [ 1, {} ]);
expect(result).to.equal(true);

result = validateArguments('remove', [ 1, {} ]);
result = validateArguments(argumentsOrders, 'remove', [ 1, {} ]);
expect(result).to.equal(true);
result = validateArguments('remove', [ 1 ]);
result = validateArguments(argumentsOrders, 'remove', [ 1 ]);
expect(result).to.equal(true);
});
});
Loading

0 comments on commit ddbb995

Please sign in to comment.