All Projects → zkat → figgy-pudding

zkat / figgy-pudding

Licence: other
Cascading, controlled-visibility options object management.

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to figgy-pudding

jekyll-deploy-action
🪂 A Github Action to deploy the Jekyll site conveniently for GitHub Pages.
Stars: ✭ 162 (+337.84%)
Mutual labels:  configuration
killer-storybook-config
A killer Storybook Webpack config to help you bootstrap a great storybook config ASAP. It includes a React Frontend, GraphQL compatibility for Storybook, TypeScript, Babel, and ESlint.
Stars: ✭ 32 (-13.51%)
Mutual labels:  configuration
colt
A configuration utility for Python objects inspired by AllenNLP.
Stars: ✭ 17 (-54.05%)
Mutual labels:  configuration
MEMCM-OSD-Scripts
OSD Scripts
Stars: ✭ 34 (-8.11%)
Mutual labels:  configuration
sccm
Microsoft System Center Configuration Manager
Stars: ✭ 21 (-43.24%)
Mutual labels:  configuration
easy-props
The simple, stupid properties library for Java
Stars: ✭ 76 (+105.41%)
Mutual labels:  configuration
Flutter-Global-Config
A flutter package for managing different configurations and making them available everythere inside the app.
Stars: ✭ 88 (+137.84%)
Mutual labels:  configuration
eRCaGuy dotfiles
.bashrc file, terminal prompt that shows current git branch, Arduino setup, Eclipse setup, git diff with line numbers, helpful scripts, improved Linux productivity, etc.
Stars: ✭ 84 (+127.03%)
Mutual labels:  configuration
gconfigs
gConfigs - Config and Secret parser
Stars: ✭ 42 (+13.51%)
Mutual labels:  configuration
org-starter
Configure files and directories in Org mode more easily
Stars: ✭ 73 (+97.3%)
Mutual labels:  configuration
puppet-augeasproviders
Alternative Augeas-based providers for Puppet
Stars: ✭ 64 (+72.97%)
Mutual labels:  configuration
flagga
An extensible Go library for handling program configuration using flags.
Stars: ✭ 28 (-24.32%)
Mutual labels:  configuration
road-to-orleans
This repository illustrates the road to orleans with practical, real-life examples. From most basic, to more advanced techniques.
Stars: ✭ 55 (+48.65%)
Mutual labels:  configuration
config
Configure your application in PHP, with PSR-11 implementation
Stars: ✭ 19 (-48.65%)
Mutual labels:  configuration
php-cs-fixer-config
📓 Provides a configuration factory and multiple rule sets for friendsofphp/php-cs-fixer.
Stars: ✭ 29 (-21.62%)
Mutual labels:  configuration
giulius
Tools for loading file-based configuration files and mapping them with Guice's ``@Named`` and more
Stars: ✭ 18 (-51.35%)
Mutual labels:  configuration
env
A lightweight package for loading OS environment variables into structs for Go projects
Stars: ✭ 24 (-35.14%)
Mutual labels:  configuration
envkey-ruby
EnvKey's official Ruby client library
Stars: ✭ 24 (-35.14%)
Mutual labels:  configuration
atata-configuration-json
JSON configuration of Atata
Stars: ✭ 13 (-64.86%)
Mutual labels:  configuration
ZConfer
The ultimate ZSH configuration utility.
Stars: ✭ 26 (-29.73%)
Mutual labels:  configuration

figgy-pudding npm version license Travis AppVeyor Coverage Status

figgy-pudding is a small JavaScript library for managing and composing cascading options objects -- hiding what needs to be hidden from each layer, without having to do a lot of manual munging and passing of options.

The God Object is Dead!

Now Bring Us Some Figgy Pudding!

Install

$ npm install figgy-pudding

Table of Contents

Example

// print-package.js
const fetch = require('./fetch.js')
const puddin = require('figgy-pudding')

const PrintOpts = puddin({
  json: { default: false }
})

async function printPkg (name, opts) {
  // Expected pattern is to call this in every interface function. If `opts` is
  // not passed in, it will automatically create an (empty) object for it.
  opts = PrintOpts(opts)
  const uri = `https://registry.npmjs.com/${name}`
  const res = await fetch(uri, opts.concat({
    // Add or override any passed-in configs and pass them down.
    log: customLogger
  }))
  // The following would throw an error, because it's not in PrintOpts:
  // console.log(opts.log)
  if (opts.json) {
    return res.json()
  } else {
    return res.text()
  }
}

console.log(await printPkg('figgy', {
  // Pass in *all* configs at the toplevel, as a regular object.
  json: true,
  cache: './tmp-cache'
}))
// fetch.js
const puddin = require('figgy-pudding')

const FetchOpts = puddin({
  log: { default: require('npmlog') },
  cache: {}
})

module.exports = async function (..., opts) {
  opts = FetchOpts(opts)
}

Features

  • hide options from layer that didn't ask for it
  • shared multi-layer options
  • make sure opts argument is available
  • transparent key access like normal keys, through a Proxy. No need for.get()!
  • default values
  • key aliases
  • arbitrary key filter functions
  • key/value iteration
  • serialization
  • 100% test coverage using tap --100

API

> figgyPudding({ key: { default: val } | String }, [opts]) -> PuddingFactory

Defines an Options constructor that can be used to collect only the needed options.

An optional default property for specs can be used to specify default values if nothing was passed in.

If the value for a spec is a string, it will be treated as an alias to that other key.

Example
const MyAppOpts = figgyPudding({
  lg: 'log',
  log: {
    default: () => require('npmlog')
  },
  cache: {}
})

> PuddingFactory(...providers) -> FiggyPudding{}

Instantiates an options object defined by figgyPudding(), which uses providers, in order, to find requested properties.

Each provider can be either a plain object, a Map-like object (that is, one with a .get() method) or another figgyPudding Opts object.

When nesting Opts objects, their properties will not become available to the new object, but any further nested Opts that reference that property will be able to read from their grandparent, as long as they define that key. Default values for nested Opts parents will be used, if found.

Example
const ReqOpts = figgyPudding({
  follow: {}
})

const opts = ReqOpts({
  follow: true,
  log: require('npmlog')
})

opts.follow // => true
opts.log // => Error: ReqOpts does not define `log`

const MoreOpts = figgyPudding({
  log: {}
})
MoreOpts(opts).log // => npmlog object (passed in from original plain obj)
MoreOpts(opts).follow // => Error: MoreOpts does not define `follow`

> opts.get(key) -> Value

Gets a value from the options object.

Example
const opts = MyOpts(config)
opts.get('foo') // value of `foo`
opts.foo // Proxy-based access through `.get()`

> opts.concat(...moreProviders) -> FiggyPudding{}

Creates a new opts object of the same type as opts with additional providers. Providers further to the right shadow providers to the left, with properties in the original opts being shadows by the new providers.

Example
const opts = MyOpts({x: 1})
opts.get('x') // 1
opts.concat({x: 2}).get('x') // 2
opts.get('x') // 1 (original opts object left intact)

> opts.toJSON() -> Value

Converts opts to a plain, JSON-stringifiable JavaScript value. Used internally by JavaScript to get JSON.stringify() working.

Only keys that are readable by the current pudding type will be serialized.

Example
const opts = MyOpts({x: 1})
opts.toJSON() // {x: 1}
JSON.stringify(opts) // '{"x":1}'

> opts.forEach((value, key, opts) => {}, thisArg) -> undefined

Iterates over the values of opts, limited to the keys readable by the current pudding type. thisArg will be used to set the this argument when calling the fn.

Example
const opts = MyOpts({x: 1, y: 2})
opts.forEach((value, key) => console.log(key, '=', value))

> opts.entries() -> Iterator<[[key, value], ...]>

Returns an iterator that iterates over the keys and values in opts, limited to the keys readable by the current pudding type. Each iteration returns an array of [key, value].

Example
const opts = MyOpts({x: 1, y: 2})
[...opts({x: 1, y: 2}).entries()] // [['x', 1], ['y', 2]]

> opts[Symbol.iterator]() -> Iterator<[[key, value], ...]>

Returns an iterator that iterates over the keys and values in opts, limited to the keys readable by the current pudding type. Each iteration returns an array of [key, value]. Makes puddings work natively with JS iteration mechanisms.

Example
const opts = MyOpts({x: 1, y: 2})
[...opts({x: 1, y: 2})] // [['x', 1], ['y', 2]]
for (let [key, value] of opts({x: 1, y: 2})) {
  console.log(key, '=', value)
}

> opts.keys() -> Iterator<[key, ...]>

Returns an iterator that iterates over the keys in opts, limited to the keys readable by the current pudding type.

Example
const opts = MyOpts({x: 1, y: 2})
[...opts({x: 1, y: 2}).keys()] // ['x', 'y']

> opts.values() -> Iterator<[value, ...]>

Returns an iterator that iterates over the values in opts, limited to the keys readable by the current pudding type.

Example

'

const opts = MyOpts({x: 1, y: 2})
[...opts({x: 1, y: 2}).values()] // [1, 2]
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].