v0.6.1 dev branch (#61)
* Always invoke deserialize in compose command
* More validation of composition object
diff --git a/bin/compose b/bin/compose
index b2b5246..8c297e8 100755
--- a/bin/compose
+++ b/bin/compose
@@ -47,8 +47,7 @@
const filename = argv._[0]
let composition
try {
- composition = require(path.resolve(filename))
- if (filename.slice(filename.lastIndexOf('.')) === '.json') composition = util.deserialize(composition)
+ composition = util.deserialize(require(path.resolve(filename)))
if (typeof argv.lower === 'string') composition = util.lower(composition, argv.lower || [])
} catch (error) {
console.error('Bad composition')
diff --git a/composer.js b/composer.js
index 2dcdca3..de97ca6 100644
--- a/composer.js
+++ b/composer.js
@@ -347,6 +347,12 @@
// construct a composition object with the specified fields
constructor(composition) {
+ if (!isObject(composition) || composer.util.combinators[composition.type] === undefined) throw new ComposerError('Invalid argument', composition)
+ const combinator = composer.util.combinators[composition.type]
+ if (combinator.components && composition.components === undefined)throw new ComposerError('Invalid argument', composition)
+ for (let arg of combinator.args || []) {
+ if (!arg.optional && composition[arg._] === undefined) throw new ComposerError('Invalid argument', composition)
+ }
return Object.assign(this, composition)
}
@@ -371,7 +377,7 @@
const combinator = combinators[type]
// do not overwrite existing combinators
composer[type] = composer[type] || function () {
- const composition = new Composition({ type })
+ const composition = { type }
const skip = combinator.args && combinator.args.length || 0
if (!combinator.components && (arguments.length > skip)) {
throw new ComposerError('Too many arguments')
@@ -398,7 +404,7 @@
if (combinator.components) {
composition.components = Array.prototype.slice.call(arguments, skip).map(obj => composer.task(obj))
}
- return composition
+ return new Composition(composition)
}
}
}