diff options
Diffstat (limited to 'node_modules/option-chain')
-rw-r--r-- | node_modules/option-chain/index.js | 54 | ||||
-rw-r--r-- | node_modules/option-chain/license | 21 | ||||
-rw-r--r-- | node_modules/option-chain/package.json | 38 | ||||
-rw-r--r-- | node_modules/option-chain/readme.md | 129 |
4 files changed, 242 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); +}; diff --git a/node_modules/option-chain/license b/node_modules/option-chain/license new file mode 100644 index 000000000..ad5d021ed --- /dev/null +++ b/node_modules/option-chain/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) James Talmage <james@talmage.io> (github.com/jamestalmage) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/option-chain/package.json b/node_modules/option-chain/package.json new file mode 100644 index 000000000..2c58dd932 --- /dev/null +++ b/node_modules/option-chain/package.json @@ -0,0 +1,38 @@ +{ + "name": "option-chain", + "version": "0.1.1", + "description": "Use fluent property chains in lieu of options objects", + "license": "MIT", + "repository": "jamestalmage/option-chain", + "author": { + "name": "James Talmage", + "email": "james@talmage.io", + "url": "github.com/jamestalmage" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "xo && nyc --cache --reporter=lcov --reporter=text ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "option", + "options", + "chain", + "chains", + "chainable", + "fluent" + ], + "devDependencies": { + "ava": "^0.10.0", + "coveralls": "^2.11.6", + "nyc": "^5.3.0", + "xo": "^0.12.1" + }, + "dependencies": { + "object-assign": "^4.0.1" + } +} diff --git a/node_modules/option-chain/readme.md b/node_modules/option-chain/readme.md new file mode 100644 index 000000000..efa9af4cc --- /dev/null +++ b/node_modules/option-chain/readme.md @@ -0,0 +1,129 @@ +# option-chain [![Build Status](https://travis-ci.org/jamestalmage/option-chain.svg?branch=master)](https://travis-ci.org/jamestalmage/option-chain) [![Coverage Status](https://coveralls.io/repos/jamestalmage/option-chain/badge.svg?branch=master&service=github)](https://coveralls.io/github/jamestalmage/option-chain?branch=master) + +> Use fluent property chains in lieu of options objects. + + +## Install + +``` +$ npm install --save option-chain +``` + + +## Usage + +```js +const optionChain = require('option-chain'); + +const optionDefinition = { + defaults: { + bar: false + }, + chainableMethods: { + foo: {foo: true}, + notFoo: {foo: false}, + bar: {bar: true} + } +}; + +function printOptionsAndArgs(options, args) { + console.log(options); + if (args.length) { + console.log(args); + } +} + +const fn = optionChain(optionDefinition, printOptionsAndArgs); + +fn(); +//=> [{bar: false}] +fn.bar(); +//=> [{bar: true}] +fn.foo.bar(); +//=> [{foo: true, bar: false}] + +fn.foo('a', 'b'); +//=> [{foo: true, bar: false}] +//=> ['a', 'b'] +``` + + +## API + +### optionChain(options, callback, [target]) + +#### options + +##### chainableMethods + +Type: `Object` +*Required* + +A map of chainable property names to the options set by adding property to the chain. + +Given the following: + +```js +const chainableMethods = { + foo: {foo: true}, + notFoo: {foo: false}, + bar: {bar: true}, + both: {foo: true, bar: true} +} +``` + +Then: + +- `fn.foo` would set `foo` to `true`. +- `fn.bar` would set `bar` to `true`. +- `fn.both` sets both `foo` and `bar` to `true`. +- The last property in the chain takes precedence, so `fn.foo.notFoo` would result in `foo` being `false`. + + +##### defaults + +Type: `Object` +Default: `{}` + +A set of default starting properties. + +##### spread + +Type: `boolean` +Default: `false` + +By default, any arguments passed to the wrapper are passed as an array to the second argument of the wrapped function. When this is `true`, additional arguments will be spread out as additional arguments: + +```js +function withoutSpread(opts, args) { + let foo = args[0]; + let bar = args[1]; + // ... +} + +function withSpread(opts, foo, bar) { + // ... +} +``` + +#### callback + +Type: `function` + +This callback is called with the accumulated options as the first argument. Depending on the value of `options.spread`, arguments passed to the wrapper will either be an array as the second argument or spread out as the 2nd, 3rd, 4th... arguments. + +#### target + +If supplied, the `target` object is extended with the property getters and returned. Otherwise a wrapper function is created for `options.defaults`, then that wrapper is extended and returned. + +*Hint:* If you want to extend a `target` and add a method that simply uses the defaults, add a chainable method definition with an empty spec: + +```js +const chainableMethods = { + defaultMethodName: {} +} +``` + +## License + +MIT © [James Talmage](http://github.com/jamestalmage) |