From 577957b6b18d1d53534091765198dd4169ff4e2a Mon Sep 17 00:00:00 2001 From: Mike Petrovich Date: Mon, 22 May 2017 09:47:26 -0400 Subject: [PATCH] Copy code from Instadoc/instadoc --- .gitignore | 3 + .travis.yml | 5 + README.md | 3 +- gulpfile.js | 7 + index.js | 4 + package.json | 36 + src/doc.js | 175 +++++ src/parser.js | 194 ++++++ test/comprehensive/expected.md | 77 ++ test/comprehensive/input.txt | 130 ++++ test/comprehensive/test.js | 31 + test/handlebars/expected.md | 10 + test/handlebars/input.txt | 15 + test/handlebars/test.js | 23 + test/jsx/expected.md | 10 + test/jsx/input.txt | 15 + test/jsx/test.js | 23 + test/markdown/expected.md | 12 + test/markdown/input.txt | 24 + test/markdown/test.js | 33 + test/multiple/expected-1.md | 24 + test/multiple/expected-2.md | 33 + test/multiple/input.txt | 94 +++ test/multiple/test.js | 66 ++ test/table/input.txt | 12 + test/table/test.js | 37 + yarn.lock | 1200 ++++++++++++++++++++++++++++++++ 27 files changed, 2295 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 gulpfile.js create mode 100644 index.js create mode 100644 package.json create mode 100644 src/doc.js create mode 100644 src/parser.js create mode 100644 test/comprehensive/expected.md create mode 100644 test/comprehensive/input.txt create mode 100644 test/comprehensive/test.js create mode 100644 test/handlebars/expected.md create mode 100644 test/handlebars/input.txt create mode 100644 test/handlebars/test.js create mode 100644 test/jsx/expected.md create mode 100644 test/jsx/input.txt create mode 100644 test/jsx/test.js create mode 100644 test/markdown/expected.md create mode 100644 test/markdown/input.txt create mode 100644 test/markdown/test.js create mode 100644 test/multiple/expected-1.md create mode 100644 test/multiple/expected-2.md create mode 100644 test/multiple/input.txt create mode 100644 test/multiple/test.js create mode 100644 test/table/input.txt create mode 100644 test/table/test.js create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f6a04e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +.DS_STORE +npm-debug.log diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..e9b4c50 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: +- 6 +before_script: +- npm install -g gulp diff --git a/README.md b/README.md index f4a0692..6112936 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ -# livingstyleguides +livingstyleguides   [![Build Status](https://travis-ci.org/Instadoc/livingstyleguides.svg?branch=master)](https://travis-ci.org/Instadoc/livingstyleguides) +================= Documentation extractor for living style guides diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..866ff7a --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,7 @@ +var gulp = require('gulp'); +var mocha = require('gulp-mocha'); + +gulp.task('test', function () { + return gulp.src('test/**/*test.js', { read: false }) + .pipe(mocha({ reporter: 'spec' })); +}); diff --git a/index.js b/index.js new file mode 100644 index 0000000..5b053ff --- /dev/null +++ b/index.js @@ -0,0 +1,4 @@ +var rfr = require('rfr'); +var Parser = rfr('src/parser'); + +module.exports = new Parser(); diff --git a/package.json b/package.json new file mode 100644 index 0000000..b66bb79 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "livingstyleguides", + "version": "0.0.0", + "description": "Documentation extractor for living style guides", + "keywords": [ + "livingstyleguide", + "living style guide", + "style guide", + "component library", + "design pattern" + ], + "main": "index.js", + "scripts": { + "test": "gulp test" + }, + "homepage": "https://github.com/Instadoc/livingstyleguides", + "repository": "https://github.com/Instadoc/livingstyleguides.git", + "bugs": { + "url": "https://github.com/Instadoc/livingstyleguides/issues" + }, + "author": "Mike Petrovich ", + "license": "MIT", + "bundleDependencies": [ + "rfr" + ], + "dependencies": { + "gray-matter": "^2.1.1", + "lodash": "^4.17.2", + "rfr": "^1.2.3" + }, + "devDependencies": { + "chai": "^1.10.0", + "gulp": "^3.8.10", + "gulp-mocha": "^2.0.0" + } +} diff --git a/src/doc.js b/src/doc.js new file mode 100644 index 0000000..0033d42 --- /dev/null +++ b/src/doc.js @@ -0,0 +1,175 @@ +var _ = require('lodash'); + +/** + * @constructs + */ +function Doc() {} + +/* --------------------------------------------------------------------- + * Public + * --------------------------------------------------------------------- */ + +/** + * @static + * @param {Array} docs + * @return {Array} + */ +Doc.merge = function(docs) { + var docsGroupedByName = _.groupBy(docs, 'name'); + + var docsMerged = _.map(docsGroupedByName, function(docsToMerge) { + var docMerged = new Doc(); + + _.forEach(docsToMerge, function(doc) { + docMerged.import(doc); + }); + + return docMerged; + }); + + return docsMerged; +}; + +/** + * @return {String} + */ +Doc.prototype.getName = function() { + return this.name; +}; + +/** + * @param {String} name + */ +Doc.prototype.setName = function(name) { + this.name = name; +}; + +/** + * @return {String} + */ +Doc.prototype.getCategory = function() { + return this.category; +}; + +/** + * @param {String} category + */ +Doc.prototype.setCategory = function(category) { + this.category = category; +}; + +/** + * @return {String} + */ +Doc.prototype.getDescription = function() { + return this.description; +}; + +/** + * @param {String} description + */ +Doc.prototype.setDescription = function(description) { + this.description = description; +}; + +/** + * @return {Object} + */ +Doc.prototype.getExamples = function() { + return this.examples || {}; +}; + +/** + * @param {String} name + * @param {Array.} codeBlocks + * @param {String} codeBlocks[i].syntax + * @param {String} codeBlocks[i].code + * @param {Boolean} [codeBlocks[i].hidden] + * @param {Object} [options] + * @param {Number} [options.height] + */ +Doc.prototype.addExample = function(name, codeBlocks, options) { + this.examples = this.examples || {}; + this.examples[name] = { + codeBlocks: codeBlocks, + options: options || {}, + }; +}; + +/** + * @return {Object} Set of key-value pairs + */ +Doc.prototype.getMeta = function() { + return this.meta || {}; +}; + +/** + * @param {String} key + * @param {*} value + */ +Doc.prototype.addMeta = function(key, value) { + this.meta = this.meta || {}; + + if (this.meta[key]) { + this.meta[key].push(value); + } + else { + this.meta[key] = [value]; + } +}; + +/** + * @return {String} + */ +Doc.prototype.getSource = function() { + return this.source; +}; + +/** + * @param {String} source + */ +Doc.prototype.setSource = function(source) { + this.source = source; +}; + +/** + * @return {String} + */ +Doc.prototype.getFilepath = function() { + return this.filepath; +}; + +/** + * @param {String} filepath + */ +Doc.prototype.setFilepath = function(filepath) { + this.filepath = filepath; +}; + +/** + * @param {Doc} doc + */ +Doc.prototype.import = function(doc) { + var self = this; + + this.name = doc.name; + this.category = doc.category || this.category; + this.source = doc.source || this.source; + this.filepath = doc.filepath || this.filepath; + + if (doc.description) { + var description = this.description ? this.description + '\n\n' : ''; + this.description = description + doc.description; + } + + _.each(doc.getExamples(), function(example, name) { + self.addExample(name, example.codeBlocks, example.options); + }); + _.each(doc.getMeta(), function(meta, key) { + _.each(meta, function(value) { + self.addMeta(key, value); + }); + }); +}; + +module.exports = Doc; diff --git a/src/parser.js b/src/parser.js new file mode 100644 index 0000000..a9e6c6e --- /dev/null +++ b/src/parser.js @@ -0,0 +1,194 @@ +var rfr = require('rfr'); +var _ = require('lodash'); +var Doc = rfr('src/doc'); +var matter = require('gray-matter'); + +/** + * @constructs + */ +function Parser() {} + +/* --------------------------------------------------------------------- + * Public + * --------------------------------------------------------------------- */ + +/** + * Parses docs from source content. + * + * @param {String} source + * @param {String} [syntax] + * @return {Array.} + */ +Parser.prototype.parse = function(content, syntax) { + var commentBlocks = getCommentBlocks(content, syntax); + var docs = _.map(commentBlocks, function(commentBlock) { + return parseMarkdown(commentBlock); + }); + docs = _.flatten(docs); + docs = Doc.merge(docs); + + return docs; +}; + +/* --------------------------------------------------------------------- + * Private + * --------------------------------------------------------------------- */ + +function getCommentBlocks(content, syntax) { + var commentBlocks; + + if (syntax === 'markdown') { + commentBlocks = [content]; + } + else { + commentBlocks = getJsCommentBlocks(content); + } + + return commentBlocks; +} + +function getJsCommentBlocks(content) { + var commentBlockRegex = /\/\*([\s\S]+?)\*\//g; + var commentBlocks = content.match(commentBlockRegex); + + commentBlocks = _.map(commentBlocks, function(commentBlock) { + // Removes comment block start/end dividers such as *** + return /\/\*[\s\*]*([\s\S]+?)\n?[\s\*]*\*\//g.exec(commentBlock)[1]; + }); + + return commentBlocks; +} + +function parseMarkdown(content) { + var docs = []; + var doc = new Doc(); + var parsed = matter(content); + var name; + + if (parsed.data.name) { + name = parsed.data.name; + } + else { + // No name available or inferrable, so bailing + return docs; + } + + doc.setName(name); + doc.setCategory(parsed.data.category); + + var metas = _.omit(parsed.data, ['name', 'category']) + + _.forEach(metas, function(meta, key) { + if (_.isArray(meta)) { + _.forEach(meta, function(value) { + doc.addMeta(key, value); + }); + } + else { + doc.addMeta(key, meta); + } + }); + + var description = parseDescriptionMarkdown(parsed.content, doc); + doc.setDescription(description); + + docs = [doc]; + + return docs; +} + +function parseDescriptionMarkdown(markdown, doc) { + var description = markdown; + + description = description.trim(); + + // Unescapes leading escaped @ symbols + description = description.replace(/^\\@/gm, '@'); + + // Replaces escaped pipes '\|' with '|' to allow pipe characters in Markdown table cells + // @see http://stackoverflow.com/questions/17319940/how-to-escape-a-pipe-char-in-a-code-statement-in-a-markdown-table/17320389#17320389 + description = description.replace(/\\\|/g, '|'); + + // Replaces escaped '\<' with 'lt;' + description = description.replace(/\\ tags for renderable HTML examples + _.forEach(doc.getExamples(), function(example, name) { + var exampleHtml = example.options.height + ? '\n' + : '\n'; + + description = description.replace( + new RegExp('```' + name + '\.(html|jsx|handlebars|hbs)', 'gm'), + function(match, extension) { + if (hasExample[name]) { + return '```' + extension; + } + else { + hasExample[name] = true; + return exampleHtml + '```' + extension; + } + } + ); + }); + + // Removes hidden blocks + description = description.replace(/\n?```[^\n]+hidden(?:.*\n)+?```/g, ''); + + // Removes custom block annotations + description = description.replace(/```([^\.\s,]+)\.(\w+)(?:,(\S+))?/g, '```$2'); + + return description; +} + +module.exports = Parser; diff --git a/test/comprehensive/expected.md b/test/comprehensive/expected.md new file mode 100644 index 0000000..d23c0e0 --- /dev/null +++ b/test/comprehensive/expected.md @@ -0,0 +1,77 @@ +Inspired by the excellent jQuery.tipsy plugin written by Jason Frame; Tooltips are an updated version, which don't rely on images, use CSS3 for animations, and data-attributes for local title storage. + +Tooltips with zero-length titles are never displayed. + +Examples +-------- +Hover over the links below to see tooltips: + + + +### Static tooltip +Four options are available: top, right, bottom, and left aligned. + + + +### Four directions + + +```html + + + + + + + +``` + +#### Opt-in functionality +For performance reasons, the Tooltip and Popover data-apis are opt-in, meaning you must initialize them yourself. + +One way to initialize all tooltips on a page would be to select them by their data-toggle attribute: +```js +$(function () { + $('[data-toggle="tooltip"]').tooltip() +}) +``` + +Usage +----- +The tooltip plugin generates content and markup on demand, and by default places tooltips after their trigger element. + +Trigger the tooltip via JavaScript: +```js +$('#example').tooltip(options) +``` + +Markup +------ +The required markup for a tooltip is only a `data` attribute and `title` on the HTML element you wish to have a tooltip. The generated markup of a tooltip is rather simple, though it does require a position (by default, set to `top` by the plugin). + +```html + +Hover over me + + + +``` + +Interactive example +------------------- + +To use an @ symbol at the start of a line within the description, simply escape it with a backslash like so: +@example This will be in the description +@category This will be too + +But escaped @ symbols occurring NOT at the beginning (like this one \@) should remain escaped. + + +```html + +``` \ No newline at end of file diff --git a/test/comprehensive/input.txt b/test/comprehensive/input.txt new file mode 100644 index 0000000..1d3e448 --- /dev/null +++ b/test/comprehensive/input.txt @@ -0,0 +1,130 @@ +/* +--- +name: Tooltip +category: JavaScript +--- + +Inspired by the excellent jQuery.tipsy plugin written by Jason Frame; Tooltips are an updated version, which don't rely on images, use CSS3 for animations, and data-attributes for local title storage. + +Tooltips with zero-length titles are never displayed. + +Examples +-------- +Hover over the links below to see tooltips: + +```example.html hidden +

Tight pants next level keffiyeh you probably haven't heard of them. Photo booth beard raw denim letterpress vegan messenger bag stumptown. Farm-to-table seitan, mcsweeney's fixie sustainable quinoa 8-bit american apparel have a terry richardson vinyl chambray. Beard stumptown, cardigans banh mi lomo thundercats. Tofu biodiesel williamsburg marfa, four loko mcsweeney's cleanse vegan chambray. A really ironic artisan whatever keytar, scenester farm-to-table banksy Austin twitter handle freegan cred raw denim single-origin coffee viral.

+``` +```example.js hidden +$(function () { + $('[data-toggle="tooltip"]').tooltip() +}) +``` + +### Static tooltip +Four options are available: top, right, bottom, and left aligned. + +```static.html hidden height=50 + + + + +``` + +### Four directions + +```static-directions.html + + + + + + + +``` +```static-directions.js hidden +$(function () { + $('[data-toggle="tooltip"]').tooltip() +}) +``` + +#### Opt-in functionality +For performance reasons, the Tooltip and Popover data-apis are opt-in, meaning you must initialize them yourself. + +One way to initialize all tooltips on a page would be to select them by their data-toggle attribute: +```js +$(function () { + $('[data-toggle="tooltip"]').tooltip() +}) +``` + +Usage +----- +The tooltip plugin generates content and markup on demand, and by default places tooltips after their trigger element. + +Trigger the tooltip via JavaScript: +```js +$('#example').tooltip(options) +``` + +Markup +------ +The required markup for a tooltip is only a `data` attribute and `title` on the HTML element you wish to have a tooltip. The generated markup of a tooltip is rather simple, though it does require a position (by default, set to `top` by the plugin). + +```html + +Hover over me + + + +``` + +Interactive example +------------------- + +To use an @ symbol at the start of a line within the description, simply escape it with a backslash like so: +\@example This will be in the description +\@category This will be too + +But escaped @ symbols occurring NOT at the beginning (like this one \@) should remain escaped. + +```interactive.html + +``` +```interactive.html hidden + +``` +```interactive.js hidden +var button = document.getElementsByTagName('button')[0]; +var input = document.getElementsByTagName('input')[0]; + +input.addEventListener('keyup', function() { + button.innerHTML = input.value; +}) +``` +*/ diff --git a/test/comprehensive/test.js b/test/comprehensive/test.js new file mode 100644 index 0000000..a748b8e --- /dev/null +++ b/test/comprehensive/test.js @@ -0,0 +1,31 @@ +var rfr = require('rfr'); +var expect = require('chai').expect; +var Parser = rfr('src/parser'); +var fs = require('fs'); + +describe('Parser.parse()', function() { + + describe('with inline examples in the description', function() { + var content = fs.readFileSync('test/comprehensive/input.txt', 'utf8'); + var parser = new Parser(); + var docs = parser.parse(content); + + it('should return the correct number of docs', function() { + expect(docs.length).to.equal(1); + }); + + describe('1st doc', function() { + var doc = docs[0]; + + it('should have the correct doc name', function() { + expect(doc.getName()).to.equal('Tooltip'); + }); + it('should have the correct doc description', function() { + expect(doc.getDescription()).to.equal( + fs.readFileSync('test/comprehensive/expected.md', 'utf8') + ); + }); + }); + }); + +}); diff --git a/test/handlebars/expected.md b/test/handlebars/expected.md new file mode 100644 index 0000000..82ac3e2 --- /dev/null +++ b/test/handlebars/expected.md @@ -0,0 +1,10 @@ + +```handlebars +{{#bs-button}}button{{/bs-button}} +``` +```js +$('.button').addClass('foobar'); +``` +```css +button { background: #fff; } +``` \ No newline at end of file diff --git a/test/handlebars/input.txt b/test/handlebars/input.txt new file mode 100644 index 0000000..ced264b --- /dev/null +++ b/test/handlebars/input.txt @@ -0,0 +1,15 @@ +/* +--- +name: Button +--- + +```button.handlebars +{{#bs-button}}button{{/bs-button}} +``` +```button.js +$('.button').addClass('foobar'); +``` +```button.css +button { background: #fff; } +``` +*/ diff --git a/test/handlebars/test.js b/test/handlebars/test.js new file mode 100644 index 0000000..97718cd --- /dev/null +++ b/test/handlebars/test.js @@ -0,0 +1,23 @@ +var rfr = require('rfr'); +var expect = require('chai').expect; +var Parser = rfr('src/parser'); +var fs = require('fs'); + +describe('Parser.parse() with a Handlebars example', function() { + var content = fs.readFileSync('test/handlebars/input.txt', 'utf8'); + var parser = new Parser(); + var docs = parser.parse(content); + var doc = docs[0]; + + it('should return the correct number of docs', function() { + expect(docs.length).to.equal(1); + }); + it('should have the correct doc name', function() { + expect(doc.getName()).to.equal('Button'); + }); + it('should have the correct doc description', function() { + expect(doc.getDescription()).to.equal( + fs.readFileSync('test/handlebars/expected.md', 'utf8') + ); + }); +}); diff --git a/test/jsx/expected.md b/test/jsx/expected.md new file mode 100644 index 0000000..3aeabd7 --- /dev/null +++ b/test/jsx/expected.md @@ -0,0 +1,10 @@ + +```jsx + +``` +```js +$('.button').addClass('foobar'); +``` +```css +button { background: #fff; } +``` \ No newline at end of file diff --git a/test/jsx/input.txt b/test/jsx/input.txt new file mode 100644 index 0000000..885f885 --- /dev/null +++ b/test/jsx/input.txt @@ -0,0 +1,15 @@ +/* +--- +name: Button +--- + +```button.jsx + +``` +```button.js +$('.button').addClass('foobar'); +``` +```button.css +button { background: #fff; } +``` +*/ diff --git a/test/jsx/test.js b/test/jsx/test.js new file mode 100644 index 0000000..836cde4 --- /dev/null +++ b/test/jsx/test.js @@ -0,0 +1,23 @@ +var rfr = require('rfr'); +var expect = require('chai').expect; +var Parser = rfr('src/parser'); +var fs = require('fs'); + +describe('Parser.parse() with a JSX example', function() { + var content = fs.readFileSync('test/jsx/input.txt', 'utf8'); + var parser = new Parser(); + var docs = parser.parse(content); + var doc = docs[0]; + + it('should return the correct number of docs', function() { + expect(docs.length).to.equal(1); + }); + it('should have the correct doc name', function() { + expect(doc.getName()).to.equal('Button'); + }); + it('should have the correct doc description', function() { + expect(doc.getDescription()).to.equal( + fs.readFileSync('test/jsx/expected.md', 'utf8') + ); + }); +}); diff --git a/test/markdown/expected.md b/test/markdown/expected.md new file mode 100644 index 0000000..c5bee8d --- /dev/null +++ b/test/markdown/expected.md @@ -0,0 +1,12 @@ +This is some markdown content. + + +```handlebars +{{#bs-button}}button{{/bs-button}} +``` +```js +$('.button').addClass('foobar'); +``` +```css +button { background: #fff; } +``` \ No newline at end of file diff --git a/test/markdown/input.txt b/test/markdown/input.txt new file mode 100644 index 0000000..808e013 --- /dev/null +++ b/test/markdown/input.txt @@ -0,0 +1,24 @@ +--- +name: Welcome +category: Getting Started +tags: + - one + - two + - three +version: 1.2.3 +todo: +- first todo +- second todo +--- + +This is some markdown content. + +```button.handlebars +{{#bs-button}}button{{/bs-button}} +``` +```button.js +$('.button').addClass('foobar'); +``` +```button.css +button { background: #fff; } +``` diff --git a/test/markdown/test.js b/test/markdown/test.js new file mode 100644 index 0000000..5b2f88e --- /dev/null +++ b/test/markdown/test.js @@ -0,0 +1,33 @@ +var rfr = require('rfr'); +var expect = require('chai').expect; +var Parser = rfr('src/parser'); +var fs = require('fs'); + +describe('Parser.parse() with a Markdown example', function() { + var content = fs.readFileSync('test/markdown/input.txt', 'utf8'); + var parser = new Parser(); + var docs = parser.parse(content, 'markdown'); + var doc = docs[0]; + + it('should return the correct number of docs', function() { + expect(docs.length).to.equal(1); + }); + it('should have the correct doc name', function() { + expect(doc.getName()).to.equal('Welcome'); + }); + it('should have the correct doc category', function() { + expect(doc.getCategory()).to.equal('Getting Started'); + }); + it('should have the correct doc meta', function() { + expect(doc.getMeta()).to.eql({ + tags: ['one', 'two', 'three'], + version: ['1.2.3'], + todo: ['first todo', 'second todo'], + }); + }); + it('should have the correct doc description', function() { + expect(doc.getDescription()).to.equal( + fs.readFileSync('test/markdown/expected.md', 'utf8') + ); + }); +}); diff --git a/test/multiple/expected-1.md b/test/multiple/expected-1.md new file mode 100644 index 0000000..4898374 --- /dev/null +++ b/test/multiple/expected-1.md @@ -0,0 +1,24 @@ +Basic usage of PatternA +``` + +``` + +Advanced usage of PatternA +```html,height=300 + +``` + +``` + +``` + +Some addition description. + + +```html + +``` \ No newline at end of file diff --git a/test/multiple/expected-2.md b/test/multiple/expected-2.md new file mode 100644 index 0000000..8cad7d8 --- /dev/null +++ b/test/multiple/expected-2.md @@ -0,0 +1,33 @@ +This is a description for PatternB. + +The description continues on even more lines here. + + +Section Heading +--------------- +It even has section breaks delimited by a line of dashes. +With more lines that follow. + +Another Heading +--------------- +Lots of sections here. + +Basic usage of PatternB +```html + +``` + + +Advanced usage of PatternB +```js +scope.foo = "bar"; +scope.what = "who"; +``` + +```html + +``` \ No newline at end of file diff --git a/test/multiple/input.txt b/test/multiple/input.txt new file mode 100644 index 0000000..990accb --- /dev/null +++ b/test/multiple/input.txt @@ -0,0 +1,94 @@ +/******* +--- +name: PatternA +category: Foos & Bars +version: 1.0.3 +todo: + - First todo + - Another future task +--- + +Basic usage of PatternA +``` + +``` + +Advanced usage of PatternA +```html,height=300 + +``` + +``` + +``` +**********/ + +Intermediate code +@param NotAParam +@doc NotADoc +@param NotAnotherParam + +/* @todo A random comment */ + +/* +--- +name: PatternB +version: 0.2.4 +category: Something +deprecated: Use PatternA instead +todo: Some future task +--- +This is a description for PatternB. + +The description continues on even more lines here. + + +Section Heading +--------------- +It even has section breaks delimited by a line of dashes. +With more lines that follow. + +Another Heading +--------------- +Lots of sections here. + +Basic usage of PatternB +```html + +``` + + +Advanced usage of PatternB +```advanced.js +scope.foo = "bar"; +scope.what = "who"; +``` +```advanced.html + +``` + */ + +/* +--- +name: PatternA +--- +*/ + +/* +--- +name: PatternA +--- +Some addition description. + +```more.html + +``` +*/ diff --git a/test/multiple/test.js b/test/multiple/test.js new file mode 100644 index 0000000..7745cae --- /dev/null +++ b/test/multiple/test.js @@ -0,0 +1,66 @@ +var rfr = require('rfr'); +var expect = require('chai').expect; +var Parser = rfr('src/parser'); +var fs = require('fs'); + +describe('Parser', function() { + + describe('parse()', function() { + + describe('with multiple docs', function() { + var content = fs.readFileSync('test/multiple/input.txt', 'utf8'); + var parser = new Parser(); + var docs = parser.parse(content); + + it('should return the correct number of docs', function() { + expect( docs.length ).to.equal(2); + }); + + describe('1st doc', function() { + var doc = docs[0]; + + it('should have the correct doc name', function() { + expect( doc.getName() ).to.equal('PatternA'); + }); + it('should have the correct category', function() { + expect( doc.getCategory() ).to.equal('Foos & Bars'); + }); + it('should have the correct meta version', function() { + expect( doc.getMeta().version ).to.eql(['1.0.3']); + }); + it('should have the correct doc description', function() { + expect( doc.getDescription() ).to.equal( + fs.readFileSync('test/multiple/expected-1.md', 'utf8') + ); + }); + it('should have the correct todos', function() { + expect( doc.getMeta().todo ).to.eql(['First todo', 'Another future task']); + }); + }); + + describe('2nd doc', function() { + var doc = docs[1]; + + it('should have the correct doc name', function() { + expect( doc.getName() ).to.equal('PatternB'); + }); + it('should have the correct meta version', function() { + expect( doc.getMeta().version ).to.eql(['0.2.4']); + }); + it('should have the correct doc description', function() { + expect( doc.getDescription() ).to.equal( + fs.readFileSync('test/multiple/expected-2.md', 'utf8') + ); + }); + it('should have the correct todos', function() { + expect( doc.getMeta().todo ).to.eql(['Some future task']); + }); + it('should have the correct deprecation message', function() { + expect( doc.getMeta().deprecated ).to.eql(['Use PatternA instead']); + }); + }); + }); + + }); + +}); diff --git a/test/table/input.txt b/test/table/input.txt new file mode 100644 index 0000000..8b4ff5b --- /dev/null +++ b/test/table/input.txt @@ -0,0 +1,12 @@ +/* +--- +name: TableTest +--- +This is a markdown table: + +Col A | Col B | Col C | Col D +--- | --- | --- | --- +Some text | **some bold** | `some code` | {{ some code \| filter }} + +Escaped 'less than' symbols (eg. \<) should be automatically encoded as <. +*/ diff --git a/test/table/test.js b/test/table/test.js new file mode 100644 index 0000000..35146fd --- /dev/null +++ b/test/table/test.js @@ -0,0 +1,37 @@ +var rfr = require('rfr'); +var expect = require('chai').expect; +var Parser = rfr('src/parser'); +var fs = require('fs'); + +describe('Parser.parse()', function() { + + describe('with a markdown table', function() { + var content = fs.readFileSync('test/table/input.txt', 'utf8'); + var parser = new Parser(); + var docs = parser.parse(content); + + it('should return the correct number of docs', function() { + expect(docs.length).to.equal(1); + }); + + describe('1st doc', function() { + var doc = docs[0]; + + it('should have the correct doc name', function() { + expect(doc.getName()).to.equal('TableTest'); + }); + it('should have the correct doc description', function() { + expect(doc.getDescription()).to.equal( +`This is a markdown table: + +Col A | Col B | Col C | Col D +--- | --- | --- | --- +Some text | **some bold** | \`some code\` | {{ some code | filter }} + +Escaped 'less than' symbols (eg. <) should be automatically encoded as <.` + ); + }); + }); + }); + +}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..b98e3b3 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1200 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-wrap@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +assertion-error@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.0.tgz#c7f85438fdd466bc7ca16ab90c81513797a5d23b" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +brace-expansion@^1.0.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +chai@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-1.10.0.tgz#e4031cc87654461a75943e5a35ab46eaf39c1eb9" + dependencies: + assertion-error "1.0.0" + deep-eql "0.1.3" + +chalk@^1.0.0, chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +coffee-script@^1.12.4: + version "1.12.6" + resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.6.tgz#285a3f7115689065064d6bf9ef4572db66695cbf" + +commander@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" + +commander@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +dateformat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" + +debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +deep-eql@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + dependencies: + type-detect "0.1.1" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +detect-file@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + dependencies: + fs-exists-sync "^0.1.0" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +escape-string-regexp@1.0.2, escape-string-regexp@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" + +esprima@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.1, expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + dependencies: + os-homedir "^1.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +fancy-log@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" + dependencies: + chalk "^1.1.1" + time-stamp "^1.0.0" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +findup-sync@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +fined@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97" + dependencies: + expand-tilde "^1.2.1" + lodash.assignwith "^4.0.7" + lodash.isempty "^4.2.1" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.pick "^4.2.1" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +flagged-respawn@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@3.2.11: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" + dependencies: + sparkles "^1.0.0" + +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +gray-matter@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-2.1.1.tgz#3042d9adec2a1ded6a7707a9ed2380f8a17a430e" + dependencies: + ansi-red "^0.1.1" + coffee-script "^1.12.4" + extend-shallow "^2.0.1" + js-yaml "^3.8.1" + toml "^2.3.2" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +gulp-mocha@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-2.2.0.tgz#1ce5eba4b94b40c7436afec3c4982c8eea894192" + dependencies: + gulp-util "^3.0.0" + mocha "^2.0.1" + plur "^2.1.0" + resolve-from "^1.0.0" + temp "^0.8.3" + through "^2.3.4" + +gulp-util@^3.0.0: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp@^3.8.10: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +homedir-polyfill@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +inherits@2, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +interpret@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + +irregular-plurals@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.2.0.tgz#38f299834ba8c00c30be9c554e137269752ff3ac" + +is-absolute@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" + dependencies: + is-relative "^0.2.1" + is-windows "^0.2.0" + +is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-relative@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" + dependencies: + is-unc-path "^0.1.1" + +is-unc-path@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" + dependencies: + unc-path-regex "^0.1.0" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +jade@0.26.3: + version "0.26.3" + resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" + dependencies: + commander "0.6.1" + mkdirp "0.3.0" + +js-yaml@^3.8.1: + version "3.8.4" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +liftoff@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" + dependencies: + extend "^3.0.0" + findup-sync "^0.4.2" + fined "^1.0.1" + flagged-respawn "^0.3.2" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.mapvalues "^4.4.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.assignwith@^4.0.7: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isempty@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + +lodash.isplainobject@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.mapvalues@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash@^4.17.2: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +map-cache@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + +mkdirp@0.5.1, mkdirp@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@^2.0.1: + version "2.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" + dependencies: + commander "2.3.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.2" + glob "3.2.11" + growl "1.9.2" + jade "0.26.3" + mkdirp "0.5.1" + supports-color "1.2.0" + to-iso-string "0.0.2" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +natives@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@^1.3.0, once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +parse-filepath@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" + dependencies: + is-absolute "^0.2.3" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +plur@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" + dependencies: + irregular-plurals "^1.0.0" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.1.5: + version "2.2.9" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +remove-trailing-separator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve@^1.1.6, resolve@^1.1.7: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + +rfr@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/rfr/-/rfr-1.2.3.tgz#e7bb719337ede977091faf12eac8b6cd2dba9011" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + +safe-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + +semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +stream-consume@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98" + dependencies: + safe-buffer "^5.0.1" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +supports-color@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +temp@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +through2@^0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@^2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +to-iso-string@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" + +toml@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.2.tgz#5eded5ca42887924949fd06eb0e955656001e834" + +type-detect@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + +unc-path-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl@^0.4.0: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +which@^1.2.12: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +"xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"