diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-05-28 00:38:50 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-05-28 00:40:43 +0200 |
commit | 7fff4499fd915bcea3fa93b1aa8b35f4fe7a6027 (patch) | |
tree | 6de9a1aebd150a23b7f8c273ec657a5d0a18fe3e /node_modules/option-chain/index.js | |
parent | 963b7a41feb29cc4be090a2446bdfe0c1f1bcd81 (diff) |
add linting (and some initial fixes)
Diffstat (limited to 'node_modules/option-chain/index.js')
-rw-r--r-- | node_modules/option-chain/index.js | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/node_modules/option-chain/index.js b/node_modules/option-chain/index.js new file mode 100644 index 000000000..cf0d484b4 --- /dev/null +++ b/node_modules/option-chain/index.js @@ -0,0 +1,54 @@ +'use strict'; +var objectAssign = require('object-assign'); + +module.exports = function (options, fn, target) { + var chainables = options.chainableMethods || {}; + var spread = options.spread; + var defaults = objectAssign({}, options.defaults); + + function extend(target, getter, ctx) { + Object.keys(chainables).forEach(function (key) { + Object.defineProperty(target, key, { + enumerable: true, + configurable: true, + get: function () { + return wrap(getter, chainables[key], ctx || this); + } + }); + }); + } + + function wrap(createOpts, extensionOpts, ctx) { + function wrappedOpts() { + return objectAssign(createOpts(), extensionOpts); + } + + function wrappedFn() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + if (spread) { + args.unshift(wrappedOpts()); + } else { + args = [wrappedOpts(), args]; + } + return fn.apply(ctx || this, args); + } + + extend(wrappedFn, wrappedOpts, ctx); + + return wrappedFn; + } + + function copyDefaults() { + return objectAssign({}, defaults); + } + + if (target) { + extend(target, copyDefaults); + return target; + } + + return wrap(copyDefaults); +}; |