Added Gulp.js for compiling SCSS stylesheets
This commit is contained in:
21
node_modules/snapdragon/LICENSE
generated
vendored
Normal file
21
node_modules/snapdragon/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015-2016, Jon Schlinkert.
|
||||
|
||||
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.
|
321
node_modules/snapdragon/README.md
generated
vendored
Normal file
321
node_modules/snapdragon/README.md
generated
vendored
Normal file
@ -0,0 +1,321 @@
|
||||
# snapdragon [](https://www.npmjs.com/package/snapdragon) [](https://npmjs.org/package/snapdragon) [](https://travis-ci.org/jonschlinkert/snapdragon)
|
||||
|
||||
> Fast, pluggable and easy-to-use parser-renderer factory.
|
||||
|
||||
## Install
|
||||
|
||||
Install with [npm](https://www.npmjs.com/):
|
||||
|
||||
```sh
|
||||
$ npm install --save snapdragon
|
||||
```
|
||||
|
||||
Created by [jonschlinkert](https://github.com/jonschlinkert) and [doowb](https://github.com/doowb).
|
||||
|
||||
**Features**
|
||||
|
||||
* Bootstrap your own parser, get sourcemap support for free
|
||||
* All parsing and compiling is handled by simple, reusable middleware functions
|
||||
* Inspired by the parsers in [pug](http://jade-lang.com) and [css](https://github.com/reworkcss/css).
|
||||
|
||||
## History
|
||||
|
||||
### v0.5.0
|
||||
|
||||
**Breaking changes**
|
||||
|
||||
Substantial breaking changes were made in v0.5.0! Most of these changes are part of a larger refactor that will be finished in 0.6.0, including the introduction of a `Lexer` class.
|
||||
|
||||
* Renderer was renamed to `Compiler`
|
||||
* the `.render` method was renamed to `.compile`
|
||||
* Many other smaller changes. A more detailed overview will be provided in 0.6.0. If you don't have to time review code, I recommend you wait for the 0.6.0 release.
|
||||
|
||||
## Usage examples
|
||||
|
||||
```js
|
||||
var Snapdragon = require('snapdragon');
|
||||
var snapdragon = new Snapdragon();
|
||||
```
|
||||
|
||||
**Parse**
|
||||
|
||||
```js
|
||||
var ast = snapdragon.parser('some string', options)
|
||||
// parser middleware that can be called by other middleware
|
||||
.set('foo', function () {})
|
||||
// parser middleware, runs immediately in the order defined
|
||||
.use(bar())
|
||||
.use(baz())
|
||||
```
|
||||
|
||||
**Render**
|
||||
|
||||
```js
|
||||
// pass the `ast` from the parse method
|
||||
var res = snapdragon.compiler(ast)
|
||||
// compiler middleware, called when the name of the middleware
|
||||
// matches the `node.type` (defined in a parser middleware)
|
||||
.set('bar', function () {})
|
||||
.set('baz', function () {})
|
||||
.compile()
|
||||
```
|
||||
|
||||
See the [examples](./examples/).
|
||||
|
||||
## Getting started
|
||||
|
||||
**Parsers**
|
||||
|
||||
Parsers are middleware functions used for parsing a string into an ast node.
|
||||
|
||||
```js
|
||||
var ast = snapdragon.parser(str, options)
|
||||
.use(function() {
|
||||
var pos = this.position();
|
||||
var m = this.match(/^\./);
|
||||
if (!m) return;
|
||||
return pos({
|
||||
// `type` specifies the compiler to use
|
||||
type: 'dot',
|
||||
val: m[0]
|
||||
});
|
||||
})
|
||||
```
|
||||
|
||||
**AST node**
|
||||
|
||||
When the parser finds a match, `pos()` is called, pushing a token for that node onto the ast that looks something like:
|
||||
|
||||
```js
|
||||
{ type: 'dot',
|
||||
val: '.',
|
||||
position:
|
||||
{ start: { lineno: 1, column: 1 },
|
||||
end: { lineno: 1, column: 2 } }}
|
||||
```
|
||||
|
||||
**Renderers**
|
||||
|
||||
Renderers are _named_ middleware functions that visit over an array of ast nodes to compile a string.
|
||||
|
||||
```js
|
||||
var res = snapdragon.compiler(ast)
|
||||
.set('dot', function (node) {
|
||||
console.log(node.val)
|
||||
//=> '.'
|
||||
return this.emit(node.val);
|
||||
})
|
||||
```
|
||||
|
||||
**Source maps**
|
||||
|
||||
If you want source map support, make sure to emit the position as well.
|
||||
|
||||
```js
|
||||
var res = snapdragon.compiler(ast)
|
||||
.set('dot', function (node) {
|
||||
return this.emit(node.val, node.position);
|
||||
})
|
||||
```
|
||||
|
||||
## Docs
|
||||
|
||||
### Parser middleware
|
||||
|
||||
A parser middleware is a function that returns an abject called a `token`. This token is pushed onto the AST as a node.
|
||||
|
||||
**Example token**
|
||||
|
||||
```js
|
||||
{ type: 'dot',
|
||||
val: '.',
|
||||
position:
|
||||
{ start: { lineno: 1, column: 1 },
|
||||
end: { lineno: 1, column: 2 } }}
|
||||
```
|
||||
|
||||
**Example parser middleware**
|
||||
|
||||
Match a single `.` in a string:
|
||||
|
||||
1. Get the starting position by calling `this.position()`
|
||||
2. pass a regex for matching a single dot to the `.match` method
|
||||
3. if **no match** is found, return `undefined`
|
||||
4. if a **match** is found, `pos()` is called, which returns a token with:
|
||||
- `type`: the name of the [compiler] to use
|
||||
- `val`: The actual value captured by the regex. In this case, a `.`. Note that you can capture and return whatever will be needed by the corresponding [compiler].
|
||||
- The ending position: automatically calculated by adding the length of the first capture group to the starting position.
|
||||
|
||||
## Renderer middleware
|
||||
|
||||
Renderers are run when the name of the compiler middleware matches the `type` defined on an ast `node` (which is defined in a parser).
|
||||
|
||||
**Example**
|
||||
|
||||
Exercise: Parse a dot, then compile it as an escaped dot.
|
||||
|
||||
```js
|
||||
var ast = snapdragon.parser('.')
|
||||
.use(function () {
|
||||
var pos = this.position();
|
||||
var m = this.match(/^\./);
|
||||
if (!m) return;
|
||||
return pos({
|
||||
// define the `type` of compiler to use
|
||||
type: 'dot',
|
||||
val: m[0]
|
||||
})
|
||||
})
|
||||
|
||||
var result = snapdragon.compiler(ast)
|
||||
.set('dot', function (node) {
|
||||
return this.emit('\\' + node.val);
|
||||
})
|
||||
.compile()
|
||||
|
||||
console.log(result.output);
|
||||
//=> '\.'
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### [Parser](lib/parser.js#L19)
|
||||
|
||||
Create a new `Parser` with the given `input` and `options`.
|
||||
|
||||
**Params**
|
||||
|
||||
* `input` **{String}**
|
||||
* `options` **{Object}**
|
||||
|
||||
### [.define](lib/parser.js#L103)
|
||||
|
||||
Define a non-enumberable property on the `Parser` instance.
|
||||
|
||||
**Example**
|
||||
|
||||
```js
|
||||
parser.define('foo', 'bar');
|
||||
```
|
||||
|
||||
**Params**
|
||||
|
||||
* `key` **{String}**: propery name
|
||||
* `val` **{any}**: property value
|
||||
* `returns` **{Object}**: Returns the Parser instance for chaining.
|
||||
|
||||
Set parser `name` with the given `fn`
|
||||
|
||||
**Params**
|
||||
|
||||
* `name` **{String}**
|
||||
* `fn` **{Function}**
|
||||
|
||||
Get parser `name`
|
||||
|
||||
**Params**
|
||||
|
||||
* `name` **{String}**
|
||||
|
||||
Push a `token` onto the `type` stack.
|
||||
|
||||
**Params**
|
||||
|
||||
* `type` **{String}**
|
||||
* `returns` **{Object}** `token`
|
||||
|
||||
Pop a token off of the `type` stack
|
||||
|
||||
**Params**
|
||||
|
||||
* `type` **{String}**
|
||||
* `returns` **{Object}**: Returns a token
|
||||
|
||||
Return true if inside a `stack` node. Types are `braces`, `parens` or `brackets`.
|
||||
|
||||
**Params**
|
||||
|
||||
* `type` **{String}**
|
||||
* `returns` **{Boolean}**
|
||||
|
||||
**Example**
|
||||
|
||||
```js
|
||||
parser.isType(node, 'brace');
|
||||
```
|
||||
|
||||
**Params**
|
||||
|
||||
* `node` **{Object}**
|
||||
* `type` **{String}**
|
||||
* `returns` **{Boolean}**
|
||||
|
||||
### [.define](lib/compiler.js#L71)
|
||||
|
||||
Define a non-enumberable property on the `Compiler` instance.
|
||||
|
||||
**Example**
|
||||
|
||||
```js
|
||||
compiler.define('foo', 'bar');
|
||||
```
|
||||
|
||||
**Params**
|
||||
|
||||
* `key` **{String}**: propery name
|
||||
* `val` **{any}**: property value
|
||||
* `returns` **{Object}**: Returns the Compiler instance for chaining.
|
||||
|
||||
## About
|
||||
|
||||
### Related projects
|
||||
|
||||
* [braces](https://www.npmjs.com/package/braces): Fastest brace expansion for node.js, with the most complete support for the Bash 4.3 braces… [more](https://github.com/jonschlinkert/braces) | [homepage](https://github.com/jonschlinkert/braces "Fastest brace expansion for node.js, with the most complete support for the Bash 4.3 braces specification.")
|
||||
* [expand-brackets](https://www.npmjs.com/package/expand-brackets): Expand POSIX bracket expressions (character classes) in glob patterns. | [homepage](https://github.com/jonschlinkert/expand-brackets "Expand POSIX bracket expressions (character classes) in glob patterns.")
|
||||
* [extglob](https://www.npmjs.com/package/extglob): Convert extended globs to regex-compatible strings. Add (almost) the expressive power of regular expressions to… [more](https://github.com/jonschlinkert/extglob) | [homepage](https://github.com/jonschlinkert/extglob "Convert extended globs to regex-compatible strings. Add (almost) the expressive power of regular expressions to glob patterns.")
|
||||
* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.")
|
||||
|
||||
### Contributing
|
||||
|
||||
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
|
||||
|
||||
### Contributors
|
||||
|
||||
| **Commits** | **Contributor**<br/> |
|
||||
| --- | --- |
|
||||
| 106 | [jonschlinkert](https://github.com/jonschlinkert) |
|
||||
| 2 | [doowb](https://github.com/doowb) |
|
||||
|
||||
### Building docs
|
||||
|
||||
_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_
|
||||
|
||||
To generate the readme and API documentation with [verb](https://github.com/verbose/verb):
|
||||
|
||||
```sh
|
||||
$ npm install -g verb verb-generate-readme && verb
|
||||
```
|
||||
|
||||
### Running tests
|
||||
|
||||
Install dev dependencies:
|
||||
|
||||
```sh
|
||||
$ npm install -d && npm test
|
||||
```
|
||||
|
||||
### Author
|
||||
|
||||
**Jon Schlinkert**
|
||||
|
||||
* [github/jonschlinkert](https://github.com/jonschlinkert)
|
||||
* [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
|
||||
|
||||
### License
|
||||
|
||||
Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert).
|
||||
Released under the [MIT license](https://github.com/jonschlinkert/snapdragon/blob/master/LICENSE).
|
||||
|
||||
***
|
||||
|
||||
_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.31, on October 10, 2016._
|
174
node_modules/snapdragon/index.js
generated
vendored
Normal file
174
node_modules/snapdragon/index.js
generated
vendored
Normal file
@ -0,0 +1,174 @@
|
||||
'use strict';
|
||||
|
||||
var Base = require('base');
|
||||
var define = require('define-property');
|
||||
var Compiler = require('./lib/compiler');
|
||||
var Parser = require('./lib/parser');
|
||||
var utils = require('./lib/utils');
|
||||
var regexCache = {};
|
||||
var cache = {};
|
||||
|
||||
/**
|
||||
* Create a new instance of `Snapdragon` with the given `options`.
|
||||
*
|
||||
* ```js
|
||||
* var snapdragon = new Snapdragon();
|
||||
* ```
|
||||
*
|
||||
* @param {Object} `options`
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function Snapdragon(options) {
|
||||
Base.call(this, null, options);
|
||||
this.options = utils.extend({source: 'string'}, this.options);
|
||||
this.compiler = new Compiler(this.options);
|
||||
this.parser = new Parser(this.options);
|
||||
|
||||
Object.defineProperty(this, 'compilers', {
|
||||
get: function() {
|
||||
return this.compiler.compilers;
|
||||
}
|
||||
});
|
||||
|
||||
Object.defineProperty(this, 'parsers', {
|
||||
get: function() {
|
||||
return this.parser.parsers;
|
||||
}
|
||||
});
|
||||
|
||||
Object.defineProperty(this, 'regex', {
|
||||
get: function() {
|
||||
return this.parser.regex;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Inherit Base
|
||||
*/
|
||||
|
||||
Base.extend(Snapdragon);
|
||||
|
||||
/**
|
||||
* Add a parser to `snapdragon.parsers` for capturing the given `type` using
|
||||
* the specified regex or parser function. A function is useful if you need
|
||||
* to customize how the token is created and/or have access to the parser
|
||||
* instance to check options, etc.
|
||||
*
|
||||
* ```js
|
||||
* snapdragon
|
||||
* .capture('slash', /^\//)
|
||||
* .capture('dot', function() {
|
||||
* var pos = this.position();
|
||||
* var m = this.match(/^\./);
|
||||
* if (!m) return;
|
||||
* return pos({
|
||||
* type: 'dot',
|
||||
* val: m[0]
|
||||
* });
|
||||
* });
|
||||
* ```
|
||||
* @param {String} `type`
|
||||
* @param {RegExp|Function} `regex`
|
||||
* @return {Object} Returns the parser instance for chaining
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Snapdragon.prototype.capture = function() {
|
||||
return this.parser.capture.apply(this.parser, arguments);
|
||||
};
|
||||
|
||||
/**
|
||||
* Register a plugin `fn`.
|
||||
*
|
||||
* ```js
|
||||
* var snapdragon = new Snapdgragon([options]);
|
||||
* snapdragon.use(function() {
|
||||
* console.log(this); //<= snapdragon instance
|
||||
* console.log(this.parser); //<= parser instance
|
||||
* console.log(this.compiler); //<= compiler instance
|
||||
* });
|
||||
* ```
|
||||
* @param {Object} `fn`
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Snapdragon.prototype.use = function(fn) {
|
||||
fn.call(this, this);
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Parse the given `str`.
|
||||
*
|
||||
* ```js
|
||||
* var snapdragon = new Snapdgragon([options]);
|
||||
* // register parsers
|
||||
* snapdragon.parser.use(function() {});
|
||||
*
|
||||
* // parse
|
||||
* var ast = snapdragon.parse('foo/bar');
|
||||
* console.log(ast);
|
||||
* ```
|
||||
* @param {String} `str`
|
||||
* @param {Object} `options` Set `options.sourcemap` to true to enable source maps.
|
||||
* @return {Object} Returns an AST.
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Snapdragon.prototype.parse = function(str, options) {
|
||||
this.options = utils.extend({}, this.options, options);
|
||||
var parsed = this.parser.parse(str, this.options);
|
||||
|
||||
// add non-enumerable parser reference
|
||||
define(parsed, 'parser', this.parser);
|
||||
return parsed;
|
||||
};
|
||||
|
||||
/**
|
||||
* Compile the given `AST`.
|
||||
*
|
||||
* ```js
|
||||
* var snapdragon = new Snapdgragon([options]);
|
||||
* // register plugins
|
||||
* snapdragon.use(function() {});
|
||||
* // register parser plugins
|
||||
* snapdragon.parser.use(function() {});
|
||||
* // register compiler plugins
|
||||
* snapdragon.compiler.use(function() {});
|
||||
*
|
||||
* // parse
|
||||
* var ast = snapdragon.parse('foo/bar');
|
||||
*
|
||||
* // compile
|
||||
* var res = snapdragon.compile(ast);
|
||||
* console.log(res.output);
|
||||
* ```
|
||||
* @param {Object} `ast`
|
||||
* @param {Object} `options`
|
||||
* @return {Object} Returns an object with an `output` property with the rendered string.
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Snapdragon.prototype.compile = function(ast, options) {
|
||||
this.options = utils.extend({}, this.options, options);
|
||||
var compiled = this.compiler.compile(ast, this.options);
|
||||
|
||||
// add non-enumerable compiler reference
|
||||
define(compiled, 'compiler', this.compiler);
|
||||
return compiled;
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose `Snapdragon`
|
||||
*/
|
||||
|
||||
module.exports = Snapdragon;
|
||||
|
||||
/**
|
||||
* Expose `Parser` and `Compiler`
|
||||
*/
|
||||
|
||||
module.exports.Compiler = Compiler;
|
||||
module.exports.Parser = Parser;
|
177
node_modules/snapdragon/lib/compiler.js
generated
vendored
Normal file
177
node_modules/snapdragon/lib/compiler.js
generated
vendored
Normal file
@ -0,0 +1,177 @@
|
||||
'use strict';
|
||||
|
||||
var use = require('use');
|
||||
var define = require('define-property');
|
||||
var debug = require('debug')('snapdragon:compiler');
|
||||
var utils = require('./utils');
|
||||
|
||||
/**
|
||||
* Create a new `Compiler` with the given `options`.
|
||||
* @param {Object} `options`
|
||||
*/
|
||||
|
||||
function Compiler(options, state) {
|
||||
debug('initializing', __filename);
|
||||
this.options = utils.extend({source: 'string'}, options);
|
||||
this.state = state || {};
|
||||
this.compilers = {};
|
||||
this.output = '';
|
||||
this.set('eos', function(node) {
|
||||
return this.emit(node.val, node);
|
||||
});
|
||||
this.set('noop', function(node) {
|
||||
return this.emit(node.val, node);
|
||||
});
|
||||
this.set('bos', function(node) {
|
||||
return this.emit(node.val, node);
|
||||
});
|
||||
use(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prototype methods
|
||||
*/
|
||||
|
||||
Compiler.prototype = {
|
||||
|
||||
/**
|
||||
* Throw an error message with details including the cursor position.
|
||||
* @param {String} `msg` Message to use in the Error.
|
||||
*/
|
||||
|
||||
error: function(msg, node) {
|
||||
var pos = node.position || {start: {column: 0}};
|
||||
var message = this.options.source + ' column:' + pos.start.column + ': ' + msg;
|
||||
|
||||
var err = new Error(message);
|
||||
err.reason = msg;
|
||||
err.column = pos.start.column;
|
||||
err.source = this.pattern;
|
||||
|
||||
if (this.options.silent) {
|
||||
this.errors.push(err);
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Define a non-enumberable property on the `Compiler` instance.
|
||||
*
|
||||
* ```js
|
||||
* compiler.define('foo', 'bar');
|
||||
* ```
|
||||
* @name .define
|
||||
* @param {String} `key` propery name
|
||||
* @param {any} `val` property value
|
||||
* @return {Object} Returns the Compiler instance for chaining.
|
||||
* @api public
|
||||
*/
|
||||
|
||||
define: function(key, val) {
|
||||
define(this, key, val);
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Emit `node.val`
|
||||
*/
|
||||
|
||||
emit: function(str, node) {
|
||||
this.output += str;
|
||||
return str;
|
||||
},
|
||||
|
||||
/**
|
||||
* Add a compiler `fn` with the given `name`
|
||||
*/
|
||||
|
||||
set: function(name, fn) {
|
||||
this.compilers[name] = fn;
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get compiler `name`.
|
||||
*/
|
||||
|
||||
get: function(name) {
|
||||
return this.compilers[name];
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the previous AST node.
|
||||
*/
|
||||
|
||||
prev: function(n) {
|
||||
return this.ast.nodes[this.idx - (n || 1)] || { type: 'bos', val: '' };
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the next AST node.
|
||||
*/
|
||||
|
||||
next: function(n) {
|
||||
return this.ast.nodes[this.idx + (n || 1)] || { type: 'eos', val: '' };
|
||||
},
|
||||
|
||||
/**
|
||||
* Visit `node`.
|
||||
*/
|
||||
|
||||
visit: function(node, nodes, i) {
|
||||
var fn = this.compilers[node.type];
|
||||
this.idx = i;
|
||||
|
||||
if (typeof fn !== 'function') {
|
||||
throw this.error('compiler "' + node.type + '" is not registered', node);
|
||||
}
|
||||
return fn.call(this, node, nodes, i);
|
||||
},
|
||||
|
||||
/**
|
||||
* Map visit over array of `nodes`.
|
||||
*/
|
||||
|
||||
mapVisit: function(nodes) {
|
||||
if (!Array.isArray(nodes)) {
|
||||
throw new TypeError('expected an array');
|
||||
}
|
||||
var len = nodes.length;
|
||||
var idx = -1;
|
||||
while (++idx < len) {
|
||||
this.visit(nodes[idx], nodes, idx);
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Compile `ast`.
|
||||
*/
|
||||
|
||||
compile: function(ast, options) {
|
||||
var opts = utils.extend({}, this.options, options);
|
||||
this.ast = ast;
|
||||
this.parsingErrors = this.ast.errors;
|
||||
this.output = '';
|
||||
|
||||
// source map support
|
||||
if (opts.sourcemap) {
|
||||
var sourcemaps = require('./source-maps');
|
||||
sourcemaps(this);
|
||||
this.mapVisit(this.ast.nodes);
|
||||
this.applySourceMaps();
|
||||
this.map = opts.sourcemap === 'generator' ? this.map : this.map.toJSON();
|
||||
return this;
|
||||
}
|
||||
|
||||
this.mapVisit(this.ast.nodes);
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Expose `Compiler`
|
||||
*/
|
||||
|
||||
module.exports = Compiler;
|
533
node_modules/snapdragon/lib/parser.js
generated
vendored
Normal file
533
node_modules/snapdragon/lib/parser.js
generated
vendored
Normal file
@ -0,0 +1,533 @@
|
||||
'use strict';
|
||||
|
||||
var use = require('use');
|
||||
var util = require('util');
|
||||
var Cache = require('map-cache');
|
||||
var define = require('define-property');
|
||||
var debug = require('debug')('snapdragon:parser');
|
||||
var Position = require('./position');
|
||||
var utils = require('./utils');
|
||||
|
||||
/**
|
||||
* Create a new `Parser` with the given `input` and `options`.
|
||||
* @param {String} `input`
|
||||
* @param {Object} `options`
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function Parser(options) {
|
||||
debug('initializing', __filename);
|
||||
this.options = utils.extend({source: 'string'}, options);
|
||||
this.init(this.options);
|
||||
use(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prototype methods
|
||||
*/
|
||||
|
||||
Parser.prototype = {
|
||||
constructor: Parser,
|
||||
|
||||
init: function(options) {
|
||||
this.orig = '';
|
||||
this.input = '';
|
||||
this.parsed = '';
|
||||
|
||||
this.column = 1;
|
||||
this.line = 1;
|
||||
|
||||
this.regex = new Cache();
|
||||
this.errors = this.errors || [];
|
||||
this.parsers = this.parsers || {};
|
||||
this.types = this.types || [];
|
||||
this.sets = this.sets || {};
|
||||
this.fns = this.fns || [];
|
||||
this.currentType = 'root';
|
||||
|
||||
var pos = this.position();
|
||||
this.bos = pos({type: 'bos', val: ''});
|
||||
|
||||
this.ast = {
|
||||
type: 'root',
|
||||
errors: this.errors,
|
||||
nodes: [this.bos]
|
||||
};
|
||||
|
||||
define(this.bos, 'parent', this.ast);
|
||||
this.nodes = [this.ast];
|
||||
|
||||
this.count = 0;
|
||||
this.setCount = 0;
|
||||
this.stack = [];
|
||||
},
|
||||
|
||||
/**
|
||||
* Throw a formatted error with the cursor column and `msg`.
|
||||
* @param {String} `msg` Message to use in the Error.
|
||||
*/
|
||||
|
||||
error: function(msg, node) {
|
||||
var pos = node.position || {start: {column: 0, line: 0}};
|
||||
var line = pos.start.line;
|
||||
var column = pos.start.column;
|
||||
var source = this.options.source;
|
||||
|
||||
var message = source + ' <line:' + line + ' column:' + column + '>: ' + msg;
|
||||
var err = new Error(message);
|
||||
err.source = source;
|
||||
err.reason = msg;
|
||||
err.pos = pos;
|
||||
|
||||
if (this.options.silent) {
|
||||
this.errors.push(err);
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Define a non-enumberable property on the `Parser` instance.
|
||||
*
|
||||
* ```js
|
||||
* parser.define('foo', 'bar');
|
||||
* ```
|
||||
* @name .define
|
||||
* @param {String} `key` propery name
|
||||
* @param {any} `val` property value
|
||||
* @return {Object} Returns the Parser instance for chaining.
|
||||
* @api public
|
||||
*/
|
||||
|
||||
define: function(key, val) {
|
||||
define(this, key, val);
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Mark position and patch `node.position`.
|
||||
*/
|
||||
|
||||
position: function() {
|
||||
var start = { line: this.line, column: this.column };
|
||||
var self = this;
|
||||
|
||||
return function(node) {
|
||||
define(node, 'position', new Position(start, self));
|
||||
return node;
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Set parser `name` with the given `fn`
|
||||
* @param {String} `name`
|
||||
* @param {Function} `fn`
|
||||
* @api public
|
||||
*/
|
||||
|
||||
set: function(type, fn) {
|
||||
if (this.types.indexOf(type) === -1) {
|
||||
this.types.push(type);
|
||||
}
|
||||
this.parsers[type] = fn.bind(this);
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get parser `name`
|
||||
* @param {String} `name`
|
||||
* @api public
|
||||
*/
|
||||
|
||||
get: function(name) {
|
||||
return this.parsers[name];
|
||||
},
|
||||
|
||||
/**
|
||||
* Push a `token` onto the `type` stack.
|
||||
*
|
||||
* @param {String} `type`
|
||||
* @return {Object} `token`
|
||||
* @api public
|
||||
*/
|
||||
|
||||
push: function(type, token) {
|
||||
this.sets[type] = this.sets[type] || [];
|
||||
this.count++;
|
||||
this.stack.push(token);
|
||||
return this.sets[type].push(token);
|
||||
},
|
||||
|
||||
/**
|
||||
* Pop a token off of the `type` stack
|
||||
* @param {String} `type`
|
||||
* @returns {Object} Returns a token
|
||||
* @api public
|
||||
*/
|
||||
|
||||
pop: function(type) {
|
||||
this.sets[type] = this.sets[type] || [];
|
||||
this.count--;
|
||||
this.stack.pop();
|
||||
return this.sets[type].pop();
|
||||
},
|
||||
|
||||
/**
|
||||
* Return true if inside a `stack` node. Types are `braces`, `parens` or `brackets`.
|
||||
*
|
||||
* @param {String} `type`
|
||||
* @return {Boolean}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
isInside: function(type) {
|
||||
this.sets[type] = this.sets[type] || [];
|
||||
return this.sets[type].length > 0;
|
||||
},
|
||||
|
||||
/**
|
||||
* Return true if `node` is the given `type`.
|
||||
*
|
||||
* ```js
|
||||
* parser.isType(node, 'brace');
|
||||
* ```
|
||||
* @param {Object} `node`
|
||||
* @param {String} `type`
|
||||
* @return {Boolean}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
isType: function(node, type) {
|
||||
return node && node.type === type;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the previous AST node
|
||||
* @return {Object}
|
||||
*/
|
||||
|
||||
prev: function(n) {
|
||||
return this.stack.length > 0
|
||||
? utils.last(this.stack, n)
|
||||
: utils.last(this.nodes, n);
|
||||
},
|
||||
|
||||
/**
|
||||
* Update line and column based on `str`.
|
||||
*/
|
||||
|
||||
consume: function(len) {
|
||||
this.input = this.input.substr(len);
|
||||
},
|
||||
|
||||
/**
|
||||
* Update column based on `str`.
|
||||
*/
|
||||
|
||||
updatePosition: function(str, len) {
|
||||
var lines = str.match(/\n/g);
|
||||
if (lines) this.line += lines.length;
|
||||
var i = str.lastIndexOf('\n');
|
||||
this.column = ~i ? len - i : this.column + len;
|
||||
this.parsed += str;
|
||||
this.consume(len);
|
||||
},
|
||||
|
||||
/**
|
||||
* Match `regex`, return captures, and update the cursor position by `match[0]` length.
|
||||
* @param {RegExp} `regex`
|
||||
* @return {Object}
|
||||
*/
|
||||
|
||||
match: function(regex) {
|
||||
var m = regex.exec(this.input);
|
||||
if (m) {
|
||||
this.updatePosition(m[0], m[0].length);
|
||||
return m;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Capture `type` with the given regex.
|
||||
* @param {String} `type`
|
||||
* @param {RegExp} `regex`
|
||||
* @return {Function}
|
||||
*/
|
||||
|
||||
capture: function(type, regex) {
|
||||
if (typeof regex === 'function') {
|
||||
return this.set.apply(this, arguments);
|
||||
}
|
||||
|
||||
this.regex.set(type, regex);
|
||||
this.set(type, function() {
|
||||
var parsed = this.parsed;
|
||||
var pos = this.position();
|
||||
var m = this.match(regex);
|
||||
if (!m || !m[0]) return;
|
||||
|
||||
var prev = this.prev();
|
||||
var node = pos({
|
||||
type: type,
|
||||
val: m[0],
|
||||
parsed: parsed,
|
||||
rest: this.input
|
||||
});
|
||||
|
||||
if (m[1]) {
|
||||
node.inner = m[1];
|
||||
}
|
||||
|
||||
define(node, 'inside', this.stack.length > 0);
|
||||
define(node, 'parent', prev);
|
||||
prev.nodes.push(node);
|
||||
}.bind(this));
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Create a parser with open and close for parens,
|
||||
* brackets or braces
|
||||
*/
|
||||
|
||||
capturePair: function(type, openRegex, closeRegex, fn) {
|
||||
this.sets[type] = this.sets[type] || [];
|
||||
|
||||
/**
|
||||
* Open
|
||||
*/
|
||||
|
||||
this.set(type + '.open', function() {
|
||||
var parsed = this.parsed;
|
||||
var pos = this.position();
|
||||
var m = this.match(openRegex);
|
||||
if (!m || !m[0]) return;
|
||||
|
||||
var val = m[0];
|
||||
this.setCount++;
|
||||
this.specialChars = true;
|
||||
var open = pos({
|
||||
type: type + '.open',
|
||||
val: val,
|
||||
rest: this.input
|
||||
});
|
||||
|
||||
if (typeof m[1] !== 'undefined') {
|
||||
open.inner = m[1];
|
||||
}
|
||||
|
||||
var prev = this.prev();
|
||||
var node = pos({
|
||||
type: type,
|
||||
nodes: [open]
|
||||
});
|
||||
|
||||
define(node, 'rest', this.input);
|
||||
define(node, 'parsed', parsed);
|
||||
define(node, 'prefix', m[1]);
|
||||
define(node, 'parent', prev);
|
||||
define(open, 'parent', node);
|
||||
|
||||
if (typeof fn === 'function') {
|
||||
fn.call(this, open, node);
|
||||
}
|
||||
|
||||
this.push(type, node);
|
||||
prev.nodes.push(node);
|
||||
});
|
||||
|
||||
/**
|
||||
* Close
|
||||
*/
|
||||
|
||||
this.set(type + '.close', function() {
|
||||
var pos = this.position();
|
||||
var m = this.match(closeRegex);
|
||||
if (!m || !m[0]) return;
|
||||
|
||||
var parent = this.pop(type);
|
||||
var node = pos({
|
||||
type: type + '.close',
|
||||
rest: this.input,
|
||||
suffix: m[1],
|
||||
val: m[0]
|
||||
});
|
||||
|
||||
if (!this.isType(parent, type)) {
|
||||
if (this.options.strict) {
|
||||
throw new Error('missing opening "' + type + '"');
|
||||
}
|
||||
|
||||
this.setCount--;
|
||||
node.escaped = true;
|
||||
return node;
|
||||
}
|
||||
|
||||
if (node.suffix === '\\') {
|
||||
parent.escaped = true;
|
||||
node.escaped = true;
|
||||
}
|
||||
|
||||
parent.nodes.push(node);
|
||||
define(node, 'parent', parent);
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Capture end-of-string
|
||||
*/
|
||||
|
||||
eos: function() {
|
||||
var pos = this.position();
|
||||
if (this.input) return;
|
||||
var prev = this.prev();
|
||||
|
||||
while (prev.type !== 'root' && !prev.visited) {
|
||||
if (this.options.strict === true) {
|
||||
throw new SyntaxError('invalid syntax:' + util.inspect(prev, null, 2));
|
||||
}
|
||||
|
||||
if (!hasDelims(prev)) {
|
||||
prev.parent.escaped = true;
|
||||
prev.escaped = true;
|
||||
}
|
||||
|
||||
visit(prev, function(node) {
|
||||
if (!hasDelims(node.parent)) {
|
||||
node.parent.escaped = true;
|
||||
node.escaped = true;
|
||||
}
|
||||
});
|
||||
|
||||
prev = prev.parent;
|
||||
}
|
||||
|
||||
var tok = pos({
|
||||
type: 'eos',
|
||||
val: this.append || ''
|
||||
});
|
||||
|
||||
define(tok, 'parent', this.ast);
|
||||
return tok;
|
||||
},
|
||||
|
||||
/**
|
||||
* Run parsers to advance the cursor position
|
||||
*/
|
||||
|
||||
next: function() {
|
||||
var parsed = this.parsed;
|
||||
var len = this.types.length;
|
||||
var idx = -1;
|
||||
var tok;
|
||||
|
||||
while (++idx < len) {
|
||||
if ((tok = this.parsers[this.types[idx]].call(this))) {
|
||||
define(tok, 'rest', this.input);
|
||||
define(tok, 'parsed', parsed);
|
||||
this.last = tok;
|
||||
return tok;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Parse the given string.
|
||||
* @return {Array}
|
||||
*/
|
||||
|
||||
parse: function(input) {
|
||||
if (typeof input !== 'string') {
|
||||
throw new TypeError('expected a string');
|
||||
}
|
||||
|
||||
this.init(this.options);
|
||||
this.orig = input;
|
||||
this.input = input;
|
||||
var self = this;
|
||||
|
||||
function parse() {
|
||||
// check input before calling `.next()`
|
||||
input = self.input;
|
||||
|
||||
// get the next AST ndoe
|
||||
var node = self.next();
|
||||
if (node) {
|
||||
var prev = self.prev();
|
||||
if (prev) {
|
||||
define(node, 'parent', prev);
|
||||
if (prev.nodes) {
|
||||
prev.nodes.push(node);
|
||||
}
|
||||
}
|
||||
|
||||
if (self.sets.hasOwnProperty(prev.type)) {
|
||||
self.currentType = prev.type;
|
||||
}
|
||||
}
|
||||
|
||||
// if we got here but input is not changed, throw an error
|
||||
if (self.input && input === self.input) {
|
||||
throw new Error('no parsers registered for: "' + self.input.slice(0, 5) + '"');
|
||||
}
|
||||
}
|
||||
|
||||
while (this.input) parse();
|
||||
if (this.stack.length && this.options.strict) {
|
||||
var node = this.stack.pop();
|
||||
throw this.error('missing opening ' + node.type + ': "' + this.orig + '"');
|
||||
}
|
||||
|
||||
var eos = this.eos();
|
||||
var tok = this.prev();
|
||||
if (tok.type !== 'eos') {
|
||||
this.ast.nodes.push(eos);
|
||||
}
|
||||
|
||||
return this.ast;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Visit `node` with the given `fn`
|
||||
*/
|
||||
|
||||
function visit(node, fn) {
|
||||
if (!node.visited) {
|
||||
define(node, 'visited', true);
|
||||
return node.nodes ? mapVisit(node.nodes, fn) : fn(node);
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
/**
|
||||
* Map visit over array of `nodes`.
|
||||
*/
|
||||
|
||||
function mapVisit(nodes, fn) {
|
||||
var len = nodes.length;
|
||||
var idx = -1;
|
||||
while (++idx < len) {
|
||||
visit(nodes[idx], fn);
|
||||
}
|
||||
}
|
||||
|
||||
function hasOpen(node) {
|
||||
return node.nodes && node.nodes[0].type === (node.type + '.open');
|
||||
}
|
||||
|
||||
function hasClose(node) {
|
||||
return node.nodes && utils.last(node.nodes).type === (node.type + '.close');
|
||||
}
|
||||
|
||||
function hasDelims(node) {
|
||||
return hasOpen(node) && hasClose(node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose `Parser`
|
||||
*/
|
||||
|
||||
module.exports = Parser;
|
14
node_modules/snapdragon/lib/position.js
generated
vendored
Normal file
14
node_modules/snapdragon/lib/position.js
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
'use strict';
|
||||
|
||||
var define = require('define-property');
|
||||
|
||||
/**
|
||||
* Store position for a node
|
||||
*/
|
||||
|
||||
module.exports = function Position(start, parser) {
|
||||
this.start = start;
|
||||
this.end = { line: parser.line, column: parser.column };
|
||||
define(this, 'content', parser.orig);
|
||||
define(this, 'source', parser.options.source);
|
||||
};
|
145
node_modules/snapdragon/lib/source-maps.js
generated
vendored
Normal file
145
node_modules/snapdragon/lib/source-maps.js
generated
vendored
Normal file
@ -0,0 +1,145 @@
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var define = require('define-property');
|
||||
var utils = require('./utils');
|
||||
|
||||
/**
|
||||
* Expose `mixin()`.
|
||||
* This code is based on `source-maps-support.js` in reworkcss/css
|
||||
* https://github.com/reworkcss/css/blob/master/lib/stringify/source-map-support.js
|
||||
* Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>
|
||||
*/
|
||||
|
||||
module.exports = mixin;
|
||||
|
||||
/**
|
||||
* Mixin source map support into `compiler`.
|
||||
*
|
||||
* @param {Object} `compiler`
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function mixin(compiler) {
|
||||
define(compiler, '_comment', compiler.comment);
|
||||
compiler.map = new utils.SourceMap.SourceMapGenerator();
|
||||
compiler.position = { line: 1, column: 1 };
|
||||
compiler.content = {};
|
||||
compiler.files = {};
|
||||
|
||||
for (var key in exports) {
|
||||
define(compiler, key, exports[key]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update position.
|
||||
*
|
||||
* @param {String} str
|
||||
*/
|
||||
|
||||
exports.updatePosition = function(str) {
|
||||
var lines = str.match(/\n/g);
|
||||
if (lines) this.position.line += lines.length;
|
||||
var i = str.lastIndexOf('\n');
|
||||
this.position.column = ~i ? str.length - i : this.position.column + str.length;
|
||||
};
|
||||
|
||||
/**
|
||||
* Emit `str` with `position`.
|
||||
*
|
||||
* @param {String} str
|
||||
* @param {Object} [pos]
|
||||
* @return {String}
|
||||
*/
|
||||
|
||||
exports.emit = function(str, node) {
|
||||
var position = node.position || {};
|
||||
var source = position.source;
|
||||
if (source) {
|
||||
if (position.filepath) {
|
||||
source = utils.unixify(position.filepath);
|
||||
}
|
||||
|
||||
this.map.addMapping({
|
||||
source: source,
|
||||
generated: {
|
||||
line: this.position.line,
|
||||
column: Math.max(this.position.column - 1, 0)
|
||||
},
|
||||
original: {
|
||||
line: position.start.line,
|
||||
column: position.start.column - 1
|
||||
}
|
||||
});
|
||||
|
||||
if (position.content) {
|
||||
this.addContent(source, position);
|
||||
}
|
||||
if (position.filepath) {
|
||||
this.addFile(source, position);
|
||||
}
|
||||
|
||||
this.updatePosition(str);
|
||||
this.output += str;
|
||||
}
|
||||
return str;
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds a file to the source map output if it has not already been added
|
||||
* @param {String} `file`
|
||||
* @param {Object} `pos`
|
||||
*/
|
||||
|
||||
exports.addFile = function(file, position) {
|
||||
if (typeof position.content !== 'string') return;
|
||||
if (Object.prototype.hasOwnProperty.call(this.files, file)) return;
|
||||
this.files[file] = position.content;
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds a content source to the source map output if it has not already been added
|
||||
* @param {String} `source`
|
||||
* @param {Object} `position`
|
||||
*/
|
||||
|
||||
exports.addContent = function(source, position) {
|
||||
if (typeof position.content !== 'string') return;
|
||||
if (Object.prototype.hasOwnProperty.call(this.content, source)) return;
|
||||
this.map.setSourceContent(source, position.content);
|
||||
};
|
||||
|
||||
/**
|
||||
* Applies any original source maps to the output and embeds the source file
|
||||
* contents in the source map.
|
||||
*/
|
||||
|
||||
exports.applySourceMaps = function() {
|
||||
Object.keys(this.files).forEach(function(file) {
|
||||
var content = this.files[file];
|
||||
this.map.setSourceContent(file, content);
|
||||
|
||||
if (this.options.inputSourcemaps === true) {
|
||||
var originalMap = utils.sourceMapResolve.resolveSync(content, file, fs.readFileSync);
|
||||
if (originalMap) {
|
||||
var map = new utils.SourceMap.SourceMapConsumer(originalMap.map);
|
||||
var relativeTo = originalMap.sourcesRelativeTo;
|
||||
this.map.applySourceMap(map, file, utils.unixify(path.dirname(relativeTo)));
|
||||
}
|
||||
}
|
||||
}, this);
|
||||
};
|
||||
|
||||
/**
|
||||
* Process comments, drops sourceMap comments.
|
||||
* @param {Object} node
|
||||
*/
|
||||
|
||||
exports.comment = function(node) {
|
||||
if (/^# sourceMappingURL=/.test(node.comment)) {
|
||||
return this.emit('', node.position);
|
||||
}
|
||||
return this._comment(node);
|
||||
};
|
48
node_modules/snapdragon/lib/utils.js
generated
vendored
Normal file
48
node_modules/snapdragon/lib/utils.js
generated
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Module dependencies
|
||||
*/
|
||||
|
||||
exports.extend = require('extend-shallow');
|
||||
exports.SourceMap = require('source-map');
|
||||
exports.sourceMapResolve = require('source-map-resolve');
|
||||
|
||||
/**
|
||||
* Convert backslash in the given string to forward slashes
|
||||
*/
|
||||
|
||||
exports.unixify = function(fp) {
|
||||
return fp.split(/\\+/).join('/');
|
||||
};
|
||||
|
||||
/**
|
||||
* Return true if `val` is a non-empty string
|
||||
*
|
||||
* @param {String} `str`
|
||||
* @return {Boolean}
|
||||
*/
|
||||
|
||||
exports.isString = function(str) {
|
||||
return str && typeof str === 'string';
|
||||
};
|
||||
|
||||
/**
|
||||
* Cast `val` to an array
|
||||
* @return {Array}
|
||||
*/
|
||||
|
||||
exports.arrayify = function(val) {
|
||||
if (typeof val === 'string') return [val];
|
||||
return val ? (Array.isArray(val) ? val : [val]) : [];
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the last `n` element from the given `array`
|
||||
* @param {Array} `array`
|
||||
* @return {*}
|
||||
*/
|
||||
|
||||
exports.last = function(arr, n) {
|
||||
return arr[arr.length - (n || 1)];
|
||||
};
|
21
node_modules/snapdragon/node_modules/define-property/LICENSE
generated
vendored
Normal file
21
node_modules/snapdragon/node_modules/define-property/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015, Jon Schlinkert.
|
||||
|
||||
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.
|
77
node_modules/snapdragon/node_modules/define-property/README.md
generated
vendored
Normal file
77
node_modules/snapdragon/node_modules/define-property/README.md
generated
vendored
Normal file
@ -0,0 +1,77 @@
|
||||
# define-property [](http://badge.fury.io/js/define-property)
|
||||
|
||||
> Define a non-enumerable property on an object.
|
||||
|
||||
## Install
|
||||
|
||||
Install with [npm](https://www.npmjs.com/)
|
||||
|
||||
```sh
|
||||
$ npm i define-property --save
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
**Params**
|
||||
|
||||
* `obj`: The object on which to define the property.
|
||||
* `prop`: The name of the property to be defined or modified.
|
||||
* `descriptor`: The descriptor for the property being defined or modified.
|
||||
|
||||
```js
|
||||
var define = require('define-property');
|
||||
var obj = {};
|
||||
define(obj, 'foo', function(val) {
|
||||
return val.toUpperCase();
|
||||
});
|
||||
|
||||
console.log(obj);
|
||||
//=> {}
|
||||
|
||||
console.log(obj.foo('bar'));
|
||||
//=> 'BAR'
|
||||
```
|
||||
|
||||
**get/set**
|
||||
|
||||
```js
|
||||
define(obj, 'foo', {
|
||||
get: function() {},
|
||||
set: function() {}
|
||||
});
|
||||
```
|
||||
|
||||
## Related projects
|
||||
|
||||
* [delegate-object](https://www.npmjs.com/package/delegate-object): Copy properties from an object to another object, where properties with function values will be… [more](https://www.npmjs.com/package/delegate-object) | [homepage](https://github.com/doowb/delegate-object)
|
||||
* [forward-object](https://www.npmjs.com/package/forward-object): Copy properties from an object to another object, where properties with function values will be… [more](https://www.npmjs.com/package/forward-object) | [homepage](https://github.com/doowb/forward-object)
|
||||
* [mixin-deep](https://www.npmjs.com/package/mixin-deep): Deeply mix the properties of objects into the first object. Like merge-deep, but doesn't clone. | [homepage](https://github.com/jonschlinkert/mixin-deep)
|
||||
* [mixin-object](https://www.npmjs.com/package/mixin-object): Mixin the own and inherited properties of other objects onto the first object. Pass an… [more](https://www.npmjs.com/package/mixin-object) | [homepage](https://github.com/jonschlinkert/mixin-object)
|
||||
|
||||
## Running tests
|
||||
|
||||
Install dev dependencies:
|
||||
|
||||
```sh
|
||||
$ npm i -d && npm test
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/define-property/issues/new).
|
||||
|
||||
## Author
|
||||
|
||||
**Jon Schlinkert**
|
||||
|
||||
+ [github/jonschlinkert](https://github.com/jonschlinkert)
|
||||
+ [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
|
||||
|
||||
## License
|
||||
|
||||
Copyright © 2015 Jon Schlinkert
|
||||
Released under the MIT license.
|
||||
|
||||
***
|
||||
|
||||
_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on August 31, 2015._
|
31
node_modules/snapdragon/node_modules/define-property/index.js
generated
vendored
Normal file
31
node_modules/snapdragon/node_modules/define-property/index.js
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
/*!
|
||||
* define-property <https://github.com/jonschlinkert/define-property>
|
||||
*
|
||||
* Copyright (c) 2015, Jon Schlinkert.
|
||||
* Licensed under the MIT License.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var isDescriptor = require('is-descriptor');
|
||||
|
||||
module.exports = function defineProperty(obj, prop, val) {
|
||||
if (typeof obj !== 'object' && typeof obj !== 'function') {
|
||||
throw new TypeError('expected an object or function.');
|
||||
}
|
||||
|
||||
if (typeof prop !== 'string') {
|
||||
throw new TypeError('expected `prop` to be a string.');
|
||||
}
|
||||
|
||||
if (isDescriptor(val) && ('set' in val || 'get' in val)) {
|
||||
return Object.defineProperty(obj, prop, val);
|
||||
}
|
||||
|
||||
return Object.defineProperty(obj, prop, {
|
||||
configurable: true,
|
||||
enumerable: false,
|
||||
writable: true,
|
||||
value: val
|
||||
});
|
||||
};
|
51
node_modules/snapdragon/node_modules/define-property/package.json
generated
vendored
Normal file
51
node_modules/snapdragon/node_modules/define-property/package.json
generated
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
{
|
||||
"name": "define-property",
|
||||
"description": "Define a non-enumerable property on an object.",
|
||||
"version": "0.2.5",
|
||||
"homepage": "https://github.com/jonschlinkert/define-property",
|
||||
"author": "Jon Schlinkert (https://github.com/jonschlinkert)",
|
||||
"repository": "jonschlinkert/define-property",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jonschlinkert/define-property/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"main": "index.js",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha"
|
||||
},
|
||||
"devDependencies": {
|
||||
"mocha": "*",
|
||||
"should": "^7.0.4"
|
||||
},
|
||||
"keywords": [
|
||||
"define",
|
||||
"define-property",
|
||||
"enumerable",
|
||||
"key",
|
||||
"non",
|
||||
"non-enumerable",
|
||||
"object",
|
||||
"prop",
|
||||
"property",
|
||||
"value"
|
||||
],
|
||||
"verb": {
|
||||
"related": {
|
||||
"list": [
|
||||
"mixin-deep",
|
||||
"mixin-object",
|
||||
"delegate-object",
|
||||
"forward-object"
|
||||
]
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"is-descriptor": "^0.1.0"
|
||||
}
|
||||
}
|
21
node_modules/snapdragon/node_modules/is-accessor-descriptor/LICENSE
generated
vendored
Normal file
21
node_modules/snapdragon/node_modules/is-accessor-descriptor/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015, Jon Schlinkert.
|
||||
|
||||
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.
|
123
node_modules/snapdragon/node_modules/is-accessor-descriptor/README.md
generated
vendored
Normal file
123
node_modules/snapdragon/node_modules/is-accessor-descriptor/README.md
generated
vendored
Normal file
@ -0,0 +1,123 @@
|
||||
# is-accessor-descriptor [](https://www.npmjs.com/package/is-accessor-descriptor) [](https://travis-ci.org/jonschlinkert/is-accessor-descriptor)
|
||||
|
||||
> Returns true if a value has the characteristics of a valid JavaScript accessor descriptor.
|
||||
|
||||
- [Install](#install)
|
||||
- [Usage](#usage)
|
||||
- [Examples](#examples)
|
||||
- [API](#api)
|
||||
- [Related projects](#related-projects)
|
||||
- [Running tests](#running-tests)
|
||||
- [Contributing](#contributing)
|
||||
- [Author](#author)
|
||||
- [License](#license)
|
||||
|
||||
_(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_
|
||||
|
||||
## Install
|
||||
|
||||
Install with [npm](https://www.npmjs.com/):
|
||||
|
||||
```sh
|
||||
$ npm i is-accessor-descriptor --save
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
var isAccessor = require('is-accessor-descriptor');
|
||||
|
||||
isAccessor({get: function() {}});
|
||||
//=> true
|
||||
```
|
||||
|
||||
You may also pass an object and property name to check if the property is an accessor:
|
||||
|
||||
```js
|
||||
isAccessor(foo, 'bar');
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
`false` when not an object
|
||||
|
||||
```js
|
||||
isAccessor('a')
|
||||
isAccessor(null)
|
||||
isAccessor([])
|
||||
//=> false
|
||||
```
|
||||
|
||||
`true` when the object has valid properties
|
||||
|
||||
and the properties all have the correct JavaScript types:
|
||||
|
||||
```js
|
||||
isAccessor({get: noop, set: noop})
|
||||
isAccessor({get: noop})
|
||||
isAccessor({set: noop})
|
||||
//=> true
|
||||
```
|
||||
|
||||
`false` when the object has invalid properties
|
||||
|
||||
```js
|
||||
isAccessor({get: noop, set: noop, bar: 'baz'})
|
||||
isAccessor({get: noop, writable: true})
|
||||
isAccessor({get: noop, value: true})
|
||||
//=> false
|
||||
```
|
||||
|
||||
`false` when an accessor is not a function
|
||||
|
||||
```js
|
||||
isAccessor({get: noop, set: 'baz'})
|
||||
isAccessor({get: 'foo', set: noop})
|
||||
isAccessor({get: 'foo', bar: 'baz'})
|
||||
isAccessor({get: 'foo', set: 'baz'})
|
||||
//=> false
|
||||
```
|
||||
|
||||
`false` when a value is not the correct type
|
||||
|
||||
```js
|
||||
isAccessor({get: noop, set: noop, enumerable: 'foo'})
|
||||
isAccessor({set: noop, configurable: 'foo'})
|
||||
isAccessor({get: noop, configurable: 'foo'})
|
||||
//=> false
|
||||
```
|
||||
|
||||
## Related projects
|
||||
|
||||
* [is-accessor-descriptor](https://www.npmjs.com/package/is-accessor-descriptor): Returns true if a value has the characteristics of a valid JavaScript accessor descriptor. | [homepage](https://github.com/jonschlinkert/is-accessor-descriptor)
|
||||
* [is-data-descriptor](https://www.npmjs.com/package/is-data-descriptor): Returns true if a value has the characteristics of a valid JavaScript data descriptor. | [homepage](https://github.com/jonschlinkert/is-data-descriptor)
|
||||
* [is-descriptor](https://www.npmjs.com/package/is-descriptor): Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for… [more](https://www.npmjs.com/package/is-descriptor) | [homepage](https://github.com/jonschlinkert/is-descriptor)
|
||||
* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject)
|
||||
|
||||
## Running tests
|
||||
|
||||
Install dev dependencies:
|
||||
|
||||
```sh
|
||||
$ npm i -d && npm test
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/is-accessor-descriptor/issues/new).
|
||||
|
||||
## Author
|
||||
|
||||
**Jon Schlinkert**
|
||||
|
||||
* [github/jonschlinkert](https://github.com/jonschlinkert)
|
||||
* [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
|
||||
|
||||
## License
|
||||
|
||||
Copyright © 2015 [Jon Schlinkert](https://github.com/jonschlinkert)
|
||||
Released under the MIT license.
|
||||
|
||||
***
|
||||
|
||||
_This file was generated by [verb](https://github.com/verbose/verb) on December 28, 2015._
|
69
node_modules/snapdragon/node_modules/is-accessor-descriptor/index.js
generated
vendored
Normal file
69
node_modules/snapdragon/node_modules/is-accessor-descriptor/index.js
generated
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
/*!
|
||||
* is-accessor-descriptor <https://github.com/jonschlinkert/is-accessor-descriptor>
|
||||
*
|
||||
* Copyright (c) 2015, Jon Schlinkert.
|
||||
* Licensed under the MIT License.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var typeOf = require('kind-of');
|
||||
|
||||
// accessor descriptor properties
|
||||
var accessor = {
|
||||
get: 'function',
|
||||
set: 'function',
|
||||
configurable: 'boolean',
|
||||
enumerable: 'boolean'
|
||||
};
|
||||
|
||||
function isAccessorDescriptor(obj, prop) {
|
||||
if (typeof prop === 'string') {
|
||||
var val = Object.getOwnPropertyDescriptor(obj, prop);
|
||||
return typeof val !== 'undefined';
|
||||
}
|
||||
|
||||
if (typeOf(obj) !== 'object') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (has(obj, 'value') || has(obj, 'writable')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!has(obj, 'get') || typeof obj.get !== 'function') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// tldr: it's valid to have "set" be undefined
|
||||
// "set" might be undefined if `Object.getOwnPropertyDescriptor`
|
||||
// was used to get the value, and only `get` was defined by the user
|
||||
if (has(obj, 'set') && typeof obj[key] !== 'function' && typeof obj[key] !== 'undefined') {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (var key in obj) {
|
||||
if (!accessor.hasOwnProperty(key)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (typeOf(obj[key]) === accessor[key]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (typeof obj[key] !== 'undefined') {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function has(obj, key) {
|
||||
return {}.hasOwnProperty.call(obj, key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose `isAccessorDescriptor`
|
||||
*/
|
||||
|
||||
module.exports = isAccessorDescriptor;
|
21
node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of/LICENSE
generated
vendored
Normal file
21
node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014-2017, Jon Schlinkert
|
||||
|
||||
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.
|
261
node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of/README.md
generated
vendored
Normal file
261
node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of/README.md
generated
vendored
Normal file
@ -0,0 +1,261 @@
|
||||
# kind-of [](https://www.npmjs.com/package/kind-of) [](https://npmjs.org/package/kind-of) [](https://npmjs.org/package/kind-of) [](https://travis-ci.org/jonschlinkert/kind-of)
|
||||
|
||||
> Get the native type of a value.
|
||||
|
||||
## Install
|
||||
|
||||
Install with [npm](https://www.npmjs.com/):
|
||||
|
||||
```sh
|
||||
$ npm install --save kind-of
|
||||
```
|
||||
|
||||
## Install
|
||||
|
||||
Install with [bower](https://bower.io/)
|
||||
|
||||
```sh
|
||||
$ bower install kind-of --save
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
> es5, browser and es6 ready
|
||||
|
||||
```js
|
||||
var kindOf = require('kind-of');
|
||||
|
||||
kindOf(undefined);
|
||||
//=> 'undefined'
|
||||
|
||||
kindOf(null);
|
||||
//=> 'null'
|
||||
|
||||
kindOf(true);
|
||||
//=> 'boolean'
|
||||
|
||||
kindOf(false);
|
||||
//=> 'boolean'
|
||||
|
||||
kindOf(new Boolean(true));
|
||||
//=> 'boolean'
|
||||
|
||||
kindOf(new Buffer(''));
|
||||
//=> 'buffer'
|
||||
|
||||
kindOf(42);
|
||||
//=> 'number'
|
||||
|
||||
kindOf(new Number(42));
|
||||
//=> 'number'
|
||||
|
||||
kindOf('str');
|
||||
//=> 'string'
|
||||
|
||||
kindOf(new String('str'));
|
||||
//=> 'string'
|
||||
|
||||
kindOf(arguments);
|
||||
//=> 'arguments'
|
||||
|
||||
kindOf({});
|
||||
//=> 'object'
|
||||
|
||||
kindOf(Object.create(null));
|
||||
//=> 'object'
|
||||
|
||||
kindOf(new Test());
|
||||
//=> 'object'
|
||||
|
||||
kindOf(new Date());
|
||||
//=> 'date'
|
||||
|
||||
kindOf([]);
|
||||
//=> 'array'
|
||||
|
||||
kindOf([1, 2, 3]);
|
||||
//=> 'array'
|
||||
|
||||
kindOf(new Array());
|
||||
//=> 'array'
|
||||
|
||||
kindOf(/foo/);
|
||||
//=> 'regexp'
|
||||
|
||||
kindOf(new RegExp('foo'));
|
||||
//=> 'regexp'
|
||||
|
||||
kindOf(function () {});
|
||||
//=> 'function'
|
||||
|
||||
kindOf(function * () {});
|
||||
//=> 'function'
|
||||
|
||||
kindOf(new Function());
|
||||
//=> 'function'
|
||||
|
||||
kindOf(new Map());
|
||||
//=> 'map'
|
||||
|
||||
kindOf(new WeakMap());
|
||||
//=> 'weakmap'
|
||||
|
||||
kindOf(new Set());
|
||||
//=> 'set'
|
||||
|
||||
kindOf(new WeakSet());
|
||||
//=> 'weakset'
|
||||
|
||||
kindOf(Symbol('str'));
|
||||
//=> 'symbol'
|
||||
|
||||
kindOf(new Int8Array());
|
||||
//=> 'int8array'
|
||||
|
||||
kindOf(new Uint8Array());
|
||||
//=> 'uint8array'
|
||||
|
||||
kindOf(new Uint8ClampedArray());
|
||||
//=> 'uint8clampedarray'
|
||||
|
||||
kindOf(new Int16Array());
|
||||
//=> 'int16array'
|
||||
|
||||
kindOf(new Uint16Array());
|
||||
//=> 'uint16array'
|
||||
|
||||
kindOf(new Int32Array());
|
||||
//=> 'int32array'
|
||||
|
||||
kindOf(new Uint32Array());
|
||||
//=> 'uint32array'
|
||||
|
||||
kindOf(new Float32Array());
|
||||
//=> 'float32array'
|
||||
|
||||
kindOf(new Float64Array());
|
||||
//=> 'float64array'
|
||||
```
|
||||
|
||||
## Benchmarks
|
||||
|
||||
Benchmarked against [typeof](http://github.com/CodingFu/typeof) and [type-of](https://github.com/ForbesLindesay/type-of).
|
||||
Note that performaces is slower for es6 features `Map`, `WeakMap`, `Set` and `WeakSet`.
|
||||
|
||||
```bash
|
||||
#1: array
|
||||
current x 23,329,397 ops/sec ±0.82% (94 runs sampled)
|
||||
lib-type-of x 4,170,273 ops/sec ±0.55% (94 runs sampled)
|
||||
lib-typeof x 9,686,935 ops/sec ±0.59% (98 runs sampled)
|
||||
|
||||
#2: boolean
|
||||
current x 27,197,115 ops/sec ±0.85% (94 runs sampled)
|
||||
lib-type-of x 3,145,791 ops/sec ±0.73% (97 runs sampled)
|
||||
lib-typeof x 9,199,562 ops/sec ±0.44% (99 runs sampled)
|
||||
|
||||
#3: date
|
||||
current x 20,190,117 ops/sec ±0.86% (92 runs sampled)
|
||||
lib-type-of x 5,166,970 ops/sec ±0.74% (94 runs sampled)
|
||||
lib-typeof x 9,610,821 ops/sec ±0.50% (96 runs sampled)
|
||||
|
||||
#4: function
|
||||
current x 23,855,460 ops/sec ±0.60% (97 runs sampled)
|
||||
lib-type-of x 5,667,740 ops/sec ±0.54% (100 runs sampled)
|
||||
lib-typeof x 10,010,644 ops/sec ±0.44% (100 runs sampled)
|
||||
|
||||
#5: null
|
||||
current x 27,061,047 ops/sec ±0.97% (96 runs sampled)
|
||||
lib-type-of x 13,965,573 ops/sec ±0.62% (97 runs sampled)
|
||||
lib-typeof x 8,460,194 ops/sec ±0.61% (97 runs sampled)
|
||||
|
||||
#6: number
|
||||
current x 25,075,682 ops/sec ±0.53% (99 runs sampled)
|
||||
lib-type-of x 2,266,405 ops/sec ±0.41% (98 runs sampled)
|
||||
lib-typeof x 9,821,481 ops/sec ±0.45% (99 runs sampled)
|
||||
|
||||
#7: object
|
||||
current x 3,348,980 ops/sec ±0.49% (99 runs sampled)
|
||||
lib-type-of x 3,245,138 ops/sec ±0.60% (94 runs sampled)
|
||||
lib-typeof x 9,262,952 ops/sec ±0.59% (99 runs sampled)
|
||||
|
||||
#8: regex
|
||||
current x 21,284,827 ops/sec ±0.72% (96 runs sampled)
|
||||
lib-type-of x 4,689,241 ops/sec ±0.43% (100 runs sampled)
|
||||
lib-typeof x 8,957,593 ops/sec ±0.62% (98 runs sampled)
|
||||
|
||||
#9: string
|
||||
current x 25,379,234 ops/sec ±0.58% (96 runs sampled)
|
||||
lib-type-of x 3,635,148 ops/sec ±0.76% (93 runs sampled)
|
||||
lib-typeof x 9,494,134 ops/sec ±0.49% (98 runs sampled)
|
||||
|
||||
#10: undef
|
||||
current x 27,459,221 ops/sec ±1.01% (93 runs sampled)
|
||||
lib-type-of x 14,360,433 ops/sec ±0.52% (99 runs sampled)
|
||||
lib-typeof x 23,202,868 ops/sec ±0.59% (94 runs sampled)
|
||||
|
||||
```
|
||||
|
||||
## Optimizations
|
||||
|
||||
In 7 out of 8 cases, this library is 2x-10x faster than other top libraries included in the benchmarks. There are a few things that lead to this performance advantage, none of them hard and fast rules, but all of them simple and repeatable in almost any code library:
|
||||
|
||||
1. Optimize around the fastest and most common use cases first. Of course, this will change from project-to-project, but I took some time to understand how and why `typeof` checks were being used in my own libraries and other libraries I use a lot.
|
||||
2. Optimize around bottlenecks - In other words, the order in which conditionals are implemented is significant, because each check is only as fast as the failing checks that came before it. Here, the biggest bottleneck by far is checking for plain objects (an object that was created by the `Object` constructor). I opted to make this check happen by process of elimination rather than brute force up front (e.g. by using something like `val.constructor.name`), so that every other type check would not be penalized it.
|
||||
3. Don't do uneccessary processing - why do `.slice(8, -1).toLowerCase();` just to get the word `regex`? It's much faster to do `if (type === '[object RegExp]') return 'regex'`
|
||||
|
||||
## About
|
||||
|
||||
### Related projects
|
||||
|
||||
* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet")
|
||||
* [is-number](https://www.npmjs.com/package/is-number): Returns true if the value is a number. comprehensive tests. | [homepage](https://github.com/jonschlinkert/is-number "Returns true if the value is a number. comprehensive tests.")
|
||||
* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ")
|
||||
|
||||
### Contributing
|
||||
|
||||
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
|
||||
|
||||
### Contributors
|
||||
|
||||
| **Commits** | **Contributor** |
|
||||
| --- | --- |
|
||||
| 59 | [jonschlinkert](https://github.com/jonschlinkert) |
|
||||
| 2 | [miguelmota](https://github.com/miguelmota) |
|
||||
| 1 | [dtothefp](https://github.com/dtothefp) |
|
||||
| 1 | [ksheedlo](https://github.com/ksheedlo) |
|
||||
| 1 | [pdehaan](https://github.com/pdehaan) |
|
||||
| 1 | [laggingreflex](https://github.com/laggingreflex) |
|
||||
|
||||
### Building docs
|
||||
|
||||
_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
|
||||
|
||||
To generate the readme, run the following command:
|
||||
|
||||
```sh
|
||||
$ npm install -g verbose/verb#dev verb-generate-readme && verb
|
||||
```
|
||||
|
||||
### Running tests
|
||||
|
||||
Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
|
||||
|
||||
```sh
|
||||
$ npm install && npm test
|
||||
```
|
||||
|
||||
### Author
|
||||
|
||||
**Jon Schlinkert**
|
||||
|
||||
* [github/jonschlinkert](https://github.com/jonschlinkert)
|
||||
* [twitter/jonschlinkert](https://twitter.com/jonschlinkert)
|
||||
|
||||
### License
|
||||
|
||||
Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert).
|
||||
Released under the [MIT License](LICENSE).
|
||||
|
||||
***
|
||||
|
||||
_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on May 16, 2017._
|
116
node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of/index.js
generated
vendored
Normal file
116
node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of/index.js
generated
vendored
Normal file
@ -0,0 +1,116 @@
|
||||
var isBuffer = require('is-buffer');
|
||||
var toString = Object.prototype.toString;
|
||||
|
||||
/**
|
||||
* Get the native `typeof` a value.
|
||||
*
|
||||
* @param {*} `val`
|
||||
* @return {*} Native javascript type
|
||||
*/
|
||||
|
||||
module.exports = function kindOf(val) {
|
||||
// primitivies
|
||||
if (typeof val === 'undefined') {
|
||||
return 'undefined';
|
||||
}
|
||||
if (val === null) {
|
||||
return 'null';
|
||||
}
|
||||
if (val === true || val === false || val instanceof Boolean) {
|
||||
return 'boolean';
|
||||
}
|
||||
if (typeof val === 'string' || val instanceof String) {
|
||||
return 'string';
|
||||
}
|
||||
if (typeof val === 'number' || val instanceof Number) {
|
||||
return 'number';
|
||||
}
|
||||
|
||||
// functions
|
||||
if (typeof val === 'function' || val instanceof Function) {
|
||||
return 'function';
|
||||
}
|
||||
|
||||
// array
|
||||
if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {
|
||||
return 'array';
|
||||
}
|
||||
|
||||
// check for instances of RegExp and Date before calling `toString`
|
||||
if (val instanceof RegExp) {
|
||||
return 'regexp';
|
||||
}
|
||||
if (val instanceof Date) {
|
||||
return 'date';
|
||||
}
|
||||
|
||||
// other objects
|
||||
var type = toString.call(val);
|
||||
|
||||
if (type === '[object RegExp]') {
|
||||
return 'regexp';
|
||||
}
|
||||
if (type === '[object Date]') {
|
||||
return 'date';
|
||||
}
|
||||
if (type === '[object Arguments]') {
|
||||
return 'arguments';
|
||||
}
|
||||
if (type === '[object Error]') {
|
||||
return 'error';
|
||||
}
|
||||
|
||||
// buffer
|
||||
if (isBuffer(val)) {
|
||||
return 'buffer';
|
||||
}
|
||||
|
||||
// es6: Map, WeakMap, Set, WeakSet
|
||||
if (type === '[object Set]') {
|
||||
return 'set';
|
||||
}
|
||||
if (type === '[object WeakSet]') {
|
||||
return 'weakset';
|
||||
}
|
||||
if (type === '[object Map]') {
|
||||
return 'map';
|
||||
}
|
||||
if (type === '[object WeakMap]') {
|
||||
return 'weakmap';
|
||||
}
|
||||
if (type === '[object Symbol]') {
|
||||
return 'symbol';
|
||||
}
|
||||
|
||||
// typed arrays
|
||||
if (type === '[object Int8Array]') {
|
||||
return 'int8array';
|
||||
}
|
||||
if (type === '[object Uint8Array]') {
|
||||
return 'uint8array';
|
||||
}
|
||||
if (type === '[object Uint8ClampedArray]') {
|
||||
return 'uint8clampedarray';
|
||||
}
|
||||
if (type === '[object Int16Array]') {
|
||||
return 'int16array';
|
||||
}
|
||||
if (type === '[object Uint16Array]') {
|
||||
return 'uint16array';
|
||||
}
|
||||
if (type === '[object Int32Array]') {
|
||||
return 'int32array';
|
||||
}
|
||||
if (type === '[object Uint32Array]') {
|
||||
return 'uint32array';
|
||||
}
|
||||
if (type === '[object Float32Array]') {
|
||||
return 'float32array';
|
||||
}
|
||||
if (type === '[object Float64Array]') {
|
||||
return 'float64array';
|
||||
}
|
||||
|
||||
// must be a plain object
|
||||
return 'object';
|
||||
};
|
90
node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of/package.json
generated
vendored
Normal file
90
node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of/package.json
generated
vendored
Normal file
@ -0,0 +1,90 @@
|
||||
{
|
||||
"name": "kind-of",
|
||||
"description": "Get the native type of a value.",
|
||||
"version": "3.2.2",
|
||||
"homepage": "https://github.com/jonschlinkert/kind-of",
|
||||
"author": "Jon Schlinkert (https://github.com/jonschlinkert)",
|
||||
"contributors": [
|
||||
"David Fox-Powell (https://dtothefp.github.io/me)",
|
||||
"Jon Schlinkert (http://twitter.com/jonschlinkert)",
|
||||
"Ken Sheedlo (kensheedlo.com)",
|
||||
"laggingreflex (https://github.com/laggingreflex)",
|
||||
"Miguel Mota (https://miguelmota.com)",
|
||||
"Peter deHaan (http://about.me/peterdehaan)"
|
||||
],
|
||||
"repository": "jonschlinkert/kind-of",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jonschlinkert/kind-of/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"main": "index.js",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha",
|
||||
"prepublish": "browserify -o browser.js -e index.js -s index --bare"
|
||||
},
|
||||
"dependencies": {
|
||||
"is-buffer": "^1.1.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ansi-bold": "^0.1.1",
|
||||
"benchmarked": "^1.0.0",
|
||||
"browserify": "^14.3.0",
|
||||
"glob": "^7.1.1",
|
||||
"gulp-format-md": "^0.1.12",
|
||||
"mocha": "^3.3.0",
|
||||
"type-of": "^2.0.1",
|
||||
"typeof": "^1.0.0"
|
||||
},
|
||||
"keywords": [
|
||||
"arguments",
|
||||
"array",
|
||||
"boolean",
|
||||
"check",
|
||||
"date",
|
||||
"function",
|
||||
"is",
|
||||
"is-type",
|
||||
"is-type-of",
|
||||
"kind",
|
||||
"kind-of",
|
||||
"number",
|
||||
"object",
|
||||
"of",
|
||||
"regexp",
|
||||
"string",
|
||||
"test",
|
||||
"type",
|
||||
"type-of",
|
||||
"typeof",
|
||||
"types"
|
||||
],
|
||||
"verb": {
|
||||
"related": {
|
||||
"list": [
|
||||
"is-glob",
|
||||
"is-number",
|
||||
"is-primitive"
|
||||
]
|
||||
},
|
||||
"toc": false,
|
||||
"layout": "default",
|
||||
"tasks": [
|
||||
"readme"
|
||||
],
|
||||
"plugins": [
|
||||
"gulp-format-md"
|
||||
],
|
||||
"lint": {
|
||||
"reflinks": true
|
||||
},
|
||||
"reflinks": [
|
||||
"verb"
|
||||
]
|
||||
}
|
||||
}
|
61
node_modules/snapdragon/node_modules/is-accessor-descriptor/package.json
generated
vendored
Normal file
61
node_modules/snapdragon/node_modules/is-accessor-descriptor/package.json
generated
vendored
Normal file
@ -0,0 +1,61 @@
|
||||
{
|
||||
"name": "is-accessor-descriptor",
|
||||
"description": "Returns true if a value has the characteristics of a valid JavaScript accessor descriptor.",
|
||||
"version": "0.1.6",
|
||||
"homepage": "https://github.com/jonschlinkert/is-accessor-descriptor",
|
||||
"author": "Jon Schlinkert (https://github.com/jonschlinkert)",
|
||||
"repository": "jonschlinkert/is-accessor-descriptor",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jonschlinkert/is-accessor-descriptor/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"main": "index.js",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": "^3.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"mocha": "*",
|
||||
"should": "*"
|
||||
},
|
||||
"keywords": [
|
||||
"accessor",
|
||||
"check",
|
||||
"data",
|
||||
"descriptor",
|
||||
"get",
|
||||
"getter",
|
||||
"is",
|
||||
"keys",
|
||||
"object",
|
||||
"properties",
|
||||
"property",
|
||||
"set",
|
||||
"setter",
|
||||
"type",
|
||||
"valid",
|
||||
"value"
|
||||
],
|
||||
"verb": {
|
||||
"related": {
|
||||
"list": [
|
||||
"is-accessor-descriptor",
|
||||
"is-data-descriptor",
|
||||
"is-descriptor",
|
||||
"isobject"
|
||||
]
|
||||
},
|
||||
"plugins": [
|
||||
"gulp-format-md"
|
||||
],
|
||||
"layout": "default"
|
||||
}
|
||||
}
|
21
node_modules/snapdragon/node_modules/is-data-descriptor/LICENSE
generated
vendored
Normal file
21
node_modules/snapdragon/node_modules/is-data-descriptor/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015, Jon Schlinkert.
|
||||
|
||||
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.
|
128
node_modules/snapdragon/node_modules/is-data-descriptor/README.md
generated
vendored
Normal file
128
node_modules/snapdragon/node_modules/is-data-descriptor/README.md
generated
vendored
Normal file
@ -0,0 +1,128 @@
|
||||
# is-data-descriptor [](https://www.npmjs.com/package/is-data-descriptor) [](https://travis-ci.org/jonschlinkert/is-data-descriptor)
|
||||
|
||||
> Returns true if a value has the characteristics of a valid JavaScript data descriptor.
|
||||
|
||||
## Install
|
||||
|
||||
Install with [npm](https://www.npmjs.com/):
|
||||
|
||||
```sh
|
||||
$ npm i is-data-descriptor --save
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
var isDataDesc = require('is-data-descriptor');
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
`true` when the descriptor has valid properties with valid values.
|
||||
|
||||
```js
|
||||
// `value` can be anything
|
||||
isDataDesc({value: 'foo'})
|
||||
isDataDesc({value: function() {}})
|
||||
isDataDesc({value: true})
|
||||
//=> true
|
||||
```
|
||||
|
||||
`false` when not an object
|
||||
|
||||
```js
|
||||
isDataDesc('a')
|
||||
//=> false
|
||||
isDataDesc(null)
|
||||
//=> false
|
||||
isDataDesc([])
|
||||
//=> false
|
||||
```
|
||||
|
||||
`false` when the object has invalid properties
|
||||
|
||||
```js
|
||||
isDataDesc({value: 'foo', bar: 'baz'})
|
||||
//=> false
|
||||
isDataDesc({value: 'foo', bar: 'baz'})
|
||||
//=> false
|
||||
isDataDesc({value: 'foo', get: function(){}})
|
||||
//=> false
|
||||
isDataDesc({get: function(){}, value: 'foo'})
|
||||
//=> false
|
||||
```
|
||||
|
||||
`false` when a value is not the correct type
|
||||
|
||||
```js
|
||||
isDataDesc({value: 'foo', enumerable: 'foo'})
|
||||
//=> false
|
||||
isDataDesc({value: 'foo', configurable: 'foo'})
|
||||
//=> false
|
||||
isDataDesc({value: 'foo', writable: 'foo'})
|
||||
//=> false
|
||||
```
|
||||
|
||||
## Valid properties
|
||||
|
||||
The only valid data descriptor properties are the following:
|
||||
|
||||
* `configurable` (required)
|
||||
* `enumerable` (required)
|
||||
* `value` (optional)
|
||||
* `writable` (optional)
|
||||
|
||||
To be a valid data descriptor, either `value` or `writable` must be defined.
|
||||
|
||||
**Invalid properties**
|
||||
|
||||
A descriptor may have additional _invalid_ properties (an error will **not** be thrown).
|
||||
|
||||
```js
|
||||
var foo = {};
|
||||
|
||||
Object.defineProperty(foo, 'bar', {
|
||||
enumerable: true,
|
||||
whatever: 'blah', // invalid, but doesn't cause an error
|
||||
get: function() {
|
||||
return 'baz';
|
||||
}
|
||||
});
|
||||
|
||||
console.log(foo.bar);
|
||||
//=> 'baz'
|
||||
```
|
||||
|
||||
## Related projects
|
||||
|
||||
* [is-accessor-descriptor](https://www.npmjs.com/package/is-accessor-descriptor): Returns true if a value has the characteristics of a valid JavaScript accessor descriptor. | [homepage](https://github.com/jonschlinkert/is-accessor-descriptor)
|
||||
* [is-descriptor](https://www.npmjs.com/package/is-descriptor): Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for… [more](https://www.npmjs.com/package/is-descriptor) | [homepage](https://github.com/jonschlinkert/is-descriptor)
|
||||
* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject)
|
||||
|
||||
## Running tests
|
||||
|
||||
Install dev dependencies:
|
||||
|
||||
```sh
|
||||
$ npm i -d && npm test
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/is-data-descriptor/issues/new).
|
||||
|
||||
## Author
|
||||
|
||||
**Jon Schlinkert**
|
||||
|
||||
* [github/jonschlinkert](https://github.com/jonschlinkert)
|
||||
* [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
|
||||
|
||||
## License
|
||||
|
||||
Copyright © 2015 [Jon Schlinkert](https://github.com/jonschlinkert)
|
||||
Released under the MIT license.
|
||||
|
||||
***
|
||||
|
||||
_This file was generated by [verb](https://github.com/verbose/verb) on December 28, 2015._
|
55
node_modules/snapdragon/node_modules/is-data-descriptor/index.js
generated
vendored
Normal file
55
node_modules/snapdragon/node_modules/is-data-descriptor/index.js
generated
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
/*!
|
||||
* is-data-descriptor <https://github.com/jonschlinkert/is-data-descriptor>
|
||||
*
|
||||
* Copyright (c) 2015, Jon Schlinkert.
|
||||
* Licensed under the MIT License.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var typeOf = require('kind-of');
|
||||
|
||||
// data descriptor properties
|
||||
var data = {
|
||||
configurable: 'boolean',
|
||||
enumerable: 'boolean',
|
||||
writable: 'boolean'
|
||||
};
|
||||
|
||||
function isDataDescriptor(obj, prop) {
|
||||
if (typeOf(obj) !== 'object') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (typeof prop === 'string') {
|
||||
var val = Object.getOwnPropertyDescriptor(obj, prop);
|
||||
return typeof val !== 'undefined';
|
||||
}
|
||||
|
||||
if (!('value' in obj) && !('writable' in obj)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (var key in obj) {
|
||||
if (key === 'value') continue;
|
||||
|
||||
if (!data.hasOwnProperty(key)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (typeOf(obj[key]) === data[key]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (typeof obj[key] !== 'undefined') {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose `isDataDescriptor`
|
||||
*/
|
||||
|
||||
module.exports = isDataDescriptor;
|
21
node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of/LICENSE
generated
vendored
Normal file
21
node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014-2017, Jon Schlinkert
|
||||
|
||||
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.
|
261
node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of/README.md
generated
vendored
Normal file
261
node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of/README.md
generated
vendored
Normal file
@ -0,0 +1,261 @@
|
||||
# kind-of [](https://www.npmjs.com/package/kind-of) [](https://npmjs.org/package/kind-of) [](https://npmjs.org/package/kind-of) [](https://travis-ci.org/jonschlinkert/kind-of)
|
||||
|
||||
> Get the native type of a value.
|
||||
|
||||
## Install
|
||||
|
||||
Install with [npm](https://www.npmjs.com/):
|
||||
|
||||
```sh
|
||||
$ npm install --save kind-of
|
||||
```
|
||||
|
||||
## Install
|
||||
|
||||
Install with [bower](https://bower.io/)
|
||||
|
||||
```sh
|
||||
$ bower install kind-of --save
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
> es5, browser and es6 ready
|
||||
|
||||
```js
|
||||
var kindOf = require('kind-of');
|
||||
|
||||
kindOf(undefined);
|
||||
//=> 'undefined'
|
||||
|
||||
kindOf(null);
|
||||
//=> 'null'
|
||||
|
||||
kindOf(true);
|
||||
//=> 'boolean'
|
||||
|
||||
kindOf(false);
|
||||
//=> 'boolean'
|
||||
|
||||
kindOf(new Boolean(true));
|
||||
//=> 'boolean'
|
||||
|
||||
kindOf(new Buffer(''));
|
||||
//=> 'buffer'
|
||||
|
||||
kindOf(42);
|
||||
//=> 'number'
|
||||
|
||||
kindOf(new Number(42));
|
||||
//=> 'number'
|
||||
|
||||
kindOf('str');
|
||||
//=> 'string'
|
||||
|
||||
kindOf(new String('str'));
|
||||
//=> 'string'
|
||||
|
||||
kindOf(arguments);
|
||||
//=> 'arguments'
|
||||
|
||||
kindOf({});
|
||||
//=> 'object'
|
||||
|
||||
kindOf(Object.create(null));
|
||||
//=> 'object'
|
||||
|
||||
kindOf(new Test());
|
||||
//=> 'object'
|
||||
|
||||
kindOf(new Date());
|
||||
//=> 'date'
|
||||
|
||||
kindOf([]);
|
||||
//=> 'array'
|
||||
|
||||
kindOf([1, 2, 3]);
|
||||
//=> 'array'
|
||||
|
||||
kindOf(new Array());
|
||||
//=> 'array'
|
||||
|
||||
kindOf(/foo/);
|
||||
//=> 'regexp'
|
||||
|
||||
kindOf(new RegExp('foo'));
|
||||
//=> 'regexp'
|
||||
|
||||
kindOf(function () {});
|
||||
//=> 'function'
|
||||
|
||||
kindOf(function * () {});
|
||||
//=> 'function'
|
||||
|
||||
kindOf(new Function());
|
||||
//=> 'function'
|
||||
|
||||
kindOf(new Map());
|
||||
//=> 'map'
|
||||
|
||||
kindOf(new WeakMap());
|
||||
//=> 'weakmap'
|
||||
|
||||
kindOf(new Set());
|
||||
//=> 'set'
|
||||
|
||||
kindOf(new WeakSet());
|
||||
//=> 'weakset'
|
||||
|
||||
kindOf(Symbol('str'));
|
||||
//=> 'symbol'
|
||||
|
||||
kindOf(new Int8Array());
|
||||
//=> 'int8array'
|
||||
|
||||
kindOf(new Uint8Array());
|
||||
//=> 'uint8array'
|
||||
|
||||
kindOf(new Uint8ClampedArray());
|
||||
//=> 'uint8clampedarray'
|
||||
|
||||
kindOf(new Int16Array());
|
||||
//=> 'int16array'
|
||||
|
||||
kindOf(new Uint16Array());
|
||||
//=> 'uint16array'
|
||||
|
||||
kindOf(new Int32Array());
|
||||
//=> 'int32array'
|
||||
|
||||
kindOf(new Uint32Array());
|
||||
//=> 'uint32array'
|
||||
|
||||
kindOf(new Float32Array());
|
||||
//=> 'float32array'
|
||||
|
||||
kindOf(new Float64Array());
|
||||
//=> 'float64array'
|
||||
```
|
||||
|
||||
## Benchmarks
|
||||
|
||||
Benchmarked against [typeof](http://github.com/CodingFu/typeof) and [type-of](https://github.com/ForbesLindesay/type-of).
|
||||
Note that performaces is slower for es6 features `Map`, `WeakMap`, `Set` and `WeakSet`.
|
||||
|
||||
```bash
|
||||
#1: array
|
||||
current x 23,329,397 ops/sec ±0.82% (94 runs sampled)
|
||||
lib-type-of x 4,170,273 ops/sec ±0.55% (94 runs sampled)
|
||||
lib-typeof x 9,686,935 ops/sec ±0.59% (98 runs sampled)
|
||||
|
||||
#2: boolean
|
||||
current x 27,197,115 ops/sec ±0.85% (94 runs sampled)
|
||||
lib-type-of x 3,145,791 ops/sec ±0.73% (97 runs sampled)
|
||||
lib-typeof x 9,199,562 ops/sec ±0.44% (99 runs sampled)
|
||||
|
||||
#3: date
|
||||
current x 20,190,117 ops/sec ±0.86% (92 runs sampled)
|
||||
lib-type-of x 5,166,970 ops/sec ±0.74% (94 runs sampled)
|
||||
lib-typeof x 9,610,821 ops/sec ±0.50% (96 runs sampled)
|
||||
|
||||
#4: function
|
||||
current x 23,855,460 ops/sec ±0.60% (97 runs sampled)
|
||||
lib-type-of x 5,667,740 ops/sec ±0.54% (100 runs sampled)
|
||||
lib-typeof x 10,010,644 ops/sec ±0.44% (100 runs sampled)
|
||||
|
||||
#5: null
|
||||
current x 27,061,047 ops/sec ±0.97% (96 runs sampled)
|
||||
lib-type-of x 13,965,573 ops/sec ±0.62% (97 runs sampled)
|
||||
lib-typeof x 8,460,194 ops/sec ±0.61% (97 runs sampled)
|
||||
|
||||
#6: number
|
||||
current x 25,075,682 ops/sec ±0.53% (99 runs sampled)
|
||||
lib-type-of x 2,266,405 ops/sec ±0.41% (98 runs sampled)
|
||||
lib-typeof x 9,821,481 ops/sec ±0.45% (99 runs sampled)
|
||||
|
||||
#7: object
|
||||
current x 3,348,980 ops/sec ±0.49% (99 runs sampled)
|
||||
lib-type-of x 3,245,138 ops/sec ±0.60% (94 runs sampled)
|
||||
lib-typeof x 9,262,952 ops/sec ±0.59% (99 runs sampled)
|
||||
|
||||
#8: regex
|
||||
current x 21,284,827 ops/sec ±0.72% (96 runs sampled)
|
||||
lib-type-of x 4,689,241 ops/sec ±0.43% (100 runs sampled)
|
||||
lib-typeof x 8,957,593 ops/sec ±0.62% (98 runs sampled)
|
||||
|
||||
#9: string
|
||||
current x 25,379,234 ops/sec ±0.58% (96 runs sampled)
|
||||
lib-type-of x 3,635,148 ops/sec ±0.76% (93 runs sampled)
|
||||
lib-typeof x 9,494,134 ops/sec ±0.49% (98 runs sampled)
|
||||
|
||||
#10: undef
|
||||
current x 27,459,221 ops/sec ±1.01% (93 runs sampled)
|
||||
lib-type-of x 14,360,433 ops/sec ±0.52% (99 runs sampled)
|
||||
lib-typeof x 23,202,868 ops/sec ±0.59% (94 runs sampled)
|
||||
|
||||
```
|
||||
|
||||
## Optimizations
|
||||
|
||||
In 7 out of 8 cases, this library is 2x-10x faster than other top libraries included in the benchmarks. There are a few things that lead to this performance advantage, none of them hard and fast rules, but all of them simple and repeatable in almost any code library:
|
||||
|
||||
1. Optimize around the fastest and most common use cases first. Of course, this will change from project-to-project, but I took some time to understand how and why `typeof` checks were being used in my own libraries and other libraries I use a lot.
|
||||
2. Optimize around bottlenecks - In other words, the order in which conditionals are implemented is significant, because each check is only as fast as the failing checks that came before it. Here, the biggest bottleneck by far is checking for plain objects (an object that was created by the `Object` constructor). I opted to make this check happen by process of elimination rather than brute force up front (e.g. by using something like `val.constructor.name`), so that every other type check would not be penalized it.
|
||||
3. Don't do uneccessary processing - why do `.slice(8, -1).toLowerCase();` just to get the word `regex`? It's much faster to do `if (type === '[object RegExp]') return 'regex'`
|
||||
|
||||
## About
|
||||
|
||||
### Related projects
|
||||
|
||||
* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet")
|
||||
* [is-number](https://www.npmjs.com/package/is-number): Returns true if the value is a number. comprehensive tests. | [homepage](https://github.com/jonschlinkert/is-number "Returns true if the value is a number. comprehensive tests.")
|
||||
* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ")
|
||||
|
||||
### Contributing
|
||||
|
||||
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
|
||||
|
||||
### Contributors
|
||||
|
||||
| **Commits** | **Contributor** |
|
||||
| --- | --- |
|
||||
| 59 | [jonschlinkert](https://github.com/jonschlinkert) |
|
||||
| 2 | [miguelmota](https://github.com/miguelmota) |
|
||||
| 1 | [dtothefp](https://github.com/dtothefp) |
|
||||
| 1 | [ksheedlo](https://github.com/ksheedlo) |
|
||||
| 1 | [pdehaan](https://github.com/pdehaan) |
|
||||
| 1 | [laggingreflex](https://github.com/laggingreflex) |
|
||||
|
||||
### Building docs
|
||||
|
||||
_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
|
||||
|
||||
To generate the readme, run the following command:
|
||||
|
||||
```sh
|
||||
$ npm install -g verbose/verb#dev verb-generate-readme && verb
|
||||
```
|
||||
|
||||
### Running tests
|
||||
|
||||
Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
|
||||
|
||||
```sh
|
||||
$ npm install && npm test
|
||||
```
|
||||
|
||||
### Author
|
||||
|
||||
**Jon Schlinkert**
|
||||
|
||||
* [github/jonschlinkert](https://github.com/jonschlinkert)
|
||||
* [twitter/jonschlinkert](https://twitter.com/jonschlinkert)
|
||||
|
||||
### License
|
||||
|
||||
Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert).
|
||||
Released under the [MIT License](LICENSE).
|
||||
|
||||
***
|
||||
|
||||
_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on May 16, 2017._
|
116
node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of/index.js
generated
vendored
Normal file
116
node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of/index.js
generated
vendored
Normal file
@ -0,0 +1,116 @@
|
||||
var isBuffer = require('is-buffer');
|
||||
var toString = Object.prototype.toString;
|
||||
|
||||
/**
|
||||
* Get the native `typeof` a value.
|
||||
*
|
||||
* @param {*} `val`
|
||||
* @return {*} Native javascript type
|
||||
*/
|
||||
|
||||
module.exports = function kindOf(val) {
|
||||
// primitivies
|
||||
if (typeof val === 'undefined') {
|
||||
return 'undefined';
|
||||
}
|
||||
if (val === null) {
|
||||
return 'null';
|
||||
}
|
||||
if (val === true || val === false || val instanceof Boolean) {
|
||||
return 'boolean';
|
||||
}
|
||||
if (typeof val === 'string' || val instanceof String) {
|
||||
return 'string';
|
||||
}
|
||||
if (typeof val === 'number' || val instanceof Number) {
|
||||
return 'number';
|
||||
}
|
||||
|
||||
// functions
|
||||
if (typeof val === 'function' || val instanceof Function) {
|
||||
return 'function';
|
||||
}
|
||||
|
||||
// array
|
||||
if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {
|
||||
return 'array';
|
||||
}
|
||||
|
||||
// check for instances of RegExp and Date before calling `toString`
|
||||
if (val instanceof RegExp) {
|
||||
return 'regexp';
|
||||
}
|
||||
if (val instanceof Date) {
|
||||
return 'date';
|
||||
}
|
||||
|
||||
// other objects
|
||||
var type = toString.call(val);
|
||||
|
||||
if (type === '[object RegExp]') {
|
||||
return 'regexp';
|
||||
}
|
||||
if (type === '[object Date]') {
|
||||
return 'date';
|
||||
}
|
||||
if (type === '[object Arguments]') {
|
||||
return 'arguments';
|
||||
}
|
||||
if (type === '[object Error]') {
|
||||
return 'error';
|
||||
}
|
||||
|
||||
// buffer
|
||||
if (isBuffer(val)) {
|
||||
return 'buffer';
|
||||
}
|
||||
|
||||
// es6: Map, WeakMap, Set, WeakSet
|
||||
if (type === '[object Set]') {
|
||||
return 'set';
|
||||
}
|
||||
if (type === '[object WeakSet]') {
|
||||
return 'weakset';
|
||||
}
|
||||
if (type === '[object Map]') {
|
||||
return 'map';
|
||||
}
|
||||
if (type === '[object WeakMap]') {
|
||||
return 'weakmap';
|
||||
}
|
||||
if (type === '[object Symbol]') {
|
||||
return 'symbol';
|
||||
}
|
||||
|
||||
// typed arrays
|
||||
if (type === '[object Int8Array]') {
|
||||
return 'int8array';
|
||||
}
|
||||
if (type === '[object Uint8Array]') {
|
||||
return 'uint8array';
|
||||
}
|
||||
if (type === '[object Uint8ClampedArray]') {
|
||||
return 'uint8clampedarray';
|
||||
}
|
||||
if (type === '[object Int16Array]') {
|
||||
return 'int16array';
|
||||
}
|
||||
if (type === '[object Uint16Array]') {
|
||||
return 'uint16array';
|
||||
}
|
||||
if (type === '[object Int32Array]') {
|
||||
return 'int32array';
|
||||
}
|
||||
if (type === '[object Uint32Array]') {
|
||||
return 'uint32array';
|
||||
}
|
||||
if (type === '[object Float32Array]') {
|
||||
return 'float32array';
|
||||
}
|
||||
if (type === '[object Float64Array]') {
|
||||
return 'float64array';
|
||||
}
|
||||
|
||||
// must be a plain object
|
||||
return 'object';
|
||||
};
|
90
node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of/package.json
generated
vendored
Normal file
90
node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of/package.json
generated
vendored
Normal file
@ -0,0 +1,90 @@
|
||||
{
|
||||
"name": "kind-of",
|
||||
"description": "Get the native type of a value.",
|
||||
"version": "3.2.2",
|
||||
"homepage": "https://github.com/jonschlinkert/kind-of",
|
||||
"author": "Jon Schlinkert (https://github.com/jonschlinkert)",
|
||||
"contributors": [
|
||||
"David Fox-Powell (https://dtothefp.github.io/me)",
|
||||
"Jon Schlinkert (http://twitter.com/jonschlinkert)",
|
||||
"Ken Sheedlo (kensheedlo.com)",
|
||||
"laggingreflex (https://github.com/laggingreflex)",
|
||||
"Miguel Mota (https://miguelmota.com)",
|
||||
"Peter deHaan (http://about.me/peterdehaan)"
|
||||
],
|
||||
"repository": "jonschlinkert/kind-of",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jonschlinkert/kind-of/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"main": "index.js",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha",
|
||||
"prepublish": "browserify -o browser.js -e index.js -s index --bare"
|
||||
},
|
||||
"dependencies": {
|
||||
"is-buffer": "^1.1.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ansi-bold": "^0.1.1",
|
||||
"benchmarked": "^1.0.0",
|
||||
"browserify": "^14.3.0",
|
||||
"glob": "^7.1.1",
|
||||
"gulp-format-md": "^0.1.12",
|
||||
"mocha": "^3.3.0",
|
||||
"type-of": "^2.0.1",
|
||||
"typeof": "^1.0.0"
|
||||
},
|
||||
"keywords": [
|
||||
"arguments",
|
||||
"array",
|
||||
"boolean",
|
||||
"check",
|
||||
"date",
|
||||
"function",
|
||||
"is",
|
||||
"is-type",
|
||||
"is-type-of",
|
||||
"kind",
|
||||
"kind-of",
|
||||
"number",
|
||||
"object",
|
||||
"of",
|
||||
"regexp",
|
||||
"string",
|
||||
"test",
|
||||
"type",
|
||||
"type-of",
|
||||
"typeof",
|
||||
"types"
|
||||
],
|
||||
"verb": {
|
||||
"related": {
|
||||
"list": [
|
||||
"is-glob",
|
||||
"is-number",
|
||||
"is-primitive"
|
||||
]
|
||||
},
|
||||
"toc": false,
|
||||
"layout": "default",
|
||||
"tasks": [
|
||||
"readme"
|
||||
],
|
||||
"plugins": [
|
||||
"gulp-format-md"
|
||||
],
|
||||
"lint": {
|
||||
"reflinks": true
|
||||
},
|
||||
"reflinks": [
|
||||
"verb"
|
||||
]
|
||||
}
|
||||
}
|
60
node_modules/snapdragon/node_modules/is-data-descriptor/package.json
generated
vendored
Normal file
60
node_modules/snapdragon/node_modules/is-data-descriptor/package.json
generated
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
{
|
||||
"name": "is-data-descriptor",
|
||||
"description": "Returns true if a value has the characteristics of a valid JavaScript data descriptor.",
|
||||
"version": "0.1.4",
|
||||
"homepage": "https://github.com/jonschlinkert/is-data-descriptor",
|
||||
"author": "Jon Schlinkert (https://github.com/jonschlinkert)",
|
||||
"repository": "jonschlinkert/is-data-descriptor",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jonschlinkert/is-data-descriptor/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"main": "index.js",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha"
|
||||
},
|
||||
"dependencies": {
|
||||
"kind-of": "^3.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"mocha": "*",
|
||||
"should": "*"
|
||||
},
|
||||
"keywords": [
|
||||
"accessor",
|
||||
"check",
|
||||
"data",
|
||||
"descriptor",
|
||||
"get",
|
||||
"getter",
|
||||
"is",
|
||||
"keys",
|
||||
"object",
|
||||
"properties",
|
||||
"property",
|
||||
"set",
|
||||
"setter",
|
||||
"type",
|
||||
"valid",
|
||||
"value"
|
||||
],
|
||||
"verb": {
|
||||
"related": {
|
||||
"list": [
|
||||
"is-accessor-descriptor",
|
||||
"is-data-descriptor",
|
||||
"is-descriptor",
|
||||
"isobject"
|
||||
]
|
||||
},
|
||||
"plugins": [
|
||||
"gulp-format-md"
|
||||
]
|
||||
}
|
||||
}
|
21
node_modules/snapdragon/node_modules/is-descriptor/LICENSE
generated
vendored
Normal file
21
node_modules/snapdragon/node_modules/is-descriptor/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015-2017, Jon Schlinkert.
|
||||
|
||||
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.
|
193
node_modules/snapdragon/node_modules/is-descriptor/README.md
generated
vendored
Normal file
193
node_modules/snapdragon/node_modules/is-descriptor/README.md
generated
vendored
Normal file
@ -0,0 +1,193 @@
|
||||
# is-descriptor [](https://www.npmjs.com/package/is-descriptor) [](https://npmjs.org/package/is-descriptor) [](https://npmjs.org/package/is-descriptor) [](https://travis-ci.org/jonschlinkert/is-descriptor)
|
||||
|
||||
> Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for data descriptors and accessor descriptors.
|
||||
|
||||
## Install
|
||||
|
||||
Install with [npm](https://www.npmjs.com/):
|
||||
|
||||
```sh
|
||||
$ npm install --save is-descriptor
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
var isDescriptor = require('is-descriptor');
|
||||
|
||||
isDescriptor({value: 'foo'})
|
||||
//=> true
|
||||
isDescriptor({get: function(){}, set: function(){}})
|
||||
//=> true
|
||||
isDescriptor({get: 'foo', set: function(){}})
|
||||
//=> false
|
||||
```
|
||||
|
||||
You may also check for a descriptor by passing an object as the first argument and property name (`string`) as the second argument.
|
||||
|
||||
```js
|
||||
var obj = {};
|
||||
obj.foo = 'abc';
|
||||
|
||||
Object.defineProperty(obj, 'bar', {
|
||||
value: 'xyz'
|
||||
});
|
||||
|
||||
isDescriptor(obj, 'foo');
|
||||
//=> true
|
||||
isDescriptor(obj, 'bar');
|
||||
//=> true
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
### value type
|
||||
|
||||
`false` when not an object
|
||||
|
||||
```js
|
||||
isDescriptor('a');
|
||||
//=> false
|
||||
isDescriptor(null);
|
||||
//=> false
|
||||
isDescriptor([]);
|
||||
//=> false
|
||||
```
|
||||
|
||||
### data descriptor
|
||||
|
||||
`true` when the object has valid properties with valid values.
|
||||
|
||||
```js
|
||||
isDescriptor({value: 'foo'});
|
||||
//=> true
|
||||
isDescriptor({value: noop});
|
||||
//=> true
|
||||
```
|
||||
|
||||
`false` when the object has invalid properties
|
||||
|
||||
```js
|
||||
isDescriptor({value: 'foo', bar: 'baz'});
|
||||
//=> false
|
||||
isDescriptor({value: 'foo', bar: 'baz'});
|
||||
//=> false
|
||||
isDescriptor({value: 'foo', get: noop});
|
||||
//=> false
|
||||
isDescriptor({get: noop, value: noop});
|
||||
//=> false
|
||||
```
|
||||
|
||||
`false` when a value is not the correct type
|
||||
|
||||
```js
|
||||
isDescriptor({value: 'foo', enumerable: 'foo'});
|
||||
//=> false
|
||||
isDescriptor({value: 'foo', configurable: 'foo'});
|
||||
//=> false
|
||||
isDescriptor({value: 'foo', writable: 'foo'});
|
||||
//=> false
|
||||
```
|
||||
|
||||
### accessor descriptor
|
||||
|
||||
`true` when the object has valid properties with valid values.
|
||||
|
||||
```js
|
||||
isDescriptor({get: noop, set: noop});
|
||||
//=> true
|
||||
isDescriptor({get: noop});
|
||||
//=> true
|
||||
isDescriptor({set: noop});
|
||||
//=> true
|
||||
```
|
||||
|
||||
`false` when the object has invalid properties
|
||||
|
||||
```js
|
||||
isDescriptor({get: noop, set: noop, bar: 'baz'});
|
||||
//=> false
|
||||
isDescriptor({get: noop, writable: true});
|
||||
//=> false
|
||||
isDescriptor({get: noop, value: true});
|
||||
//=> false
|
||||
```
|
||||
|
||||
`false` when an accessor is not a function
|
||||
|
||||
```js
|
||||
isDescriptor({get: noop, set: 'baz'});
|
||||
//=> false
|
||||
isDescriptor({get: 'foo', set: noop});
|
||||
//=> false
|
||||
isDescriptor({get: 'foo', bar: 'baz'});
|
||||
//=> false
|
||||
isDescriptor({get: 'foo', set: 'baz'});
|
||||
//=> false
|
||||
```
|
||||
|
||||
`false` when a value is not the correct type
|
||||
|
||||
```js
|
||||
isDescriptor({get: noop, set: noop, enumerable: 'foo'});
|
||||
//=> false
|
||||
isDescriptor({set: noop, configurable: 'foo'});
|
||||
//=> false
|
||||
isDescriptor({get: noop, configurable: 'foo'});
|
||||
//=> false
|
||||
```
|
||||
|
||||
## About
|
||||
|
||||
### Related projects
|
||||
|
||||
* [is-accessor-descriptor](https://www.npmjs.com/package/is-accessor-descriptor): Returns true if a value has the characteristics of a valid JavaScript accessor descriptor. | [homepage](https://github.com/jonschlinkert/is-accessor-descriptor "Returns true if a value has the characteristics of a valid JavaScript accessor descriptor.")
|
||||
* [is-data-descriptor](https://www.npmjs.com/package/is-data-descriptor): Returns true if a value has the characteristics of a valid JavaScript data descriptor. | [homepage](https://github.com/jonschlinkert/is-data-descriptor "Returns true if a value has the characteristics of a valid JavaScript data descriptor.")
|
||||
* [is-descriptor](https://www.npmjs.com/package/is-descriptor): Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for… [more](https://github.com/jonschlinkert/is-descriptor) | [homepage](https://github.com/jonschlinkert/is-descriptor "Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for data descriptors and accessor descriptors.")
|
||||
* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.")
|
||||
|
||||
### Contributing
|
||||
|
||||
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
|
||||
|
||||
### Contributors
|
||||
|
||||
| **Commits** | **Contributor** |
|
||||
| --- | --- |
|
||||
| 24 | [jonschlinkert](https://github.com/jonschlinkert) |
|
||||
| 1 | [doowb](https://github.com/doowb) |
|
||||
| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) |
|
||||
|
||||
### Building docs
|
||||
|
||||
_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
|
||||
|
||||
To generate the readme, run the following command:
|
||||
|
||||
```sh
|
||||
$ npm install -g verbose/verb#dev verb-generate-readme && verb
|
||||
```
|
||||
|
||||
### Running tests
|
||||
|
||||
Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
|
||||
|
||||
```sh
|
||||
$ npm install && npm test
|
||||
```
|
||||
|
||||
### Author
|
||||
|
||||
**Jon Schlinkert**
|
||||
|
||||
* [github/jonschlinkert](https://github.com/jonschlinkert)
|
||||
* [twitter/jonschlinkert](https://twitter.com/jonschlinkert)
|
||||
|
||||
### License
|
||||
|
||||
Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert).
|
||||
Released under the [MIT License](LICENSE).
|
||||
|
||||
***
|
||||
|
||||
_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on July 22, 2017._
|
22
node_modules/snapdragon/node_modules/is-descriptor/index.js
generated
vendored
Normal file
22
node_modules/snapdragon/node_modules/is-descriptor/index.js
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
/*!
|
||||
* is-descriptor <https://github.com/jonschlinkert/is-descriptor>
|
||||
*
|
||||
* Copyright (c) 2015-2017, Jon Schlinkert.
|
||||
* Released under the MIT License.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var typeOf = require('kind-of');
|
||||
var isAccessor = require('is-accessor-descriptor');
|
||||
var isData = require('is-data-descriptor');
|
||||
|
||||
module.exports = function isDescriptor(obj, key) {
|
||||
if (typeOf(obj) !== 'object') {
|
||||
return false;
|
||||
}
|
||||
if ('get' in obj) {
|
||||
return isAccessor(obj, key);
|
||||
}
|
||||
return isData(obj, key);
|
||||
};
|
75
node_modules/snapdragon/node_modules/is-descriptor/package.json
generated
vendored
Normal file
75
node_modules/snapdragon/node_modules/is-descriptor/package.json
generated
vendored
Normal file
@ -0,0 +1,75 @@
|
||||
{
|
||||
"name": "is-descriptor",
|
||||
"description": "Returns true if a value has the characteristics of a valid JavaScript descriptor. Works for data descriptors and accessor descriptors.",
|
||||
"version": "0.1.6",
|
||||
"homepage": "https://github.com/jonschlinkert/is-descriptor",
|
||||
"author": "Jon Schlinkert (https://github.com/jonschlinkert)",
|
||||
"contributors": [
|
||||
"Brian Woodward (https://twitter.com/doowb)",
|
||||
"Jon Schlinkert (http://twitter.com/jonschlinkert)",
|
||||
"(https://github.com/wtgtybhertgeghgtwtg)"
|
||||
],
|
||||
"repository": "jonschlinkert/is-descriptor",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jonschlinkert/is-descriptor/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"main": "index.js",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha"
|
||||
},
|
||||
"dependencies": {
|
||||
"is-accessor-descriptor": "^0.1.6",
|
||||
"is-data-descriptor": "^0.1.4",
|
||||
"kind-of": "^5.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"gulp-format-md": "^1.0.0",
|
||||
"mocha": "^3.4.2"
|
||||
},
|
||||
"keywords": [
|
||||
"accessor",
|
||||
"check",
|
||||
"data",
|
||||
"descriptor",
|
||||
"get",
|
||||
"getter",
|
||||
"is",
|
||||
"keys",
|
||||
"object",
|
||||
"properties",
|
||||
"property",
|
||||
"set",
|
||||
"setter",
|
||||
"type",
|
||||
"valid",
|
||||
"value"
|
||||
],
|
||||
"verb": {
|
||||
"related": {
|
||||
"list": [
|
||||
"is-accessor-descriptor",
|
||||
"is-data-descriptor",
|
||||
"is-descriptor",
|
||||
"isobject"
|
||||
]
|
||||
},
|
||||
"plugins": [
|
||||
"gulp-format-md"
|
||||
],
|
||||
"toc": false,
|
||||
"layout": "default",
|
||||
"tasks": [
|
||||
"readme"
|
||||
],
|
||||
"lint": {
|
||||
"reflinks": true
|
||||
}
|
||||
}
|
||||
}
|
79
node_modules/snapdragon/package.json
generated
vendored
Normal file
79
node_modules/snapdragon/package.json
generated
vendored
Normal file
@ -0,0 +1,79 @@
|
||||
{
|
||||
"name": "snapdragon",
|
||||
"description": "Fast, pluggable and easy-to-use parser-renderer factory.",
|
||||
"version": "0.8.2",
|
||||
"homepage": "https://github.com/jonschlinkert/snapdragon",
|
||||
"author": "Jon Schlinkert (https://github.com/jonschlinkert)",
|
||||
"contributors": [
|
||||
"Brian Woodward (https://twitter.com/doowb)",
|
||||
"Edward Betts (http://edwardbetts.com)",
|
||||
"Jon Schlinkert (http://twitter.com/jonschlinkert)"
|
||||
],
|
||||
"repository": "jonschlinkert/snapdragon",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jonschlinkert/snapdragon/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"index.js",
|
||||
"lib"
|
||||
],
|
||||
"main": "index.js",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha"
|
||||
},
|
||||
"dependencies": {
|
||||
"base": "^0.11.1",
|
||||
"debug": "^2.2.0",
|
||||
"define-property": "^0.2.5",
|
||||
"extend-shallow": "^2.0.1",
|
||||
"map-cache": "^0.2.2",
|
||||
"source-map": "^0.5.6",
|
||||
"source-map-resolve": "^0.5.0",
|
||||
"use": "^3.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"gulp": "^3.9.1",
|
||||
"gulp-eslint": "^3.0.1",
|
||||
"gulp-format-md": "^0.1.10",
|
||||
"gulp-istanbul": "^1.1.1",
|
||||
"gulp-mocha": "^3.0.1",
|
||||
"gulp-unused": "^0.2.0",
|
||||
"mocha": "^3.0.2"
|
||||
},
|
||||
"keywords": [
|
||||
"lexer",
|
||||
"snapdragon"
|
||||
],
|
||||
"verb": {
|
||||
"toc": false,
|
||||
"layout": "default",
|
||||
"tasks": [
|
||||
"readme"
|
||||
],
|
||||
"plugins": [
|
||||
"gulp-format-md"
|
||||
],
|
||||
"related": {
|
||||
"description": "These libraries use snapdragon:",
|
||||
"list": [
|
||||
"braces",
|
||||
"expand-brackets",
|
||||
"extglob",
|
||||
"micromatch"
|
||||
]
|
||||
},
|
||||
"reflinks": [
|
||||
"css",
|
||||
"pug",
|
||||
"verb",
|
||||
"verb-generate-readme"
|
||||
],
|
||||
"lint": {
|
||||
"reflinks": true
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user