Skip to content

Commit

Permalink
docs(readme): update background section
Browse files Browse the repository at this point in the history
  • Loading branch information
tunnckoCore committed Feb 8, 2017
1 parent 4006de4 commit 882dd95
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 78 deletions.
31 changes: 12 additions & 19 deletions .verb.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

> {%= description %}
[![code climate][codeclimate-img]][codeclimate-url]
[![standard code style][standard-img]][standard-url]
[![linux build status][travis-img]][travis-url]
[![windows build status][appveyor-img]][appveyor-url]
[![coverage status][coveralls-img]][coveralls-url]
[![code climate][codeclimate-img]][codeclimate-url]
[![standard code style][standard-img]][standard-url]
[![linux build status][travis-img]][travis-url]
[![windows build status][appveyor-img]][appveyor-url]
[![coverage status][coveralls-img]][coveralls-url]
[![dependency status][david-img]][david-url]

{%= include('highlight') %}
Expand Down Expand Up @@ -99,41 +99,34 @@ Let's take this example

And so on, and so on... infinite nesting. That's just freaking crazy, right?

That's all about wat this package does - you give it an array and it does such thing - in case with Browserify if they use this package they should pass `browserify.transform` as first argument.
That's all about what this package does - you give it an array and it does such thing - in case with Browserify if they use this package they should pass `browserify.transform` as first argument.

It's so customizable that it match to all their needs - both for Babel plugins/presets/transforms and Browserify transforms. The [browserify][] transforms are a bit different by all others. They accept `filename, options` signature. And so, because they don't accept `options` as first argument, like Babel's transforms or like Rollup's plugins, we need a bit configuration to make things work for Browserify.

That's why this package has `opts` object.
That's why this package has `opts` object through which you can pass `opts.first` to set first argument for the plugin/transform function. Another thing that you can do is to pass `opts.args` if you want more control over the passed arguments to the plugin/transform function.

***

TBC

***

### Resolution

_**to be udpated**_

***
How we resolve plugins? Resolving algorithm has 4 steps. You should know that in the following paragraphs `item` means each element in the passed array to `resolvePluginsSync()`.

**1)** If item is `string`, it tries to require it from
locally installed dependencies, calls it and you can pass
a `opts.prefix` which will be prepended to the item string.
Think for it like `rollup-plugin-`, `babel-plugin-`, `gulp-`
and etc. You may want to see below comments for the `resolveFromString`.
and etc. You may want to see the comments for `resolveFromString` inside the source code.

**2)** If item is `function`, it will call it and if you
want to pass arguments to it you can pass `opts.args` array
or `opts.first`. If `opts.args` is passed it calls the
or `opts.first`. If `opts.args` is passed it calls that
item function with `.apply`. If `opts.first` is passed
it will pass it as first argument to that function.

**3)** If item is `object`, nothing happens, it just returns it
in the `result` array.

**4)** If item is `array`, then there are few possible
scenarios (see comments for `resolveFromArray`):
scenarios (see comments for `resolveFromArray` inside the source code):
- if 1st argument is string - see 1
- if 1st argument is function - see 2
- if 2nd argument is object it will be passed to
Expand Down Expand Up @@ -210,4 +203,4 @@ _Project scaffolded using [charlike][] cli._
[david-img]: https://img.shields.io/david/{%= repository %}.svg

[standard-url]: https://github.com/feross/standard
[standard-img]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg
[standard-img]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg
67 changes: 13 additions & 54 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

> Synchronously resolve plugins / transforms / presets just like Babel and Browserify does it, using CommonJS `require` builtin. For example, useful for loading complex configs from `package.json` file.
[![code climate][codeclimate-img]][codeclimate-url]
[![standard code style][standard-img]][standard-url]
[![linux build status][travis-img]][travis-url]
[![windows build status][appveyor-img]][appveyor-url]
[![coverage status][coveralls-img]][coveralls-url]
[![code climate][codeclimate-img]][codeclimate-url]
[![standard code style][standard-img]][standard-url]
[![linux build status][travis-img]][travis-url]
[![windows build status][appveyor-img]][appveyor-url]
[![coverage status][coveralls-img]][coveralls-url]
[![dependency status][david-img]][david-url]

You might also be interested in [always-done](https://github.com/hybridables/always-done#readme).
Expand All @@ -18,7 +18,6 @@ You might also be interested in [always-done](https://github.com/hybridables/alw
* [What and Why?](#what-and-why)
* [Resolution](#resolution)
- [API](#api)
* [resolvePluginsSync](#resolvepluginssync)
- [Related](#related)
- [Contributing](#contributing)
- [Building docs](#building-docs)
Expand Down Expand Up @@ -113,80 +112,40 @@ Let's take this example

And so on, and so on... infinite nesting. That's just freaking crazy, right?

That's all about wat this package does - you give it an array and it does such thing - in case with Browserify if they use this package they should pass `browserify.transform` as first argument.
That's all about what this package does - you give it an array and it does such thing - in case with Browserify if they use this package they should pass `browserify.transform` as first argument.

It's so customizable that it match to all their needs - both for Babel plugins/presets/transforms and Browserify transforms. The [browserify][] transforms are a bit different by all others. They accept `filename, options` signature. And so, because they don't accept `options` as first argument, like Babel's transforms or like Rollup's plugins, we need a bit configuration to make things work for Browserify.

That's why this package has `opts` object.

***

TBC

***
That's why this package has `opts` object through which you can pass `opts.first` to set first argument for the plugin/transform function. Another thing that you can do is to pass `opts.args` if you want more control over the passed arguments to the plugin/transform function.

### Resolution

_**to be udpated**_

***
How we resolve plugins? Resolving algorithm has 4 steps. You should know that in the following paragraphs `item` means each element in the passed array to `resolvePluginsSync()`.

**1)** If item is `string`, it tries to require it from
locally installed dependencies, calls it and you can pass
a `opts.prefix` which will be prepended to the item string.
Think for it like `rollup-plugin-`, `babel-plugin-`, `gulp-`
and etc. You may want to see below comments for the `resolveFromString`.
and etc. You may want to see the comments for `resolveFromString` inside the source code.

**2)** If item is `function`, it will call it and if you
want to pass arguments to it you can pass `opts.args` array
or `opts.first`. If `opts.args` is passed it calls the
or `opts.first`. If `opts.args` is passed it calls that
item function with `.apply`. If `opts.first` is passed
it will pass it as first argument to that function.

**3)** If item is `object`, nothing happens, it just returns it
in the `result` array.

**4)** If item is `array`, then there are few possible
scenarios (see comments for `resolveFromArray`):
scenarios (see comments for `resolveFromArray` inside the source code):
- if 1st argument is string - see 1
- if 1st argument is function - see 2
- if 2nd argument is object it will be passed to
that resolve function from 1st argument

## API

### [resolvePluginsSync](index.js#L60)
> Babel/Browserify-style resolve of a `plugins` array and optional `opts` options object, where each "plugin" (item in the array) can be 1) string, 2) function, 3) object or 4) array. Useful for loading complex and meaningful configs like exactly all of them - Babel, ESLint, Browserify. It would be great if they use that package one day :) The [rolldown][] bundler already using it as default resolution for resolving [rollup][] plugins. :)
**Params**

* `plugins` **{Array|String}**: array of "plugins/transforms/presets" or single string, which is arrayified so returned `result` is always an array
* `opts` **{Object}**: optional custom configuration
* `opts.prefix` **{String}**: useful like `babel-plugin-` or `rollup-plugin-`
* `opts.context` **{Any}**: custom context to be passed to plugin function, using the `.apply` method
* `opts.first` **{Any}**: pass first argument for plugin function, if it is given, then it will pass plugin options as 2nd argument, that's useful for browserify-like transforms where first argument is `filename`, second is transform `options`
* `opts.args` **{Array}**: pass custom arguments to the resolved plugin function, if given - respected more than `opts.first`
* `returns` **{Array}** `result`: resolved plugins, always an array

**Example**

```js
const resolve = require('resolve-plugins-sync')

// fake
const baz = require('tool-plugin-baz')
const qux = require('tool-plugin-qux')

resolve([
'foo',
['bar', { some: 'options here' }],
[baz, { a: 'b' }],
qux
], {
prefix: 'tool-plugin-'
})
```

## Related
- [always-done](https://www.npmjs.com/package/always-done): Handle completion and errors with elegance! Support for streams, callbacks, promises, child processes, async/await and sync functions. A drop-in replacement… [more](https://github.com/hybridables/always-done#readme) | [homepage](https://github.com/hybridables/always-done#readme "Handle completion and errors with elegance! Support for streams, callbacks, promises, child processes, async/await and sync functions. A drop-in replacement for [async-done][] - pass 100% of its tests plus more")
- [minibase](https://www.npmjs.com/package/minibase): Minimalist alternative for Base. Build complex APIs with small units called plugins. Works well with most of the already existing… [more](https://github.com/node-minibase/minibase#readme) | [homepage](https://github.com/node-minibase/minibase#readme "Minimalist alternative for Base. Build complex APIs with small units called plugins. Works well with most of the already existing [base][] plugins.")
Expand Down Expand Up @@ -226,15 +185,15 @@ $ npm install && npm test
**Charlike Mike Reagent**

+ [github/tunnckoCore](https://github.com/tunnckoCore)
+ [twitter/tunnckoCore](http://twitter.com/tunnckoCore)
+ [twitter/tunnckoCore](https://twitter.com/tunnckoCore)
+ [codementor/tunnckoCore](https://codementor.io/tunnckoCore)

## License
Copyright © 2016-2017, [Charlike Mike Reagent](http://i.am.charlike.online). Released under the [MIT license](LICENSE).

***

_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.2.3, on January 04, 2017._
_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.4.1, on February 08, 2017._
_Project scaffolded using [charlike][] cli._

[always-done]: https://github.com/hybridables/always-done
Expand Down
10 changes: 5 additions & 5 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ const extend = require('extend-shallow')
* ```
*
* @name resolvePluginsSync
* @param {Array|String} `plugins` array of "plugins/transforms/presets" or single string,
* @param {Array|String} [plugins] array of "plugins/transforms/presets" or single string,
* which is arrayified so returned `result`
* is always an array
* @param {Object} `opts` optional custom configuration
* @param {Object} opts optional custom configuration
* @param {String} `opts.prefix` useful like `babel-plugin-` or `rollup-plugin-`
* @param {Any} `opts.context` custom context to be passed to plugin function,
* using the `.apply` method
Expand All @@ -54,7 +54,7 @@ const extend = require('extend-shallow')
* @param {Array} `opts.args` pass custom arguments to the resolved plugin function,
* if given - respected more than `opts.first`
* @return {Array} `result` resolved plugins, always an array
* @api public
* @public
*/

const resolvePluginsSync = (plugins, opts) => {
Expand Down Expand Up @@ -98,12 +98,12 @@ const resolvePluginsSync = (plugins, opts) => {
/**
* > Make an array from any value.
*
* @param {Any} `val`
* @param {Any} `val` some long description
* @return {Array}
* @api private
*/

const arrayify = (val) => {
let arrayify = (val) => {
if (!val) return []
if (Array.isArray(val)) return val
return [val]
Expand Down
7 changes: 7 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,5 +86,12 @@
"engines": {
"node": ">=4",
"npm": ">=2"
},
"eslintConfig": {
"extends": "standard",
"rules": {
"semi": [2, "never"],
"no-extra-semi": 2
}
}
}
7 changes: 7 additions & 0 deletions x.eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"extends": "standard",
"rules": {
"semi": [2, "never"],
"no-extra-semi": 2
}
}

0 comments on commit 882dd95

Please sign in to comment.