aboutsummaryrefslogtreecommitdiff
path: root/node_modules/option-chain/index.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-28 00:38:50 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-28 00:40:43 +0200
commit7fff4499fd915bcea3fa93b1aa8b35f4fe7a6027 (patch)
tree6de9a1aebd150a23b7f8c273ec657a5d0a18fe3e /node_modules/option-chain/index.js
parent963b7a41feb29cc4be090a2446bdfe0c1f1bcd81 (diff)
add linting (and some initial fixes)
Diffstat (limited to 'node_modules/option-chain/index.js')
-rw-r--r--node_modules/option-chain/index.js54
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);
+};