From 8481f5d9276f617d9a4dcbe8b3aff01ae5e1e00f Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Sun, 13 Nov 2016 22:29:01 -0600 Subject: [PATCH 01/98] politely inform eslint that there shall be es6 --- .eslintrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc b/.eslintrc index dbecc8098..bf80289c8 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,7 +1,8 @@ { "env": { "node": true, - "builtin": true + "builtin": true, + "es6" true }, "parserOptions": { "ecmaVersion": 6, From 7527c252d2c6b230e64f0e821ac877fa41687c42 Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Sun, 13 Nov 2016 22:31:05 -0600 Subject: [PATCH 02/98] holy hell, how did I miss that? --- .eslintrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc b/.eslintrc index bf80289c8..f2463e9b6 100644 --- a/.eslintrc +++ b/.eslintrc @@ -2,7 +2,7 @@ "env": { "node": true, "builtin": true, - "es6" true + "es6": true }, "parserOptions": { "ecmaVersion": 6, From 82ff49d3fa6ce6fcd524bd61ce1aa251027d7875 Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Mon, 14 Nov 2016 00:31:20 -0600 Subject: [PATCH 03/98] first great victory: working async pattern loading & analysis, apparently (hopefully) free of race conditions. Next up: the rendering --- core/lib/pattern_assembler.js | 36 ++++-- core/lib/patternlab.js | 233 +++++++++++++++++++--------------- package.json | 2 + 3 files changed, 155 insertions(+), 116 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 05df15e82..8e1131225 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -1,7 +1,7 @@ "use strict"; var path = require('path'), - fs = require('fs-extra'), + fs = require('fs-promise'), Pattern = require('./object_factory').Pattern, pph = require('./pseudopattern_hunter'), mp = require('./markdown_parser'), @@ -14,6 +14,7 @@ var path = require('path'), JSON5 = require('json5'); var markdown_parser = new mp(); +var pseudopattern_hunter = new pph(); var pattern_assembler = function () { // HELPER FUNCTIONS @@ -45,6 +46,7 @@ var pattern_assembler = function () { return patternlab.patterns[i]; } } + console.trace("Here I am!"); plutils.logOrange('Could not find pattern referenced with partial syntax ' + partialName + '. This can occur when a pattern was renamed, moved, or no longer exists but it still called within a different template somewhere.'); return undefined; } @@ -240,7 +242,9 @@ var pattern_assembler = function () { addPattern(pattern, patternlab); } - function processPatternIterative(relPath, patternlab) { + // loads a pattern from disk, creates a Pattern object from it and + // all its associated files, and records it in patternlab.patterns[] + function loadPatternIterative(relPath, patternlab) { var relativeDepth = (relPath.match(/\w(?=\\)|\w(?=\/)/g) || []).length; if (relativeDepth > 2) { @@ -284,7 +288,6 @@ var pattern_assembler = function () { } - var pseudopattern_hunter = new pph(); //extract some information var filename = fileObject.base; @@ -357,19 +360,23 @@ var pattern_assembler = function () { //add the raw template to memory currentPattern.template = fs.readFileSync(path.resolve(patternsPath, relPath), 'utf8'); - //find any stylemodifiers that may be in the current pattern - currentPattern.stylePartials = currentPattern.findPartialsWithStyleModifiers(); - - //find any pattern parameters that may be in the current pattern - currentPattern.parameteredPartials = currentPattern.findPartialsWithPatternParameters(); - //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); + return currentPattern; + } + + // This is now solely for analysis; loading of the pattern file is + // above, in loadPatternIterative() + function processPatternIterative(pattern, patternlab) { //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json - pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab); + pseudopattern_hunter.find_pseudopatterns(pattern, patternlab); - return currentPattern; + //find any stylemodifiers that may be in the current pattern + pattern.stylePartials = pattern.findPartialsWithStyleModifiers(); + + //find any pattern parameters that may be in the current pattern + pattern.parameteredPartials = pattern.findPartialsWithPatternParameters(); } function processPatternRecursive(file, patternlab) { @@ -533,8 +540,11 @@ var pattern_assembler = function () { renderPattern: function (template, data, partials) { return renderPattern(template, data, partials); }, - process_pattern_iterative: function (file, patternlab) { - return processPatternIterative(file, patternlab); + load_pattern_iterative: function (file, patternlab) { + return loadPatternIterative(file, patternlab); + }, + process_pattern_iterative: function (pattern, patternlab) { + return processPatternIterative(pattern, patternlab); }, process_pattern_recursive: function (file, patternlab, additionalData) { processPatternRecursive(file, patternlab, additionalData); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index df3275f18..a04ff5cd9 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -11,6 +11,7 @@ "use strict"; var diveSync = require('diveSync'), + dive = require('dive'), glob = require('glob'), _ = require('lodash'), path = require('path'), @@ -34,18 +35,35 @@ function buildPatternData(dataFilesPath, fsDep) { // GTP: these two diveSync pattern processors factored out so they can be reused // from unit tests to reduce code dupe! -function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab) { - diveSync( - patterns_dir, - function (err, file) { - //log any errors - if (err) { - console.log(err); - return; +function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab){ + return new Promise(function (resolve, reject) { + dive( + patterns_dir, + (err, file) => { + //log any errors + if (err) { + console.log('error in processAllPatternsIterative():', err); + return; + } + + // We now have the loading and process phases spearated; this + // loads all the patterns before beginning any analysis, so we + // can load them asynchronously and be sure we know about all + // of them before we start lineage hunting, for + // example. Incidentally, this should also allow people to do + // horrifying things like include a page in a atom. But + // please, if you're reading this: don't. + pattern_assembler.load_pattern_iterative(path.relative(patterns_dir, file), patternlab); + }, () => { + // This is the second phase: once we've loaded all patterns, + // start analysis. + patternlab.patterns.forEach((pattern) => { + pattern_assembler.process_pattern_iterative(pattern, patternlab); + }); + resolve(); } - pattern_assembler.process_pattern_iterative(path.relative(patterns_dir, file), patternlab); - } - ); + ); + }); } function processAllPatternsRecursive(pattern_assembler, patterns_dir, patternlab) { @@ -125,6 +143,7 @@ function PatternLabEventEmitter() { } inherits(PatternLabEventEmitter, EventEmitter); + var patternlab_engine = function (config) { 'use strict'; @@ -320,84 +339,7 @@ var patternlab_engine = function (config) { outputFiles.forEach(outFile => fs.outputFileSync(outFile.path, outFile.content)); } - function buildPatterns(deletePatternDir) { - - patternlab.events.emit('patternlab-build-pattern-start', patternlab); - - try { - patternlab.data = buildPatternData(paths.source.data, fs); - } catch (ex) { - plutils.logRed('missing or malformed' + paths.source.data + 'data.json Pattern Lab may not work without this file.'); - patternlab.data = {}; - } - try { - patternlab.listitems = fs.readJSONSync(path.resolve(paths.source.data, 'listitems.json')); - } catch (ex) { - plutils.logOrange('WARNING: missing or malformed ' + paths.source.data + 'listitems.json file. Pattern Lab may not work without this file.'); - patternlab.listitems = {}; - } - try { - patternlab.header = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'general-header.mustache'), 'utf8'); - patternlab.footer = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'general-footer.mustache'), 'utf8'); - patternlab.patternSection = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'patternSection.mustache'), 'utf8'); - patternlab.patternSectionSubType = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'patternSectionSubtype.mustache'), 'utf8'); - patternlab.viewAll = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'viewall.mustache'), 'utf8'); - } catch (ex) { - console.log(ex); - plutils.logRed('\nERROR: missing an essential file from ' + paths.source.patternlabFiles + '. Pattern Lab won\'t work without this file.\n'); - process.exit(1); - } - patternlab.patterns = []; - patternlab.subtypePatterns = {}; - patternlab.partials = {}; - patternlab.data.link = {}; - - setCacheBust(); - - pattern_assembler.combine_listItems(patternlab); - - patternlab.events.emit('patternlab-build-global-data-end', patternlab); - - // diveSync once to perform iterative populating of patternlab object - processAllPatternsIterative(pattern_assembler, paths.source.patterns, patternlab); - - patternlab.events.emit('patternlab-pattern-iteration-end', patternlab); - - //diveSync again to recursively include partials, filling out the - //extendedTemplate property of the patternlab.patterns elements - processAllPatternsRecursive(pattern_assembler, paths.source.patterns, patternlab); - - //take the user defined head and foot and process any data and patterns that apply - processHeadPattern(); - processFootPattern(); - - //now that all the main patterns are known, look for any links that might be within data and expand them - //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference - pattern_assembler.parse_data_links(patternlab); - - //cascade any patternStates - lineage_hunter.cascade_pattern_states(patternlab); - - //delete the contents of config.patterns.public before writing - if (deletePatternDir) { - fs.removeSync(paths.public.patterns); - fs.emptyDirSync(paths.public.patterns); - } - - //set pattern-specific header if necessary - var head; - if (patternlab.userHead) { - head = patternlab.userHead; - } else { - head = patternlab.header; - } - - //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header - patternlab.data.patternLabHead = pattern_assembler.renderPattern(patternlab.header, { - cacheBuster: patternlab.cacheBuster - }); - - //render all patterns last, so lineageR works + function renderAllPatterns(head) { patternlab.patterns.forEach(function (pattern) { if (!pattern.isPattern) { @@ -444,7 +386,7 @@ var patternlab_engine = function (config) { patternLineageEExists: pattern.patternLineageExists || pattern.patternLineageRExists, patternDesc: pattern.patternDescExists ? pattern.patternDesc : '', patternBreadcrumb: - pattern.patternGroup === pattern.patternSubGroup ? + pattern.patternGroup === pattern.patternSubGroup ? { patternType: pattern.patternGroup } : { @@ -487,9 +429,92 @@ var patternlab_engine = function (config) { return true; }); + } + + + function buildPatterns(deletePatternDir) { + patternlab.events.emit('patternlab-build-pattern-start', patternlab); - //export patterns if necessary - pattern_exporter.export_patterns(patternlab); + try { + patternlab.data = buildPatternData(paths.source.data, fs); + } catch (ex) { + plutils.logRed('missing or malformed' + paths.source.data + 'data.json Pattern Lab may not work without this file.'); + patternlab.data = {}; + } + try { + patternlab.listitems = fs.readJSONSync(path.resolve(paths.source.data, 'listitems.json')); + } catch (ex) { + plutils.logOrange('WARNING: missing or malformed ' + paths.source.data + 'listitems.json file. Pattern Lab may not work without this file.'); + patternlab.listitems = {}; + } + try { + patternlab.header = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'general-header.mustache'), 'utf8'); + patternlab.footer = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'general-footer.mustache'), 'utf8'); + patternlab.patternSection = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'patternSection.mustache'), 'utf8'); + patternlab.patternSectionSubType = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'patternSectionSubtype.mustache'), 'utf8'); + patternlab.viewAll = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'viewall.mustache'), 'utf8'); + } catch (ex) { + console.log(ex); + plutils.logRed('\nERROR: missing an essential file from ' + paths.source.patternlabFiles + '. Pattern Lab won\'t work without this file.\n'); + process.exit(1); + } + patternlab.patterns = []; + patternlab.subtypePatterns = {}; + patternlab.partials = {}; + patternlab.data.link = {}; + + setCacheBust(); + + pattern_assembler.combine_listItems(patternlab); + + patternlab.events.emit('patternlab-build-global-data-end', patternlab); + + // diveSync once to perform iterative populating of patternlab object + return processAllPatternsIterative(pattern_assembler, paths.source.patterns, patternlab).then(() => { + patternlab.events.emit('patternlab-pattern-iteration-end', patternlab); + + //diveSync again to recursively include partials, filling out the + //extendedTemplate property of the patternlab.patterns elements + processAllPatternsRecursive(pattern_assembler, paths.source.patterns, patternlab); + + //take the user defined head and foot and process any data and patterns that apply + processHeadPattern(); + processFootPattern(); + + //now that all the main patterns are known, look for any links that might be within data and expand them + //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference + pattern_assembler.parse_data_links(patternlab); + + //cascade any patternStates + lineage_hunter.cascade_pattern_states(patternlab); + + //delete the contents of config.patterns.public before writing + if (deletePatternDir) { + fs.removeSync(paths.public.patterns); + fs.emptyDirSync(paths.public.patterns); + } + + //set pattern-specific header if necessary + var head; + if (patternlab.userHead) { + head = patternlab.userHead; + } else { + head = patternlab.header; + } + + //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header + patternlab.data.patternLabHead = pattern_assembler.renderPattern(patternlab.header, { + cacheBuster: patternlab.cacheBuster + }); + + //render all patterns last, so lineageR works + renderAllPatterns(head); + + //export patterns if necessary + pattern_exporter.export_patterns(patternlab); + }).catch((err) => { + console.log('Error in buildPatterns():', err); + }); } return { @@ -499,14 +524,15 @@ var patternlab_engine = function (config) { build: function (callback, deletePatternDir) { if (patternlab && patternlab.isBusy) { console.log('Pattern Lab is busy building a previous run - returning early.'); - return; + return Promise.resolve(); } patternlab.isBusy = true; - buildPatterns(deletePatternDir); - new ui().buildFrontend(patternlab); - printDebug(); - patternlab.isBusy = false; - callback(); + return buildPatterns(deletePatternDir).then(() => { + new ui().buildFrontend(patternlab); + printDebug(); + patternlab.isBusy = false; + callback(); + }); }, help: function () { help(); @@ -514,13 +540,14 @@ var patternlab_engine = function (config) { patternsonly: function (callback, deletePatternDir) { if (patternlab && patternlab.isBusy) { console.log('Pattern Lab is busy building a previous run - returning early.'); - return; + return Promise.resolve(); } patternlab.isBusy = true; - buildPatterns(deletePatternDir); - printDebug(); - patternlab.isBusy = false; - callback(); + return buildPatterns(deletePatternDir).then(() => { + printDebug(); + patternlab.isBusy = false; + callback(); + }); }, liststarterkits: function () { return listStarterkits(); diff --git a/package.json b/package.json index 29cc5d61c..6d56ece96 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,10 @@ "version": "2.6.2", "main": "./core/lib/patternlab.js", "dependencies": { + "dive": "^0.5.0", "diveSync": "^0.3.0", "fs-extra": "^0.30.0", + "fs-promise": "^1.0.0", "glob": "^7.0.0", "js-beautify": "^1.6.3", "js-yaml": "^3.6.1", From da13ab4cfb90665bee6a31559f5951955ebefa4a Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Tue, 15 Nov 2016 00:43:26 -0600 Subject: [PATCH 04/98] Some progress on the pseudopattern hunter, maybe, but still doesn't appear to be generating any visible pseudo patterns in the UI. --- core/lib/pattern_assembler.js | 16 +++-- core/lib/patternlab.js | 8 ++- core/lib/pseudopattern_hunter.js | 104 +++++++++++++++++-------------- package.json | 1 + 4 files changed, 76 insertions(+), 53 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 8e1131225..db7237917 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -14,7 +14,6 @@ var path = require('path'), JSON5 = require('json5'); var markdown_parser = new mp(); -var pseudopattern_hunter = new pph(); var pattern_assembler = function () { // HELPER FUNCTIONS @@ -370,13 +369,18 @@ var pattern_assembler = function () { // above, in loadPatternIterative() function processPatternIterative(pattern, patternlab) { //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json - pseudopattern_hunter.find_pseudopatterns(pattern, patternlab); + return pph.find_pseudopatterns(pattern, patternlab).then(() => { + console.log('done with pseudopatternsfind_pseudopatterns'); - //find any stylemodifiers that may be in the current pattern - pattern.stylePartials = pattern.findPartialsWithStyleModifiers(); + //find any stylemodifiers that may be in the current pattern + pattern.stylePartials = pattern.findPartialsWithStyleModifiers(); - //find any pattern parameters that may be in the current pattern - pattern.parameteredPartials = pattern.findPartialsWithPatternParameters(); + //find any pattern parameters that may be in the current pattern + pattern.parameteredPartials = pattern.findPartialsWithPatternParameters(); + }).catch((err) => { + console.log('There was an error in processPatternIterative():', err); + console.log(err); + }); } function processPatternRecursive(file, patternlab) { diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index a04ff5cd9..571570a2b 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -36,6 +36,8 @@ function buildPatternData(dataFilesPath, fsDep) { // GTP: these two diveSync pattern processors factored out so they can be reused // from unit tests to reduce code dupe! function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab){ + const async = require('async'); + return new Promise(function (resolve, reject) { dive( patterns_dir, @@ -57,8 +59,12 @@ function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab }, () => { // This is the second phase: once we've loaded all patterns, // start analysis. - patternlab.patterns.forEach((pattern) => { + // patternlab.patterns.forEach((pattern) => { + // pattern_assembler.process_pattern_iterative(pattern, patternlab); + // }); + async.each(patternlab.patterns, (pattern, done) => { pattern_assembler.process_pattern_iterative(pattern, patternlab); + done(); }); resolve(); } diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index d695b4f0e..cf608cfdd 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -1,48 +1,53 @@ "use strict"; -var pseudopattern_hunter = function () { +var glob = require('glob'), + fs = require('fs-promise'), + lh = require('./lineage_hunter'), + Pattern = require('./object_factory').Pattern, + plutils = require('./utilities'), + path = require('path'), + async = require('async'); - function findpseudopatterns(currentPattern, patternlab) { - var glob = require('glob'), - fs = require('fs-extra'), - pa = require('./pattern_assembler'), - lh = require('./lineage_hunter'), - Pattern = require('./object_factory').Pattern, - plutils = require('./utilities'), - path = require('path'); - - var pattern_assembler = new pa(); - var lineage_hunter = new lh(); - var paths = patternlab.config.paths; - - //look for a pseudo pattern by checking if there is a file containing same +function promiseGlobMatches(currentPattern, paths) { + //look for a pseudo pattern by checking if there is a file containing same //name, with ~ in it, ending in .json - var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; - var pseudoPatterns = glob.sync(needle, { - cwd: paths.source.patterns, - debug: false, - nodir: true - }); - - if (pseudoPatterns.length > 0) { - for (var i = 0; i < pseudoPatterns.length; i++) { - if (patternlab.config.debug) { - console.log('found pseudoPattern variant of ' + currentPattern.patternPartial); - } - - //we want to do everything we normally would here, except instead read the pseudoPattern data - try { - var variantFileData = fs.readJSONSync(path.resolve(paths.source.patterns, pseudoPatterns[i])); - } catch (err) { - console.log('There was an error parsing pseudopattern JSON for ' + currentPattern.relPath); - console.log(err); - } + var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; + + return new Promise((resolve, reject) => { + glob( + needle, + { cwd: paths.source.patterns, debug: false, nodir: true }, + function (err, matches) { + if (err) { reject(err); } + resolve(matches); + } + ); + }); +} + +function findpseudopatterns(currentPattern, patternlab) { + /* eslint-disable no-shadow */ + var pa = require('./pattern_assembler'); + + var pattern_assembler = new pa(); + var lineage_hunter = new lh(); + var paths = patternlab.config.paths; + + return promiseGlobMatches(currentPattern, paths).then((pseudoPatterns) => { + const promises = pseudoPatterns.map((pseudoPattern) => { + console.log('found pseudoPattern variant of ' + currentPattern.patternPartial); + if (patternlab.config.debug) { + console.log('found pseudoPattern variant of ' + currentPattern.patternPartial); + } + //we want to do everything we normally would here, except instead read the pseudoPattern data + return fs.readJSON(path.resolve(paths.source.patterns, pseudoPattern)).then((variantFileData) => { + console.log('found a pseudopattern file!'); //extend any existing data with variant data variantFileData = plutils.mergeData(currentPattern.jsonFileData, variantFileData); - var variantName = pseudoPatterns[i].substring(pseudoPatterns[i].indexOf('~') + 1).split('.')[0]; + var variantName = pseudoPattern.substring(pseudoPattern.indexOf('~') + 1).split('.')[0]; var variantFilePath = path.join(currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); var patternVariant = Pattern.create(variantFilePath, variantFileData, { //use the same template as the non-variant @@ -57,6 +62,7 @@ var pseudopattern_hunter = function () { // use the same template engine as the non-variant engine: currentPattern.engine }, patternlab); + console.log('- variant name:', variantName); //process the companion markdown file if it exists pattern_assembler.parse_pattern_markdown(patternVariant, patternlab); @@ -65,17 +71,23 @@ var pseudopattern_hunter = function () { lineage_hunter.find_lineage(patternVariant, patternlab); //add to patternlab object so we can look these up later. + console.log("adding pattern variant", patternVariant.verbosePartial); pattern_assembler.addPattern(patternVariant, patternlab); - } - } - } + }).catch((err) => { + console.log('There was an error parsing pseudopattern JSON for ' + currentPattern.relPath); + console.log(err); + }); + }); - return { - find_pseudopatterns: function (pattern, patternlab) { - findpseudopatterns(pattern, patternlab); - } - }; + return Promise.all(promises); + }).catch((err) => { + console.log('There was an error parsing pseudopattern JSON for ' + currentPattern.relPath); + console.log(err); + }); +} +module.exports = { + find_pseudopatterns: function (pattern, patternlab) { + return findpseudopatterns(pattern, patternlab); + } }; - -module.exports = pseudopattern_hunter; diff --git a/package.json b/package.json index 6d56ece96..e9cb3d605 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "version": "2.6.2", "main": "./core/lib/patternlab.js", "dependencies": { + "async": "^2.1.2", "dive": "^0.5.0", "diveSync": "^0.3.0", "fs-extra": "^0.30.0", From fb8d0974d885aa26337ae42fe268e3bc3d655169 Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Tue, 15 Nov 2016 01:46:08 -0600 Subject: [PATCH 05/98] yes!! got it working. It's slower, though. --- core/lib/pattern_assembler.js | 2 -- core/lib/patternlab.js | 28 +++++++++++++++------------- core/lib/pseudopattern_hunter.js | 4 ---- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index db7237917..e8ac30547 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -370,8 +370,6 @@ var pattern_assembler = function () { function processPatternIterative(pattern, patternlab) { //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json return pph.find_pseudopatterns(pattern, patternlab).then(() => { - console.log('done with pseudopatternsfind_pseudopatterns'); - //find any stylemodifiers that may be in the current pattern pattern.stylePartials = pattern.findPartialsWithStyleModifiers(); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 571570a2b..c5cf867ee 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -38,7 +38,7 @@ function buildPatternData(dataFilesPath, fsDep) { function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab){ const async = require('async'); - return new Promise(function (resolve, reject) { + const promiseAllPatternFiles = new Promise(function (resolve, reject) { dive( patterns_dir, (err, file) => { @@ -55,21 +55,23 @@ function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab // example. Incidentally, this should also allow people to do // horrifying things like include a page in a atom. But // please, if you're reading this: don't. + + // NOTE: sync for now pattern_assembler.load_pattern_iterative(path.relative(patterns_dir, file), patternlab); - }, () => { - // This is the second phase: once we've loaded all patterns, - // start analysis. - // patternlab.patterns.forEach((pattern) => { - // pattern_assembler.process_pattern_iterative(pattern, patternlab); - // }); - async.each(patternlab.patterns, (pattern, done) => { - pattern_assembler.process_pattern_iterative(pattern, patternlab); - done(); - }); - resolve(); - } + }, + resolve ); }); + return promiseAllPatternFiles.then(() => { + // This is the second phase: once we've loaded all patterns, + // start analysis. + // patternlab.patterns.forEach((pattern) => { + // pattern_assembler.process_pattern_iterative(pattern, patternlab); + // }); + return Promise.all(patternlab.patterns.map((pattern) => { + return pattern_assembler.process_pattern_iterative(pattern, patternlab); + })); + }); } function processAllPatternsRecursive(pattern_assembler, patterns_dir, patternlab) { diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index cf608cfdd..529dfa4eb 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -36,14 +36,12 @@ function findpseudopatterns(currentPattern, patternlab) { return promiseGlobMatches(currentPattern, paths).then((pseudoPatterns) => { const promises = pseudoPatterns.map((pseudoPattern) => { - console.log('found pseudoPattern variant of ' + currentPattern.patternPartial); if (patternlab.config.debug) { console.log('found pseudoPattern variant of ' + currentPattern.patternPartial); } //we want to do everything we normally would here, except instead read the pseudoPattern data return fs.readJSON(path.resolve(paths.source.patterns, pseudoPattern)).then((variantFileData) => { - console.log('found a pseudopattern file!'); //extend any existing data with variant data variantFileData = plutils.mergeData(currentPattern.jsonFileData, variantFileData); @@ -62,7 +60,6 @@ function findpseudopatterns(currentPattern, patternlab) { // use the same template engine as the non-variant engine: currentPattern.engine }, patternlab); - console.log('- variant name:', variantName); //process the companion markdown file if it exists pattern_assembler.parse_pattern_markdown(patternVariant, patternlab); @@ -71,7 +68,6 @@ function findpseudopatterns(currentPattern, patternlab) { lineage_hunter.find_lineage(patternVariant, patternlab); //add to patternlab object so we can look these up later. - console.log("adding pattern variant", patternVariant.verbosePartial); pattern_assembler.addPattern(patternVariant, patternlab); }).catch((err) => { console.log('There was an error parsing pseudopattern JSON for ' + currentPattern.relPath); From a13c25bec4e0543d9ce4a266d2be9296287eba72 Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Tue, 15 Nov 2016 01:46:08 -0600 Subject: [PATCH 06/98] yes!! got it working. It's slower, though. Wait -- maybe not. Could be .01s faster --- core/lib/pattern_assembler.js | 2 -- core/lib/patternlab.js | 28 +++++++++++++++------------- core/lib/pseudopattern_hunter.js | 4 ---- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index db7237917..e8ac30547 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -370,8 +370,6 @@ var pattern_assembler = function () { function processPatternIterative(pattern, patternlab) { //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json return pph.find_pseudopatterns(pattern, patternlab).then(() => { - console.log('done with pseudopatternsfind_pseudopatterns'); - //find any stylemodifiers that may be in the current pattern pattern.stylePartials = pattern.findPartialsWithStyleModifiers(); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 571570a2b..c5cf867ee 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -38,7 +38,7 @@ function buildPatternData(dataFilesPath, fsDep) { function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab){ const async = require('async'); - return new Promise(function (resolve, reject) { + const promiseAllPatternFiles = new Promise(function (resolve, reject) { dive( patterns_dir, (err, file) => { @@ -55,21 +55,23 @@ function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab // example. Incidentally, this should also allow people to do // horrifying things like include a page in a atom. But // please, if you're reading this: don't. + + // NOTE: sync for now pattern_assembler.load_pattern_iterative(path.relative(patterns_dir, file), patternlab); - }, () => { - // This is the second phase: once we've loaded all patterns, - // start analysis. - // patternlab.patterns.forEach((pattern) => { - // pattern_assembler.process_pattern_iterative(pattern, patternlab); - // }); - async.each(patternlab.patterns, (pattern, done) => { - pattern_assembler.process_pattern_iterative(pattern, patternlab); - done(); - }); - resolve(); - } + }, + resolve ); }); + return promiseAllPatternFiles.then(() => { + // This is the second phase: once we've loaded all patterns, + // start analysis. + // patternlab.patterns.forEach((pattern) => { + // pattern_assembler.process_pattern_iterative(pattern, patternlab); + // }); + return Promise.all(patternlab.patterns.map((pattern) => { + return pattern_assembler.process_pattern_iterative(pattern, patternlab); + })); + }); } function processAllPatternsRecursive(pattern_assembler, patterns_dir, patternlab) { diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index cf608cfdd..529dfa4eb 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -36,14 +36,12 @@ function findpseudopatterns(currentPattern, patternlab) { return promiseGlobMatches(currentPattern, paths).then((pseudoPatterns) => { const promises = pseudoPatterns.map((pseudoPattern) => { - console.log('found pseudoPattern variant of ' + currentPattern.patternPartial); if (patternlab.config.debug) { console.log('found pseudoPattern variant of ' + currentPattern.patternPartial); } //we want to do everything we normally would here, except instead read the pseudoPattern data return fs.readJSON(path.resolve(paths.source.patterns, pseudoPattern)).then((variantFileData) => { - console.log('found a pseudopattern file!'); //extend any existing data with variant data variantFileData = plutils.mergeData(currentPattern.jsonFileData, variantFileData); @@ -62,7 +60,6 @@ function findpseudopatterns(currentPattern, patternlab) { // use the same template engine as the non-variant engine: currentPattern.engine }, patternlab); - console.log('- variant name:', variantName); //process the companion markdown file if it exists pattern_assembler.parse_pattern_markdown(patternVariant, patternlab); @@ -71,7 +68,6 @@ function findpseudopatterns(currentPattern, patternlab) { lineage_hunter.find_lineage(patternVariant, patternlab); //add to patternlab object so we can look these up later. - console.log("adding pattern variant", patternVariant.verbosePartial); pattern_assembler.addPattern(patternVariant, patternlab); }).catch((err) => { console.log('There was an error parsing pseudopattern JSON for ' + currentPattern.relPath); From 9426c34a97981c241d6c977e16bc0ee17865dc2e Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Tue, 15 Nov 2016 12:53:15 -0600 Subject: [PATCH 07/98] Refactor and prepare for PR. --- core/lib/pseudopattern_hunter.js | 124 +++++++++++++++++-------------- core/lib/utilities.js | 13 ++++ 2 files changed, 81 insertions(+), 56 deletions(-) diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index 529dfa4eb..c952a7053 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -1,18 +1,17 @@ "use strict"; -var glob = require('glob'), +const glob = require('glob'), fs = require('fs-promise'), lh = require('./lineage_hunter'), Pattern = require('./object_factory').Pattern, plutils = require('./utilities'), - path = require('path'), - async = require('async'); + path = require('path'); function promiseGlobMatches(currentPattern, paths) { //look for a pseudo pattern by checking if there is a file containing same - //name, with ~ in it, ending in .json - var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; + //name, with ~ in it, ending in .json + const needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; return new Promise((resolve, reject) => { glob( @@ -26,64 +25,77 @@ function promiseGlobMatches(currentPattern, paths) { }); } -function findpseudopatterns(currentPattern, patternlab) { +function createPseudoPatternObject(variantFileData, pattern, pseudoPattern, patternlab) { + const variantName = pseudoPattern.substring(pseudoPattern.indexOf('~') + 1).split('.')[0]; + const variantFilePath = path.join(pattern.subdir, pattern.fileName + '~' + variantName + '.json'); + + return Pattern.create(variantFilePath, variantFileData, { + //use the same template as the non-variant + template: pattern.template, + fileExtension: pattern.fileExtension, + extendedTemplate: pattern.extendedTemplate, + isPseudoPattern: true, + basePattern: pattern, + stylePartials: pattern.stylePartials, + parameteredPartials: pattern.parameteredPartials, + + // use the same template engine as the non-variant + engine: pattern.engine + }, patternlab); +} + +function processPseudoPattern(patternVariant, patternlab) { + const pa = require('./pattern_assembler'); + const pattern_assembler = new pa(); + const lineage_hunter = new lh(); + + pattern_assembler.parse_pattern_markdown(patternVariant, patternlab); + + //find pattern lineage + lineage_hunter.find_lineage(patternVariant, patternlab); + + //add to patternlab object so we can look these up later. + pattern_assembler.addPattern(patternVariant, patternlab); +} + +function findPseudoPatterns(currentPattern, patternlab) { /* eslint-disable no-shadow */ - var pa = require('./pattern_assembler'); + const paths = patternlab.config.paths; - var pattern_assembler = new pa(); - var lineage_hunter = new lh(); - var paths = patternlab.config.paths; + return promiseGlobMatches(currentPattern, paths) + .then(pseudoPatternsPaths => { + return Promise.all(pseudoPatternsPaths.map(pseudoPatternPath => { + if (patternlab.config.debug) { + console.log('found pseudoPattern variant of ' + currentPattern.patternPartial); + } - return promiseGlobMatches(currentPattern, paths).then((pseudoPatterns) => { - const promises = pseudoPatterns.map((pseudoPattern) => { - if (patternlab.config.debug) { - console.log('found pseudoPattern variant of ' + currentPattern.patternPartial); - } + // we return a Promise for each file descriptor to form an array + // of Promises for Promise.all to resolve when they're all + // complete + return fs.readJSON(path.resolve(paths.source.patterns, pseudoPatternPath)) + .then(variantFileData => { + const patternVariant = createPseudoPatternObject( + plutils.mergeData(currentPattern.jsonFileData, variantFileData), + currentPattern, + pseudoPatternPath, + patternlab + ); - //we want to do everything we normally would here, except instead read the pseudoPattern data - return fs.readJSON(path.resolve(paths.source.patterns, pseudoPattern)).then((variantFileData) => { - //extend any existing data with variant data - variantFileData = plutils.mergeData(currentPattern.jsonFileData, variantFileData); - - var variantName = pseudoPattern.substring(pseudoPattern.indexOf('~') + 1).split('.')[0]; - var variantFilePath = path.join(currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); - var patternVariant = Pattern.create(variantFilePath, variantFileData, { - //use the same template as the non-variant - template: currentPattern.template, - fileExtension: currentPattern.fileExtension, - extendedTemplate: currentPattern.extendedTemplate, - isPseudoPattern: true, - basePattern: currentPattern, - stylePartials: currentPattern.stylePartials, - parameteredPartials: currentPattern.parameteredPartials, - - // use the same template engine as the non-variant - engine: currentPattern.engine - }, patternlab); - - //process the companion markdown file if it exists - pattern_assembler.parse_pattern_markdown(patternVariant, patternlab); - - //find pattern lineage - lineage_hunter.find_lineage(patternVariant, patternlab); - - //add to patternlab object so we can look these up later. - pattern_assembler.addPattern(patternVariant, patternlab); - }).catch((err) => { - console.log('There was an error parsing pseudopattern JSON for ' + currentPattern.relPath); - console.log(err); - }); - }); - - return Promise.all(promises); - }).catch((err) => { - console.log('There was an error parsing pseudopattern JSON for ' + currentPattern.relPath); - console.log(err); - }); + //process the companion markdown file if it exists + processPseudoPattern(patternVariant, patternlab); + }) + .catch(plutils.reportError( + 'There was an error processing the pseudopattern' + pseudoPatternPath + )); + })); + }) + .catch(plutils.reportError( + 'There was an error parsing pseudopattern JSON for ' + currentPattern.relPath + )); } module.exports = { find_pseudopatterns: function (pattern, patternlab) { - return findpseudopatterns(pattern, patternlab); + return findPseudoPatterns(pattern, patternlab); } }; diff --git a/core/lib/utilities.js b/core/lib/utilities.js index 8e1488814..5cb034929 100644 --- a/core/lib/utilities.js +++ b/core/lib/utilities.js @@ -123,6 +123,19 @@ var util = { if (cleanDir) { fs.rmdirSync(dir); } + }, + + + /** + * Useful for reporting errors in .catch() on Promises + * @param {string} a message to report + * @returns {function} a callback to be passed to a Promise's .catch() + */ + reportError: function (message) { + return function (err) { + console.log(message); + console.log(err); + }; } }; From 432d879acbbcbe65f4c1772c1699ae7325fe5c9d Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Wed, 16 Nov 2016 15:26:37 -0600 Subject: [PATCH 08/98] a little error handling work; get most of the total disasters out of the unit tests --- core/lib/pattern_assembler.js | 10 +-- test/pattern_assembler_tests.js | 143 +++++++++++++++++--------------- 2 files changed, 80 insertions(+), 73 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index e8ac30547..243769683 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -284,7 +284,6 @@ var pattern_assembler = function () { console.log(err); } } - } @@ -368,17 +367,16 @@ var pattern_assembler = function () { // This is now solely for analysis; loading of the pattern file is // above, in loadPatternIterative() function processPatternIterative(pattern, patternlab) { - //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json + //look for a pseudo pattern by checking if there is a file + //containing same name, with ~ in it, ending in .json return pph.find_pseudopatterns(pattern, patternlab).then(() => { //find any stylemodifiers that may be in the current pattern pattern.stylePartials = pattern.findPartialsWithStyleModifiers(); //find any pattern parameters that may be in the current pattern pattern.parameteredPartials = pattern.findPartialsWithPatternParameters(); - }).catch((err) => { - console.log('There was an error in processPatternIterative():', err); - console.log(err); - }); + return pattern; + }).catch(plutils.reportError('There was an error in processPatternIterative():')); } function processPatternRecursive(file, patternlab) { diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 6f9bafa31..d165b4bda 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -36,32 +36,34 @@ tap.test('process_pattern_recursive recursively includes partials', function(tes patternlab.partials = {}; //diveSync once to perform iterative populating of patternlab object - plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab); - - //diveSync again to recursively include partials, filling out the - //extendedTemplate property of the patternlab.patterns elements - plMain.process_all_patterns_recursive(pattern_assembler, patterns_dir, patternlab); - - //get test output for comparison - var foo = fs.readFileSync(patterns_dir + '/00-test/00-foo.mustache', 'utf8').trim(); - var bar = fs.readFileSync(patterns_dir + '/00-test/01-bar.mustache', 'utf8').trim(); - var fooExtended; - - //get extended pattern - for (var i = 0; i < patternlab.patterns.length; i++) { - if (patternlab.patterns[i].fileName === '00-foo') { - fooExtended = patternlab.patterns[i].extendedTemplate.trim(); - break; - } - } + plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab) + .then(() => { + //diveSync again to recursively include partials, filling out the + //extendedTemplate property of the patternlab.patterns elements + plMain.process_all_patterns_recursive(pattern_assembler, patterns_dir, patternlab); + + //get test output for comparison + var foo = fs.readFileSync(patterns_dir + '/00-test/00-foo.mustache', 'utf8').trim(); + var bar = fs.readFileSync(patterns_dir + '/00-test/01-bar.mustache', 'utf8').trim(); + var fooExtended; + + //get extended pattern + for (var i = 0; i < patternlab.patterns.length; i++) { + if (patternlab.patterns[i].fileName === '00-foo') { + fooExtended = patternlab.patterns[i].extendedTemplate.trim(); + break; + } + } - //check initial values - test.equals(foo, '{{> test-bar }}', 'foo template not as expected'); - test.equals(bar, 'bar', 'bar template not as expected'); - //test that 00-foo.mustache included partial 01-bar.mustache - test.equals(fooExtended, 'bar', 'foo includes bar'); + //check initial values + test.equals(foo, '{{> test-bar }}', 'foo template not as expected'); + test.equals(bar, 'bar', 'bar template not as expected'); + //test that 00-foo.mustache included partial 01-bar.mustache + test.equals(fooExtended, 'bar', 'foo includes bar'); - test.end(); + test.end(); + }) + .catch(test.threw); }); tap.test('processPatternRecursive - correctly replaces all stylemodifiers when multiple duplicate patterns with different stylemodifiers found', function(test) { @@ -526,42 +528,44 @@ tap.test('parseDataLinks - replaces found link.* data for their expanded links', patternlab.partials = {}; //diveSync once to perform iterative populating of patternlab object - plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab); - - //for the sake of the test, also imagining I have the following pages... - patternlab.data.link['twitter-brad'] = 'https://twitter.com/brad_frost'; - patternlab.data.link['twitter-dave'] = 'https://twitter.com/dmolsen'; - patternlab.data.link['twitter-brian'] = 'https://twitter.com/bmuenzenmeyer'; - - patternlab.data.brad = {url: "link.twitter-brad"}; - patternlab.data.dave = {url: "link.twitter-dave"}; - patternlab.data.brian = {url: "link.twitter-brian"}; - - - var pattern; - for (var i = 0; i < patternlab.patterns.length; i++) { - if (patternlab.patterns[i].patternPartial === 'test-nav') { - pattern = patternlab.patterns[i]; - } - } - - //assert before - test.equals(pattern.jsonFileData.brad.url, "link.twitter-brad", "brad pattern data should be found"); - test.equals(pattern.jsonFileData.dave.url, "link.twitter-dave", "dave pattern data should be found"); - test.equals(pattern.jsonFileData.brian.url, "link.twitter-brian", "brian pattern data should be found"); - - //act - pattern_assembler.parse_data_links(patternlab); - - //assert after - test.equals(pattern.jsonFileData.brad.url, "https://twitter.com/brad_frost", "brad pattern data should be replaced"); - test.equals(pattern.jsonFileData.dave.url, "https://twitter.com/dmolsen", "dave pattern data should be replaced"); - test.equals(pattern.jsonFileData.brian.url, "https://twitter.com/bmuenzenmeyer", "brian pattern data should be replaced"); + plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab) + .then(() => { + //for the sake of the test, also imagining I have the following pages... + patternlab.data.link['twitter-brad'] = 'https://twitter.com/brad_frost'; + patternlab.data.link['twitter-dave'] = 'https://twitter.com/dmolsen'; + patternlab.data.link['twitter-brian'] = 'https://twitter.com/bmuenzenmeyer'; + + patternlab.data.brad = {url: "link.twitter-brad"}; + patternlab.data.dave = {url: "link.twitter-dave"}; + patternlab.data.brian = {url: "link.twitter-brian"}; + + + var pattern; + for (var i = 0; i < patternlab.patterns.length; i++) { + if (patternlab.patterns[i].patternPartial === 'test-nav') { + pattern = patternlab.patterns[i]; + } + } - test.equals(patternlab.data.brad.url, "https://twitter.com/brad_frost", "global brad data should be replaced"); - test.equals(patternlab.data.dave.url, "https://twitter.com/dmolsen", "global dave data should be replaced"); - test.equals(patternlab.data.brian.url, "https://twitter.com/bmuenzenmeyer", "global brian data should be replaced"); - test.end(); + //assert before + test.equals(pattern.jsonFileData.brad.url, "link.twitter-brad", "brad pattern data should be found"); + test.equals(pattern.jsonFileData.dave.url, "link.twitter-dave", "dave pattern data should be found"); + test.equals(pattern.jsonFileData.brian.url, "link.twitter-brian", "brian pattern data should be found"); + + //act + pattern_assembler.parse_data_links(patternlab); + + //assert after + test.equals(pattern.jsonFileData.brad.url, "https://twitter.com/brad_frost", "brad pattern data should be replaced"); + test.equals(pattern.jsonFileData.dave.url, "https://twitter.com/dmolsen", "dave pattern data should be replaced"); + test.equals(pattern.jsonFileData.brian.url, "https://twitter.com/bmuenzenmeyer", "brian pattern data should be replaced"); + + test.equals(patternlab.data.brad.url, "https://twitter.com/brad_frost", "global brad data should be replaced"); + test.equals(patternlab.data.dave.url, "https://twitter.com/dmolsen", "global dave data should be replaced"); + test.equals(patternlab.data.brian.url, "https://twitter.com/bmuenzenmeyer", "global brian data should be replaced"); + test.end(); + }) + .catch(test.threw); }); tap.test('get_pattern_by_key - returns the fuzzy result when no others found', function(test) { @@ -664,14 +668,19 @@ tap.test('hidden patterns can be called by their nice names', function(test){ //act var hiddenPatternPath = path.join('00-test', '_00-hidden-pattern.mustache'); - var hiddenPattern = pattern_assembler.process_pattern_iterative(hiddenPatternPath, pl); - pattern_assembler.process_pattern_recursive(hiddenPatternPath, pl); - var testPatternPath = path.join('00-test', '15-hidden-pattern-tester.mustache'); - var testPattern = pattern_assembler.process_pattern_iterative(testPatternPath, pl); - pattern_assembler.process_pattern_recursive(testPatternPath, pl); - //assert - test.equals(util.sanitized(testPattern.render()), util.sanitized('Hello there! Here\'s the hidden atom: [This is the hidden atom]'), 'hidden pattern rendered output not as expected'); - test.end(); + var hiddenPattern = pattern_assembler.load_pattern_iterative(hiddenPatternPath, pl); + var testPattern = pattern_assembler.load_pattern_iterative(testPatternPath, pl); + + return Promise.all([ + pattern_assembler.process_pattern_iterative(hiddenPattern, pl), + pattern_assembler.process_pattern_iterative(testPattern, pl) + ]).then((results) => { + pattern_assembler.process_pattern_recursive(hiddenPatternPath, pl); + pattern_assembler.process_pattern_recursive(testPatternPath, pl); + + //assert + test.equals(util.sanitized(results[1].render()), util.sanitized('Hello there! Here\'s the hidden atom: [This is the hidden atom]'), 'hidden pattern rendered output not as expected'); + }).catch(test.threw); }); From 88de86d5e771ec7dc263bead8e90d0f46b0403b9 Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Wed, 16 Nov 2016 15:44:20 -0600 Subject: [PATCH 09/98] documentation on the pseudopattern hunter and fixes for the tests --- core/lib/pseudopattern_hunter.js | 9 ++++++++ test/pseudopattern_hunter_tests.js | 37 +++++++++++++----------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index c952a7053..9bbe4bff0 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -58,6 +58,15 @@ function processPseudoPattern(patternVariant, patternlab) { pattern_assembler.addPattern(patternVariant, patternlab); } +/** + * The only public API in this module. This will search for pseudo + * patterns and returns a Promise that resolves when it's done. It + * doesn't return anything; processPseudoPattern() just updates the + * global state. + * @param {Object} currentPattern + * @param {Object} patternlab + * @returns {Promise} + */ function findPseudoPatterns(currentPattern, patternlab) { /* eslint-disable no-shadow */ const paths = patternlab.config.paths; diff --git a/test/pseudopattern_hunter_tests.js b/test/pseudopattern_hunter_tests.js index 80bce5b61..64f6eb6b8 100644 --- a/test/pseudopattern_hunter_tests.js +++ b/test/pseudopattern_hunter_tests.js @@ -3,13 +3,12 @@ var tap = require('tap'); var path = require('path'); -var pha = require('../core/lib/pseudopattern_hunter'); +var pph = require('../core/lib/pseudopattern_hunter'); var pa = require('../core/lib/pattern_assembler'); var Pattern = require('../core/lib/object_factory').Pattern; var fs = require('fs-extra'); var pattern_assembler = new pa(); -var pseudopattern_hunter = new pha(); var patterns_dir = './test/files/_patterns/'; function stubPatternlab() { @@ -27,7 +26,7 @@ function stubPatternlab() { pl.patterns = []; pl.partials = {}; pl.config.patternStates = {}; - pl.config.outputFileSuffixes = { rendered: ''} + pl.config.outputFileSuffixes = { rendered: ''}; return pl; } @@ -45,16 +44,14 @@ tap.test('pseudpattern found and added as a pattern', function (test) { //act var patternCountBefore = pl.patterns.length; - pseudopattern_hunter.find_pseudopatterns(atomPattern, pl); - - //assert - test.equals(patternCountBefore + 1, pl.patterns.length); - test.equals(pl.patterns[1].patternPartial, 'test-styled-atom-alt'); - test.equals(pl.patterns[1].extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), ' {{message}} '); - test.equals(JSON.stringify(pl.patterns[1].jsonFileData), JSON.stringify({"message": "alternateMessage"})); - test.equals(pl.patterns[1].patternLink, '00-test-03-styled-atom-alt' + path.sep + '00-test-03-styled-atom-alt.html'); - - test.end(); + return pph.find_pseudopatterns(atomPattern, pl).then(() => { + //assert + test.equals(patternCountBefore + 1, pl.patterns.length); + test.equals(pl.patterns[1].patternPartial, 'test-styled-atom-alt'); + test.equals(pl.patterns[1].extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), ' {{message}} '); + test.equals(JSON.stringify(pl.patterns[1].jsonFileData), JSON.stringify({"message": "alternateMessage"})); + test.equals(pl.patterns[1].patternLink, '00-test-03-styled-atom-alt' + path.sep + '00-test-03-styled-atom-alt.html'); + }); }); tap.test('pseudpattern variant includes stylePartials and parameteredPartials', function (test) { @@ -77,12 +74,10 @@ tap.test('pseudpattern variant includes stylePartials and parameteredPartials', pattern_assembler.addPattern(pseudoPattern, pl); //act - pseudopattern_hunter.find_pseudopatterns(pseudoPattern, pl); - - //assert - test.equals(pl.patterns[2].patternPartial, 'test-pseudomodifier-test'); - test.equals(pl.patterns[2].stylePartials, pseudoPattern.stylePartials); - test.equals(pl.patterns[2].parameteredPartials, pseudoPattern.parameteredPartials); - - test.end(); + return pph.find_pseudopatterns(pseudoPattern, pl).then(() => { + //assert + test.equals(pl.patterns[2].patternPartial, 'test-pseudomodifier-test'); + test.equals(pl.patterns[2].stylePartials, pseudoPattern.stylePartials); + test.equals(pl.patterns[2].parameteredPartials, pseudoPattern.parameteredPartials); + }); }); From 79091906560b5e5540db692b3fde6b531e07c343 Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Wed, 16 Nov 2016 15:57:19 -0600 Subject: [PATCH 10/98] Fix lingering brokenness. I wonder how long this has been broken? --- test/pattern_assembler_tests.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index d165b4bda..6f6dc28cf 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -514,15 +514,9 @@ tap.test('parseDataLinks - replaces found link.* data for their expanded links', //patternlab.header = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/header.html'), 'utf8'); //patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/footer.html'), 'utf8'); patternlab.patterns = [ - { - patternPartial: 'twitter-brad' - }, - { - patternPartial: 'twitter-dave' - }, - { - patternPartial: 'twitter-brian' - } + Pattern.createEmpty({ patternPartial: 'twitter-brad' }, patternlab), + Pattern.createEmpty({ patternPartial: 'twitter-dave' }, patternlab), + Pattern.createEmpty({ patternPartial: 'twitter-brian' }, patternlab) ]; patternlab.data.link = {}; patternlab.partials = {}; From a3afcd0c25367cd50aafb0045c1f66e9a9e63deb Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Thu, 17 Nov 2016 15:50:47 -0600 Subject: [PATCH 11/98] passin' dem unit tests --- test/engine_handlebars_tests.js | 92 ++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 36 deletions(-) diff --git a/test/engine_handlebars_tests.js b/test/engine_handlebars_tests.js index cf1fa533e..fbfd41814 100644 --- a/test/engine_handlebars_tests.js +++ b/test/engine_handlebars_tests.js @@ -12,9 +12,9 @@ var eol = require('os').EOL; var engineLoader = require('../core/lib/pattern_engines'); if (!engineLoader.handlebars) { tap.test('Handlebars engine not installed, skipping tests.', function (test) { - test.end() - }) - return + test.end(); + }); + return; } // fake pattern lab constructor: @@ -79,11 +79,14 @@ tap.test('hello world handlebars pattern renders', function (test) { // do all the normal processing of the pattern var patternlab = new fakePatternLab(); var assembler = new pa(); - var helloWorldPattern = assembler.process_pattern_iterative(patternPath, patternlab); - assembler.process_pattern_recursive(patternPath, patternlab); + var helloWorldPattern = assembler.load_pattern_iterative(patternPath, patternlab); - test.equals(helloWorldPattern.render(), 'Hello world!' + eol); - test.end(); + return assembler.process_pattern_iterative(helloWorldPattern, patternlab) + .then((helloWorldPattern) => { + assembler.process_pattern_recursive(patternPath, patternlab); + + test.equals(helloWorldPattern.render(), 'Hello world!' + eol); + }); }); tap.test('hello worlds handlebars pattern can see the atoms-helloworld partial and renders it twice', function (test) { @@ -97,15 +100,20 @@ tap.test('hello worlds handlebars pattern can see the atoms-helloworld partial a var patternlab = new fakePatternLab(); // environment var assembler = new pa(); - // do all the normal processing of the pattern - assembler.process_pattern_iterative(pattern1Path, patternlab); - var helloWorldsPattern = assembler.process_pattern_iterative(pattern2Path, patternlab); - assembler.process_pattern_recursive(pattern1Path, patternlab); - assembler.process_pattern_recursive(pattern2Path, patternlab); + // do all the normal loading and processing of the pattern + const pattern1 = assembler.load_pattern_iterative(pattern1Path, patternlab); + const pattern2 = assembler.load_pattern_iterative(pattern2Path, patternlab); - // test - test.equals(helloWorldsPattern.render(), 'Hello world!' + eol + ' and Hello world!' + eol + eol); - test.end(); + return Promise.all([ + assembler.process_pattern_iterative(pattern1, patternlab), + assembler.process_pattern_iterative(pattern2, patternlab) + ]).then(() => { + assembler.process_pattern_recursive(pattern1Path, patternlab); + assembler.process_pattern_recursive(pattern2Path, patternlab); + + // test + test.equals(pattern2.render(), 'Hello world!' + eol + ' and Hello world!' + eol + eol); + }); }); tap.test('handlebars partials can render JSON values', function (test) { @@ -119,12 +127,14 @@ tap.test('handlebars partials can render JSON values', function (test) { var assembler = new pa(); // do all the normal processing of the pattern - var helloWorldWithData = assembler.process_pattern_iterative(pattern1Path, patternlab); - assembler.process_pattern_recursive(pattern1Path, patternlab); + var helloWorldWithData = assembler.load_pattern_iterative(pattern1Path, patternlab); - // test - test.equals(helloWorldWithData.render(), 'Hello world!' + eol + 'Yeah, we got the subtitle from the JSON.' + eol); - test.end(); + return assembler.process_pattern_iterative(helloWorldWithData, patternlab).then(() => { + assembler.process_pattern_recursive(pattern1Path, patternlab); + + // test + test.equals(helloWorldWithData.render(), 'Hello world!' + eol + 'Yeah, we got the subtitle from the JSON.' + eol); + }); }); tap.test('handlebars partials use the JSON environment from the calling pattern and can accept passed parameters', function (test) { @@ -139,14 +149,19 @@ tap.test('handlebars partials use the JSON environment from the calling pattern var assembler = new pa(); // do all the normal processing of the pattern - assembler.process_pattern_iterative(atomPath, patternlab); - var mol = assembler.process_pattern_iterative(molPath, patternlab); - assembler.process_pattern_recursive(atomPath, patternlab); - assembler.process_pattern_recursive(molPath, patternlab); - - // test - test.equals(mol.render(), '

Call with default JSON environment:

' + eol + 'This is Hello world!' + eol + 'from the default JSON.' + eol + eol + eol +'

Call with passed parameter:

' + eol + 'However, this is Hello world!' + eol + 'from a totally different blob.' + eol + eol); - test.end(); + const atom = assembler.load_pattern_iterative(atomPath, patternlab); + const mol = assembler.load_pattern_iterative(molPath, patternlab); + + return Promise.all([ + assembler.process_pattern_iterative(atom, patternlab), + assembler.process_pattern_iterative(mol, patternlab) + ]).then(() => { + assembler.process_pattern_recursive(atomPath, patternlab); + assembler.process_pattern_recursive(molPath, patternlab); + + // test + test.equals(mol.render(), '

Call with default JSON environment:

' + eol + 'This is Hello world!' + eol + 'from the default JSON.' + eol + eol + eol +'

Call with passed parameter:

' + eol + 'However, this is Hello world!' + eol + 'from a totally different blob.' + eol + eol); + }); }); tap.test('find_pattern_partials finds partials', function (test) { @@ -211,14 +226,19 @@ tap.test('hidden handlebars patterns can be called by their nice names', functio var pattern_assembler = new pa(); var hiddenPatternPath = path.join('00-atoms', '00-global', '_00-hidden.hbs'); - var hiddenPattern = pattern_assembler.process_pattern_iterative(hiddenPatternPath, pl); - pattern_assembler.process_pattern_recursive(hiddenPatternPath, pl); - var testPatternPath = path.join('00-molecules', '00-global', '00-hidden-pattern-tester.hbs'); - var testPattern = pattern_assembler.process_pattern_iterative(testPatternPath, pl); - pattern_assembler.process_pattern_recursive(testPatternPath, pl); - //act - test.equals(util.sanitized(testPattern.render()), util.sanitized('Here\'s the hidden atom: [I\'m the hidden atom\n]\n')); - test.end(); + var hiddenPattern = pattern_assembler.load_pattern_iterative(hiddenPatternPath, pl); + var testPattern = pattern_assembler.load_pattern_iterative(testPatternPath, pl); + + return Promise.all([ + pattern_assembler.process_pattern_iterative(hiddenPattern, pl), + pattern_assembler.process_pattern_iterative(testPattern, pl) + ]).then(() => { + pattern_assembler.process_pattern_recursive(hiddenPatternPath, pl); + pattern_assembler.process_pattern_recursive(testPatternPath, pl); + + //act + test.equals(util.sanitized(testPattern.render()), util.sanitized('Here\'s the hidden atom: [I\'m the hidden atom\n]\n')); + }); }); From da2febd9af3807404ed9d083ad663cb7643a2eda Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Fri, 18 Nov 2016 10:56:57 -0600 Subject: [PATCH 12/98] pass underscore tests --- test/engine_underscore_tests.js | 47 +++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/test/engine_underscore_tests.js b/test/engine_underscore_tests.js index 8c245bdf4..7bf5cf791 100644 --- a/test/engine_underscore_tests.js +++ b/test/engine_underscore_tests.js @@ -53,12 +53,13 @@ tap.test('hello world underscore pattern renders', function (test) { // do all the normal processing of the pattern var patternlab = new fakePatternLab(); var assembler = new pa(); - var helloWorldPattern = assembler.process_pattern_iterative(patternPath, patternlab); - assembler.process_pattern_recursive(patternPath, patternlab); + const helloWorldPattern = assembler.load_pattern_iterative(patternPath, patternlab); - test.equals(helloWorldPattern.render(), 'Hello world!' + eol); - test.end(); + return assembler.process_pattern_iterative(helloWorldPattern, patternlab).then(() => { + assembler.process_pattern_recursive(patternPath, patternlab); + test.equals(helloWorldPattern.render(), 'Hello world!' + eol); + }); }); tap.test('underscore partials can render JSON values', function (test) { @@ -78,13 +79,13 @@ tap.test('underscore partials can render JSON values', function (test) { var assembler = new pa(); // do all the normal processing of the pattern - var helloWorldWithData = assembler.process_pattern_iterative(pattern1Path, patternlab); - assembler.process_pattern_recursive(pattern1Path, patternlab); - - // test - test.equals(helloWorldWithData.render(), 'Hello world!' + eol + 'Yeah, we got the subtitle from the JSON.' + eol); - test.end(); + const helloWorldWithData = assembler.load_pattern_iterative(pattern1Path, patternlab); + return assembler.process_pattern_iterative(helloWorldWithData, patternlab).then(() => { + assembler.process_pattern_recursive(pattern1Path, patternlab); + // test + test.equals(helloWorldWithData.render(), 'Hello world!' + eol + 'Yeah, we got the subtitle from the JSON.' + eol); + }); }); tap.test('findPartial return the ID of the partial, given a whole partial call', function (test) { @@ -101,22 +102,28 @@ tap.test('findPartial return the ID of the partial, given a whole partial call', }); tap.test('hidden underscore patterns can be called by their nice names', function(test){ - const util = require('./util/test_utils.js'); + const util = require('./util/test_utils.js'); - //arrange - const testPatternsPath = path.resolve(__dirname, 'files', '_underscore-test-patterns'); - const pl = util.fakePatternLab(testPatternsPath); - var pattern_assembler = new pa(); + //arrange + const testPatternsPath = path.resolve(__dirname, 'files', '_underscore-test-patterns'); + const pl = util.fakePatternLab(testPatternsPath); + var pattern_assembler = new pa(); - var hiddenPatternPath = path.join('00-atoms', '00-global', '_00-hidden.html'); - var hiddenPattern = pattern_assembler.process_pattern_iterative(hiddenPatternPath, pl); - pattern_assembler.process_pattern_recursive(hiddenPatternPath, pl); + var hiddenPatternPath = path.join('00-atoms', '00-global', '_00-hidden.html'); + var testPatternPath = path.join('00-molecules', '00-global', '00-hidden-pattern-tester.html'); + + var hiddenPattern = pattern_assembler.load_pattern_iterative(hiddenPatternPath, pl); + var testPattern = pattern_assembler.load_pattern_iterative(testPatternPath, pl); - var testPatternPath = path.join('00-molecules', '00-global', '00-hidden-pattern-tester.html'); - var testPattern = pattern_assembler.process_pattern_iterative(testPatternPath, pl); + return Promise.all([ + pattern_assembler.process_pattern_iterative(hiddenPattern, pl), + pattern_assembler.process_pattern_iterative(testPattern, pl) + ]).then(() => { + pattern_assembler.process_pattern_recursive(hiddenPatternPath, pl); pattern_assembler.process_pattern_recursive(testPatternPath, pl); //act test.equals(util.sanitized(testPattern.render()), util.sanitized('Here\'s the hidden atom: [I\'m the hidden atom\n]\n')); test.end(); }); +}); From d09a6faeeb70ac42bf671d2d260f71b5b54897fe Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Fri, 18 Nov 2016 11:02:01 -0600 Subject: [PATCH 13/98] pass twig tests --- test/engine_twig_tests.js | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/test/engine_twig_tests.js b/test/engine_twig_tests.js index 5a8351f7a..634c90931 100644 --- a/test/engine_twig_tests.js +++ b/test/engine_twig_tests.js @@ -79,11 +79,13 @@ tap.test('button twig pattern renders', function (test) { // do all the normal processing of the pattern var patternlab = new fakePatternLab(); var assembler = new pa(); - var helloWorldPattern = assembler.process_pattern_iterative(patternPath, patternlab); - assembler.process_pattern_recursive(patternPath, patternlab); + var helloWorldPattern = assembler.load_pattern_iterative(patternPath, patternlab); - test.equals(helloWorldPattern.render(), expectedValue); - test.end(); + return assembler.process_pattern_iterative(patternPath, patternlab).then(() => { + assembler.process_pattern_recursive(patternPath, patternlab); + + test.equals(helloWorldPattern.render(), expectedValue); + }); }); tap.test('media object twig pattern can see the atoms-button and atoms-image partials and renders them', function (test) { @@ -101,17 +103,23 @@ tap.test('media object twig pattern can see the atoms-button and atoms-image par var assembler = new pa(); // do all the normal processing of the pattern - assembler.process_pattern_iterative(buttonPatternPath, patternlab); - assembler.process_pattern_iterative(imagePatternPath, patternlab); - var mediaObjectPattern = assembler.process_pattern_iterative(mediaObjectPatternPath, patternlab); - assembler.process_pattern_recursive(buttonPatternPath, patternlab); - assembler.process_pattern_recursive(imagePatternPath, patternlab); - assembler.process_pattern_recursive(mediaObjectPatternPath, patternlab); - - // test - // this pattern is too long - so just remove line endings on both sides and compare output - test.equals(mediaObjectPattern.render().replace(/\r?\n|\r/gm, ""), expectedValue.replace(/\r?\n|\r/gm, "")); - test.end(); + const buttonPattern = assembler.load_pattern_iterative(buttonPatternPath, patternlab); + const imagePattern = assembler.load_pattern_iterative(imagePatternPath, patternlab); + const mediaObjectPattern = assembler.load_pattern_iterative(mediaObjectPatternPath, patternlab); + + return Promise.all([ + assembler.process_pattern_iterative(buttonPattern, patternlab), + assembler.process_pattern_iterative(imagePattern, patternlab), + assembler.process_pattern_iterative(mediaObjectPattern, patternlab) + ]).then(() => { + assembler.process_pattern_recursive(buttonPatternPath, patternlab); + assembler.process_pattern_recursive(imagePatternPath, patternlab); + assembler.process_pattern_recursive(mediaObjectPatternPath, patternlab); + + // test + // this pattern is too long - so just remove line endings on both sides and compare output + test.equals(mediaObjectPattern.render().replace(/\r?\n|\r/gm, ""), expectedValue.replace(/\r?\n|\r/gm, "")); + }); }); tap.test('twig partials can render JSON values', {skip: true}, function (test) { @@ -196,4 +204,3 @@ tap.test('find_pattern_partials finds partials with twig parameters', function ( "{% include 'organisms-sidebar' ignore missing with {'foo': 'bar'} %}" ]); }); - From 0406fa41d64133f0fb3dfcee4ae69120737883de Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Fri, 18 Nov 2016 11:17:55 -0600 Subject: [PATCH 14/98] Pass the last (?) of the unit tests --- test/engine_handlebars_tests.js | 40 ++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/test/engine_handlebars_tests.js b/test/engine_handlebars_tests.js index d0de6549e..a048ec7f8 100644 --- a/test/engine_handlebars_tests.js +++ b/test/engine_handlebars_tests.js @@ -251,13 +251,15 @@ tap.test('@partial-block template should render without throwing (@geoffp repo i // do all the normal processing of the pattern var patternlab = new fakePatternLab(); var assembler = new pa(); - var atPartialBlockPattern = assembler.process_pattern_iterative(patternPath, patternlab); - assembler.process_pattern_recursive(patternPath, patternlab); + var atPartialBlockPattern = assembler.load_pattern_iterative(patternPath, patternlab); - var results = '{{> @partial-block }}' + eol + 'It worked!' + eol; - test.equal(atPartialBlockPattern.render(), results); - test.end(); -}) + return assembler.process_pattern_iterative(atPartialBlockPattern, patternlab).then(() => { + assembler.process_pattern_recursive(patternPath, patternlab); + + var results = '{{> @partial-block }}' + eol + 'It worked!' + eol; + test.equal(atPartialBlockPattern.render(), results); + }); +}); tap.test('A template calling a @partial-block template should render correctly', function(test) { test.plan(1); @@ -271,13 +273,19 @@ tap.test('A template calling a @partial-block template should render correctly', var assembler = new pa(); // do all the normal processing of the pattern - assembler.process_pattern_iterative(pattern1Path, patternlab); - var callAtPartialBlockPattern = assembler.process_pattern_iterative(pattern2Path, patternlab); - assembler.process_pattern_recursive(pattern1Path, patternlab); - assembler.process_pattern_recursive(pattern2Path, patternlab); - - // test - var results = 'Hello World!' + eol + 'It worked!' + eol; - test.equals(callAtPartialBlockPattern.render(), results); - test.end(); -}) + const pattern1 = assembler.load_pattern_iterative(pattern1Path, patternlab); + const callAtPartialBlockPattern = assembler.load_pattern_iterative(pattern2Path, patternlab); + + return Promise.all([ + assembler.process_pattern_iterative(pattern1Path, patternlab), + assembler.process_pattern_iterative(pattern2Path, patternlab) + ]).then(() => { + assembler.process_pattern_recursive(pattern1Path, patternlab); + assembler.process_pattern_recursive(pattern2Path, patternlab); + + // test + var results = 'Hello World!' + eol + 'It worked!' + eol; + test.equals(callAtPartialBlockPattern.render(), results); + }); + +}); From f4cb4499dc2e7327a7d7ce8523722facb8abf866 Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Mon, 21 Nov 2016 11:53:38 -0600 Subject: [PATCH 15/98] get rid of some path and console string concatenations in favor of template literals --- core/lib/pseudopattern_hunter.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index 9bbe4bff0..8be9c8bce 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -11,7 +11,7 @@ const glob = require('glob'), function promiseGlobMatches(currentPattern, paths) { //look for a pseudo pattern by checking if there is a file containing same //name, with ~ in it, ending in .json - const needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; + const needle = path.join(currentPattern.subdir, `${currentPattern.fileName}~*.json`); return new Promise((resolve, reject) => { glob( @@ -27,7 +27,7 @@ function promiseGlobMatches(currentPattern, paths) { function createPseudoPatternObject(variantFileData, pattern, pseudoPattern, patternlab) { const variantName = pseudoPattern.substring(pseudoPattern.indexOf('~') + 1).split('.')[0]; - const variantFilePath = path.join(pattern.subdir, pattern.fileName + '~' + variantName + '.json'); + const variantFilePath = path.join(pattern.subdir, `${pattern.fileName}~${variantName}.json`); return Pattern.create(variantFilePath, variantFileData, { //use the same template as the non-variant @@ -75,7 +75,7 @@ function findPseudoPatterns(currentPattern, patternlab) { .then(pseudoPatternsPaths => { return Promise.all(pseudoPatternsPaths.map(pseudoPatternPath => { if (patternlab.config.debug) { - console.log('found pseudoPattern variant of ' + currentPattern.patternPartial); + console.log(`found pseudoPattern variant of ${currentPattern.patternPartial}`); } // we return a Promise for each file descriptor to form an array @@ -94,12 +94,12 @@ function findPseudoPatterns(currentPattern, patternlab) { processPseudoPattern(patternVariant, patternlab); }) .catch(plutils.reportError( - 'There was an error processing the pseudopattern' + pseudoPatternPath + `There was an error processing the pseudopattern $(pseudoPatternPath)` )); })); }) .catch(plutils.reportError( - 'There was an error parsing pseudopattern JSON for ' + currentPattern.relPath + `There was an error parsing pseudopattern JSON for ${currentPattern.relPath}` )); } From 204d88785cc40130785e9489d5cb35a0ad825d2d Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Sun, 27 Nov 2016 23:06:46 -0600 Subject: [PATCH 16/98] fix unit tests! forgot that we now need to pass pattern objects to processPatternIterative rather than paths --- test/engine_handlebars_tests.js | 4 ++-- test/engine_twig_tests.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/engine_handlebars_tests.js b/test/engine_handlebars_tests.js index a048ec7f8..a3d5d4c53 100644 --- a/test/engine_handlebars_tests.js +++ b/test/engine_handlebars_tests.js @@ -277,8 +277,8 @@ tap.test('A template calling a @partial-block template should render correctly', const callAtPartialBlockPattern = assembler.load_pattern_iterative(pattern2Path, patternlab); return Promise.all([ - assembler.process_pattern_iterative(pattern1Path, patternlab), - assembler.process_pattern_iterative(pattern2Path, patternlab) + assembler.process_pattern_iterative(pattern1, patternlab), + assembler.process_pattern_iterative(callAtPartialBlockPattern, patternlab) ]).then(() => { assembler.process_pattern_recursive(pattern1Path, patternlab); assembler.process_pattern_recursive(pattern2Path, patternlab); diff --git a/test/engine_twig_tests.js b/test/engine_twig_tests.js index 634c90931..278d91010 100644 --- a/test/engine_twig_tests.js +++ b/test/engine_twig_tests.js @@ -81,7 +81,7 @@ tap.test('button twig pattern renders', function (test) { var assembler = new pa(); var helloWorldPattern = assembler.load_pattern_iterative(patternPath, patternlab); - return assembler.process_pattern_iterative(patternPath, patternlab).then(() => { + return assembler.process_pattern_iterative(helloWorldPattern, patternlab).then(() => { assembler.process_pattern_recursive(patternPath, patternlab); test.equals(helloWorldPattern.render(), expectedValue); From 8112029c30929e16ef58dca8047db1ef86349bec Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Fri, 2 Dec 2016 09:30:57 -0600 Subject: [PATCH 17/98] sort the patterns array before building navigation! --- core/lib/ui_builder.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/ui_builder.js b/core/lib/ui_builder.js index e112dd8b3..8ce3550ac 100644 --- a/core/lib/ui_builder.js +++ b/core/lib/ui_builder.js @@ -371,7 +371,7 @@ var ui_builder = function () { patternGroups: {} }; - _.forEach(patternlab.patterns, function (pattern) { + _.forEach(sortPatterns(patternlab.patterns), function (pattern) { //ignore patterns we can omit from rendering directly pattern.omitFromStyleguide = isPatternExcluded(pattern, patternlab); From f2e468aff94386281821f3a3d658281d8802bec7 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 6 Dec 2016 08:37:35 -0600 Subject: [PATCH 18/98] Fix menu sort by maintaining patternlab.patterns as a name-sorted array. This lets us avoid sorting all patterns against order and name, which would comingle them. Sorting by order and name is only for pattern subtypes currently. --- core/lib/pattern_assembler.js | 5 +++-- core/lib/ui_builder.js | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index f7652dab0..b62946018 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -11,6 +11,7 @@ var path = require('path'), lih = require('./list_item_hunter'), smh = require('./style_modifier_hunter'), ph = require('./parameter_hunter'), + _ = require('lodash'), JSON5 = require('json5'); var markdown_parser = new mp(); @@ -124,8 +125,8 @@ var pattern_assembler = function () { patternlab.partials[pattern.patternPartial] = pattern.patternDesc; } - patternlab.patterns.push(pattern); - + //patterns sorted by name so the patterntype and patternsubtype is adhered to for menu building + patternlab.patterns.splice(_.sortedIndexBy(patternlab.patterns, pattern, 'name'), 0, pattern); } } diff --git a/core/lib/ui_builder.js b/core/lib/ui_builder.js index 8ce3550ac..e112dd8b3 100644 --- a/core/lib/ui_builder.js +++ b/core/lib/ui_builder.js @@ -371,7 +371,7 @@ var ui_builder = function () { patternGroups: {} }; - _.forEach(sortPatterns(patternlab.patterns), function (pattern) { + _.forEach(patternlab.patterns, function (pattern) { //ignore patterns we can omit from rendering directly pattern.omitFromStyleguide = isPatternExcluded(pattern, patternlab); From caa49f6e5cc35612d68a7d070faa00169a1f17a9 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 3 Feb 2017 07:40:50 -0600 Subject: [PATCH 19/98] increment package.json to 3.0.0 closes #602 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e9b18959e..eeb34ecea 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "patternlab-node", "description": "Pattern Lab is a collection of tools to help you create atomic design systems. This is the node command line interface (CLI).", - "version": "2.7.2", + "version": "3.0.0", "main": "./core/lib/patternlab.js", "dependencies": { "async": "^2.1.2", From 0bffcf7ddceeb78fbb2ef339c76c0964931f4064 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 3 Feb 2017 07:44:24 -0600 Subject: [PATCH 20/98] pushing experimental fix for a CLI issue part of https://github.com/pattern-lab/patternlab-node-cli/issues/28 --- core/lib/patternlab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 356adc16c..becfff521 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -36,7 +36,6 @@ console.log( chalk.bold(']====\n') ); -var patternEngines = require('./pattern_engines'); var EventEmitter = require('events').EventEmitter; function buildPatternData(dataFilesPath, fsDep) { @@ -177,6 +176,7 @@ var patternlab_engine = function (config) { lh = require('./lineage_hunter'), ui = require('./ui_builder'), sm = require('./starterkit_manager'), + patternEngines = require('./pattern_engines'), Pattern = require('./object_factory').Pattern, CompileState = require('./object_factory').CompileState, patternlab = {}; From 46f2e6cca2f05d67cf7263faea8b9e1702d9523e Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 3 Feb 2017 08:30:31 -0600 Subject: [PATCH 21/98] tell travis to build this branch --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 6d447035b..3c4671330 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,7 @@ branches: only: - master - dev + - dev3.0 notifications: webhooks: From 457ed4893f5a6b49bd1d4f7cba832e425e69aa55 Mon Sep 17 00:00:00 2001 From: BRIAN MUENZENMEYER Date: Sun, 5 Feb 2017 20:24:09 -0600 Subject: [PATCH 22/98] Revert "pushing experimental fix for a CLI issue" This reverts commit 0bffcf7ddceeb78fbb2ef339c76c0964931f4064. --- core/lib/patternlab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index becfff521..356adc16c 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -36,6 +36,7 @@ console.log( chalk.bold(']====\n') ); +var patternEngines = require('./pattern_engines'); var EventEmitter = require('events').EventEmitter; function buildPatternData(dataFilesPath, fsDep) { @@ -176,7 +177,6 @@ var patternlab_engine = function (config) { lh = require('./lineage_hunter'), ui = require('./ui_builder'), sm = require('./starterkit_manager'), - patternEngines = require('./pattern_engines'), Pattern = require('./object_factory').Pattern, CompileState = require('./object_factory').CompileState, patternlab = {}; From e6cf3b1b3b1425bd09ba06b1e723a68f4cf1b2fd Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 7 Feb 2017 05:40:24 -0600 Subject: [PATCH 23/98] WIP deferred engine load! part of #610 part of the merge of #608 most unit tests working, only a few left - due to me hanging a property off the engine that @geoffp was not doing. still need to see how it behaves during actual builds --- .eslintrc | 6 +- core/lib/annotation_exporter.js | 48 +++++------ core/lib/changes_hunter.js | 18 ++-- core/lib/lineage_hunter.js | 46 +++++----- core/lib/list_item_hunter.js | 65 +++++++------- core/lib/markdown_parser.js | 18 ++-- core/lib/object_factory.js | 39 +++++---- core/lib/parameter_hunter.js | 59 +++++++------ core/lib/pattern_assembler.js | 34 ++++---- core/lib/pattern_engines.js | 128 ++++++++++++++-------------- core/lib/pattern_exporter.js | 10 +-- core/lib/pattern_graph.js | 26 +++--- core/lib/pattern_graph_dot.js | 12 +-- core/lib/pattern_registry.js | 8 +- core/lib/patternlab.js | 132 +++++++++++++++-------------- core/lib/plugin_manager.js | 18 ++-- core/lib/pseudopattern_hunter.js | 109 ++++++++++++++++-------- core/lib/starterkit_manager.js | 24 +++--- core/lib/style_modifier_hunter.js | 4 +- core/lib/ui_builder.js | 118 +++++++++++++------------- test/engine_handlebars_tests.js | 4 +- test/engine_mustache_tests.js | 1 + test/lineage_hunter_tests.js | 3 + test/list_item_hunter_tests.js | 5 +- test/object_factory_tests.js | 3 + test/parameter_hunter_tests.js | 3 +- test/pattern_assembler_tests.js | 3 + test/pattern_engines_tests.js | 3 +- test/pattern_graph_tests.js | 3 + test/pseudopattern_hunter_tests.js | 4 + test/ui_builder_tests.js | 3 + 31 files changed, 516 insertions(+), 441 deletions(-) diff --git a/.eslintrc b/.eslintrc index f2463e9b6..c445390a4 100644 --- a/.eslintrc +++ b/.eslintrc @@ -83,6 +83,10 @@ "space-infix-ops": 1, "valid-typeof": 2, "vars-on-top": 0, - "wrap-iife": [2, "inside"] + "wrap-iife": [2, "inside"], + "prefer-const": ["error", { + "destructuring": "any", + "ignoreReadBeforeAssign": false + }] } } diff --git a/core/lib/annotation_exporter.js b/core/lib/annotation_exporter.js index d12054145..a0333e2e7 100644 --- a/core/lib/annotation_exporter.js +++ b/core/lib/annotation_exporter.js @@ -1,15 +1,15 @@ -"use strict"; +'use strict'; +const path = require('path'); +const glob = require('glob'); +const fs = require('fs-extra'); +const JSON5 = require('json5'); +const _ = require('lodash'); +const mp = require('./markdown_parser'); -var path = require('path'), - glob = require('glob'), - fs = require('fs-extra'), - JSON5 = require('json5'), - _ = require('lodash'), - mp = require('./markdown_parser'); +const annotations_exporter = function (pl) { -var annotations_exporter = function (pl) { - - var paths = pl.config.paths; + const paths = pl.config.paths; + let oldAnnotations; /* Returns the array of comments that used to be wrapped in raw JS. @@ -17,7 +17,7 @@ var annotations_exporter = function (pl) { function parseAnnotationsJS() { //attempt to read the file try { - var oldAnnotations = fs.readFileSync(path.resolve(paths.source.annotations, 'annotations.js'), 'utf8'); + oldAnnotations = fs.readFileSync(path.resolve(paths.source.annotations, 'annotations.js'), 'utf8'); } catch (ex) { if (pl.config.debug) { console.log('annotations.js file missing from ' + paths.source.annotations + '. This may be expected.'); @@ -40,8 +40,8 @@ var annotations_exporter = function (pl) { } function buildAnnotationMD(annotationsYAML, markdown_parser) { - var annotation = {}; - var markdownObj = markdown_parser.parse(annotationsYAML); + const annotation = {}; + const markdownObj = markdown_parser.parse(annotationsYAML); annotation.el = markdownObj.el || markdownObj.selector; annotation.title = markdownObj.title; @@ -50,16 +50,16 @@ var annotations_exporter = function (pl) { } function parseMDFile(annotations, parser) { - var annotations = annotations; - var markdown_parser = parser; + //let annotations = annotations; + const markdown_parser = parser; return function (filePath) { - var annotationsMD = fs.readFileSync(path.resolve(filePath), 'utf8'); + const annotationsMD = fs.readFileSync(path.resolve(filePath), 'utf8'); //take the annotation snippets and split them on our custom delimiter - var annotationsYAML = annotationsMD.split('~*~'); - for (var i = 0; i < annotationsYAML.length; i++) { - var annotation = buildAnnotationMD(annotationsYAML[i], markdown_parser); + const annotationsYAML = annotationsMD.split('~*~'); + for (let i = 0; i < annotationsYAML.length; i++) { + const annotation = buildAnnotationMD(annotationsYAML[i], markdown_parser); annotations.push(annotation); } return false; @@ -70,17 +70,17 @@ var annotations_exporter = function (pl) { Converts the *.md file yaml list into an array of annotations */ function parseAnnotationsMD() { - var markdown_parser = new mp(); - var annotations = []; - var mdFiles = glob.sync(paths.source.annotations + '/*.md'); + const markdown_parser = new mp(); + const annotations = []; + const mdFiles = glob.sync(paths.source.annotations + '/*.md'); mdFiles.forEach(parseMDFile(annotations, markdown_parser)); return annotations; } function gatherAnnotations() { - var annotationsJS = parseAnnotationsJS(); - var annotationsMD = parseAnnotationsMD(); + const annotationsJS = parseAnnotationsJS(); + const annotationsMD = parseAnnotationsMD(); return _.unionBy(annotationsJS, annotationsMD, 'el'); } diff --git a/core/lib/changes_hunter.js b/core/lib/changes_hunter.js index 3b98f9a9c..f92666abd 100644 --- a/core/lib/changes_hunter.js +++ b/core/lib/changes_hunter.js @@ -1,12 +1,12 @@ -"use strict"; -const fs = require("fs-extra"), - CompileState = require('./object_factory').CompileState; +'use strict'; +const fs = require("fs-extra"); +const CompileState = require('./object_factory').CompileState; /** * For detecting changed patterns. * @constructor */ -let ChangesHunter = function () { +const ChangesHunter = function () { }; ChangesHunter.prototype = { @@ -24,11 +24,11 @@ ChangesHunter.prototype = { checkBuildState: function (pattern, patternlab) { //write the compiled template to the public patterns directory - let renderedTemplatePath = + const renderedTemplatePath = patternlab.config.paths.public.patterns + pattern.getPatternLink(patternlab, 'rendered'); //write the compiled template to the public patterns directory - let markupOnlyPath = + const markupOnlyPath = patternlab.config.paths.public.patterns + pattern.getPatternLink(patternlab, 'markupOnly'); if (!pattern.compileState) { @@ -45,7 +45,7 @@ ChangesHunter.prototype = { // Prevent error message if file does not exist fs.accessSync(renderedFile, fs.F_OK) ); - let outputLastModified = fs.statSync(renderedTemplatePath).mtime.getTime(); + const outputLastModified = fs.statSync(renderedTemplatePath).mtime.getTime(); if (pattern.lastModified && outputLastModified > pattern.lastModified) { pattern.compileState = CompileState.CLEAN; @@ -55,7 +55,7 @@ ChangesHunter.prototype = { pattern.compileState = CompileState.NEEDS_REBUILD; } - let node = patternlab.graph.node(pattern); + const node = patternlab.graph.node(pattern); // Make the pattern known to the PatternGraph and remember its compileState if (!node) { @@ -78,7 +78,7 @@ ChangesHunter.prototype = { checkLastModified: function (currentPattern, file) { if (file) { try { - let stat = fs.statSync(file); + const stat = fs.statSync(file); // Needs recompile whenever one of the patterns files (template, json, pseudopatterns) changed currentPattern.lastModified = diff --git a/core/lib/lineage_hunter.js b/core/lib/lineage_hunter.js index d20db5771..7c61be98d 100644 --- a/core/lib/lineage_hunter.js +++ b/core/lib/lineage_hunter.js @@ -1,30 +1,30 @@ -"use strict"; +'use strict'; +const extend = require("util")._extend; -var extend = require("util")._extend; +const lineage_hunter = function () { -var lineage_hunter = function () { + function findlineage(pattern, patternlab) { - var pa = require('./pattern_assembler'); + const pa = require('./pattern_assembler'); + const pattern_assembler = new pa(); - function findlineage(pattern, patternlab) { // As we are adding edges from pattern to ancestor patterns, ensure it is known to the graph patternlab.graph.add(pattern); - var pattern_assembler = new pa(); //find the {{> template-name }} within patterns - var matches = pattern.findPartials(); + const matches = pattern.findPartials(); if (matches !== null) { matches.forEach(function (match) { //get the ancestorPattern - var ancestorPattern = pattern_assembler.getPartial(pattern.findPartial(match), patternlab); + const ancestorPattern = pattern_assembler.getPartial(pattern.findPartial(match), patternlab); if (ancestorPattern && pattern.lineageIndex.indexOf(ancestorPattern.patternPartial) === -1) { //add it since it didnt exist pattern.lineageIndex.push(ancestorPattern.patternPartial); //create the more complex patternLineage object too - var l = { + const l = { "lineagePattern": ancestorPattern.patternPartial, "lineagePath": "../../patterns/" + ancestorPattern.patternLink }; @@ -44,7 +44,7 @@ var lineage_hunter = function () { ancestorPattern.lineageRIndex.push(pattern.patternPartial); //create the more complex patternLineage object in reverse - var lr = { + const lr = { "lineagePattern": pattern.patternPartial, "lineagePath": "../../patterns/" + pattern.patternLink }; @@ -69,7 +69,7 @@ var lineage_hunter = function () { * @param graph {PatternGraph} */ function setPatternState(direction, pattern, targetPattern, graph) { - var index = null; + let index = null; if (direction === 'fromPast') { index = graph.lineage(pattern); } else { @@ -77,7 +77,7 @@ var lineage_hunter = function () { } // if the request came from the past, apply target pattern state to current pattern lineage - for (var i = 0; i < index.length; i++) { + for (let i = 0; i < index.length; i++) { if (index[i].patternPartial === targetPattern.patternPartial) { index[i].lineageState = targetPattern.patternState; } @@ -87,36 +87,36 @@ var lineage_hunter = function () { function cascadePatternStates(patternlab) { - for (var i = 0; i < patternlab.patterns.length; i++) { - var pattern = patternlab.patterns[i]; + for (let i = 0; i < patternlab.patterns.length; i++) { + const pattern = patternlab.patterns[i]; //for each pattern with a defined state if (pattern.patternState) { - var lineage = patternlab.graph.lineage(pattern); + const lineage = patternlab.graph.lineage(pattern); if (lineage && lineage.length > 0) { //find all lineage - patterns being consumed by this one - for (var h = 0; h < lineage.length; h++) { + for (let h = 0; h < lineage.length; h++) { // Not needed, the graph already knows the concrete pattern - // var lineagePattern = pattern_assembler.getPartial(lineageIndex[h], patternlab); + // let lineagePattern = pattern_assembler.getPartial(lineageIndex[h], patternlab); setPatternState('fromFuture', lineage[h], pattern, patternlab.graph); } } - var lineageR = patternlab.graph.lineageR(pattern); + const lineageR = patternlab.graph.lineageR(pattern); if (lineageR && lineageR.length > 0) { //find all reverse lineage - that is, patterns consuming this one - for (var j = 0; j < lineageR.length; j++) { + for (let j = 0; j < lineageR.length; j++) { - var lineageRPattern = lineageR[j]; + const lineageRPattern = lineageR[j]; //only set patternState if pattern.patternState "is less than" the lineageRPattern.patternstate //or if lineageRPattern.patternstate (the consuming pattern) does not have a state //this makes patternlab apply the lowest common ancestor denominator - let patternStateCascade = patternlab.config.patternStateCascade; - let patternStateIndex = patternStateCascade.indexOf(pattern.patternState); - let patternReverseStateIndex = patternStateCascade.indexOf(lineageRPattern.patternState); + const patternStateCascade = patternlab.config.patternStateCascade; + const patternStateIndex = patternStateCascade.indexOf(pattern.patternState); + const patternReverseStateIndex = patternStateCascade.indexOf(lineageRPattern.patternState); if (lineageRPattern.patternState === '' || (patternStateIndex < patternReverseStateIndex)) { if (patternlab.config.debug) { diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index be55f35c5..7904d2561 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -1,21 +1,20 @@ "use strict"; -var list_item_hunter = function () { - - var extend = require('util')._extend, - JSON5 = require('json5'), - pa = require('./pattern_assembler'), - smh = require('./style_modifier_hunter'), - plutils = require('./utilities'), - Pattern = require('./object_factory').Pattern; - - var pattern_assembler = new pa(), - style_modifier_hunter = new smh(), - items = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty']; +const list_item_hunter = function () { + const extend = require('util')._extend; + const JSON5 = require('json5'); + const pa = require('./pattern_assembler'); + const smh = require('./style_modifier_hunter'); + const plutils = require('./utilities'); + const Pattern = require('./object_factory').Pattern; + + const pattern_assembler = new pa(); + const style_modifier_hunter = new smh(); + const items = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty']; function processListItemPartials(pattern, patternlab) { //find any listitem blocks - var matches = pattern.findListItems(); + const matches = pattern.findListItems(); if (matches !== null) { matches.forEach(function (liMatch) { @@ -25,14 +24,14 @@ var list_item_hunter = function () { } //find the boundaries of the block - var loopNumberString = liMatch.split('.')[1].split('}')[0].trim(); - var end = liMatch.replace('#', '/'); - var patternBlock = pattern.template.substring(pattern.template.indexOf(liMatch) + liMatch.length, pattern.template.indexOf(end)).trim(); + const loopNumberString = liMatch.split('.')[1].split('}')[0].trim(); + const end = liMatch.replace('#', '/'); + const patternBlock = pattern.template.substring(pattern.template.indexOf(liMatch) + liMatch.length, pattern.template.indexOf(end)).trim(); //build arrays that repeat the block, however large we need to - var repeatedBlockTemplate = []; - var repeatedBlockHtml = ''; - for (var i = 0; i < items.indexOf(loopNumberString); i++) { + const repeatedBlockTemplate = []; + let repeatedBlockHtml = ''; + for (let i = 0; i < items.indexOf(loopNumberString); i++) { if (patternlab.config.debug) { console.log('list item(s) in pattern', pattern.patternPartial, 'adding', patternBlock, 'to repeatedBlockTemplate'); } @@ -40,7 +39,7 @@ var list_item_hunter = function () { } //check for a local listitems.json file - var listData; + let listData; try { listData = JSON5.parse(JSON5.stringify(patternlab.listitems)); } catch (err) { @@ -52,15 +51,15 @@ var list_item_hunter = function () { listData = pattern_assembler.parse_data_links_specific(patternlab, listData, 'listitems.json + any pattern listitems.json'); //iterate over each copied block, rendering its contents along with pattenlab.listitems[i] - for (var i = 0; i < repeatedBlockTemplate.length; i++) { + for (let i = 0; i < repeatedBlockTemplate.length; i++) { - var thisBlockTemplate = repeatedBlockTemplate[i]; - var thisBlockHTML = ""; + let thisBlockTemplate = repeatedBlockTemplate[i]; + let thisBlockHTML = ""; //combine listItem data with pattern data with global data - var itemData = listData['' + items.indexOf(loopNumberString)]; //this is a property like "2" - var globalData; - var localData; + const itemData = listData['' + items.indexOf(loopNumberString)]; //this is a property like "2" + let globalData; + let localData; try { globalData = JSON5.parse(JSON5.stringify(patternlab.data)); localData = JSON5.parse(JSON5.stringify(pattern.jsonFileData)); @@ -69,23 +68,23 @@ var list_item_hunter = function () { console.log(err); } - var allData = plutils.mergeData(globalData, localData); + let allData = plutils.mergeData(globalData, localData); allData = plutils.mergeData(allData, itemData !== undefined ? itemData[i] : {}); //itemData could be undefined if the listblock contains no partial, just markup allData.link = extend({}, patternlab.data.link); //check for partials within the repeated block - var foundPartials = Pattern.createEmpty({'template': thisBlockTemplate}).findPartials(); + const foundPartials = Pattern.createEmpty({'template': thisBlockTemplate}).findPartials(); if (foundPartials && foundPartials.length > 0) { - for (var j = 0; j < foundPartials.length; j++) { + for (let j = 0; j < foundPartials.length; j++) { //get the partial - var partialName = foundPartials[j].match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.getPartial(partialName, patternlab); + const partialName = foundPartials[j].match(/([\w\-\.\/~]+)/g)[0]; + const partialPattern = pattern_assembler.getPartial(partialName, patternlab); //create a copy of the partial so as to not pollute it after the get_pattern_by_key call. - var cleanPartialPattern; + let cleanPartialPattern; try { cleanPartialPattern = JSON5.parse(JSON5.stringify(partialPattern)); } catch (err) { @@ -118,7 +117,7 @@ var list_item_hunter = function () { } //replace the block with our generated HTML - var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch), pattern.extendedTemplate.indexOf(end) + end.length); + const repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch), pattern.extendedTemplate.indexOf(end) + end.length); pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); //update the extendedTemplate in the partials object in case this pattern is consumed later diff --git a/core/lib/markdown_parser.js b/core/lib/markdown_parser.js index 495e0d181..0b09929ac 100644 --- a/core/lib/markdown_parser.js +++ b/core/lib/markdown_parser.js @@ -1,9 +1,8 @@ -"use strict"; +'use strict'; +const md = require('markdown-it')(); +const yaml = require('js-yaml'); -var md = require('markdown-it')(); -var yaml = require('js-yaml'); - -var markdown_parser = function () { +const markdown_parser = function () { /** * Converts a markdown block with frontmatter (each is optional, technically) to a well-formed object. @@ -11,24 +10,25 @@ var markdown_parser = function () { * @returns an object with any frontmatter keys, plus a .markdown key */ function parseMarkdownBlock(block) { - var returnObject = {}; + let returnObject = {}; try { //for each block process the yaml frontmatter and markdown - var frontmatterRE = /---\r?\n{1}([\s\S]*)---\r?\n{1}([\s\S]*)+/gm; - var chunks = frontmatterRE.exec(block); + const frontmatterRE = /---\r?\n{1}([\s\S]*)---\r?\n{1}([\s\S]*)+/gm; + const chunks = frontmatterRE.exec(block); if (chunks) { //we got some frontmatter if (chunks && chunks[1]) { //parse the yaml if we got it - var frontmatter = chunks[1]; + const frontmatter = chunks[1]; returnObject = yaml.safeLoad(frontmatter); } if (chunks[2]) { //parse the actual markdown if it exists returnObject.markdown = md.render(chunks[2]); + console.log('rendered markdown', returnObject.markdown); } else { returnObject.markdown = ''; } diff --git a/core/lib/object_factory.js b/core/lib/object_factory.js index 1263d80df..82e33021a 100644 --- a/core/lib/object_factory.js +++ b/core/lib/object_factory.js @@ -1,20 +1,27 @@ -"use strict"; - -var patternEngines = require('./pattern_engines'); -var path = require('path'); -var extend = require('util')._extend; +'use strict'; +const patternEngines = require('./pattern_engines'); +const path = require('path'); +const extend = require('util')._extend; // patternPrefixMatcher is intended to match the leading maybe-underscore, // zero or more digits, and maybe-dash at the beginning of a pattern file name we can hack them // off and get at the good part. -var patternPrefixMatcher = /^_?(\d+-)?/; +const patternPrefixMatcher = /^_?(\d+-)?/; // Pattern properties - -var Pattern = function (relPath, data, patternlab) { - // We expect relPath to be the path of the pattern template, relative to the - // root of the pattern tree. Parse out the path parts and save the useful ones. - var pathObj = path.parse(path.normalize(relPath)); +/** + * Pattern constructor + * @constructor + */ +const Pattern = function (relPath, data, patternlab) { + /** + * We expect relPath to be the path of the pattern template, relative to the + * root of the pattern tree. Parse out the path parts and save the useful ones. + * @param {relPath} relative directory + * @param {data} The JSON used to render values in the pattern. + * @param {patternlab} rendered html files for the pattern + */ + const pathObj = path.parse(path.normalize(relPath)); this.relPath = path.normalize(relPath); // '00-atoms/00-global/00-colors.mustache' this.fileName = pathObj.name; // '00-colors' this.subdir = pathObj.dir; // '00-atoms/00-global' @@ -114,8 +121,8 @@ Pattern.prototype = { // Should look something like '00-atoms-00-global-00-colors/00-atoms-00-global-00-colors.html' getPatternLink: function (patternlab, suffixType, customfileExtension) { // if no suffixType is provided, we default to rendered - var suffixConfig = patternlab.config.outputFileSuffixes; - var suffix = suffixType ? suffixConfig[suffixType] : suffixConfig.rendered; + const suffixConfig = patternlab.config.outputFileSuffixes; + const suffix = suffixType ? suffixConfig[suffixType] : suffixConfig.rendered; if (suffixType === 'rawTemplate') { return this.name + path.sep + this.name + suffix + this.fileExtension; @@ -165,7 +172,7 @@ Pattern.createEmpty = function (customProps, patternlab) { } } - var pattern = new Pattern(relPath, null, patternlab); + const pattern = new Pattern(relPath, null, patternlab); return extend(pattern, customProps); }; @@ -173,11 +180,11 @@ Pattern.createEmpty = function (customProps, patternlab) { // parameters that replace the positional parameters that the Pattern // constructor takes. Pattern.create = function (relPath, data, customProps, patternlab) { - var newPattern = new Pattern(relPath || '', data || null, patternlab); + const newPattern = new Pattern(relPath || '', data || null, patternlab); return extend(newPattern, customProps); }; -var CompileState = { +const CompileState = { NEEDS_REBUILD: "needs rebuild", BUILDING: "building", CLEAN: "clean" diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 6f2d50f1e..731f85dfd 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -1,14 +1,13 @@ -"use strict"; +'use strict'; -var parameter_hunter = function () { - - var extend = require('util')._extend, - JSON5 = require('json5'), - pa = require('./pattern_assembler'), - smh = require('./style_modifier_hunter'), - plutils = require('./utilities'), - style_modifier_hunter = new smh(), - pattern_assembler = new pa(); +const parameter_hunter = function () { + const extend = require('util')._extend; + const JSON5 = require('json5'); + const pa = require('./pattern_assembler'); + const smh = require('./style_modifier_hunter'); + const plutils = require('./utilities'); + const style_modifier_hunter = new smh(); + const pattern_assembler = new pa(); /** * This function is really to accommodate the lax JSON-like syntax allowed by @@ -53,14 +52,14 @@ var parameter_hunter = function () { * @returns {string} paramStringWellFormed */ function paramToJson(pString) { - var colonPos = -1; - var keys = []; - var paramString = pString; // to not reassign param - var paramStringWellFormed; - var quotePos = -1; - var regex; - var values = []; - var wrapper; + let colonPos = -1; + const keys = []; + let paramString = pString; // to not reassign param + let paramStringWellFormed; + let quotePos = -1; + let regex; + const values = []; + let wrapper; //replace all escaped double-quotes with escaped unicode paramString = paramString.replace(/\\"/g, '\\u0022'); @@ -169,7 +168,7 @@ var parameter_hunter = function () { //build paramStringWellFormed string for JSON parsing paramStringWellFormed = '{'; - for (var i = 0; i < keys.length; i++) { + for (let i = 0; i < keys.length; i++) { //keys //replace single-quote wrappers with double-quotes @@ -239,8 +238,8 @@ var parameter_hunter = function () { //compile this partial immeadiately, essentially consuming it. pattern.parameteredPartials.forEach(function (pMatch) { //find the partial's name and retrieve it - var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.getPartial(partialName, patternlab); + const partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; + const partialPattern = pattern_assembler.getPartial(partialName, patternlab); //if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #190 partialPattern.extendedTemplate = partialPattern.template; @@ -250,14 +249,14 @@ var parameter_hunter = function () { } //strip out the additional data, convert string to JSON. - var leftParen = pMatch.indexOf('('); - var rightParen = pMatch.lastIndexOf(')'); - var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = paramToJson(paramString); + const leftParen = pMatch.indexOf('('); + const rightParen = pMatch.lastIndexOf(')'); + const paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; + const paramStringWellFormed = paramToJson(paramString); - var paramData = {}; - var globalData = {}; - var localData = {}; + let paramData = {}; + let globalData = {}; + let localData = {}; try { paramData = JSON5.parse(paramStringWellFormed); @@ -268,7 +267,7 @@ var parameter_hunter = function () { console.log(err); } - var allData = plutils.mergeData(globalData, localData); + let allData = plutils.mergeData(globalData, localData); allData = plutils.mergeData(allData, paramData); //if partial has style modifier data, replace the styleModifier value @@ -279,7 +278,7 @@ var parameter_hunter = function () { //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally allData.link = extend({}, patternlab.data.link); - var renderedPartial = pattern_assembler.renderPattern(partialPattern.extendedTemplate, allData, patternlab.partials); + const renderedPartial = pattern_assembler.renderPattern(partialPattern.extendedTemplate, allData, patternlab.partials); //remove the parameter from the partial and replace it with the rendered partial + paramData pattern.extendedTemplate = pattern.extendedTemplate.replace(pMatch, renderedPartial); diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 342fe8e33..0576d0ff0 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -1,25 +1,25 @@ "use strict"; -var path = require('path'), - fs = require('fs-promise'), - _ = require('lodash'), - Pattern = require('./object_factory').Pattern, - CompileState = require('./object_factory').CompileState, - pph = require('./pseudopattern_hunter'), - mp = require('./markdown_parser'), - plutils = require('./utilities'), - patternEngines = require('./pattern_engines'), - lh = require('./lineage_hunter'), - lih = require('./list_item_hunter'), - smh = require('./style_modifier_hunter'), - ph = require('./parameter_hunter'), - _ = require('lodash'), - ch = require('./changes_hunter'), - JSON5 = require('json5'); - +const path = require('path'); +const _ = require('lodash'); +const Pattern = require('./object_factory').Pattern; +const CompileState = require('./object_factory').CompileState; +const pph = require('./pseudopattern_hunter'); +const mp = require('./markdown_parser'); +const plutils = require('./utilities'); +const patternEngines = require('./pattern_engines'); +const lh = require('./lineage_hunter'); +const lih = require('./list_item_hunter'); +const smh = require('./style_modifier_hunter'); +const ph = require('./parameter_hunter'); +const ch = require('./changes_hunter'); +const JSON5 = require('json5'); const markdown_parser = new mp(); const changes_hunter = new ch(); +//this is mocked in unit tests +let fs = require('fs-extra'); //eslint-disable-line prefer-const + const pattern_assembler = function () { // HELPER FUNCTIONS diff --git a/core/lib/pattern_engines.js b/core/lib/pattern_engines.js index c316cec9d..9b2249a2c 100644 --- a/core/lib/pattern_engines.js +++ b/core/lib/pattern_engines.js @@ -1,11 +1,10 @@ // special shoutout to Geoffrey Pursell for single-handedly making Pattern Lab Node Pattern Engines possible! 'use strict'; - -var path = require('path'); -var diveSync = require('diveSync'); +const path = require('path'); +const diveSync = require('diveSync'); const chalk = require('chalk'); -var engineMatcher = /^patternengine-node-(.*)$/; -var enginesDirectories = [ +const engineMatcher = /^patternengine-node-(.*)$/; +const enginesDirectories = [ { displayName: 'the core', path: path.resolve(__dirname, '..', '..', 'node_modules') @@ -15,31 +14,26 @@ var enginesDirectories = [ path: path.join(process.cwd(), 'node_modules') } ]; -var PatternEngines; // the main export object -var engineNameForExtension; // generated mapping of extension to engine name - - -// free "private" functions, for internal setup only // given a path: return the engine name if the path points to a valid engine // module directory, or false if it doesn't function isEngineModule(filePath) { - var baseName = path.basename(filePath); - var engineMatch = baseName.match(engineMatcher); + const baseName = path.basename(filePath); + const engineMatch = baseName.match(engineMatcher); if (engineMatch) { return engineMatch[1]; } return false; } function findEngineModulesInDirectory(dir) { - var foundEngines = []; + const foundEngines = []; diveSync(dir, { recursive: false, directories: true }, function (err, filePath) { if (err) { throw err; } - var foundEngineName = isEngineModule(filePath); + const foundEngineName = isEngineModule(filePath); if (foundEngineName) { foundEngines.push({ name: foundEngineName, @@ -51,50 +45,16 @@ function findEngineModulesInDirectory(dir) { return foundEngines; } -// Try to load engines! We scan for engines at each path specified above. This -// function is kind of a big deal. -function loadAllEngines(enginesObject) { - enginesDirectories.forEach(function (engineDirectory) { - var enginesInThisDir = findEngineModulesInDirectory(engineDirectory.path); - console.log(chalk.bold(`Loading engines from ${engineDirectory.displayName}...\n`)); - - // find all engine-named things in this directory and try to load them, - // unless it's already been loaded. - enginesInThisDir.forEach(function (engineDiscovery) { - var errorMessage; - var successMessage = chalk.green("good to go"); - - try { - // give it a try! load 'er up. But not if we already have, of course. - if (enginesObject[engineDiscovery.name]) { - throw new Error("already loaded, skipping."); - } - enginesObject[engineDiscovery.name] = require(engineDiscovery.modulePath); - } catch (err) { - errorMessage = err.message; - } finally { - // report on the status of the engine, one way or another! - console.log(` ${engineDiscovery.name}:`, errorMessage ? chalk.red(errorMessage) : successMessage); - } - }); - console.log(''); - }); - // Complain if for some reason we haven't loaded any engines. - if (Object.keys(enginesObject).length === 0) { - throw new Error('No engines loaded! Something is seriously wrong.'); - } - console.log(chalk.bold('Done loading engines.\n')); -} // produce a mapping between file extension and engine name for each of the // loaded engines function createFileExtensionToEngineNameMap(enginesObject) { - var mapping = {}; + const mapping = {}; Object.keys(enginesObject).forEach(function (engineName) { - var extensionForEngine = enginesObject[engineName].engineFileExtension; + const extensionForEngine = enginesObject[engineName].engineFileExtension; mapping[extensionForEngine] = engineName; }); @@ -117,13 +77,56 @@ function createFileExtensionToEngineNameMap(enginesObject) { // only the engine names so we can easily iterate over them; all the handy // methods and properites below should therefore be on its prototype. -PatternEngines = Object.create({ +const PatternEngines = Object.create({ + + loadAllEngines: function () { + var self = this; + + // Try to load engines! We scan for engines at each path specified above. This + // function is kind of a big deal. + enginesDirectories.forEach(function (engineDirectory) { + const enginesInThisDir = findEngineModulesInDirectory(engineDirectory.path); + console.log(chalk.bold(`Loading engines from ${engineDirectory.displayName}...\n`)); + + // find all engine-named things in this directory and try to load them, + // unless it's already been loaded. + enginesInThisDir.forEach(function (engineDiscovery) { + let errorMessage; + const successMessage = chalk.green("good to go"); + + try { + // give it a try! load 'er up. But not if we already have, of course. + if (self[engineDiscovery.name]) { + throw new Error("already loaded, skipping."); + } + self[engineDiscovery.name] = require(engineDiscovery.modulePath); + } catch (err) { + errorMessage = err.message; + } finally { + // report on the status of the engine, one way or another! + console.log(` ${engineDiscovery.name}:`, errorMessage ? chalk.red(errorMessage) : successMessage); + } + }); + console.log(''); + }); + + // Complain if for some reason we haven't loaded any engines. + if (Object.keys(self).length === 0) { + throw new Error('No engines loaded! Something is seriously wrong.'); + } + + // mapping of file extensions to engine names, for lookup use + self.engineNameForExtension = createFileExtensionToEngineNameMap(self); + + console.log(chalk.bold('Done loading engines.\n')); + }, + getEngineNameForPattern: function (pattern) { // avoid circular dependency by putting this in here. TODO: is this slow? - var of = require('./object_factory'); + const of = require('./object_factory'); if (pattern instanceof of.Pattern && typeof pattern.fileExtension === 'string' && pattern.fileExtension) { - return engineNameForExtension[pattern.fileExtension]; + return this.engineNameForExtension[pattern.fileExtension]; } // otherwise, assume it's a plain mustache template string and act @@ -135,27 +138,27 @@ PatternEngines = Object.create({ if (pattern.isPseudoPattern) { return this.getEngineForPattern(pattern.basePattern); } else { - var engineName = this.getEngineNameForPattern(pattern); + const engineName = this.getEngineNameForPattern(pattern); return this[engineName]; } }, getSupportedFileExtensions: function () { - var engineNames = Object.keys(PatternEngines); + const engineNames = Object.keys(PatternEngines); return engineNames.map(function (engineName) { return PatternEngines[engineName].engineFileExtension; }); }, isFileExtensionSupported: function (fileExtension) { - var supportedExtensions = PatternEngines.getSupportedFileExtensions(); + const supportedExtensions = PatternEngines.getSupportedFileExtensions(); return (supportedExtensions.lastIndexOf(fileExtension) !== -1); }, // given a filename, return a boolean: whether or not the filename indicates // that the file is pseudopattern JSON isPseudoPatternJSON: function (filename) { - var extension = path.extname(filename); + const extension = path.extname(filename); return (extension === '.json' && filename.indexOf('~') > -1); }, @@ -165,24 +168,17 @@ PatternEngines = Object.create({ // pattern files! isPatternFile: function (filename) { // skip hidden patterns/files without a second thought - var extension = path.extname(filename); + const extension = path.extname(filename); if (filename.charAt(0) === '.' || (extension === '.json' && !PatternEngines.isPseudoPatternJSON(filename))) { return false; } // not a hidden pattern, let's dig deeper - var supportedPatternFileExtensions = PatternEngines.getSupportedFileExtensions(); + const supportedPatternFileExtensions = PatternEngines.getSupportedFileExtensions(); return (supportedPatternFileExtensions.lastIndexOf(extension) !== -1 || PatternEngines.isPseudoPatternJSON(filename)); } }); - -// load up the engines we found -loadAllEngines(PatternEngines); - -// mapping of file extensions to engine names, for lookup use -engineNameForExtension = createFileExtensionToEngineNameMap(PatternEngines); - module.exports = PatternEngines; diff --git a/core/lib/pattern_exporter.js b/core/lib/pattern_exporter.js index 1b899a6a2..3d8d161c1 100644 --- a/core/lib/pattern_exporter.js +++ b/core/lib/pattern_exporter.js @@ -1,8 +1,8 @@ "use strict"; -var fs = require('fs-extra'); +const fs = require('fs-extra'); -var pattern_exporter = function () { +const pattern_exporter = function () { /** * Exports all pattern's final HTML as defined in patternlab-config.json to desired location. @@ -13,11 +13,11 @@ var pattern_exporter = function () { */ function exportPatterns(patternlab) { //read the config export options - var exportPartials = patternlab.config.patternExportPatternPartials; + const exportPartials = patternlab.config.patternExportPatternPartials; //find the chosen patterns to export - for (var i = 0; i < exportPartials.length; i++) { - for (var j = 0; j < patternlab.patterns.length; j++) { + for (let i = 0; i < exportPartials.length; i++) { + for (let j = 0; j < patternlab.patterns.length; j++) { if (exportPartials[i] === patternlab.patterns[j].patternPartial) { //write matches to the desired location fs.outputFileSync(patternlab.config.patternExportDirectory + patternlab.patterns[j].patternPartial + '.html', patternlab.patterns[j].patternPartialCode); diff --git a/core/lib/pattern_graph.js b/core/lib/pattern_graph.js index 5c28d3af1..c509ca406 100644 --- a/core/lib/pattern_graph.js +++ b/core/lib/pattern_graph.js @@ -125,9 +125,9 @@ PatternGraph.prototype = { * @throws {Error} If the pattern is unknown */ link: function (patternFrom, patternTo) { - let nameFrom = nodeName(patternFrom); - let nameTo = nodeName(patternTo); - for (let name of [nameFrom, nameTo]) { + const nameFrom = nodeName(patternFrom); + const nameTo = nodeName(patternTo); + for (const name of [nameFrom, nameTo]) { if (!this.patterns.has(name)) { throw new Error("Pattern not known: " + name); } @@ -144,8 +144,8 @@ PatternGraph.prototype = { * @return {boolean} */ hasLink: function (patternFrom, patternTo) { - let nameFrom = nodeName(patternFrom); - let nameTo = nodeName(patternTo); + const nameFrom = nodeName(patternFrom); + const nameTo = nodeName(patternTo); return this.graph.hasEdge(nameFrom, nameTo); }, @@ -170,22 +170,22 @@ PatternGraph.prototype = { * Edges are added in reverse order for topological sorting(e.g. atom -> molecule -> organism, * where "->" means "included by"). */ - let compileGraph = new Graph({ + const compileGraph = new Graph({ directed: true }); - let nodes = this.graph.nodes(); - let changedNodes = nodes.filter(n => compileStateFilter(this.patterns, n)); + const nodes = this.graph.nodes(); + const changedNodes = nodes.filter(n => compileStateFilter(this.patterns, n)); this.nodes2patterns(changedNodes).forEach(pattern => { - let patternNode = nodeName(pattern); + const patternNode = nodeName(pattern); if (!compileGraph.hasNode(patternNode)) { compileGraph.setNode(patternNode); } this.applyReverse(pattern, (from, to) => { from.compileState = CompileState.NEEDS_REBUILD; - let fromName = nodeName(from); - let toName = nodeName(to); - for (let name of [fromName, toName]) { + const fromName = nodeName(from); + const toName = nodeName(to); + for (const name of [fromName, toName]) { if (!compileGraph.hasNode(name)) { compileGraph.setNode(name); } @@ -212,7 +212,7 @@ PatternGraph.prototype = { * between patterns and node metadata. */ applyReverse: function (pattern, fn) { - for (let p of this.lineageR(pattern)) { + for (const p of this.lineageR(pattern)) { fn(p, pattern); this.applyReverse(p, fn); } diff --git a/core/lib/pattern_graph_dot.js b/core/lib/pattern_graph_dot.js index 5d87c383e..1b89060b9 100644 --- a/core/lib/pattern_graph_dot.js +++ b/core/lib/pattern_graph_dot.js @@ -88,11 +88,11 @@ const PatternGraphDot = {}; PatternGraphDot.generate = function (patternGraph) { const g = patternGraph.graph; const patterns = patternGraph.patterns; - let buckets = new Map(); + const buckets = new Map(); const colors = ["darkgreen", "firebrick", "slateblue", "darkgoldenrod", "black"]; const colorMap = new Map(); let colIdx = 0; - for (let p of patterns.partials.values()) { + for (const p of patterns.partials.values()) { if (p.isPseudoPattern || !p.patternType) { continue; } @@ -117,7 +117,7 @@ PatternGraphDot.generate = function (patternGraph) { let subGraphLines = []; - for (let key of sortedKeys) { + for (const key of sortedKeys) { const subPatterns = buckets.get(key); subGraphLines = subGraphLines.concat(subGraph(key, subPatterns)); } @@ -125,9 +125,9 @@ PatternGraphDot.generate = function (patternGraph) { res.push("edge[style=solid];"); - foo: for (let edge of g.edges()) { - let fromTo = patternGraph.nodes2patterns([edge.v, edge.w]); - for (let pattern of fromTo) { + foo: for (const edge of g.edges()) { + const fromTo = patternGraph.nodes2patterns([edge.v, edge.w]); + for (const pattern of fromTo) { if (pattern.isPseudoPattern || !pattern.patternType) { continue foo; } diff --git a/core/lib/pattern_registry.js b/core/lib/pattern_registry.js index eda22d0ae..8caeb5aa8 100644 --- a/core/lib/pattern_registry.js +++ b/core/lib/pattern_registry.js @@ -50,16 +50,16 @@ PatternRegistry.prototype = { */ // This previously has been a for loop over an array in pattern_ - let byPartialName = this.partials.get(partialName); + const byPartialName = this.partials.get(partialName); if (this.partials.has(partialName)) { return byPartialName; } - let patterns = this.allPatterns(); + const patterns = this.allPatterns(); //else look by verbose syntax - for (let thisPattern of patterns) { + for (const thisPattern of patterns) { switch (partialName) { case thisPattern.relPath: case thisPattern.subdir + '/' + thisPattern.fileName: @@ -68,7 +68,7 @@ PatternRegistry.prototype = { } //return the fuzzy match if all else fails - for (let thisPattern of patterns) { + for (const thisPattern of patterns) { const partialParts = partialName.split('-'), partialType = partialParts[0], partialNameEnd = partialParts.slice(1).join('-'); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 356adc16c..d02d7117d 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -10,19 +10,19 @@ "use strict"; -var diveSync = require('diveSync'), - dive = require('dive'), - glob = require('glob'), - _ = require('lodash'), - path = require('path'), - chalk = require('chalk'), - cleanHtml = require('js-beautify').html, - inherits = require('util').inherits, - pm = require('./plugin_manager'), - fs = require('fs-extra'), - packageInfo = require('../../package.json'), - plutils = require('./utilities'), - PatternGraph = require('./pattern_graph').PatternGraph; +const diveSync = require('diveSync'); +const dive = require('dive'); +const glob = require('glob'); +const _ = require('lodash'); +const path = require('path'); +const chalk = require('chalk'); +const cleanHtml = require('js-beautify').html; +const inherits = require('util').inherits; +const pm = require('./plugin_manager'); +const fs = require('fs-extra'); +const packageInfo = require('../../package.json'); +const plutils = require('./utilities'); +const PatternGraph = require('./pattern_graph').PatternGraph; //register our log events plutils.log.on('error', msg => console.log(msg)); @@ -36,14 +36,14 @@ console.log( chalk.bold(']====\n') ); -var patternEngines = require('./pattern_engines'); -var EventEmitter = require('events').EventEmitter; +const patternEngines = require('./pattern_engines'); +const EventEmitter = require('events').EventEmitter; function buildPatternData(dataFilesPath, fsDep) { - var dataFiles = glob.sync(dataFilesPath + '*.json', {"ignore" : [dataFilesPath + 'listitems.json']}); - var mergeObject = {}; + const dataFiles = glob.sync(dataFilesPath + '*.json', {"ignore" : [dataFilesPath + 'listitems.json']}); + let mergeObject = {}; dataFiles.forEach(function (filePath) { - var jsonData = fsDep.readJSONSync(path.resolve(filePath), 'utf8'); + const jsonData = fsDep.readJSONSync(path.resolve(filePath), 'utf8'); mergeObject = _.merge(mergeObject, jsonData); }); return mergeObject; @@ -51,10 +51,9 @@ function buildPatternData(dataFilesPath, fsDep) { // GTP: these two diveSync pattern processors factored out so they can be reused // from unit tests to reduce code dupe! -function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab){ - const async = require('async'); +function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab) { - const promiseAllPatternFiles = new Promise(function (resolve, reject) { + const promiseAllPatternFiles = new Promise(function (resolve) { dive( patterns_dir, (err, file) => { @@ -106,7 +105,7 @@ function processAllPatternsRecursive(pattern_assembler, patterns_dir, patternlab function checkConfiguration(patternlab) { //default the output suffixes if not present - var outputFileSuffixes = { + const outputFileSuffixes = { rendered: '.rendered', rawTemplate: '', markupOnly: '.markup-only' @@ -129,21 +128,21 @@ function initializePlugins(patternlab) { if (!patternlab.config.plugins) { return; } - var plugin_manager = new pm(patternlab.config, path.resolve(__dirname, '../../patternlab-config.json')); - var foundPlugins = plugin_manager.detect_plugins(); + const plugin_manager = new pm(patternlab.config, path.resolve(__dirname, '../../patternlab-config.json')); + const foundPlugins = plugin_manager.detect_plugins(); if (foundPlugins && foundPlugins.length > 0) { - for (var i = 0; i < foundPlugins.length; i++) { + for (let i = 0; i < foundPlugins.length; i++) { - let pluginKey = foundPlugins[i]; + const pluginKey = foundPlugins[i]; if (patternlab.config.debug) { console.log('Found plugin: ', pluginKey); console.log('Attempting to load and initialize plugin.'); } - var plugin = plugin_manager.load_plugin(pluginKey); + const plugin = plugin_manager.load_plugin(pluginKey); plugin(patternlab); } } @@ -155,9 +154,9 @@ function initializePlugins(patternlab) { */ function installPlugin(pluginName) { //get the config - var configPath = path.resolve(process.cwd(), 'patternlab-config.json'); - var config = fs.readJSONSync(path.resolve(configPath), 'utf8'); - var plugin_manager = new pm(config, configPath); + const configPath = path.resolve(process.cwd(), 'patternlab-config.json'); + const config = fs.readJSONSync(path.resolve(configPath), 'utf8'); + const plugin_manager = new pm(config, configPath); plugin_manager.install_plugin(pluginName); } @@ -167,25 +166,24 @@ function PatternLabEventEmitter() { } inherits(PatternLabEventEmitter, EventEmitter); - -var patternlab_engine = function (config) { +const patternlab_engine = function (config) { 'use strict'; - var JSON5 = require('json5'), - pa = require('./pattern_assembler'), - pe = require('./pattern_exporter'), - lh = require('./lineage_hunter'), - ui = require('./ui_builder'), - sm = require('./starterkit_manager'), - Pattern = require('./object_factory').Pattern, - CompileState = require('./object_factory').CompileState, - patternlab = {}; + const JSON5 = require('json5'); + const pa = require('./pattern_assembler'); + const pe = require('./pattern_exporter'); + const lh = require('./lineage_hunter'); + const ui = require('./ui_builder'); + const sm = require('./starterkit_manager'); + const Pattern = require('./object_factory').Pattern; + const CompileState = require('./object_factory').CompileState; + const patternlab = {}; patternlab.engines = patternEngines; - var pattern_assembler = new pa(), - pattern_exporter = new pe(), - lineage_hunter = new lh(); + const pattern_assembler = new pa(); + const pattern_exporter = new pe(); + const lineage_hunter = new lh(); patternlab.package = fs.readJSONSync(path.resolve(__dirname, '../../package.json')); patternlab.config = config || fs.readJSONSync(path.resolve(__dirname, '../../patternlab-config.json')); @@ -199,7 +197,7 @@ var patternlab_engine = function (config) { //todo: determine if this is the best place to wire up plugins initializePlugins(patternlab); - var paths = patternlab.config.paths; + const paths = patternlab.config.paths; function getVersion() { console.log(patternlab.package.version); @@ -290,12 +288,12 @@ var patternlab_engine = function (config) { } function listStarterkits() { - var starterkit_manager = new sm(patternlab.config); + const starterkit_manager = new sm(patternlab.config); return starterkit_manager.list_starterkits(); } function loadStarterKit(starterkitName, clean) { - var starterkit_manager = new sm(patternlab.config); + const starterkit_manager = new sm(patternlab.config); starterkit_manager.load_starterkit(starterkitName, clean); } @@ -304,8 +302,8 @@ var patternlab_engine = function (config) { */ function processHeadPattern() { try { - var headPath = path.resolve(paths.source.meta, '_00-head.mustache'); - var headPattern = new Pattern(headPath, null, patternlab); + const headPath = path.resolve(paths.source.meta, '_00-head.mustache'); + const headPattern = new Pattern(headPath, null, patternlab); headPattern.template = fs.readFileSync(headPath, 'utf8'); headPattern.isPattern = false; headPattern.isMetaPattern = true; @@ -324,8 +322,8 @@ var patternlab_engine = function (config) { */ function processFootPattern() { try { - var footPath = path.resolve(paths.source.meta, '_01-foot.mustache'); - var footPattern = new Pattern(footPath, null, patternlab); + const footPath = path.resolve(paths.source.meta, '_01-foot.mustache'); + const footPattern = new Pattern(footPath, null, patternlab); footPattern.template = fs.readFileSync(footPath, 'utf8'); footPattern.isPattern = false; footPattern.isMetaPattern = true; @@ -389,7 +387,7 @@ var patternlab_engine = function (config) { patternlab.events.emit('patternlab-pattern-before-data-merge', patternlab, pattern); //render the pattern, but first consolidate any data we may have - var allData; + let allData; try { allData = JSON5.parse(JSON5.stringify(patternlab.data)); } catch (err) { @@ -401,7 +399,7 @@ var patternlab_engine = function (config) { //re-rendering the headHTML each time allows pattern-specific data to influence the head of the pattern pattern.header = head; - var headHTML = pattern_assembler.renderPattern(pattern.header, allData); + const headHTML = pattern_assembler.renderPattern(pattern.header, allData); //render the extendedTemplate with all data pattern.patternPartialCode = pattern_assembler.renderPattern(pattern, allData); @@ -434,13 +432,13 @@ var patternlab_engine = function (config) { }); //set the pattern-specific footer by compiling the general-footer with data, and then adding it to the meta footer - var footerPartial = pattern_assembler.renderPattern(patternlab.footer, { + const footerPartial = pattern_assembler.renderPattern(patternlab.footer, { isPattern: pattern.isPattern, patternData: pattern.patternData, cacheBuster: patternlab.cacheBuster }); - var allFooterData; + let allFooterData; try { allFooterData = JSON5.parse(JSON5.stringify(patternlab.data)); } catch (err) { @@ -450,7 +448,7 @@ var patternlab_engine = function (config) { allFooterData = plutils.mergeData(allFooterData, pattern.jsonFileData); allFooterData.patternLabFoot = footerPartial; - var footerHTML = pattern_assembler.renderPattern(patternlab.userFoot, allFooterData); + const footerHTML = pattern_assembler.renderPattern(patternlab.userFoot, allFooterData); patternlab.events.emit('patternlab-pattern-write-begin', patternlab, pattern); @@ -486,9 +484,9 @@ var patternlab_engine = function (config) { function buildPatterns(deletePatternDir) { patternlab.events.emit('patternlab-build-pattern-start', patternlab); - let graph = patternlab.graph = loadPatternGraph(deletePatternDir); + const graph = patternlab.graph = loadPatternGraph(deletePatternDir); - let graphNeedsUpgrade = !PatternGraph.checkVersion(graph); + const graphNeedsUpgrade = !PatternGraph.checkVersion(graph); if (graphNeedsUpgrade) { plutils.log.info("Due to an upgrade, a complete rebuild is required and the public/patterns directory was deleted. " + @@ -499,7 +497,7 @@ var patternlab_engine = function (config) { } // Flags - let incrementalBuildsEnabled = !(deletePatternDir || graphNeedsUpgrade); + const incrementalBuildsEnabled = !(deletePatternDir || graphNeedsUpgrade); if (incrementalBuildsEnabled) { plutils.log.info("Incremental builds enabled."); @@ -545,6 +543,7 @@ var patternlab_engine = function (config) { // diveSync once to perform iterative populating of patternlab object return processAllPatternsIterative(pattern_assembler, paths.source.patterns, patternlab).then(() => { + patternlab.events.emit('patternlab-pattern-iteration-end', patternlab); //diveSync again to recursively include partials, filling out the @@ -564,7 +563,7 @@ var patternlab_engine = function (config) { lineage_hunter.cascade_pattern_states(patternlab); //set pattern-specific header if necessary - var head; + let head; if (patternlab.userHead) { head = patternlab.userHead; } else { @@ -580,6 +579,15 @@ var patternlab_engine = function (config) { // rebuild all patterns let patternsToBuild = null; + //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header + patternlab.data.patternLabHead = pattern_assembler.renderPattern(patternlab.header, { + cacheBuster: patternlab.cacheBuster + }); + + // If deletePatternDir == true or graph needs to be updated + // rebuild all patterns + patternsToBuild = null; + if (incrementalBuildsEnabled) { // When the graph was loaded from file, some patterns might have been moved/deleted between runs // so the graph data become out of sync @@ -588,13 +596,13 @@ var patternlab_engine = function (config) { }); // TODO Find created or deleted files - let now = new Date().getTime(); + const now = new Date().getTime(); pattern_assembler.mark_modified_patterns(now, patternlab); patternsToBuild = patternlab.graph.compileOrder(); } else { // build all patterns, mark all to be rebuilt patternsToBuild = patternlab.patterns; - for (let p of patternsToBuild) { + for (const p of patternsToBuild) { p.compileState = CompileState.NEEDS_REBUILD; } } diff --git a/core/lib/plugin_manager.js b/core/lib/plugin_manager.js index 136cc7324..b126f767c 100644 --- a/core/lib/plugin_manager.js +++ b/core/lib/plugin_manager.js @@ -1,9 +1,9 @@ "use strict"; -var plugin_manager = function (config, configPath) { - var path = require('path'), - fs = require('fs-extra'), - util = require('./utilities'); +const plugin_manager = function (config, configPath) { + const path = require('path'); + const fs = require('fs-extra'); + const util = require('./utilities'); /** * Loads a plugin @@ -22,7 +22,7 @@ var plugin_manager = function (config, configPath) { */ function installPlugin(pluginName) { try { - var pluginPath = path.resolve( + const pluginPath = path.resolve( path.join(process.cwd(), 'node_modules', pluginName) ); console.log('Attempting to load plugin from', pluginPath); @@ -33,10 +33,10 @@ var plugin_manager = function (config, configPath) { util.error(pluginName + ' not loaded.'); return; } - var pluginPathDirExists = pluginDirStats.isDirectory(); + const pluginPathDirExists = pluginDirStats.isDirectory(); if (pluginPathDirExists) { - var diskConfig = fs.readJSONSync(path.resolve(configPath), 'utf8'); + const diskConfig = fs.readJSONSync(path.resolve(configPath), 'utf8'); //add the plugin entry to patternlab-config.json if (!diskConfig.plugins) { @@ -66,9 +66,9 @@ var plugin_manager = function (config, configPath) { * @return {array} list of installed plugins */ function detectPlugins() { - var node_modules_path = path.join(process.cwd(), 'node_modules'); + const node_modules_path = path.join(process.cwd(), 'node_modules'); return fs.readdirSync(node_modules_path).filter(function (dir) { - var module_path = path.join(process.cwd(), 'node_modules', dir); + const module_path = path.join(process.cwd(), 'node_modules', dir); return fs.statSync(module_path).isDirectory() && dir.indexOf('plugin-node-') === 0; }); } diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index 8d5e3cac3..3c7c14edc 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -1,40 +1,34 @@ +"use strict"; +const ch = require('./changes_hunter'); +const glob = require('glob'); +const fs = require('fs-extra'); +const lh = require('./lineage_hunter'); +const Pattern = require('./object_factory').Pattern; +const plutils = require('./utilities'); +const path = require('path'); +const lineage_hunter = new lh(); +const changes_hunter = new ch(); -const ch = require('./changes_hunter'), - glob = require('glob'), - fs = require('fs-extra'), - Pattern = require('./object_factory').Pattern, - plutils = require('./utilities'), - path = require('path'); - -/** - * The only public API in this module. This will search for pseudo - * patterns and returns a Promise that resolves when it's done. It - * doesn't return anything; processPseudoPattern() just updates the - * global state. - * @param {Object} currentPattern - * @param {Object} patternlab - * @returns {Promise} - */ -function findPseudoPatterns(currentPattern, patternlab) { +const pseudopattern_hunter = function () {}; + +pseudopattern_hunter.prototype.find_pseudopatterns = function (currentPattern, patternlab) { const pa = require('./pattern_assembler'); - const lh = require('./lineage_hunter'); const pattern_assembler = new pa(); - const lineage_hunter = new lh(); - const changes_hunter = new ch(); + const paths = patternlab.config.paths; //look for a pseudo pattern by checking if there is a file containing same //name, with ~ in it, ending in .json - var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; - var pseudoPatterns = glob.sync(needle, { + const needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; + const pseudoPatterns = glob.sync(needle, { cwd: paths.source.patterns, debug: false, nodir: true }); if (pseudoPatterns.length > 0) { - for (var i = 0; i < pseudoPatterns.length; i++) { + for (let i = 0; i < pseudoPatterns.length; i++) { if (patternlab.config.debug) { console.log('found pseudoPattern variant of ' + currentPattern.patternPartial); } @@ -51,10 +45,10 @@ function findPseudoPatterns(currentPattern, patternlab) { //extend any existing data with variant data variantFileData = plutils.mergeData(currentPattern.jsonFileData, variantFileData); - var variantName = pseudoPatterns[i].substring(pseudoPatterns[i].indexOf('~') + 1).split('.')[0]; - var variantFilePath = path.join(currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); - var lm = fs.statSync(variantFileFullPath); - var patternVariant = Pattern.create(variantFilePath, variantFileData, { + let variantName = pseudoPatterns[i].substring(pseudoPatterns[i].indexOf('~') + 1).split('.')[0]; + let variantFilePath = path.join(currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); + let lm = fs.statSync(variantFileFullPath); + let patternVariant = Pattern.create(variantFilePath, variantFileData, { //use the same template as the non-variant template: currentPattern.template, fileExtension: currentPattern.fileExtension, @@ -84,18 +78,59 @@ function findPseudoPatterns(currentPattern, patternlab) { //add to patternlab object so we can look these up later. pattern_assembler.addPattern(patternVariant, patternlab); - } - } - // GTP: this is to emulate the behavior of the stale asynced - // version; when we have time, we can make all the FS calls in here - // async and see if it helps any, but it didn't when I tried it. - return Promise.resolve(); -} + //we want to do everything we normally would here, except instead read the pseudoPattern data + try { + var variantFileFullPath = path.resolve(paths.source.patterns, pseudoPatterns[i]); + var variantFileData = fs.readJSONSync(variantFileFullPath); + } catch (err) { + console.log('There was an error parsing pseudopattern JSON for ' + currentPattern.relPath); + console.log(err); + } + + //extend any existing data with variant data + variantFileData = plutils.mergeData(currentPattern.jsonFileData, variantFileData); + + variantName = pseudoPatterns[i].substring(pseudoPatterns[i].indexOf('~') + 1).split('.')[0]; + variantFilePath = path.join(currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); + lm = fs.statSync(variantFileFullPath); + patternVariant = Pattern.create(variantFilePath, variantFileData, { + //use the same template as the non-variant + template: currentPattern.template, + fileExtension: currentPattern.fileExtension, + extendedTemplate: currentPattern.extendedTemplate, + isPseudoPattern: true, + basePattern: currentPattern, + stylePartials: currentPattern.stylePartials, + parameteredPartials: currentPattern.parameteredPartials, + + // Only regular patterns are discovered during iterative walks + // Need to recompile on data change or template change + lastModified: Math.max(currentPattern.lastModified, lm.mtime), + + // use the same template engine as the non-variant + engine: currentPattern.engine + }, patternlab); + + changes_hunter.checkBuildState(patternVariant, patternlab); + patternlab.graph.add(patternVariant); + patternlab.graph.link(patternVariant, currentPattern); + + //process the companion markdown file if it exists + pattern_assembler.parse_pattern_markdown(patternVariant, patternlab); + + //find pattern lineage + lineage_hunter.find_lineage(patternVariant, patternlab); + //add to patternlab object so we can look these up later. + pattern_assembler.addPattern(patternVariant, patternlab); + } -module.exports = { - find_pseudopatterns: function (pattern, patternlab) { - return findPseudoPatterns(pattern, patternlab); + // GTP: this is to emulate the behavior of the stale asynced + // version; when we have time, we can make all the FS calls in here + // async and see if it helps any, but it didn't when I tried it. } + return Promise.resolve(); }; + +module.exports = new pseudopattern_hunter(); diff --git a/core/lib/starterkit_manager.js b/core/lib/starterkit_manager.js index db4153486..24746316a 100644 --- a/core/lib/starterkit_manager.js +++ b/core/lib/starterkit_manager.js @@ -1,11 +1,11 @@ "use strict"; -var starterkit_manager = function (config) { - var path = require('path'), - fetch = require('node-fetch'), - fs = require('fs-extra'), - util = require('./utilities'), - paths = config.paths; +const starterkit_manager = function (config) { + const path = require('path'); + const fetch = require('node-fetch'); + const fs = require('fs-extra'); + const util = require('./utilities'); + const paths = config.paths; /** * Loads npm module identified by the starterkitName parameter. @@ -15,7 +15,7 @@ var starterkit_manager = function (config) { */ function loadStarterKit(starterkitName, clean) { try { - var kitPath = path.resolve( + const kitPath = path.resolve( path.join(process.cwd(), 'node_modules', starterkitName, config.starterkitSubDir) ); console.log('Attempting to load starterkit from', kitPath); @@ -26,7 +26,7 @@ var starterkit_manager = function (config) { util.error(starterkitName + ' not loaded.'); return; } - var kitPathDirExists = kitDirStats.isDirectory(); + const kitPathDirExists = kitDirStats.isDirectory(); if (kitPathDirExists) { if (clean) { @@ -60,7 +60,7 @@ var starterkit_manager = function (config) { 'Accept': 'application/json' } }).then(function (res) { - var contentType = res.headers.get('content-type'); + const contentType = res.headers.get('content-type'); if (contentType && contentType.indexOf('application/json') === -1) { throw new TypeError("StarterkitManager->listStarterkits: Not valid JSON"); } @@ -89,9 +89,9 @@ var starterkit_manager = function (config) { * @return {array} List of starter kits installed */ function detectStarterKits() { - var node_modules_path = path.join(process.cwd(), 'node_modules'); - var npm_modules = fs.readdirSync(node_modules_path).filter(function (dir) { - var module_path = path.join(process.cwd(), 'node_modules', dir); + const node_modules_path = path.join(process.cwd(), 'node_modules'); + const npm_modules = fs.readdirSync(node_modules_path).filter(function (dir) { + const module_path = path.join(process.cwd(), 'node_modules', dir); return fs.statSync(module_path).isDirectory() && dir.indexOf('starterkit-') === 0; }); return npm_modules; diff --git a/core/lib/style_modifier_hunter.js b/core/lib/style_modifier_hunter.js index f6f9f0596..af50fb155 100644 --- a/core/lib/style_modifier_hunter.js +++ b/core/lib/style_modifier_hunter.js @@ -1,6 +1,6 @@ "use strict"; -var style_modifier_hunter = function () { +const style_modifier_hunter = function () { /** * Modifies a patterns partial with any styleModifiers found on the supplied partial @@ -11,7 +11,7 @@ var style_modifier_hunter = function () { */ function consumestylemodifier(pattern, partial, patternlab) { //extract the classname from the stylemodifier which comes in the format of :className - var styleModifier = partial.match(/:([\w\-_|])+/g) ? partial.match(/:([\w\-_|])+/g)[0].slice(1) : null; + let styleModifier = partial.match(/:([\w\-_|])+/g) ? partial.match(/:([\w\-_|])+/g)[0].slice(1) : null; if (styleModifier) { //replace the special character pipe | used to separate multiple classes with a space diff --git a/core/lib/ui_builder.js b/core/lib/ui_builder.js index 22e4357fd..88ed1c19b 100644 --- a/core/lib/ui_builder.js +++ b/core/lib/ui_builder.js @@ -1,17 +1,19 @@ "use strict"; -var path = require('path'); -var JSON5 = require('json5'); -var fs = require('fs-extra'); -var ae = require('./annotation_exporter'); -var of = require('./object_factory'); -var Pattern = of.Pattern; -var pattern_assembler = require('./pattern_assembler')(); -var plutils = require('./utilities'); -var eol = require('os').EOL; -var _ = require('lodash'); - -var ui_builder = function () { +const path = require('path'); +const JSON5 = require('json5'); +const ae = require('./annotation_exporter'); +const of = require('./object_factory'); +const Pattern = of.Pattern; +const plutils = require('./utilities'); +const eol = require('os').EOL; +const _ = require('lodash'); + +//these are mocked in unit tests, so let them be overridden +let fs = require('fs-extra'); //eslint-disable-line prefer-const +let pattern_assembler = require('./pattern_assembler')(); //eslint-disable-line prefer-const + +const ui_builder = function () { /** * Registers the pattern to the patternPaths object for the appropriate patternGroup and basename @@ -60,7 +62,7 @@ var ui_builder = function () { * @returns boolean - whether or not the pattern is excluded */ function isPatternExcluded(pattern, patternlab) { - var isOmitted; + let isOmitted; // skip underscore-prefixed files isOmitted = pattern.isPattern && pattern.fileName.charAt(0) === '_'; @@ -112,7 +114,7 @@ var ui_builder = function () { */ function injectDocumentationBlock(pattern, patternlab, isSubtypePattern) { //first see if pattern_assembler processed one already - var docPattern = patternlab.subtypePatterns[pattern.patternGroup + (isSubtypePattern ? '-' + pattern.patternSubGroup : '')]; + let docPattern = patternlab.subtypePatterns[pattern.patternGroup + (isSubtypePattern ? '-' + pattern.patternSubGroup : '')]; if (docPattern) { docPattern.isDocPattern = true; docPattern.order = -Number.MAX_SAFE_INTEGER; @@ -164,7 +166,7 @@ var ui_builder = function () { * @returns the found pattern type object */ function getPatternType(patternlab, pattern) { - var patternType = _.find(patternlab.patternTypes, ['patternType', pattern.patternType]); + const patternType = _.find(patternlab.patternTypes, ['patternType', pattern.patternType]); if (!patternType) { plutils.error('Could not find patternType' + pattern.patternType + '. This is a critical error.'); @@ -182,8 +184,8 @@ var ui_builder = function () { * @returns the found patternSubType object */ function getPatternSubType(patternlab, pattern) { - var patternType = getPatternType(patternlab, pattern); - var patternSubType = _.find(patternType.patternTypeItems, ['patternSubtype', pattern.patternSubType]); + const patternType = getPatternType(patternlab, pattern); + const patternSubType = _.find(patternType.patternTypeItems, ['patternSubtype', pattern.patternSubType]); if (!patternSubType) { plutils.error('Could not find patternType ' + pattern.patternType + '-' + pattern.patternType + '. This is a critical error.'); @@ -201,15 +203,15 @@ var ui_builder = function () { * @param pattern - the pattern to register */ function addPatternSubType(patternlab, pattern) { - let newSubType = { + const newSubType = { patternSubtypeLC: pattern.patternSubGroup.toLowerCase(), patternSubtypeUC: pattern.patternSubGroup.charAt(0).toUpperCase() + pattern.patternSubGroup.slice(1), patternSubtype: pattern.patternSubType, patternSubtypeDash: pattern.patternSubGroup, //todo verify patternSubtypeItems: [] }; - var patternType = getPatternType(patternlab, pattern); - let insertIndex = _.sortedIndexBy(patternType.patternTypeItems, newSubType, 'patternSubtype'); + const patternType = getPatternType(patternlab, pattern); + const insertIndex = _.sortedIndexBy(patternType.patternTypeItems, newSubType, 'patternSubtype'); patternType.patternTypeItems.splice(insertIndex, 0, newSubType); } @@ -220,7 +222,7 @@ var ui_builder = function () { * @returns {{patternPartial: string, patternName: (*|string), patternState: string, patternSrcPath: string, patternPath: string}} */ function createPatternSubTypeItem(pattern) { - var patternPath = ''; + let patternPath = ''; if (pattern.isFlatPattern) { patternPath = pattern.flatPatternPath + '-' + pattern.fileName + '/' + pattern.flatPatternPath + '-' + pattern.fileName + '.html'; } else { @@ -261,7 +263,7 @@ var ui_builder = function () { newSubTypeItem = createPatternSubTypeItem(pattern); } - let patternSubType = getPatternSubType(patternlab, pattern); + const patternSubType = getPatternSubType(patternlab, pattern); patternSubType.patternSubtypeItems.push(newSubTypeItem); patternSubType.patternSubtypeItems = _.sortBy(patternSubType.patternSubtypeItems, ['order', 'name']); } @@ -272,7 +274,7 @@ var ui_builder = function () { * @param pattern - the pattern to add */ function addPatternItem(patternlab, pattern, isViewAllVariant) { - var patternType = getPatternType(patternlab, pattern); + const patternType = getPatternType(patternlab, pattern); if (!patternType) { plutils.error('Could not find patternType' + pattern.patternType + '. This is a critical error.'); console.trace(); @@ -317,7 +319,7 @@ var ui_builder = function () { return patternsArray.sort(function (a, b) { let aOrder = parseInt(a.order, 10); - let bOrder = parseInt(b.order, 10); + const bOrder = parseInt(b.order, 10); if (aOrder === NaN) { aOrder = Number.MAX_SAFE_INTEGER; @@ -367,7 +369,7 @@ var ui_builder = function () { * @returns ptterns grouped by type -> subtype like atoms -> global -> pattern, pattern, pattern */ function groupPatterns(patternlab) { - var groupedPatterns = { + const groupedPatterns = { patternGroups: {} }; @@ -426,14 +428,14 @@ var ui_builder = function () { */ function buildFooterHTML(patternlab, patternPartial) { //first render the general footer - var footerPartial = pattern_assembler.renderPattern(patternlab.footer, { + const footerPartial = pattern_assembler.renderPattern(patternlab.footer, { patternData: JSON.stringify({ patternPartial: patternPartial, }), cacheBuster: patternlab.cacheBuster }); - var allFooterData; + let allFooterData; try { allFooterData = JSON5.parse(JSON5.stringify(patternlab.data)); } catch (err) { @@ -443,7 +445,7 @@ var ui_builder = function () { allFooterData.patternLabFoot = footerPartial; //then add it to the user footer - var footerHTML = pattern_assembler.renderPattern(patternlab.userFoot, allFooterData); + const footerHTML = pattern_assembler.renderPattern(patternlab.userFoot, allFooterData); return footerHTML; } @@ -456,7 +458,7 @@ var ui_builder = function () { * @returns HTML */ function buildViewAllHTML(patternlab, patterns, patternPartial) { - var viewAllHTML = pattern_assembler.renderPattern(patternlab.viewAll, + const viewAllHTML = pattern_assembler.renderPattern(patternlab.viewAll, { partials: patterns, patternPartial: 'viewall-' + patternPartial, @@ -476,20 +478,20 @@ var ui_builder = function () { * @returns every built pattern and set of viewall patterns, so the styleguide can use it */ function buildViewAllPages(mainPageHeadHtml, patternlab, styleguidePatterns) { - var paths = patternlab.config.paths; - var patterns = []; - var writeViewAllFile = true; + const paths = patternlab.config.paths; + let patterns = []; + let writeViewAllFile = true; //loop through the grouped styleguide patterns, building at each level _.forEach(styleguidePatterns.patternGroups, function (patternTypeObj, patternType) { - var p; - var typePatterns = []; - var styleGuideExcludes = patternlab.config.styleGuideExcludes; + let p; + let typePatterns = []; + const styleGuideExcludes = patternlab.config.styleGuideExcludes; _.forOwn(patternTypeObj, function (patternSubtypes, patternSubtype) { - var patternPartial = patternType + '-' + patternSubtype; + const patternPartial = patternType + '-' + patternSubtype; //do not create a viewall page for flat patterns if (patternType === patternSubtype) { @@ -498,10 +500,10 @@ var ui_builder = function () { } //render the footer needed for the viewall template - var footerHTML = buildFooterHTML(patternlab, 'viewall-' + patternPartial); + const footerHTML = buildFooterHTML(patternlab, 'viewall-' + patternPartial); //render the viewall template by finding these smallest subtype-grouped patterns - var subtypePatterns = sortPatterns(_.values(patternSubtypes)); + const subtypePatterns = sortPatterns(_.values(patternSubtypes)); //determine if we should write at this time by checking if these are flat patterns or grouped patterns p = _.find(subtypePatterns, function (pat) { @@ -510,7 +512,7 @@ var ui_builder = function () { typePatterns = typePatterns.concat(subtypePatterns); - var viewAllHTML = buildViewAllHTML(patternlab, subtypePatterns, patternPartial); + const viewAllHTML = buildViewAllHTML(patternlab, subtypePatterns, patternPartial); fs.outputFileSync(paths.public.patterns + p.flatPatternPath + '/index.html', mainPageHeadHtml + viewAllHTML + footerHTML); }); @@ -520,22 +522,22 @@ var ui_builder = function () { } //render the footer needed for the viewall template - var footerHTML = buildFooterHTML(patternlab, 'viewall-' + patternType + '-all'); + const footerHTML = buildFooterHTML(patternlab, 'viewall-' + patternType + '-all'); //add any flat patterns //todo this isn't quite working yet //typePatterns = typePatterns.concat(getPatternItems(patternlab, patternType)); //get the appropriate patternType - var anyPatternOfType = _.find(typePatterns, function (pat) { + const anyPatternOfType = _.find(typePatterns, function (pat) { return pat.patternType && pat.patternType !== '';}); //render the viewall template for the type - var viewAllHTML = buildViewAllHTML(patternlab, typePatterns, patternType); + const viewAllHTML = buildViewAllHTML(patternlab, typePatterns, patternType); fs.outputFileSync(paths.public.patterns + anyPatternOfType.patternType + '/index.html', mainPageHeadHtml + viewAllHTML + footerHTML); //determine if we should omit this patterntype completely from the viewall page - var omitPatternType = styleGuideExcludes && styleGuideExcludes.length + const omitPatternType = styleGuideExcludes && styleGuideExcludes.length && _.some(styleGuideExcludes, function (exclude) { return exclude === patternType; }); @@ -555,11 +557,11 @@ var ui_builder = function () { * @param patternlab - global data store */ function exportData(patternlab) { - var annotation_exporter = new ae(patternlab); - var paths = patternlab.config.paths; + const annotation_exporter = new ae(patternlab); + const paths = patternlab.config.paths; //write out the data - var output = ''; + let output = ''; //config output += 'var config = ' + JSON.stringify(patternlab.config) + ';\n'; @@ -587,8 +589,8 @@ var ui_builder = function () { fs.outputFileSync(path.resolve(paths.public.data, 'patternlab-data.js'), output); //annotations - var annotationsJSON = annotation_exporter.gather(); - var annotations = 'var comments = { "comments" : ' + JSON.stringify(annotationsJSON) + '};'; + const annotationsJSON = annotation_exporter.gather(); + const annotations = 'var comments = { "comments" : ' + JSON.stringify(annotationsJSON) + '};'; fs.outputFileSync(path.resolve(paths.public.annotations, 'annotations.js'), annotations); } @@ -609,31 +611,31 @@ var ui_builder = function () { resetUIBuilderState(patternlab); - var paths = patternlab.config.paths; + const paths = patternlab.config.paths; //determine which patterns should be included in the front-end rendering - var styleguidePatterns = groupPatterns(patternlab); + const styleguidePatterns = groupPatterns(patternlab); //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header - var headerPartial = pattern_assembler.renderPattern(patternlab.header, { + const headerPartial = pattern_assembler.renderPattern(patternlab.header, { cacheBuster: patternlab.cacheBuster }); - var headFootData = patternlab.data; + const headFootData = patternlab.data; headFootData.patternLabHead = headerPartial; headFootData.cacheBuster = patternlab.cacheBuster; - var headerHTML = pattern_assembler.renderPattern(patternlab.userHead, headFootData); + const headerHTML = pattern_assembler.renderPattern(patternlab.userHead, headFootData); //set the pattern-specific footer by compiling the general-footer with data, and then adding it to the meta footer - var footerPartial = pattern_assembler.renderPattern(patternlab.footer, { + const footerPartial = pattern_assembler.renderPattern(patternlab.footer, { patternData: '{}', cacheBuster: patternlab.cacheBuster }); headFootData.patternLabFoot = footerPartial; - var footerHTML = pattern_assembler.renderPattern(patternlab.userFoot, headFootData); + const footerHTML = pattern_assembler.renderPattern(patternlab.userFoot, headFootData); //build the viewall pages - var allPatterns = buildViewAllPages(headerHTML, patternlab, styleguidePatterns); + const allPatterns = buildViewAllPages(headerHTML, patternlab, styleguidePatterns); //add the defaultPattern if we found one if (patternlab.defaultPattern) { @@ -642,7 +644,7 @@ var ui_builder = function () { } //build the main styleguide page - var styleguideHtml = pattern_assembler.renderPattern(patternlab.viewAll, + const styleguideHtml = pattern_assembler.renderPattern(patternlab.viewAll, { partials: allPatterns }, { @@ -652,7 +654,7 @@ var ui_builder = function () { fs.outputFileSync(path.resolve(paths.public.styleguide, 'html/styleguide.html'), headerHTML + styleguideHtml + footerHTML); //move the index file from its asset location into public root - var patternlabSiteHtml; + let patternlabSiteHtml; try { patternlabSiteHtml = fs.readFileSync(path.resolve(paths.source.styleguide, 'index.html'), 'utf8'); } catch (error) { diff --git a/test/engine_handlebars_tests.js b/test/engine_handlebars_tests.js index 7acda08d0..fd6720a3d 100644 --- a/test/engine_handlebars_tests.js +++ b/test/engine_handlebars_tests.js @@ -9,8 +9,10 @@ var PatternGraph = require('../core/lib/pattern_graph').PatternGraph; var testPatternsPath = path.resolve(__dirname, 'files', '_handlebars-test-patterns'); var eol = require('os').EOL; -// don't run these tests unless handlebars is installed var engineLoader = require('../core/lib/pattern_engines'); +engineLoader.loadAllEngines(); + +// don't run these tests unless handlebars is installed if (!engineLoader.handlebars) { tap.test('Handlebars engine not installed, skipping tests.', function (test) { test.end(); diff --git a/test/engine_mustache_tests.js b/test/engine_mustache_tests.js index 30d2c3048..35d49eb5a 100644 --- a/test/engine_mustache_tests.js +++ b/test/engine_mustache_tests.js @@ -10,6 +10,7 @@ var eol = require('os').EOL; // don't run these tests unless mustache is installed var engineLoader = require('../core/lib/pattern_engines'); +engineLoader.loadAllEngines(); if (!engineLoader.mustache) { tap.test('Mustache engine not installed, skipping tests.', function (test) { test.end(); diff --git a/test/lineage_hunter_tests.js b/test/lineage_hunter_tests.js index d1206c1e1..01ab483c0 100644 --- a/test/lineage_hunter_tests.js +++ b/test/lineage_hunter_tests.js @@ -8,6 +8,9 @@ var of = require('../core/lib/object_factory'); var Pattern = require('../core/lib/object_factory').Pattern; var PatternGraph = require('../core/lib/pattern_graph').PatternGraph; +var engineLoader = require('../core/lib/pattern_engines'); +engineLoader.loadAllEngines(); + var fs = require('fs-extra'); var path = require('path'); diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index 74b21cd74..ed8bf6b7e 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -9,6 +9,9 @@ var extend = require('util')._extend; var pa = require('../core/lib/pattern_assembler'); var pattern_assembler = new pa(); +var engineLoader = require('../core/lib/pattern_engines'); +engineLoader.loadAllEngines(); + // fake pattern creators function createFakeListPattern(customProps) { var inputs = { @@ -421,5 +424,3 @@ tap.test('process_list_item_partials - correctly ignores already processed parti test.equals(listPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.end(); }); - - diff --git a/test/object_factory_tests.js b/test/object_factory_tests.js index f20034f61..0e831a8f3 100644 --- a/test/object_factory_tests.js +++ b/test/object_factory_tests.js @@ -28,6 +28,9 @@ var Pattern = require('../core/lib/object_factory').Pattern; var path = require('path'); var pl = fakePatternLab(); +var engineLoader = require('../core/lib/pattern_engines'); +engineLoader.loadAllEngines(); + tap.test('test Pattern initializes correctly', function (test) { var p = new Pattern('00-atoms/00-global/00-colors.mustache', { d: 123}); test.equals(p.relPath, '00-atoms' + path.sep + '00-global' + path.sep + '00-colors.mustache'); diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 092f44428..4d64fec93 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -1,8 +1,9 @@ "use strict"; var tap = require('tap'); - var ph = require('../core/lib/parameter_hunter'); +var engineLoader = require('../core/lib/pattern_engines'); +engineLoader.loadAllEngines(); //setup current pattern from what we would have during execution function currentPatternClosure() { diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 252c97079..1e44efd53 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -8,6 +8,9 @@ var CompileState = require('../core/lib/object_factory').CompileState; var PatternGraph = require('../core/lib/pattern_graph').PatternGraph; var path = require('path'); +var engineLoader = require('../core/lib/pattern_engines'); +engineLoader.loadAllEngines(); + function emptyPatternLab() { return { graph: PatternGraph.empty() diff --git a/test/pattern_engines_tests.js b/test/pattern_engines_tests.js index dc55b6cf0..951743257 100644 --- a/test/pattern_engines_tests.js +++ b/test/pattern_engines_tests.js @@ -5,6 +5,8 @@ var tap = require('tap'); var patternEngines = require('../core/lib/pattern_engines'); var Pattern = require('../core/lib/object_factory').Pattern; +patternEngines.loadAllEngines(); + // the mustache test pattern, stolen from object_factory unit tests var mustacheTestPattern = new Pattern('source/_patterns/00-atoms/00-global/00-colors-alt.mustache', {d: 123}); var mustacheTestPseudoPatternBasePattern = new Pattern('source/_patterns/04-pages/00-homepage.mustache', {d: 123}); @@ -161,4 +163,3 @@ engineNames.forEach(function (engineName) { test.end(); }); }); - diff --git a/test/pattern_graph_tests.js b/test/pattern_graph_tests.js index 78980422b..8da4d9033 100644 --- a/test/pattern_graph_tests.js +++ b/test/pattern_graph_tests.js @@ -8,6 +8,9 @@ var CompileState = require('../core/lib/object_factory').CompileState; var tap = require('tap'); const posixPath = require('./util/test_utils.js').posixPath; +var engineLoader = require('../core/lib/pattern_engines'); +engineLoader.loadAllEngines(); + var patternlab = { config: { paths: { diff --git a/test/pseudopattern_hunter_tests.js b/test/pseudopattern_hunter_tests.js index cd1a71a11..2aa2af0a0 100644 --- a/test/pseudopattern_hunter_tests.js +++ b/test/pseudopattern_hunter_tests.js @@ -4,10 +4,14 @@ var tap = require('tap'); var path = require('path'); var pph = require('../core/lib/pseudopattern_hunter'); + var pa = require('../core/lib/pattern_assembler'); var Pattern = require('../core/lib/object_factory').Pattern; var PatternGraph = require('../core/lib/pattern_graph').PatternGraph; +var engineLoader = require('../core/lib/pattern_engines'); +engineLoader.loadAllEngines(); + var fs = require('fs-extra'); var pattern_assembler = new pa(); var patterns_dir = './test/files/_patterns/'; diff --git a/test/ui_builder_tests.js b/test/ui_builder_tests.js index 38137c692..7ed6ebf45 100644 --- a/test/ui_builder_tests.js +++ b/test/ui_builder_tests.js @@ -8,6 +8,9 @@ var Pattern = require('../core/lib/object_factory').Pattern; var extend = require('util')._extend; var uiModule = rewire('../core/lib/ui_builder'); +var engineLoader = require('../core/lib/pattern_engines'); +engineLoader.loadAllEngines(); + //set up a global mocks - we don't want to be writing/rendering any files right now var fsMock = { outputFileSync: function (path, data, cb) { } From 4e33074b08d8a36754c481e73e0be942f29de7e7 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 7 Feb 2017 11:58:06 -0600 Subject: [PATCH 24/98] working against gulp-edition async branch with mustache still reporitng quite a few handlebar tests broken --- core/lib/markdown_parser.js | 1 - core/lib/pattern_engines.js | 29 +++++++---------------------- core/lib/patternlab.js | 1 + 3 files changed, 8 insertions(+), 23 deletions(-) diff --git a/core/lib/markdown_parser.js b/core/lib/markdown_parser.js index 0b09929ac..68fcfa68d 100644 --- a/core/lib/markdown_parser.js +++ b/core/lib/markdown_parser.js @@ -28,7 +28,6 @@ const markdown_parser = function () { if (chunks[2]) { //parse the actual markdown if it exists returnObject.markdown = md.render(chunks[2]); - console.log('rendered markdown', returnObject.markdown); } else { returnObject.markdown = ''; } diff --git a/core/lib/pattern_engines.js b/core/lib/pattern_engines.js index 9b2249a2c..8d03aeda9 100644 --- a/core/lib/pattern_engines.js +++ b/core/lib/pattern_engines.js @@ -45,23 +45,6 @@ function findEngineModulesInDirectory(dir) { return foundEngines; } - - - -// produce a mapping between file extension and engine name for each of the -// loaded engines -function createFileExtensionToEngineNameMap(enginesObject) { - const mapping = {}; - - Object.keys(enginesObject).forEach(function (engineName) { - const extensionForEngine = enginesObject[engineName].engineFileExtension; - mapping[extensionForEngine] = engineName; - }); - - return mapping; -} - - // // PatternEngines: the main export of this module // @@ -115,18 +98,20 @@ const PatternEngines = Object.create({ throw new Error('No engines loaded! Something is seriously wrong.'); } - // mapping of file extensions to engine names, for lookup use - self.engineNameForExtension = createFileExtensionToEngineNameMap(self); - console.log(chalk.bold('Done loading engines.\n')); }, getEngineNameForPattern: function (pattern) { // avoid circular dependency by putting this in here. TODO: is this slow? const of = require('./object_factory'); - if (pattern instanceof of.Pattern && typeof pattern.fileExtension === 'string' && pattern.fileExtension) { - return this.engineNameForExtension[pattern.fileExtension]; + //loop through known engines and find the one that supports the pattern's fileExtension + //TODO: support multiple extensions someday, such as .handlebars and .hbs + for (const engine in this) { + if (engine.engineFileExtension === pattern.fileExtension) { + return engine.engineName; + } + } } // otherwise, assume it's a plain mustache template string and act diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index d02d7117d..09ab35f0b 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -180,6 +180,7 @@ const patternlab_engine = function (config) { const patternlab = {}; patternlab.engines = patternEngines; + patternlab.engines.loadAllEngines(); const pattern_assembler = new pa(); const pattern_exporter = new pe(); From ab2244c78ecb6bab2caf7a9baed3718d24728ab0 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 7 Feb 2017 11:58:06 -0600 Subject: [PATCH 25/98] working against gulp-edition async branch with mustache still reporitng quite a few handlebar tests broken part of #610 --- core/lib/markdown_parser.js | 1 - core/lib/pattern_engines.js | 29 +++++++---------------------- core/lib/patternlab.js | 1 + 3 files changed, 8 insertions(+), 23 deletions(-) diff --git a/core/lib/markdown_parser.js b/core/lib/markdown_parser.js index 0b09929ac..68fcfa68d 100644 --- a/core/lib/markdown_parser.js +++ b/core/lib/markdown_parser.js @@ -28,7 +28,6 @@ const markdown_parser = function () { if (chunks[2]) { //parse the actual markdown if it exists returnObject.markdown = md.render(chunks[2]); - console.log('rendered markdown', returnObject.markdown); } else { returnObject.markdown = ''; } diff --git a/core/lib/pattern_engines.js b/core/lib/pattern_engines.js index 9b2249a2c..8d03aeda9 100644 --- a/core/lib/pattern_engines.js +++ b/core/lib/pattern_engines.js @@ -45,23 +45,6 @@ function findEngineModulesInDirectory(dir) { return foundEngines; } - - - -// produce a mapping between file extension and engine name for each of the -// loaded engines -function createFileExtensionToEngineNameMap(enginesObject) { - const mapping = {}; - - Object.keys(enginesObject).forEach(function (engineName) { - const extensionForEngine = enginesObject[engineName].engineFileExtension; - mapping[extensionForEngine] = engineName; - }); - - return mapping; -} - - // // PatternEngines: the main export of this module // @@ -115,18 +98,20 @@ const PatternEngines = Object.create({ throw new Error('No engines loaded! Something is seriously wrong.'); } - // mapping of file extensions to engine names, for lookup use - self.engineNameForExtension = createFileExtensionToEngineNameMap(self); - console.log(chalk.bold('Done loading engines.\n')); }, getEngineNameForPattern: function (pattern) { // avoid circular dependency by putting this in here. TODO: is this slow? const of = require('./object_factory'); - if (pattern instanceof of.Pattern && typeof pattern.fileExtension === 'string' && pattern.fileExtension) { - return this.engineNameForExtension[pattern.fileExtension]; + //loop through known engines and find the one that supports the pattern's fileExtension + //TODO: support multiple extensions someday, such as .handlebars and .hbs + for (const engine in this) { + if (engine.engineFileExtension === pattern.fileExtension) { + return engine.engineName; + } + } } // otherwise, assume it's a plain mustache template string and act diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index d02d7117d..09ab35f0b 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -180,6 +180,7 @@ const patternlab_engine = function (config) { const patternlab = {}; patternlab.engines = patternEngines; + patternlab.engines.loadAllEngines(); const pattern_assembler = new pa(); const pattern_exporter = new pe(); From 7efa976e7f0c702d890769e036a594062a4e841c Mon Sep 17 00:00:00 2001 From: BRIAN MUENZENMEYER Date: Wed, 8 Feb 2017 05:37:36 -0600 Subject: [PATCH 26/98] poor object key iteration was looping through all properties, and subsequently falling through to mustache only one failing unit test now part of #610 --- core/lib/pattern_engines.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/lib/pattern_engines.js b/core/lib/pattern_engines.js index 8d03aeda9..b8c03a80a 100644 --- a/core/lib/pattern_engines.js +++ b/core/lib/pattern_engines.js @@ -107,7 +107,9 @@ const PatternEngines = Object.create({ if (pattern instanceof of.Pattern && typeof pattern.fileExtension === 'string' && pattern.fileExtension) { //loop through known engines and find the one that supports the pattern's fileExtension //TODO: support multiple extensions someday, such as .handlebars and .hbs - for (const engine in this) { + const engineNames = Object.keys(this); + for (let i = 0; i < engineNames.length; i++) { + const engine = this[engineNames[i]]; if (engine.engineFileExtension === pattern.fileExtension) { return engine.engineName; } From 9412dde7bbaabff9648f9d50b3205e412ef50b32 Mon Sep 17 00:00:00 2001 From: BRIAN MUENZENMEYER Date: Wed, 8 Feb 2017 05:43:15 -0600 Subject: [PATCH 27/98] fix the branch name for the travis config --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3c4671330..585e43d78 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,7 @@ branches: only: - master - dev - - dev3.0 + - dev-3.0 notifications: webhooks: From 8f92ec08b1b47dca32d7f4aca16024a1f732bd1f Mon Sep 17 00:00:00 2001 From: BRIAN MUENZENMEYER Date: Thu, 9 Feb 2017 00:06:08 -0600 Subject: [PATCH 28/98] made some small improvements to plugin loading - which will move us toward a better state --- core/lib/patternlab.js | 2 ++ core/lib/plugin_manager.js | 23 +++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 09ab35f0b..f687630ce 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -124,6 +124,8 @@ function checkConfiguration(patternlab) { * Finds and calls the main method of any found plugins. * @param patternlab - global data store */ + +//todo, move this to plugin_manager function initializePlugins(patternlab) { if (!patternlab.config.plugins) { return; } diff --git a/core/lib/plugin_manager.js b/core/lib/plugin_manager.js index b126f767c..50aee143d 100644 --- a/core/lib/plugin_manager.js +++ b/core/lib/plugin_manager.js @@ -42,10 +42,25 @@ const plugin_manager = function (config, configPath) { if (!diskConfig.plugins) { diskConfig.plugins = {}; } - diskConfig.plugins[pluginName] = { - enabled: true, - initialized: false - }; + + if (!diskConfig.plugins[pluginName]) { + diskConfig.plugins[pluginName] = { + enabled: true, + initialized: false, + options: {} + }; + } + + const pluginPathConfig = path.resolve(pluginPath, 'config.json'); + try { + var pluginConfigJSON = require(pluginPathConfig); + if (!diskConfig.plugins[pluginName].options) { + + diskConfig.plugins[pluginName].options = pluginConfigJSON; + } + } catch (ex) { + //a config.json file is not required at this time + } //write config entry back fs.outputFileSync(path.resolve(configPath), JSON.stringify(diskConfig, null, 2)); From 24b04af8737a3f92301c85d00daf35dd3b0f2c79 Mon Sep 17 00:00:00 2001 From: Ben Halverson Date: Thu, 9 Feb 2017 21:08:00 -0800 Subject: [PATCH 29/98] removed deprecated patternStates Object --- core/lib/pattern_assembler.js | 20 --------------- patternlab-config.json | 2 -- test/pattern_assembler_tests.js | 43 --------------------------------- 3 files changed, 65 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index b85867d88..bfc871e33 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -77,21 +77,7 @@ var pattern_assembler = function () { } } - /* - * Deprecated in favor of .md 'status' frontmatter inside a pattern. Still used for unit tests at this time. - * Will be removed in future versions - */ - function setState(pattern, patternlab, displayDeprecatedWarning) { - if (patternlab.config.patternStates && patternlab.config.patternStates[pattern.patternPartial]) { - if (displayDeprecatedWarning) { - plutils.error("Deprecation Warning: Using patternlab-config.json patternStates object will be deprecated in favor of the state frontmatter key associated with individual pattern markdown files."); - console.log("This feature will still work in it's current form this release (but still be overridden by the new parsing method), and will be removed in the future."); - } - - pattern.patternState = patternlab.config.patternStates[pattern.patternPartial]; - } - } function addPattern(pattern, patternlab) { @@ -313,9 +299,6 @@ var pattern_assembler = function () { return currentPattern; } - //see if this file has a state - setState(currentPattern, patternlab, true); - //look for a json file for this template try { var jsonFilename = path.resolve(patternsPath, currentPattern.subdir, currentPattern.fileName + ".json"); @@ -571,9 +554,6 @@ var pattern_assembler = function () { find_list_items: function (pattern) { return pattern.findListItems(); }, - setPatternState: function (pattern, patternlab, displayDeprecatedWarning) { - setState(pattern, patternlab, displayDeprecatedWarning); - }, addPattern: function (pattern, patternlab) { addPattern(pattern, patternlab); }, diff --git a/patternlab-config.json b/patternlab-config.json index 70ff944c7..1dd3cfeff 100644 --- a/patternlab-config.json +++ b/patternlab-config.json @@ -50,8 +50,6 @@ "ishMinimum": "240", "ishMaximum": "2600", "patternStateCascade": ["inprogress", "inreview", "complete"], - "patternStates": { - }, "patternExportPatternPartials": [], "patternExportDirectory": "./pattern_exports/", "cacheBust": true, diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index fa1cf92d2..cfba3f07b 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -456,49 +456,6 @@ tap.test('processPatternRecursive - ensure deep-nesting works', function(test) { test.end(); }); -tap.test('setState - applies any patternState matching the pattern', function(test) { - //arrange - var pa = require('../core/lib/pattern_assembler'); - var pattern_assembler = new pa(); - var patternlab = {}; - patternlab.config = {}; - patternlab.config.patternStates = {}; - patternlab.config.patternStates["pages-homepage-emergency"] = "inprogress"; - - var pattern = { - patternPartial: "pages-homepage-emergency" - }; - - //act - pattern_assembler.setPatternState(pattern, patternlab); - - //assert - test.equals(pattern.patternState, "inprogress"); - test.end(); -}); - -tap.test('setState - does not apply any patternState if nothing matches the pattern', function(test) { - //arrange - var pa = require('../core/lib/pattern_assembler'); - var pattern_assembler = new pa(); - var patternlab = {}; - patternlab.config = {}; - patternlab.config.patternStates = {}; - patternlab.config.patternStates["pages-homepage-emergency"] = "inprogress"; - - var pattern = { - key: "pages-homepage", - patternState: "" - }; - - //act - pattern_assembler.setPatternState(pattern, patternlab); - - //assert - test.equals(pattern.patternState, ""); - test.end(); -}); - tap.test('parseDataLinks - replaces found link.* data for their expanded links', function(test) { //arrange var diveSync = require('diveSync'); From ea1f963a052df19dd599264880da2fd00f95c888 Mon Sep 17 00:00:00 2001 From: BRIAN MUENZENMEYER Date: Mon, 20 Feb 2017 20:49:13 -0600 Subject: [PATCH 30/98] expose getSupportedTemplateExtensions part of #625 --- core/lib/patternlab.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index f687630ce..7151bca5a 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -206,6 +206,10 @@ const patternlab_engine = function (config) { console.log(patternlab.package.version); } + function getSupportedTemplateExtensions(){ + return patternlab.engines.getSupportedFileExtensions(); + } + function help() { console.log(''); @@ -672,6 +676,9 @@ const patternlab_engine = function (config) { }, installplugin: function (pluginName) { installPlugin(pluginName); + }, + getSupportedTemplateExtensions: function () { + return getSupportedTemplateExtensions(); } }; }; From c59672e699a5f7b697b4acec151659c32297b2ab Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 21 Feb 2017 07:42:35 -0600 Subject: [PATCH 31/98] don't add an empty options key only to check for options before writing the good stuff. d'oh! --- core/lib/plugin_manager.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/lib/plugin_manager.js b/core/lib/plugin_manager.js index 50aee143d..e636dd4a5 100644 --- a/core/lib/plugin_manager.js +++ b/core/lib/plugin_manager.js @@ -46,8 +46,7 @@ const plugin_manager = function (config, configPath) { if (!diskConfig.plugins[pluginName]) { diskConfig.plugins[pluginName] = { enabled: true, - initialized: false, - options: {} + initialized: false }; } @@ -55,7 +54,6 @@ const plugin_manager = function (config, configPath) { try { var pluginConfigJSON = require(pluginPathConfig); if (!diskConfig.plugins[pluginName].options) { - diskConfig.plugins[pluginName].options = pluginConfigJSON; } } catch (ex) { From 96d4b70b6e5e9fab6dd4a61fefa3fa4aaad7c841 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 21 Mar 2017 07:25:08 -0500 Subject: [PATCH 32/98] ignore nyc output part of resolving #622 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e5a709278..d1ddc139e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ source/css/style.css.map public !test/patterns/public/.gitkeep !test/patterns/testDependencyGraph.json +.nyc_output/ From 5f38775a8547ef6f9fbf79c050a85a9c0a001fa4 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 21 Mar 2017 07:25:45 -0500 Subject: [PATCH 33/98] separated test and lint procedures added coverage to test command part of resolving #622 --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index eeb34ecea..87747ec98 100644 --- a/package.json +++ b/package.json @@ -54,8 +54,9 @@ ], "license": "MIT", "scripts": { - "test": "eslint core/**/*.js && tap test/*_tests.js --reporter spec", - "lint": "eslint core/**/*.js" + "lint": "eslint core/**/*.js", + "pretest" : "npm run lint", + "test": "tap test/*_tests.js --reporter spec --coverage" }, "engines": { "node": ">=4.0" From 1b74429b2bbe7e22422dad5dc1622203c1326c1a Mon Sep 17 00:00:00 2001 From: James McCollum Date: Tue, 21 Mar 2017 13:33:18 -0500 Subject: [PATCH 34/98] Fixed lineage_hunter_tests Also switched test .md files to use `state` instead of `status` as per https://github.com/pattern-lab/the-spec/issues/16 --- test/files/_patterns/00-test/00-foo.md | 3 +++ test/files/_patterns/00-test/01-bar.md | 2 +- test/files/_patterns/00-test/03-styled-atom.md | 2 +- test/lineage_hunter_tests.js | 18 +++++++----------- test/markdown_parser_tests.js | 4 ++-- 5 files changed, 14 insertions(+), 15 deletions(-) diff --git a/test/files/_patterns/00-test/00-foo.md b/test/files/_patterns/00-test/00-foo.md index 4c8bbf296..b284e8103 100644 --- a/test/files/_patterns/00-test/00-foo.md +++ b/test/files/_patterns/00-test/00-foo.md @@ -1,3 +1,6 @@ +--- +state: inreview +--- ## A Simple Include This pattern contains an include of `test-bar`. It also has this markdown file, which does not have frontmatter. diff --git a/test/files/_patterns/00-test/01-bar.md b/test/files/_patterns/00-test/01-bar.md index d4fd865a2..cbbcba83e 100644 --- a/test/files/_patterns/00-test/01-bar.md +++ b/test/files/_patterns/00-test/01-bar.md @@ -1,5 +1,5 @@ --- -status: complete +state: complete --- ## A Simple Bit of Markup diff --git a/test/files/_patterns/00-test/03-styled-atom.md b/test/files/_patterns/00-test/03-styled-atom.md index 23371c488..58c494066 100644 --- a/test/files/_patterns/00-test/03-styled-atom.md +++ b/test/files/_patterns/00-test/03-styled-atom.md @@ -1,3 +1,3 @@ --- -status: inprogress +state: inprogress --- diff --git a/test/lineage_hunter_tests.js b/test/lineage_hunter_tests.js index 01ab483c0..6df3aae9a 100644 --- a/test/lineage_hunter_tests.js +++ b/test/lineage_hunter_tests.js @@ -34,6 +34,9 @@ function createBasePatternLabObject() { paths: { source: { patterns: patterns_dir + }, + public: { + patterns: './test/public/_patterns' } }, outputFileSuffixes: { @@ -48,6 +51,8 @@ function createBasePatternLabObject() { pl.config.debug = false; pl.patterns = []; pl.partials = {}; + pl.patternGroups = {}; + pl.subtypePatterns = {}; return pl; } @@ -266,17 +271,8 @@ tap.test('cascade_pattern_states sets the pattern state on any lineage patterns //arrange var pl = createBasePatternLabObject(); - var atomPattern = new of.Pattern('00-test/01-bar.mustache'); - atomPattern.template = fs.readFileSync(pl.config.paths.source.patterns + '00-test/01-bar.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.patternState = "inreview"; - pattern_assembler.addPattern(atomPattern, pl); - - var consumerPattern = new of.Pattern('00-test/00-foo.mustache'); - consumerPattern.template = fs.readFileSync(pl.config.paths.source.patterns + '00-test/00-foo.mustache', 'utf8'); - consumerPattern.extendedTemplate = consumerPattern.template; - consumerPattern.patternState = "complete"; - pattern_assembler.addPattern(consumerPattern, pl); + var atomPattern = pattern_assembler.load_pattern_iterative('00-test/01-bar.mustache', pl); + var consumerPattern = pattern_assembler.load_pattern_iterative('00-test/00-foo.mustache', pl); lineage_hunter.find_lineage(consumerPattern, pl); diff --git a/test/markdown_parser_tests.js b/test/markdown_parser_tests.js index 5931dd832..df28250b4 100644 --- a/test/markdown_parser_tests.js +++ b/test/markdown_parser_tests.js @@ -31,7 +31,7 @@ tap.test('parses pattern description block correctly when frontmatter present', //assert test.equals(returnObject.markdown, '

A Simple Bit of Markup

\n

Foo cannot get simpler than bar, amiright?

\n'); - test.equals(returnObject.status, 'complete'); + test.equals(returnObject.state, 'complete'); test.end(); }); @@ -45,6 +45,6 @@ tap.test('parses frontmatter only when no markdown present', function (test) { //assert test.equals(returnObject.markdown, ''); - test.equals(returnObject.status, 'inprogress'); + test.equals(returnObject.state, 'inprogress'); test.end(); }); From 121b0cbaf3f46bb7370f3c1d7823d85724799e00 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 21 Mar 2017 14:12:55 -0500 Subject: [PATCH 35/98] added dev installation instructions, usage, logo, ecosystem mention, community, support, and license sections --- README.md | 95 ++++++++++++++++++++++++++++++++++++++------------ patternlab.svg | 6 ++++ 2 files changed, 79 insertions(+), 22 deletions(-) create mode 100644 patternlab.svg diff --git a/README.md b/README.md index 58bd30c02..6517e52f3 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,98 @@ +![Pattern Lab Logo](patternlab.svg) + [![Build Status](https://travis-ci.org/pattern-lab/patternlab-node.svg?branch=master)](https://travis-ci.org/pattern-lab/patternlab-node) ![current release](https://img.shields.io/github/release/pattern-lab/patternlab-node.svg) ![license](https://img.shields.io/github/license/pattern-lab/patternlab-node.svg) [![Join the chat at Gitter](https://badges.gitter.im/pattern-lab/node.svg)](https://gitter.im/pattern-lab/node) # Pattern Lab Node Core -This repository contains the core functionality for Pattern Lab Node. Pattern Lab Core is designed to be included as a dependency within [Node Editions](https://github.com/pattern-lab?utf8=%E2%9C%93&query=edition-node). -If this looks **REALLY DIFFERENT** from what you expected, check out the [ChangeLog](https://github.com/pattern-lab/patternlab-node/wiki/ChangeLog). +This repository contains the core functionality for Pattern Lab Node. Pattern Lab helps you and your team build thoughtful, pattern-driven user interfaces using atomic design principles. + +[Online Demo of Pattern Lab Output](http://demo.patternlab.io/) + +## Installation + +Pattern Lab Node Core is designed to be consumed, and by default is included as a dependency within two example [Node Editions](https://github.com/pattern-lab?utf8=%E2%9C%93&query=edition-node). + * [Pattern Lab/Node: Gulp Edition](https://github.com/pattern-lab/edition-node-gulp) contains info how to get started within a Gulp task running environment. * [Pattern Lab/Node: Grunt Edition](https://github.com/pattern-lab/edition-node-grunt) contains info how to get started within a Grunt task running environment. -## Core Team +![Pattern Lab Ecosystem](http://patternlab.io/assets/pattern-lab-2-image_18-large-opt.png) -* [@bmuenzenmeyer](https://github.com/bmuenzenmeyer) - Lead Maintainer -* [@geoffp](https://github.com/geoffp) - Core Contributor -* [@raphaelokon](https://github.com/raphaelokon) - CLI Contributor -* [@tburny](https://github.com/tburny) - Core Contributor +Core, and Editions, are part of the [Pattern Lab Ecosystem](http://patternlab.io/docs/advanced-ecosystem-overview.html). With this architecture, we encourage people to write and maintain their own editions. + +## Usage + +``` javascript +const config = require('./patternlab-config.json'); +const patternlab = require('patternlab-node')(config); +patternlab.build(doneCallBack, boolCleanOutputDir); +``` + +* Read more about configuration via `patternlab-config.json`: https://github.com/pattern-lab/patternlab-node/wiki/Configuration +* The rest of the [api / command line interface](https://github.com/pattern-lab/patternlab-node/wiki/Command-Line-Interface) is documented in the wiki, and already implemented for you within [Node Editions](https://github.com/pattern-lab?utf8=%E2%9C%93&query=edition-node). +A [full-featured command line interface](https://github.com/pattern-lab/patternlab-node-cli) is in the works, courtesy of [@raphaelokon](https://github.com/raphaelokon). + + +## Development Installation / Workflow + +If you are interested in [contributing to Pattern Lab](https://github.com/pattern-lab/patternlab-node/blob/master/.github/CONTRIBUTING.md), it's suggested to install an Edition of your choice and then run a local copy of this repository via [`npm link`](https://docs.npmjs.com/cli/link). + +``` bash +mkdir /patternlab-node +cd /patternlab-node +git clone https://github.com/pattern-lab/patternlab-node.git +npm install +npm link +cd location/of/edition +npm link patternlab-node +``` + +The above is a bit verbose, but illustrates: + +1. how to clone this repository to an arbitrary location +2. install all dependencies (run `npm install --dev` if your NODE_ENV is production for some reason) +3. setup the `npm link` to your local copy +4. use the local copy of patternlab-node in your edition + +> Make sure to change to whichever branch you intend to hack on or test within your cloned repository, such as `dev` or `bugfix/fixes-broken-unittest` ## Upgrading If you find yourself here and are looking to upgrade, check out how to upgrade from version to version of Pattern Lab Node here: [https://github.com/pattern-lab/patternlab-node/wiki/Upgrading](https://github.com/pattern-lab/patternlab-node/wiki/Upgrading) -## Command Line Interface - -The rudimentary [command line interface](https://github.com/pattern-lab/patternlab-node/wiki/Command-Line-Interface) is documented in the wiki, and already implemented for you within [Node Editions](https://github.com/pattern-lab?utf8=%E2%9C%93&query=edition-node). -A [full-featured command line interface](https://github.com/pattern-lab/patternlab-node-cli) is in the works, courtesy of [@raphaelokon](https://github.com/raphaelokon). +View the [ChangeLog](https://github.com/pattern-lab/patternlab-node/wiki/ChangeLog) for the latest Pattern Lab Node updates. ## Contributing If you'd like to contribute to Pattern Lab Node, please do so! There is always a lot of ground to cover and something for your wheelhouse. -No pull request is too small. Check out any [up for grabs issues](https://github.com/pattern-lab/patternlab-node/labels/help%20wanted%20%2F%20up%20for%20grabs) as a good way to get your feet wet, or add some more unit tests. +Please read the guidelines: https://github.com/pattern-lab/patternlab-node/blob/master/.github/CONTRIBUTING.md -## Guidelines -1. Please keep your pull requests concise and limited to **ONE** substantive change at a time. This makes reviewing and testing so much easier. -2. _ALWAYS_ submit pull requests against the [dev branch](https://github.com/pattern-lab/patternlab-node/tree/dev). If this does not occur, I will first, try to redirect you gently, second, port over your contribution manually if time allows, and/or third, close your pull request. If you have a major feature to stabilize over time, talk to @bmuenzenmeyer about making a dedicated `feature-branch` -3. If you can, add some unit tests using the existing patterns in the `./test` directory -4. To help hack on core from an edition, read [this wiki page](https://github.com/pattern-lab/patternlab-node/wiki/Running-an-Edition-Against-Local-Core) -## Coding style -Two files combine within the project to define and maintain our coding style. +## Core Team -* The `.editorconfig` controls spaces / tabs within supported editors. Check out their [site](http://editorconfig.org/). -* The `.eslintrc` defines our javascript standards. Some editors will evaluate this real-time - otherwise it's run using `grunt|gulp build` +* [@bmuenzenmeyer](https://github.com/bmuenzenmeyer) - Lead Maintainer +* [@geoffp](https://github.com/geoffp) - Core Contributor +* [@raphaelokon](https://github.com/raphaelokon) - CLI Contributor +* [@tburny](https://github.com/tburny) - Core Contributor -## Gitter +## Community The Pattern Lab Node team uses [our gitter.im channel, pattern-lab/node](https://gitter.im/pattern-lab/node) to keep in sync, share updates, and talk shop. Please stop by to say hello or as a first place to turn if stuck. Other channels in the Pattern Lab organization can be found on gitter too. + +There is also a dedicated Pattern Lab channel on the [design system slack](designsystems.herokuapp.com) run by [@jina](https://twitter.com/jina). + +Ask or answer Pattern Lab questions on Stack Overflow: http://stackoverflow.com/questions/tagged/patternlab.io + +## Support Pattern Lab Node + +Pattern Lab Node is on [Patreon account](https://www.patreon.com/patternlab) to allow users and organizations to directly support continued work on the Pattern Lab Node project. + +I (Brian talking) need help and support to make Pattern Lab Node a sustained success. I devote a lot of free time and would-be sleep to make the project what it is, but nothing compares to hearing back from users. It means the world to me when people find value in Pattern Lab Node. I am ridiculously humbled to hear and see what you all build with it. + +If you find yourself here and balk and the idea of supporting open source software monetarily - I understand. Carry on, but please do share what you build - we all learn more together. +- [Pattern Lab on Patreon](https://www.patreon.com/patternlab) + +## License + +[MIT](https://github.com/pattern-lab/patternlab-node/blob/master/LICENSE) diff --git a/patternlab.svg b/patternlab.svg new file mode 100644 index 000000000..b1980ba91 --- /dev/null +++ b/patternlab.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file From 288107635f2437dc988fec5f5d0e3e7b93ddb9a0 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 21 Mar 2017 14:14:01 -0500 Subject: [PATCH 36/98] make file relative --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6517e52f3..0be6fcbe8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Pattern Lab Logo](patternlab.svg) +![Pattern Lab Logo](/patternlab.svg) [![Build Status](https://travis-ci.org/pattern-lab/patternlab-node.svg?branch=master)](https://travis-ci.org/pattern-lab/patternlab-node) ![current release](https://img.shields.io/github/release/pattern-lab/patternlab-node.svg) ![license](https://img.shields.io/github/license/pattern-lab/patternlab-node.svg) [![Join the chat at Gitter](https://badges.gitter.im/pattern-lab/node.svg)](https://gitter.im/pattern-lab/node) From 1af79d41f42fe8b23ffc1ec0b706484b5d09054d Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 21 Mar 2017 14:21:45 -0500 Subject: [PATCH 37/98] screw you github and svg --- README.md | 2 +- patternlab.png | Bin 0 -> 10939 bytes patternlab.svg | 6 ------ 3 files changed, 1 insertion(+), 7 deletions(-) create mode 100644 patternlab.png delete mode 100644 patternlab.svg diff --git a/README.md b/README.md index 0be6fcbe8..8bb404298 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Pattern Lab Logo](/patternlab.svg) +![Pattern Lab Logo](/patternlab.png "Pattern Lab Logo") [![Build Status](https://travis-ci.org/pattern-lab/patternlab-node.svg?branch=master)](https://travis-ci.org/pattern-lab/patternlab-node) ![current release](https://img.shields.io/github/release/pattern-lab/patternlab-node.svg) ![license](https://img.shields.io/github/license/pattern-lab/patternlab-node.svg) [![Join the chat at Gitter](https://badges.gitter.im/pattern-lab/node.svg)](https://gitter.im/pattern-lab/node) diff --git a/patternlab.png b/patternlab.png new file mode 100644 index 0000000000000000000000000000000000000000..a177cea8f823a26be4f749b39f0a29ce07a6af82 GIT binary patch literal 10939 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 KuTj?({eJ*t2LYx4 literal 0 HcmV?d00001 diff --git a/patternlab.svg b/patternlab.svg deleted file mode 100644 index b1980ba91..000000000 --- a/patternlab.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 89f1c0fe1426a3b44ae479bb130eb948f9e50f7c Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 21 Mar 2017 14:24:35 -0500 Subject: [PATCH 38/98] once more with feeling --- patternlab.png | Bin 10939 -> 11640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/patternlab.png b/patternlab.png index a177cea8f823a26be4f749b39f0a29ce07a6af82..80edf70ad8497b8242dedf7f6401f2efd7a850f0 100644 GIT binary patch delta 10595 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 delta 9888 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 Tua$i1i~?z3rvFUWHTnMm#K4pz From 8edc3d13ed536eaf02a0d2ae4a17c149d4766390 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 21 Mar 2017 14:28:36 -0500 Subject: [PATCH 39/98] added coveralls --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 87747ec98..d04ddadf8 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "graphlib": "^2.1.1" }, "devDependencies": { + "coveralls": "^2.12.0", "eslint": "^3.5.0", "rewire": "^2.5.2", "tap": "^7.1.2" @@ -55,7 +56,7 @@ "license": "MIT", "scripts": { "lint": "eslint core/**/*.js", - "pretest" : "npm run lint", + "pretest": "npm run lint", "test": "tap test/*_tests.js --reporter spec --coverage" }, "engines": { From 50a466022efd8e89594f5e97e3b68b0848c28ad7 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 21 Mar 2017 14:29:41 -0500 Subject: [PATCH 40/98] Revert "added coveralls" This reverts commit 8edc3d13ed536eaf02a0d2ae4a17c149d4766390. --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index d04ddadf8..87747ec98 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "graphlib": "^2.1.1" }, "devDependencies": { - "coveralls": "^2.12.0", "eslint": "^3.5.0", "rewire": "^2.5.2", "tap": "^7.1.2" @@ -56,7 +55,7 @@ "license": "MIT", "scripts": { "lint": "eslint core/**/*.js", - "pretest": "npm run lint", + "pretest" : "npm run lint", "test": "tap test/*_tests.js --reporter spec --coverage" }, "engines": { From 15c456cfd788e294b330564f1e2e332f8c4900b9 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Wed, 22 Mar 2017 07:18:06 -0500 Subject: [PATCH 41/98] add a missing require statement --- core/lib/list_item_hunter.js | 1 + 1 file changed, 1 insertion(+) diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index c93ecba37..c13078f2f 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -5,6 +5,7 @@ const list_item_hunter = function () { const pa = require('./pattern_assembler'); const smh = require('./style_modifier_hunter'); const plutils = require('./utilities'); + const jsonCopy = require('./json_copy'); const Pattern = require('./object_factory').Pattern; const pattern_assembler = new pa(); From 15f89eb25374b9de0e5bad5c733a7e6f12d0b1ed Mon Sep 17 00:00:00 2001 From: Geoffrey Pursell Date: Mon, 3 Apr 2017 22:42:12 -0500 Subject: [PATCH 42/98] If supported by the engine, call a function that injects the global pattern lab config into the closure scope of the engine so that engines can be configured. --- core/lib/pattern_engines.js | 10 ++++++++-- core/lib/patternlab.js | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/lib/pattern_engines.js b/core/lib/pattern_engines.js index b8c03a80a..414cee7a8 100644 --- a/core/lib/pattern_engines.js +++ b/core/lib/pattern_engines.js @@ -62,7 +62,7 @@ function findEngineModulesInDirectory(dir) { const PatternEngines = Object.create({ - loadAllEngines: function () { + loadAllEngines: function (patternLabConfig) { var self = this; // Try to load engines! We scan for engines at each path specified above. This @@ -78,11 +78,17 @@ const PatternEngines = Object.create({ const successMessage = chalk.green("good to go"); try { - // give it a try! load 'er up. But not if we already have, of course. + // Give it a try! load 'er up. But not if we already have, + // of course. Also pass the pattern lab config object into + // the engine's closure scope so it can know things about + // things. if (self[engineDiscovery.name]) { throw new Error("already loaded, skipping."); } self[engineDiscovery.name] = require(engineDiscovery.modulePath); + if (typeof self[engineDiscovery.name].usePatternLabConfig === 'function') { + self[engineDiscovery.name].usePatternLabConfig(patternLabConfig); + } } catch (err) { errorMessage = err.message; } finally { diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 459a71b79..3d1272967 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -182,7 +182,7 @@ const patternlab_engine = function (config) { const patternlab = {}; patternlab.engines = patternEngines; - patternlab.engines.loadAllEngines(); + patternlab.engines.loadAllEngines(config); const pattern_assembler = new pa(); const pattern_exporter = new pe(); From 7390846d0a829db7d6a2b4634bad2b78bc07aa30 Mon Sep 17 00:00:00 2001 From: Raphael Okon Date: Thu, 4 May 2017 20:56:03 +0200 Subject: [PATCH 43/98] Replace common util functions in core Replace plutils.mergeData with _.merge in core/lib/pseudopattern_hunter.js Replace plutils.mergeData with _.merge in core/lib/list_item_hunter.js Replace plutils.mergeData with _.merge in core/lib/patternlab.js Replace plutils.isObjectEmpty with _.empty in core/lib/pattern_assembler.js Replace plutils.shuffle with _.shuffle in core/lib/pattern_assembler.js Replace util.emptyDirectory with fs.emptyDirSync in core/lib/starterkit_manager.js --- core/lib/list_item_hunter.js | 8 ++++---- core/lib/parameter_hunter.js | 6 +++--- core/lib/pattern_assembler.js | 4 ++-- core/lib/patternlab.js | 4 ++-- core/lib/pseudopattern_hunter.js | 6 +++--- core/lib/starterkit_manager.js | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index c13078f2f..7ffe450de 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -2,9 +2,9 @@ const list_item_hunter = function () { const extend = require('util')._extend; + const _ = require('lodash'); const pa = require('./pattern_assembler'); const smh = require('./style_modifier_hunter'); - const plutils = require('./utilities'); const jsonCopy = require('./json_copy'); const Pattern = require('./object_factory').Pattern; @@ -47,7 +47,7 @@ const list_item_hunter = function () { console.log(err); } - listData = plutils.mergeData(listData, pattern.listitems); + listData = _.merge(listData, pattern.listitems); listData = pattern_assembler.parse_data_links_specific(patternlab, listData, 'listitems.json + any pattern listitems.json'); //iterate over each copied block, rendering its contents along with pattenlab.listitems[i] @@ -68,8 +68,8 @@ const list_item_hunter = function () { console.log(err); } - let allData = plutils.mergeData(globalData, localData); - allData = plutils.mergeData(allData, itemData !== undefined ? itemData[i] : {}); //itemData could be undefined if the listblock contains no partial, just markup + let allData = _.merge(globalData, localData); + allData = _.merge(allData, itemData !== undefined ? itemData[i] : {}); //itemData could be undefined if the listblock contains no partial, just markup allData.link = extend({}, patternlab.data.link); //check for partials within the repeated block diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 07c20a167..c5a5d9ce5 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -2,10 +2,10 @@ const parameter_hunter = function () { const extend = require('util')._extend; + const _ = require('lodash'); const jsonCopy = require('./json_copy'); const pa = require('./pattern_assembler'); const smh = require('./style_modifier_hunter'); - const plutils = require('./utilities'); const style_modifier_hunter = new smh(); const pattern_assembler = new pa(); @@ -267,8 +267,8 @@ const parameter_hunter = function () { console.log(err); } - let allData = plutils.mergeData(globalData, localData); - allData = plutils.mergeData(allData, paramData); + let allData = _.merge(globalData, localData); + allData = _.merge(allData, paramData); //if partial has style modifier data, replace the styleModifier value if (pattern.stylePartials && pattern.stylePartials.length > 0) { diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index d63b1be11..ffce0890a 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -62,7 +62,7 @@ const pattern_assembler = function () { list.push(container.listitems[item]); } } - container.listItemArray = plutils.shuffle(list); + container.listItemArray = _.shuffle(list); for (var i = 1; i <= container.listItemArray.length; i++) { var tempItems = []; @@ -149,7 +149,7 @@ const pattern_assembler = function () { var markdownFileContents = fs.readFileSync(markdownFileName, 'utf8'); var markdownObject = markdown_parser.parse(markdownFileContents); - if (!plutils.isObjectEmpty(markdownObject)) { + if (!_.empty(markdownObject)) { //set keys and markdown itself currentPattern.patternDescExists = true; currentPattern.patternDesc = markdownObject.markdown; diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 3d1272967..aef5520ae 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -401,7 +401,7 @@ const patternlab_engine = function (config) { console.log('There was an error parsing JSON for ' + pattern.relPath); console.log(err); } - allData = plutils.mergeData(allData, pattern.jsonFileData); + allData = _.merge(allData, pattern.jsonFileData); allData.cacheBuster = patternlab.cacheBuster; //re-rendering the headHTML each time allows pattern-specific data to influence the head of the pattern @@ -452,7 +452,7 @@ const patternlab_engine = function (config) { console.log('There was an error parsing JSON for ' + pattern.relPath); console.log(err); } - allFooterData = plutils.mergeData(allFooterData, pattern.jsonFileData); + allFooterData = _.merge(allFooterData, pattern.jsonFileData); allFooterData.patternLabFoot = footerPartial; const footerHTML = pattern_assembler.renderPattern(patternlab.userFoot, allFooterData); diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index 3c7c14edc..debae2d8c 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -3,9 +3,9 @@ const ch = require('./changes_hunter'); const glob = require('glob'); const fs = require('fs-extra'); +const _ = require('lodash'); const lh = require('./lineage_hunter'); const Pattern = require('./object_factory').Pattern; -const plutils = require('./utilities'); const path = require('path'); const lineage_hunter = new lh(); const changes_hunter = new ch(); @@ -43,7 +43,7 @@ pseudopattern_hunter.prototype.find_pseudopatterns = function (currentPattern, p } //extend any existing data with variant data - variantFileData = plutils.mergeData(currentPattern.jsonFileData, variantFileData); + variantFileData = _.merge(currentPattern.jsonFileData, variantFileData); let variantName = pseudoPatterns[i].substring(pseudoPatterns[i].indexOf('~') + 1).split('.')[0]; let variantFilePath = path.join(currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); @@ -89,7 +89,7 @@ pseudopattern_hunter.prototype.find_pseudopatterns = function (currentPattern, p } //extend any existing data with variant data - variantFileData = plutils.mergeData(currentPattern.jsonFileData, variantFileData); + variantFileData = _.merge(currentPattern.jsonFileData, variantFileData); variantName = pseudoPatterns[i].substring(pseudoPatterns[i].indexOf('~') + 1).split('.')[0]; variantFilePath = path.join(currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); diff --git a/core/lib/starterkit_manager.js b/core/lib/starterkit_manager.js index f0741ce37..2498580b9 100644 --- a/core/lib/starterkit_manager.js +++ b/core/lib/starterkit_manager.js @@ -31,7 +31,7 @@ const starterkit_manager = function (config) { if (clean) { console.log('Deleting contents of', paths.source.root, 'prior to starterkit load.'); - util.emptyDirectory(paths.source.root); + fs.emptyDirSync(paths.source.root); } else { console.log('Overwriting contents of', paths.source.root, 'during starterkit load.'); } From ecb0291f7f75c3eeaf184dac8f8f973e624412ae Mon Sep 17 00:00:00 2001 From: Raphael Okon Date: Thu, 4 May 2017 21:09:22 +0200 Subject: [PATCH 44/98] Remove unused functions from core/lib/utilities.js --- core/lib/utilities.js | 95 ------------------------------------------- 1 file changed, 95 deletions(-) diff --git a/core/lib/utilities.js b/core/lib/utilities.js index e464ec909..b271ac14c 100644 --- a/core/lib/utilities.js +++ b/core/lib/utilities.js @@ -49,97 +49,6 @@ const warning = log.warning.bind(log); */ const error = log.error.bind(log); - /** - * Shuffles an array in place. - * http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript - * - * @param {Array} o - * @returns {Array} o - */ -const shuffle = function (o) { - /*eslint-disable curly*/ - for (var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); - return o; -}; - -/** - * Recursively merge properties of two objects. - * - * @param {Object} obj1 If obj1 has properties obj2 doesn't, add to obj2. - * @param {Object} obj2 This object's properties have priority over obj1. - * @returns {Object} obj2 - */ -const mergeData = function (obj1, obj2) { - /*eslint-disable no-param-reassign, guard-for-in*/ - if (typeof obj2 === 'undefined') { - obj2 = {}; - } - for (var p in obj1) { - try { - // Only recurse if obj1[p] is an object. - if (obj1[p].constructor === Object) { - // Requires 2 objects as params; create obj2[p] if undefined. - if (typeof obj2[p] === 'undefined') { - obj2[p] = {}; - } - obj2[p] = mergeData(obj1[p], obj2[p]); - - // Pop when recursion meets a non-object. If obj1[p] is a non-object, - // only copy to undefined obj2[p]. This way, obj2 maintains priority. - } else if (typeof obj2[p] === 'undefined') { - obj2[p] = obj1[p]; - } - } catch (e) { - // Property in destination object not set; create it and set its value. - if (typeof obj2[p] === 'undefined') { - obj2[p] = obj1[p]; - } - } - } - return obj2; -}; - -/** - * Determines whether or not an object is empty. - * - * @param {Object} obj - * @returns {Boolean} - */ -const isObjectEmpty = function (obj) { - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { return false; } - } - return true; -}; - -/** - * Recursively delete the contents of directory. - * Adapted from https://gist.github.com/tkihira/2367067 - * - * @param {string} dir - directory to empty - * @param {string} cleanDir - already empty directory - * @returns {undefined} - */ -const emptyDirectory = function (dir, cleanDir) { - var list = fs.readdirSync(dir); - for (var i = 0; i < list.length; i++) { - var filename = path.join(dir, list[i]); - var stat = fs.statSync(filename); - - if (filename === "." || filename === "..") { - // pass these files - } else if (stat.isDirectory()) { - this.emptyDirectory(filename); - } else { - // rm fiilename - fs.unlinkSync(filename); - } - } - if (cleanDir) { - fs.rmdirSync(dir); - } -}; - /** * Useful for reporting errors in .catch() on Promises * @param {string} - a message to report @@ -158,9 +67,5 @@ module.exports = { warning, error, log, - shuffle, - mergeData, - isObjectEmpty, - emptyDirectory, reportError }; From 6a9674bdf7b0b5283e7ef2db51a61fff7d3e694f Mon Sep 17 00:00:00 2001 From: Raphael Okon Date: Fri, 5 May 2017 21:48:30 +0200 Subject: [PATCH 45/98] Fixing _.emtpy -> _.isEmpty --- core/lib/pattern_assembler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index ffce0890a..d83a0f7c3 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -149,7 +149,7 @@ const pattern_assembler = function () { var markdownFileContents = fs.readFileSync(markdownFileName, 'utf8'); var markdownObject = markdown_parser.parse(markdownFileContents); - if (!_.empty(markdownObject)) { + if (!_.isEmpty(markdownObject)) { //set keys and markdown itself currentPattern.patternDescExists = true; currentPattern.patternDesc = markdownObject.markdown; From f74faa3d259c4d7eb393e7319bd628d1ff8421dc Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 16 May 2017 09:27:34 -0500 Subject: [PATCH 46/98] replace ishMinMax with ishViewportRange part of https://github.com/pattern-lab/styleguidekit-assets-default/releases/tag/v3.5.0 i know this file isnt really used --- patternlab-config.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/patternlab-config.json b/patternlab-config.json index 1dd3cfeff..ef5ea68a8 100644 --- a/patternlab-config.json +++ b/patternlab-config.json @@ -47,8 +47,11 @@ "tools-all": false, "tools-docs": false }, - "ishMinimum": "240", - "ishMaximum": "2600", + "ishViewportRange": { + "s": [240, 500], + "m": [500, 800], + "l": [800, 2600] + }, "patternStateCascade": ["inprogress", "inreview", "complete"], "patternExportPatternPartials": [], "patternExportDirectory": "./pattern_exports/", From 0098d89ab41db4d95d0a0afe493cf8e22b5222e4 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 16 May 2017 12:11:41 -0500 Subject: [PATCH 47/98] call spawnMeta if defined on the engine part of https://github.com/pattern-lab/patternlab-node/issues/611 --- core/lib/pattern_engines.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/lib/pattern_engines.js b/core/lib/pattern_engines.js index 414cee7a8..1f2ac9b50 100644 --- a/core/lib/pattern_engines.js +++ b/core/lib/pattern_engines.js @@ -89,6 +89,9 @@ const PatternEngines = Object.create({ if (typeof self[engineDiscovery.name].usePatternLabConfig === 'function') { self[engineDiscovery.name].usePatternLabConfig(patternLabConfig); } + if (typeof self[engineDiscovery.name].spawnMeta === 'function') { + self[engineDiscovery.name].spawnMeta(patternLabConfig); + } } catch (err) { errorMessage = err.message; } finally { From 7b60bccd435ecbb7afcff7b37d5413c3c62afc33 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 16 May 2017 14:35:47 -0500 Subject: [PATCH 48/98] moved pattern lab package version log behind debug flag part of https://github.com/pattern-lab/patternlab-node/issues/636 --- core/lib/patternlab.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index aef5520ae..485e1d83a 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -31,12 +31,6 @@ plutils.log.on('debug', msg => console.log(msg)); plutils.log.on('warning', msg => console.log(msg)); plutils.log.on('info', msg => console.log(msg)); -console.log( - chalk.bold('\n====[ Pattern Lab / Node'), - `- v${packageInfo.version}`, - chalk.bold(']====\n') -); - const patternEngines = require('./pattern_engines'); const EventEmitter = require('events').EventEmitter; @@ -489,6 +483,15 @@ const patternlab_engine = function (config) { } function buildPatterns(deletePatternDir) { + + if (patternlab.config.debug) { + console.log( + chalk.bold('\n====[ Pattern Lab / Node'), + `- v${packageInfo.version}`, + chalk.bold(']====\n') + ); + } + patternlab.events.emit('patternlab-build-pattern-start', patternlab); const graph = patternlab.graph = loadPatternGraph(deletePatternDir); From 2e7152ba80887e1a289fa3a5a44c420ffed08292 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 16 May 2017 14:58:48 -0500 Subject: [PATCH 49/98] moved patternlab engine logs behind debug flag --- core/lib/pattern_engines.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/core/lib/pattern_engines.js b/core/lib/pattern_engines.js index 1f2ac9b50..8ca2aea2a 100644 --- a/core/lib/pattern_engines.js +++ b/core/lib/pattern_engines.js @@ -69,13 +69,18 @@ const PatternEngines = Object.create({ // function is kind of a big deal. enginesDirectories.forEach(function (engineDirectory) { const enginesInThisDir = findEngineModulesInDirectory(engineDirectory.path); - console.log(chalk.bold(`Loading engines from ${engineDirectory.displayName}...\n`)); + if (patternLabConfig.debug) { + console.log(chalk.bold(`Loading engines from ${engineDirectory.displayName}...\n`)); + } // find all engine-named things in this directory and try to load them, // unless it's already been loaded. enginesInThisDir.forEach(function (engineDiscovery) { let errorMessage; - const successMessage = chalk.green("good to go"); + const successMessage = "good to go"; + if (patternLabConfig.debug) { + chalk.green(successMessage); + } try { // Give it a try! load 'er up. But not if we already have, @@ -96,7 +101,9 @@ const PatternEngines = Object.create({ errorMessage = err.message; } finally { // report on the status of the engine, one way or another! - console.log(` ${engineDiscovery.name}:`, errorMessage ? chalk.red(errorMessage) : successMessage); + if (patternLabConfig.debug) { + console.log(` ${engineDiscovery.name}:`, errorMessage ? chalk.red(errorMessage) : successMessage); + } } }); console.log(''); @@ -106,8 +113,9 @@ const PatternEngines = Object.create({ if (Object.keys(self).length === 0) { throw new Error('No engines loaded! Something is seriously wrong.'); } - - console.log(chalk.bold('Done loading engines.\n')); + if (patternLabConfig.debug) { + console.log(chalk.bold('Done loading engines.\n')); + } }, getEngineNameForPattern: function (pattern) { From 94f199ad807678ab82e5e0ebd5d179fe4b3638a8 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 16 May 2017 14:58:48 -0500 Subject: [PATCH 50/98] moved patternlab engine logs behind debug flag closes https://github.com/pattern-lab/patternlab-node/issues/636 --- core/lib/pattern_engines.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/core/lib/pattern_engines.js b/core/lib/pattern_engines.js index 1f2ac9b50..8ca2aea2a 100644 --- a/core/lib/pattern_engines.js +++ b/core/lib/pattern_engines.js @@ -69,13 +69,18 @@ const PatternEngines = Object.create({ // function is kind of a big deal. enginesDirectories.forEach(function (engineDirectory) { const enginesInThisDir = findEngineModulesInDirectory(engineDirectory.path); - console.log(chalk.bold(`Loading engines from ${engineDirectory.displayName}...\n`)); + if (patternLabConfig.debug) { + console.log(chalk.bold(`Loading engines from ${engineDirectory.displayName}...\n`)); + } // find all engine-named things in this directory and try to load them, // unless it's already been loaded. enginesInThisDir.forEach(function (engineDiscovery) { let errorMessage; - const successMessage = chalk.green("good to go"); + const successMessage = "good to go"; + if (patternLabConfig.debug) { + chalk.green(successMessage); + } try { // Give it a try! load 'er up. But not if we already have, @@ -96,7 +101,9 @@ const PatternEngines = Object.create({ errorMessage = err.message; } finally { // report on the status of the engine, one way or another! - console.log(` ${engineDiscovery.name}:`, errorMessage ? chalk.red(errorMessage) : successMessage); + if (patternLabConfig.debug) { + console.log(` ${engineDiscovery.name}:`, errorMessage ? chalk.red(errorMessage) : successMessage); + } } }); console.log(''); @@ -106,8 +113,9 @@ const PatternEngines = Object.create({ if (Object.keys(self).length === 0) { throw new Error('No engines loaded! Something is seriously wrong.'); } - - console.log(chalk.bold('Done loading engines.\n')); + if (patternLabConfig.debug) { + console.log(chalk.bold('Done loading engines.\n')); + } }, getEngineNameForPattern: function (pattern) { From b638ad0198b4ae2bcfcdfabec8a525613429d293 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Wed, 17 May 2017 07:12:36 -0500 Subject: [PATCH 51/98] expose version as getter @raphaelokon will this work for https://github.com/pattern-lab/patternlab-node-cli/issues/42 ? --- core/lib/patternlab.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 485e1d83a..27bc83327 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -197,6 +197,10 @@ const patternlab_engine = function (config) { const paths = patternlab.config.paths; function getVersion() { + return patternlab.package.version; + } + + function logVersion() { console.log(patternlab.package.version); } @@ -641,6 +645,9 @@ const patternlab_engine = function (config) { return { version: function () { + return logVersion(); + }, + v: function () { return getVersion(); }, build: function (callback, deletePatternDir) { From d1776e986315521ba4cdff8694fec017a1d553ed Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 8 Sep 2017 06:47:27 -0500 Subject: [PATCH 52/98] fix lint issues --- core/lib/patternlab.js | 4 ++-- core/lib/utilities.js | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 4c78379b0..29e5f0502 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -623,8 +623,8 @@ const patternlab_engine = function (config) { } } - //render all patterns last, so lineageR works - patternsToBuild.forEach(pattern => renderSinglePattern(pattern, head)); + //render all patterns last, so lineageR works + patternsToBuild.forEach(pattern => renderSinglePattern(pattern, head)); // Saves the pattern graph when all files have been compiled PatternGraph.storeToFile(patternlab); diff --git a/core/lib/utilities.js b/core/lib/utilities.js index b271ac14c..6c88dac90 100644 --- a/core/lib/utilities.js +++ b/core/lib/utilities.js @@ -1,7 +1,5 @@ "use strict"; -const fs = require('fs-extra'); -const path = require('path'); const chalk = require('chalk'); const EventEmitter = require('events').EventEmitter; From 1a64c17e287e8a47fbc83b580e7c41400907b303 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 8 Sep 2017 07:17:01 -0500 Subject: [PATCH 53/98] fix unit tests that relied the engine loader passing in patternlab-config.json --- test/engine_handlebars_tests.js | 4 ++-- test/engine_mustache_tests.js | 5 +++-- test/lineage_hunter_tests.js | 3 ++- test/list_item_hunter_tests.js | 4 ++-- test/object_factory_tests.js | 6 +++--- test/parameter_hunter_tests.js | 4 ++-- test/pattern_assembler_tests.js | 4 ++-- test/pattern_engines_tests.js | 3 ++- test/pattern_graph_tests.js | 4 ++-- test/pseudopattern_hunter_tests.js | 3 ++- test/ui_builder_tests.js | 3 ++- 11 files changed, 24 insertions(+), 19 deletions(-) diff --git a/test/engine_handlebars_tests.js b/test/engine_handlebars_tests.js index fd6720a3d..53a2453e5 100644 --- a/test/engine_handlebars_tests.js +++ b/test/engine_handlebars_tests.js @@ -8,9 +8,9 @@ var Pattern = require('../core/lib/object_factory').Pattern; var PatternGraph = require('../core/lib/pattern_graph').PatternGraph; var testPatternsPath = path.resolve(__dirname, 'files', '_handlebars-test-patterns'); var eol = require('os').EOL; - +var config = require('./util/patternlab-config.json'); var engineLoader = require('../core/lib/pattern_engines'); -engineLoader.loadAllEngines(); +engineLoader.loadAllEngines(config); // don't run these tests unless handlebars is installed if (!engineLoader.handlebars) { diff --git a/test/engine_mustache_tests.js b/test/engine_mustache_tests.js index 35d49eb5a..77330ec8a 100644 --- a/test/engine_mustache_tests.js +++ b/test/engine_mustache_tests.js @@ -7,10 +7,11 @@ var Pattern = require('../core/lib/object_factory').Pattern; var PatternGraph = require('../core/lib/pattern_graph').PatternGraph; var testPatternsPath = path.resolve(__dirname, 'files', '_patterns'); var eol = require('os').EOL; +var config = require('./util/patternlab-config.json'); // don't run these tests unless mustache is installed var engineLoader = require('../core/lib/pattern_engines'); -engineLoader.loadAllEngines(); +engineLoader.loadAllEngines(config); if (!engineLoader.mustache) { tap.test('Mustache engine not installed, skipping tests.', function (test) { test.end(); @@ -33,7 +34,7 @@ function fakePatternLab() { data: { link: {} }, - config: require('../patternlab-config.json'), + config: config, package: {} }; diff --git a/test/lineage_hunter_tests.js b/test/lineage_hunter_tests.js index 6df3aae9a..58d7892c6 100644 --- a/test/lineage_hunter_tests.js +++ b/test/lineage_hunter_tests.js @@ -7,9 +7,10 @@ var pa = require('../core/lib/pattern_assembler'); var of = require('../core/lib/object_factory'); var Pattern = require('../core/lib/object_factory').Pattern; var PatternGraph = require('../core/lib/pattern_graph').PatternGraph; +var config = require('./util/patternlab-config.json'); var engineLoader = require('../core/lib/pattern_engines'); -engineLoader.loadAllEngines(); +engineLoader.loadAllEngines(config); var fs = require('fs-extra'); var path = require('path'); diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index ed8bf6b7e..ff7dae374 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -8,9 +8,9 @@ var PatternGraph = require('../core/lib/pattern_graph').PatternGraph; var extend = require('util')._extend; var pa = require('../core/lib/pattern_assembler'); var pattern_assembler = new pa(); - +var config = require('./util/patternlab-config.json'); var engineLoader = require('../core/lib/pattern_engines'); -engineLoader.loadAllEngines(); +engineLoader.loadAllEngines(config); // fake pattern creators function createFakeListPattern(customProps) { diff --git a/test/object_factory_tests.js b/test/object_factory_tests.js index 0e831a8f3..0b8512ce8 100644 --- a/test/object_factory_tests.js +++ b/test/object_factory_tests.js @@ -1,6 +1,7 @@ "use strict"; var tap = require('tap'); +var config = require('./util/patternlab-config.json'); // fake pattern lab constructor: // sets up a fake patternlab object, which is needed by the pattern processing @@ -16,7 +17,7 @@ function fakePatternLab() { data: { link: {} }, - config: require('../patternlab-config.json'), + config: config, package: {} }; @@ -27,9 +28,8 @@ var of = require('../core/lib/object_factory'); var Pattern = require('../core/lib/object_factory').Pattern; var path = require('path'); var pl = fakePatternLab(); - var engineLoader = require('../core/lib/pattern_engines'); -engineLoader.loadAllEngines(); +engineLoader.loadAllEngines(config); tap.test('test Pattern initializes correctly', function (test) { var p = new Pattern('00-atoms/00-global/00-colors.mustache', { d: 123}); diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 911dfaf27..d494ef5e8 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -10,9 +10,9 @@ var fs = require('fs-extra'); var util = require('./util/test_utils.js'); var ph = require('../core/lib/parameter_hunter'); +var config = require('./util/patternlab-config.json'); var engineLoader = require('../core/lib/pattern_engines'); -engineLoader.loadAllEngines(); - +engineLoader.loadAllEngines(config); //setup current pattern from what we would have during execution function currentPatternClosure() { diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 22ce36c56..bbc05b08d 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -7,9 +7,9 @@ var Pattern = require('../core/lib/object_factory').Pattern; var CompileState = require('../core/lib/object_factory').CompileState; var PatternGraph = require('../core/lib/pattern_graph').PatternGraph; var path = require('path'); - +var config = require('./util/patternlab-config.json'); var engineLoader = require('../core/lib/pattern_engines'); -engineLoader.loadAllEngines(); +engineLoader.loadAllEngines(config); function emptyPatternLab() { return { diff --git a/test/pattern_engines_tests.js b/test/pattern_engines_tests.js index 951743257..893dd031f 100644 --- a/test/pattern_engines_tests.js +++ b/test/pattern_engines_tests.js @@ -4,8 +4,9 @@ var tap = require('tap'); var patternEngines = require('../core/lib/pattern_engines'); var Pattern = require('../core/lib/object_factory').Pattern; +var config = require('./util/patternlab-config.json'); -patternEngines.loadAllEngines(); +patternEngines.loadAllEngines(config); // the mustache test pattern, stolen from object_factory unit tests var mustacheTestPattern = new Pattern('source/_patterns/00-atoms/00-global/00-colors-alt.mustache', {d: 123}); diff --git a/test/pattern_graph_tests.js b/test/pattern_graph_tests.js index 8da4d9033..b09a2c4b2 100644 --- a/test/pattern_graph_tests.js +++ b/test/pattern_graph_tests.js @@ -7,9 +7,9 @@ var Pattern = require('../core/lib/object_factory').Pattern; var CompileState = require('../core/lib/object_factory').CompileState; var tap = require('tap'); const posixPath = require('./util/test_utils.js').posixPath; - +var config = require('./util/patternlab-config.json'); var engineLoader = require('../core/lib/pattern_engines'); -engineLoader.loadAllEngines(); +engineLoader.loadAllEngines(config); var patternlab = { config: { diff --git a/test/pseudopattern_hunter_tests.js b/test/pseudopattern_hunter_tests.js index 2aa2af0a0..57becf357 100644 --- a/test/pseudopattern_hunter_tests.js +++ b/test/pseudopattern_hunter_tests.js @@ -9,8 +9,9 @@ var pa = require('../core/lib/pattern_assembler'); var Pattern = require('../core/lib/object_factory').Pattern; var PatternGraph = require('../core/lib/pattern_graph').PatternGraph; +var config = require('./util/patternlab-config.json'); var engineLoader = require('../core/lib/pattern_engines'); -engineLoader.loadAllEngines(); +engineLoader.loadAllEngines(config); var fs = require('fs-extra'); var pattern_assembler = new pa(); diff --git a/test/ui_builder_tests.js b/test/ui_builder_tests.js index f3db8e1af..6dc5bf308 100644 --- a/test/ui_builder_tests.js +++ b/test/ui_builder_tests.js @@ -8,9 +8,10 @@ var Pattern = require('../core/lib/object_factory').Pattern; var extend = require('util')._extend; var uiModule = rewire('../core/lib/ui_builder'); var path = require('path'); +var config = require('./util/patternlab-config.json'); var engineLoader = require('../core/lib/pattern_engines'); -engineLoader.loadAllEngines(); +engineLoader.loadAllEngines(config); //set up a global mocks - we don't want to be writing/rendering any files right now var fsMock = { From 2c942fae02508bf623b5cb156b437dd19ef3e9af Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Mon, 11 Sep 2017 00:10:15 -0500 Subject: [PATCH 54/98] simplify patternlab.js fix last of unit tests --- .vscode/launch.json | 20 ++++++++++ core/lib/patternlab.js | 40 ++++++++++---------- pattern_exports/test-paramParent.html | 4 ++ test/files/_patterns/00-test/01-bar.md | 2 +- test/files/_patterns/00-test/02-baz.md | 1 + test/files/_patterns/00-test/02-baz.mustache | 1 + test/markdown_parser_tests.js | 4 +- test/pattern_assembler_tests.js | 39 +++++++++++-------- test/patternlab_tests.js | 10 +++-- 9 files changed, 78 insertions(+), 43 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 pattern_exports/test-paramParent.html create mode 100644 test/files/_patterns/00-test/02-baz.md create mode 100644 test/files/_patterns/00-test/02-baz.mustache diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..8663f7a28 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible Node.js debug attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "program": "${workspaceRoot}\\core\\lib\\patternlab.js" + }, + { + "type": "node", + "request": "launch", + "name": "Debug", + "program": "${workspaceRoot}\\test\\patternlab_tests.js" + } + ] +} diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 29e5f0502..5011186b5 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -19,11 +19,24 @@ const chalk = require('chalk'); const cleanHtml = require('js-beautify').html; const inherits = require('util').inherits; const pm = require('./plugin_manager'); -const fs = require('fs-extra'); const packageInfo = require('../../package.json'); const plutils = require('./utilities'); const jsonCopy = require('./json_copy'); const PatternGraph = require('./pattern_graph').PatternGraph; +const pa = require('./pattern_assembler'); +const lh = require('./lineage_hunter'); +const sm = require('./starterkit_manager'); +const pe = require('./pattern_exporter'); +const Pattern = require('./object_factory').Pattern; +const CompileState = require('./object_factory').CompileState; + +//these are mocked in unit tests, so let them be overridden +let fs = require('fs-extra'); // eslint-disable-line +let ui_builder = require('./ui_builder'); // eslint-disable-line +let pattern_exporter = new pe(); // eslint-disable-line + +const pattern_assembler = new pa(); +const lineage_hunter = new lh(); //register our log events plutils.log.on('error', msg => console.log(msg)); @@ -46,7 +59,7 @@ function buildPatternData(dataFilesPath, fsDep) { // GTP: these two diveSync pattern processors factored out so they can be reused // from unit tests to reduce code dupe! -function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab) { +function processAllPatternsIterative(patterns_dir, patternlab) { const promiseAllPatternFiles = new Promise(function (resolve) { dive( @@ -84,7 +97,7 @@ function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab }); } -function processAllPatternsRecursive(pattern_assembler, patterns_dir, patternlab) { +function processAllPatternsRecursive(patterns_dir, patternlab) { diveSync( patterns_dir, function (err, file) { @@ -164,24 +177,11 @@ function PatternLabEventEmitter() { inherits(PatternLabEventEmitter, EventEmitter); const patternlab_engine = function (config) { - 'use strict'; - - const pa = require('./pattern_assembler'); - const pe = require('./pattern_exporter'); - const lh = require('./lineage_hunter'); - const ui = require('./ui_builder'); - const sm = require('./starterkit_manager'); - const Pattern = require('./object_factory').Pattern; - const CompileState = require('./object_factory').CompileState; const patternlab = {}; patternlab.engines = patternEngines; patternlab.engines.loadAllEngines(config); - const pattern_assembler = new pa(); - const pattern_exporter = new pe(); - const lineage_hunter = new lh(); - patternlab.package = fs.readJSONSync(path.resolve(__dirname, '../../package.json')); patternlab.config = config || fs.readJSONSync(path.resolve(__dirname, '../../patternlab-config.json')); patternlab.events = new PatternLabEventEmitter(); @@ -563,18 +563,18 @@ const patternlab_engine = function (config) { patternlab.events.emit('patternlab-build-global-data-end', patternlab); // diveSync once to perform iterative populating of patternlab object - return processAllPatternsIterative(pattern_assembler, paths.source.patterns, patternlab).then(() => { + return processAllPatternsIterative(paths.source.patterns, patternlab).then(() => { patternlab.events.emit('patternlab-pattern-iteration-end', patternlab); //now that all the main patterns are known, look for any links that might be within data and expand them //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference - pattern_assembler.parse_data_links(patternlab); + pattern_assembler.parse_data_links(patternlab); //diveSync again to recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements // TODO we can reduce the time needed by only processing changed patterns and their partials - processAllPatternsRecursive(pattern_assembler, paths.source.patterns, patternlab); + processAllPatternsRecursive(paths.source.patterns, patternlab); //take the user defined head and foot and process any data and patterns that apply processHeadPattern(); @@ -654,7 +654,7 @@ const patternlab_engine = function (config) { } patternlab.isBusy = true; return buildPatterns(deletePatternDir).then(() => { - new ui().buildFrontend(patternlab); + new ui_builder().buildFrontend(patternlab); printDebug(); patternlab.isBusy = false; callback(); diff --git a/pattern_exports/test-paramParent.html b/pattern_exports/test-paramParent.html new file mode 100644 index 000000000..2c75ed8b1 --- /dev/null +++ b/pattern_exports/test-paramParent.html @@ -0,0 +1,4 @@ + + diff --git a/test/files/_patterns/00-test/01-bar.md b/test/files/_patterns/00-test/01-bar.md index 755aa5799..a811dacd7 100644 --- a/test/files/_patterns/00-test/01-bar.md +++ b/test/files/_patterns/00-test/01-bar.md @@ -1,5 +1,5 @@ --- -status: complete +state: complete title: An Atom Walks Into a Bar joke: bad --- diff --git a/test/files/_patterns/00-test/02-baz.md b/test/files/_patterns/00-test/02-baz.md new file mode 100644 index 000000000..f6f78b399 --- /dev/null +++ b/test/files/_patterns/00-test/02-baz.md @@ -0,0 +1 @@ +### Only baz \ No newline at end of file diff --git a/test/files/_patterns/00-test/02-baz.mustache b/test/files/_patterns/00-test/02-baz.mustache new file mode 100644 index 000000000..3f9538666 --- /dev/null +++ b/test/files/_patterns/00-test/02-baz.mustache @@ -0,0 +1 @@ +baz \ No newline at end of file diff --git a/test/markdown_parser_tests.js b/test/markdown_parser_tests.js index df28250b4..63f541ab8 100644 --- a/test/markdown_parser_tests.js +++ b/test/markdown_parser_tests.js @@ -10,14 +10,14 @@ var markdown_parser = new mp(); tap.test('parses pattern description block correctly when frontmatter not present', function(test) { //arrange - var markdownFileName = path.resolve("./test/files/_patterns/00-test/00-foo.md"); + var markdownFileName = path.resolve("./test/files/_patterns/00-test/02-baz.md"); var markdownFileContents = fs.readFileSync(markdownFileName, 'utf8'); //act var returnObject = markdown_parser.parse(markdownFileContents); //assert - test.equals(returnObject.markdown, '

A Simple Include

\n

This pattern contains an include of test-bar. It also has this markdown file, which does not have frontmatter.

\n'); + test.equals(returnObject.markdown, '

Only baz

\n'); test.end(); }); diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index bbc05b08d..47ee0e7a0 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -48,11 +48,11 @@ tap.test('process_pattern_recursive recursively includes partials', function(tes patternlab.partials = {}; //diveSync once to perform iterative populating of patternlab object - plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab) + plMain.process_all_patterns_iterative(patterns_dir, patternlab) .then(() => { //diveSync again to recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements - plMain.process_all_patterns_recursive(pattern_assembler, patterns_dir, patternlab); + plMain.process_all_patterns_recursive(patterns_dir, patternlab); //get test output for comparison var foo = fs.readFileSync(patterns_dir + '/00-test/00-foo.mustache', 'utf8').trim(); @@ -491,7 +491,7 @@ tap.test('parseDataLinks - replaces found link.* data for their expanded links', patternlab.partials = {}; //diveSync once to perform iterative populating of patternlab object - plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab) + plMain.process_all_patterns_iterative( patterns_dir, patternlab) .then(() => { //for the sake of the test, also imagining I have the following pages... patternlab.data.link['twitter-brad'] = 'https://twitter.com/brad_frost'; @@ -740,14 +740,17 @@ tap.test('parses pattern title correctly when frontmatter present', function(tes var pl = util.fakePatternLab(testPatternsPath); var pattern_assembler = new pa(); - //act var testPatternPath = path.join('00-test', '01-bar.mustache'); - var testPattern = pattern_assembler.process_pattern_iterative(testPatternPath, pl); - pattern_assembler.process_pattern_recursive(testPatternPath, pl); + var testPattern = pattern_assembler.load_pattern_iterative(testPatternPath, pl); - //assert - test.equals(testPattern.patternName, 'An Atom Walks Into a Bar','patternName not overridden'); - test.end(); + //act + return Promise.all([ + pattern_assembler.process_pattern_iterative(testPattern, pl), + pattern_assembler.process_pattern_recursive(testPatternPath, pl) + ]).then((results) => { + //assert + test.equals(results[0].patternName, 'An Atom Walks Into a Bar','patternName not overridden'); + }).catch(test.threw); }); tap.test('parses pattern extra frontmatter correctly when frontmatter present', function(test){ @@ -758,12 +761,16 @@ tap.test('parses pattern extra frontmatter correctly when frontmatter present', var pl = util.fakePatternLab(testPatternsPath); var pattern_assembler = new pa(); - //act var testPatternPath = path.join('00-test', '01-bar.mustache'); - var testPattern = pattern_assembler.process_pattern_iterative(testPatternPath, pl); - pattern_assembler.process_pattern_recursive(testPatternPath, pl); + var testPattern = pattern_assembler.load_pattern_iterative(testPatternPath, pl); - //assert - test.equals(testPattern.allMarkdown.joke, 'bad','extra key not added'); - test.end(); -}); \ No newline at end of file + //act + return Promise.all([ + pattern_assembler.process_pattern_iterative(testPattern, pl), + pattern_assembler.process_pattern_recursive(testPatternPath, pl) + ]).then((results) => { + //assert + test.equals(results[0].allMarkdown.joke, 'bad','extra key not added'); + + }).catch(test.threw); +}); diff --git a/test/patternlab_tests.js b/test/patternlab_tests.js index 0ea02de9b..a688e3769 100644 --- a/test/patternlab_tests.js +++ b/test/patternlab_tests.js @@ -9,8 +9,10 @@ var config = require('./util/patternlab-config.json'); var plEngineModule = rewire('../core/lib/patternlab'); //set up a global mocks - we don't want to be writing/rendering any files right now -const uiBuilderMock = { - buildFrontend: function (patternlab) { } +const uiBuilderMock = function(){ + return { + buildFrontend: function () { } + }; }; const fsMock = { @@ -49,8 +51,8 @@ tap.test('buildPatterns - should replace data link even when pattern parameter p only on the order of events within build. */ export_patterns: function (patternlab) { - var pattern = _.find(patternlab.patterns, (pattern) => { - return pattern.patternPartial === 'test-paramParent'; + var pattern = _.find(patternlab.patterns, (p) => { + return p.patternPartial === 'test-paramParent'; }); //assert test.equals(pattern.patternPartialCode.indexOf('00-test-00-foo.rendered.html') > -1, true, 'data link should be replaced properly'); From ab99d50e0f5ffbc117f0a9b8cb5d602e7232dc49 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Sun, 17 Sep 2017 05:31:05 -0500 Subject: [PATCH 55/98] Update official Node support to latest 6.X release closes #682 --- .nvmrc | 1 + .travis.yml | 1 - package.json | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..7fcfe2dcd --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +6.11.3 diff --git a/.travis.yml b/.travis.yml index 585e43d78..cc2b3e8ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ language: node_js node_js: - node - 6 - - 4 before_install: - phantomjs --version diff --git a/package.json b/package.json index c0a7ffcbf..5e2261651 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,6 @@ "test": "tap test/*_tests.js --reporter spec --coverage" }, "engines": { - "node": ">=4.0" + "node": ">=6.0" } } From 9cd4dd020aa6072597bca8681eb5304ce301946d Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Sun, 17 Sep 2017 05:37:06 -0500 Subject: [PATCH 56/98] Remove patternengine-node-mustache as a dependency in core closes #617 --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 5e2261651..714872f55 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "lodash": "~4.13.1", "markdown-it": "^6.0.1", "node-fetch": "^1.6.0", - "patternengine-node-mustache": "^1.0.0", "graphlib": "^2.1.1" }, "devDependencies": { From 1e46ee03efd43e38c06e436a2e79ba4c030e313a Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Sun, 17 Sep 2017 05:41:31 -0500 Subject: [PATCH 57/98] delete commented code --- test/pattern_assembler_tests.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 47ee0e7a0..8b55a37d0 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -35,13 +35,9 @@ tap.test('process_pattern_recursive recursively includes partials', function(tes patternlab.config.paths.public = public_dir; patternlab.config.outputFileSuffixes = {rendered: ''}; - //patternlab.data = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'data.json')); patternlab.data = {}; - //patternlab.listitems = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'listitems.json')); patternlab.listitems = {}; - //patternlab.header = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/header.html'), 'utf8'); patternlab.header = ''; - //patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/footer.html'), 'utf8'); patternlab.footer = ''; patternlab.patterns = []; patternlab.data.link = {}; @@ -478,10 +474,6 @@ tap.test('parseDataLinks - replaces found link.* data for their expanded links', patternlab.listitems = {}; patternlab.header = {}; patternlab.footer = {}; - //patternlab.data = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'data.json')); - //patternlab.listitems = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'listitems.json')); - //patternlab.header = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/header.html'), 'utf8'); - //patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/footer.html'), 'utf8'); patternlab.patterns = [ Pattern.createEmpty({ patternPartial: 'twitter-brad' }, patternlab), Pattern.createEmpty({ patternPartial: 'twitter-dave' }, patternlab), From 7a9994ceb2eaa7a84bffe40b3d354ac23f31b262 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Sun, 17 Sep 2017 05:56:09 -0500 Subject: [PATCH 58/98] install patternengine-node-mustache explicitly during CI --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index cc2b3e8ae..70c7614d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ before_install: - phantomjs --version before_script: + - npm install patternengine-node-mustache - npm install patternengine-node-underscore - npm install patternengine-node-handlebars - npm install patternengine-node-twig From 9b16f26c0614e74935c81f4e352cc82f1934cd9b Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Sun, 17 Sep 2017 06:09:40 -0500 Subject: [PATCH 59/98] Specify template files via configuration closes #683 --- core/lib/patternlab.js | 10 +++++----- test/util/patternlab-config.json | 8 +++++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 5011186b5..5e9f5d524 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -541,11 +541,11 @@ const patternlab_engine = function (config) { patternlab.listitems = {}; } try { - patternlab.header = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'general-header.mustache'), 'utf8'); - patternlab.footer = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'general-footer.mustache'), 'utf8'); - patternlab.patternSection = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'patternSection.mustache'), 'utf8'); - patternlab.patternSectionSubType = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'partials', 'patternSectionSubtype.mustache'), 'utf8'); - patternlab.viewAll = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'viewall.mustache'), 'utf8'); + patternlab.header = fs.readFileSync(path.resolve(paths.source.patternlabFiles['general-header']), 'utf8'); + patternlab.footer = fs.readFileSync(path.resolve(paths.source.patternlabFiles['general-footer']), 'utf8'); + patternlab.patternSection = fs.readFileSync(path.resolve(paths.source.patternlabFiles.patternSection), 'utf8'); + patternlab.patternSectionSubType = fs.readFileSync(path.resolve(paths.source.patternlabFiles.patternSectionSubtype), 'utf8'); + patternlab.viewAll = fs.readFileSync(path.resolve(paths.source.patternlabFiles.viewall), 'utf8'); } catch (ex) { console.log(ex); plutils.error('\nERROR: missing an essential file from ' + paths.source.patternlabFiles + '. Pattern Lab won\'t work without this file.\n'); diff --git a/test/util/patternlab-config.json b/test/util/patternlab-config.json index d13f33508..5c2f66ec2 100644 --- a/test/util/patternlab-config.json +++ b/test/util/patternlab-config.json @@ -6,7 +6,13 @@ "data" : "./test/files/_data/", "meta": "./test/files/_meta/", "styleguide" : "./test/files/styleguide/", - "patternlabFiles" : "./test/files/", + "patternlabFiles" : { + "general-header": "./test/files/partials/general-header.mustache", + "general-footer": "./test/files/partials/general-footer.mustache", + "patternSection": "./test/files/partials/patternSection.mustache", + "patternSectionSubtype": "./test/files/partials/patternSectionSubtype.mustache", + "viewall": "./test/files/viewall.mustache" + }, "js" : "./test/files/js", "images" : "./test/files/images", "fonts" : "./test/files/fonts", From 0a4110310408ed08faf6d0205ff7a9805ac5859b Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Sun, 17 Sep 2017 06:25:55 -0500 Subject: [PATCH 60/98] Add configuration check for specified templates part of https://github.com/pattern-lab/patternlab-node/issues/683 --- core/lib/patternlab.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 5e9f5d524..a033c3a0e 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -122,10 +122,16 @@ function checkConfiguration(patternlab) { if (!patternlab.config.outputFileSuffixes) { plutils.warning('Configuration Object "outputFileSuffixes" not found, and defaulted to the following:'); console.log(outputFileSuffixes); - plutils.warning('Since Pattern Lab Core 2.3.0 this configuration option is required. Suggest you add it to your patternlab-config.json file.'); + plutils.warning('Since Pattern Lab Node Core 2.3.0 this configuration option is required. Suggest you add it to your patternlab-config.json file.'); console.log(); } patternlab.config.outputFileSuffixes = _.extend(outputFileSuffixes, patternlab.config.outputFileSuffixes); + + if (typeof patternlab.config.paths.source.patternlabFiles === 'string') { + plutils.warning(`Configuration key [paths.source.patternlabFiles] inside patternlab-config.json was found as the string '${patternlab.config.paths.source.patternlabFiles}'`); + plutils.warning('Since Pattern Lab Node Core 3.0.0 this key is an object. Suggest you update this key following this issue: https://github.com/pattern-lab/patternlab-node/issues/683.'); + } + } /** From eb927803711e6a8d7b8023ebe186179b81ddeb89 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 29 Sep 2017 01:16:53 -0500 Subject: [PATCH 61/98] Allow engines to support multiple extensions closes #623 --- core/lib/pattern_engines.js | 17 +++++++++++++---- test/pattern_engines_tests.js | 25 +++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/core/lib/pattern_engines.js b/core/lib/pattern_engines.js index 8ca2aea2a..7582b4ea7 100644 --- a/core/lib/pattern_engines.js +++ b/core/lib/pattern_engines.js @@ -123,12 +123,19 @@ const PatternEngines = Object.create({ const of = require('./object_factory'); if (pattern instanceof of.Pattern && typeof pattern.fileExtension === 'string' && pattern.fileExtension) { //loop through known engines and find the one that supports the pattern's fileExtension - //TODO: support multiple extensions someday, such as .handlebars and .hbs const engineNames = Object.keys(this); for (let i = 0; i < engineNames.length; i++) { const engine = this[engineNames[i]]; - if (engine.engineFileExtension === pattern.fileExtension) { - return engine.engineName; + + if (Array.isArray(engine.engineFileExtension)) { + if (engine.engineFileExtension.includes(pattern.fileExtension)) { + return engine.engineName; + } + } else { + //this likely means the users engines are out of date. todo: tell them to upgrade + if (engine.engineFileExtension === pattern.fileExtension) { + return engine.engineName; + } } } } @@ -147,11 +154,13 @@ const PatternEngines = Object.create({ } }, + // combine all found engines into a single array of supported extensions getSupportedFileExtensions: function () { const engineNames = Object.keys(PatternEngines); - return engineNames.map(function (engineName) { + const allEnginesExtensions = engineNames.map((engineName) => { return PatternEngines[engineName].engineFileExtension; }); + return [].concat.apply([], allEnginesExtensions); }, isFileExtensionSupported: function (fileExtension) { diff --git a/test/pattern_engines_tests.js b/test/pattern_engines_tests.js index 893dd031f..0d20e73ad 100644 --- a/test/pattern_engines_tests.js +++ b/test/pattern_engines_tests.js @@ -125,7 +125,7 @@ function testProps(object, propTests, test) { }); test.ok(object.hasOwnProperty(propName), '"' + propName + '" prop should be present'); - test.ok(isOneOfTheseTypes, '"' + propName + '" prop should be one of types ' + possibleTypes); + test.ok(isOneOfTheseTypes, '"' + propName + '" prop should be one of types ' + possibleTypes + ' but was instead ' + typeof propName); } // go over each property test and run it @@ -154,7 +154,7 @@ engineNames.forEach(function (engineName) { var propertyTests = { 'engine': ['object', 'function'], 'engineName': 'string', - 'engineFileExtension': 'string', + 'engineFileExtension': ['string', 'object'], 'renderPattern': 'function', 'findPartials': 'function' }; @@ -164,3 +164,24 @@ engineNames.forEach(function (engineName) { test.end(); }); }); + +tap.test('patternEngines getSupportedFileExtensions flattens known engine extensions into a single array', function (test) { + + //arrange + patternEngines.fooEngine = { + engineFileExtension : ['.foo1', '.foo2'] + }; + patternEngines.barEngine = { + engineFileExtension : '.bar' + }; + + const exts = patternEngines.getSupportedFileExtensions(); + test.ok(exts.includes('.foo1')); + test.ok(exts.includes('.foo2')); + test.ok(exts.includes('.bar')); + + delete patternEngines.fooEngine; + delete patternEngines.barEngine; + + test.end(); +}); From 046fe2778c63203bb42d9529d05f1986e13fa139 Mon Sep 17 00:00:00 2001 From: Tobias Brennecke Date: Fri, 29 Sep 2017 23:53:56 +0200 Subject: [PATCH 62/98] Add branching scheme to contribution guidelines --- .github/CONTRIBUTING.md | 42 ++++- .github/branching-scheme.png | Bin 0 -> 51103 bytes .github/gitgraph/README.md | 14 ++ .github/gitgraph/branching-scheme.html | 17 ++ .github/gitgraph/patternlab-flow.js | 212 +++++++++++++++++++++++++ 5 files changed, 277 insertions(+), 8 deletions(-) create mode 100644 .github/branching-scheme.png create mode 100644 .github/gitgraph/README.md create mode 100644 .github/gitgraph/branching-scheme.html create mode 100644 .github/gitgraph/patternlab-flow.js diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 8598cddb2..c1f952854 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,15 +1,41 @@ -# Contributing to Patternlab Node +Contributing to Patternlab Node +=============================== + If you'd like to contribute to Pattern Lab Node, please do so! There is always a lot of ground to cover and something for your wheelhouse. No pull request is too small. Check out any [up for grabs issues](https://github.com/pattern-lab/patternlab-node/labels/up%20for%20grabs) as a good way to get your feet wet, or add some more unit tests. -## Guidelines -1. Please keep your pull requests concise and limited to **ONE** substantive change at a time. This makes reviewing and testing so much easier. -2. _ALWAYS_ submit pull requests against the [dev branch](https://github.com/pattern-lab/patternlab-node/tree/dev). If this does not occur, I will first, try to redirect you gently, second, port over your contribution manually if time allows, and/or third, close your pull request. If you have a major feature to stabilize over time, talk to @bmuenzenmeyer about making a dedicated `feature-branch` -3. If you can, add some unit tests using the existing patterns in the `./test` directory +Guidelines +---------- + +1. Please keep your pull requests concise and limited to **ONE** substantive change at a time. This makes reviewing and testing so much easier. +2. *ALWAYS* submit pull requests against the [dev branch](https://github.com/pattern-lab/patternlab-node/tree/dev). If this does not occur, I will first, try to redirect you gently, second, port over your contribution manually if time allows, and/or third, close your pull request. If you have a major feature to stabilize over time, talk to @bmuenzenmeyer about making a dedicated `feature-branch` +3. If you can, add some unit tests using the existing patterns in the `./test` directory +4. Please mention the issue number in commits if you can, so anyone can see to which issue your changes belong to. For instance: + - `#123 Fix resolving patterns in pattern_hunter` + - `Feature #42: improve improbability drive` + +Coding style +------------ -##Coding style Two files combine within the project to define and maintain our coding style. -* The `.editorconfig` controls spaces / tabs within supported editors. Check out their [site](http://editorconfig.org/). -* The `.eslintrc` defines our javascript standards. Some editors will evaluate this real-time - otherwise it's run using `grunt|gulp build` +- The `.editorconfig` controls spaces / tabs within supported editors. Check out their [site](http://editorconfig.org/). +- The `.eslintrc` defines our javascript standards. Some editors will evaluate this real-time - otherwise it's run using `grunt|gulp build` + +Branching Scheme +---------------- + +![alt text](branching-scheme.png) While activilely maintaining `2.X` on `master`, there is heavy development going on for Patternlab `3.X`. Currently Pattern Lab has the following branches: + +- **master** contains the latext stable, released `2.X` version +- **dev**: for `2.X` development. Please target pull requests against this branch +- **dev-3.0** Development branch for version `3.0`. Pattern Lab has undergone some major changes and the source trees have diverged a lot and we will try to forward-port any changes made in `2.X` +- **feature-branches** for larger changes. Allows merging all changes into both `2.X` and `3.X` easily. +- **long running branches** for changes that involve major changes to the code, architecture and take a lot of time (i.e. making Pattern Lab async) + +Development mainly happens in the `dev` branch, but you can help us a lot if you also do a pull request against `dev-3.0`. When `dev` seems stable enough, we do releases of `2.X` by merging `dev` to `master` and creating a release tag. + +Feature branches may target either `dev` and/or `dev-3.0` and should be updated regularly. + +Long running branches should only target the latest version of Pattern Lab, currently `dev-3.0`, and may be lagging behind a lot. diff --git a/.github/branching-scheme.png b/.github/branching-scheme.png new file mode 100644 index 0000000000000000000000000000000000000000..ca610f2522f5cf91c24cda3e2e7ab62525ad33a5 GIT binary patch literal 51103 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

BtGh+netKy>N99>t$FMp;bGO}pn-)S?NIH2-tg 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 Q0RNQFsh@p&#`xa<0PBg`uK)l5 literal 0 HcmV?d00001 diff --git a/.github/gitgraph/README.md b/.github/gitgraph/README.md new file mode 100644 index 000000000..e87ca5248 --- /dev/null +++ b/.github/gitgraph/README.md @@ -0,0 +1,14 @@ +Generating a new graph +====================== + +This folder uses http://gitgraphjs.com/ for generating the git graph model. + +To generate a new one, install `gitgraph.js` via `bower`. + +``` +bower install gitgraph.js +``` + +1. Change `patternlab-flow.js` to your needs according to the documentation on http://gitgraphjs.com/ +2. Open branching-scheme.html in browse, right click the graph and "Save as...". +3. Overwrite `/.github/branching-scheme.png` diff --git a/.github/gitgraph/branching-scheme.html b/.github/gitgraph/branching-scheme.html new file mode 100644 index 000000000..39d1deb13 --- /dev/null +++ b/.github/gitgraph/branching-scheme.html @@ -0,0 +1,17 @@ + + + + + + + + + + + + diff --git a/.github/gitgraph/patternlab-flow.js b/.github/gitgraph/patternlab-flow.js new file mode 100644 index 000000000..79872b09a --- /dev/null +++ b/.github/gitgraph/patternlab-flow.js @@ -0,0 +1,212 @@ +var graphConfig = new GitGraph.Template({ + colors: [ "#9993FF", "#47E8D4", "#6BDB52", "#F85BB5", "#FFA657", "#FFCCAA", "#F85BB5" ], + branch: { + lineWidth: 3, + spacingX: 60, + mergeStyle: "straight", + showLabel: true, // display branch names on graph + labelFont: "normal 10pt Arial", + labelRotation: 0, + color: "black" + }, + commit: { + spacingY: -30, + dot: { + size: 8, + strokeColor: "#000000", + strokeWidth: 4 + }, + tag: { + font: "normal 10pt Arial", + color: "yellow" + }, + message: { + color: "black", + font: "normal 12pt Arial", + displayAuthor: false, + displayBranch: false, + displayHash: false, + } + }, + arrow: { + size: 8, + offset: 3, + + } +}); + +var config = { + template: graphConfig, + mode: "extended", + orientation: "horizontal" +}; + +var bugFixCommit = { + messageAuthorDisplay: false, + messageBranchDisplay: false, + messageHashDisplay: false, + message: "Bug fix commit(s)" +}; + +var stabilizationCommit = { + messageAuthorDisplay: false, + messageBranchDisplay: false, + messageHashDisplay: false, + message: "Release stabilization commit(s)" +}; + +// You can manually fix columns to control the display. +var i = 0; +var longRunningCol = i++; +var featureV3Col = i++; +var developV3Col = i++; +var featureCol = i++; +var developCol = i++; +var releaseCol = i++; +var masterCol = i++; + +var gitgraph = new GitGraph(config); + +var master = gitgraph.branch({ + name: "master", + column: masterCol +}); +master.commit("Initial commit"); + +var develop = gitgraph.branch({ + parentBranch: master, + name: "dev", + column: developCol +}); + +var developV3 = gitgraph.branch({ + parentBranch: master, + name: "dev-3.0", + column: developV3Col +}); + + +var longRunning = gitgraph.branch({ + parentBranch: master, + name: "long-running-improvement", + column: longRunningCol +}); + +develop.commit({ + messageDisplay: false +}); +developV3.commit({ + messageDisplay: false +}); + +longRunning.commit({ + messageDisplay: false +}); +longRunning.merge(developV3); + +var feature1 = gitgraph.branch({ + parentBranch: develop, + name: "feature/1-description", + column: featureCol +}); +feature1.commit("#1 A feature to go into v2.8.0").commit({ + messageDisplay: false +}); +develop.merge(feature1); +feature1.commit("Small Bugfix").commit({ + messageDisplay: false +}); +feature1.merge(develop); + + +var feature3X = gitgraph.branch({ + parentBranch: developV3, + name: "feature/42-feature-for-3-x-only", + column: featureV3Col +}); +feature3X.commit("#42 A feature to go into v3.X").commit({ + messageDisplay: false +}); +feature3X.merge(developV3); + + +var feature2 = gitgraph.branch({ + parentBranch: develop, + name: "feature/2-description", + column: featureCol +}); +feature2.commit("#2 Another feature to go into v2.8.0").commit({ + messageDisplay: false +}); +feature2.merge(develop); +feature2.merge(developV3); + +develop.merge(master,{ + dotStrokeWidth: 10, + message: "Release v2.8.1 tagged", + tag: "v2.8.1" +}); + + +develop.commit({ + messageDisplay: false +}); + + +longRunning.commit({ + messageDisplay: false +}); + +developV3.merge(longRunning); + +longRunning.commit({ + messageDisplay: false +}); + +var feature3 = gitgraph.branch({ + parentBranch: develop, + name: "bugfix/3-description", + column: featureCol +}); + +feature3.commit("A feature to go into v2.8.0").commit({ + messageDisplay: false +}); +feature3.merge(develop); + +longRunning.merge(developV3); + +developV3.commit({ + messageDisplay: false, + dotStrokeWidth: 10 +}); + + +develop.commit({ + messageDisplay: false +}); + +develop.commit({ + messageDisplay: false +}); + +develop.merge(master, { + dotStrokeWidth: 10, + message: "Release v2.9.0 tagged", + tag: "v2.9.0" +}); + +develop.commit({ + messageDisplay: false, + dotStrokeWidth: 10 +}); + +developV3.checkout(); + +/* +developV3.merge(master, { + dotStrokeWidth: 10, + message: "Release v3.0.0 tagged", + tag: "v3.0.0" +}); +*/ From d36a1ce098156888c77064fb412d863b1f5a048c Mon Sep 17 00:00:00 2001 From: Tobias Brennecke Date: Sat, 30 Sep 2017 00:02:37 +0200 Subject: [PATCH 63/98] Typo --- .github/CONTRIBUTING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c1f952854..cb5c527d5 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -26,7 +26,7 @@ Two files combine within the project to define and maintain our coding style. Branching Scheme ---------------- -![alt text](branching-scheme.png) While activilely maintaining `2.X` on `master`, there is heavy development going on for Patternlab `3.X`. Currently Pattern Lab has the following branches: +![alt text](branching-scheme.png) While actively maintaining `2.X` on `master`, there is heavy development going on for Patternlab `3.X`. Currently Pattern Lab has the following branches: - **master** contains the latext stable, released `2.X` version - **dev**: for `2.X` development. Please target pull requests against this branch @@ -39,3 +39,5 @@ Development mainly happens in the `dev` branch, but you can help us a lot if you Feature branches may target either `dev` and/or `dev-3.0` and should be updated regularly. Long running branches should only target the latest version of Pattern Lab, currently `dev-3.0`, and may be lagging behind a lot. + +If you have any questions or you would like to help, feel free to ask on [our Gitter.im](https://gitter.im/pattern-lab/node-team) From 81738f29ef5fa7d2be6394b516491f5216cc678b Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Sun, 1 Oct 2017 03:35:18 -0500 Subject: [PATCH 64/98] wip --- core/lib/asset_copy.js | 11 +++++++++++ core/lib/patternlab.js | 6 ++++++ 2 files changed, 17 insertions(+) create mode 100644 core/lib/asset_copy.js diff --git a/core/lib/asset_copy.js b/core/lib/asset_copy.js new file mode 100644 index 000000000..18189d588 --- /dev/null +++ b/core/lib/asset_copy.js @@ -0,0 +1,11 @@ +"use strict"; +const plutils = require('./utilities'); +let fs = require('fs-extra'); // eslint-disable-line + +const asset_copy = () => { + const copyDirectory = (sourceDirectoryPath, destDirectoryPath) => { + return fs.copy(sourceDirectoryPath, destDirectoryPath); + }; +}; + +module.exports = asset_copy; diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index a033c3a0e..b1387094d 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -34,6 +34,7 @@ const CompileState = require('./object_factory').CompileState; let fs = require('fs-extra'); // eslint-disable-line let ui_builder = require('./ui_builder'); // eslint-disable-line let pattern_exporter = new pe(); // eslint-disable-line +let assetCopy = require('./asset_copy'); const pattern_assembler = new pa(); const lineage_hunter = new lh(); @@ -692,6 +693,11 @@ const patternlab_engine = function (config) { }, getSupportedTemplateExtensions: function () { return getSupportedTemplateExtensions(); + }, + copyAssets: function () { + + // accept a filtered list of assets to copy. or use the default inferred from the config + assetCopy() } }; }; From 6e696a50ca886ef9f12118999686afc178ff0523 Mon Sep 17 00:00:00 2001 From: Mohit Sharma Date: Sun, 1 Oct 2017 20:57:48 +0530 Subject: [PATCH 65/98] Pin all dependencies --- package.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 36871314c..7e3d05e44 100644 --- a/package.json +++ b/package.json @@ -4,23 +4,23 @@ "version": "2.12.0", "main": "./core/lib/patternlab.js", "dependencies": { - "chalk": "^1.1.3", - "diveSync": "^0.3.0", - "fs-extra": "^0.30.0", - "glob": "^7.0.0", - "graphlib": "^2.1.1", - "js-beautify": "^1.6.3", - "js-yaml": "^3.6.1", - "lodash": "~4.13.1", - "markdown-it": "^6.0.1", - "node-fetch": "^1.6.0", - "patternengine-node-mustache": "^1.0.0", - "update-notifier": "^2.2.0" + "chalk": "1.1.3", + "diveSync": "0.3.0", + "fs-extra": "0.30.0", + "glob": "7.0.0", + "graphlib": "2.1.1", + "js-beautify": "1.6.3", + "js-yaml": "3.6.1", + "lodash": "4.13.1", + "markdown-it": "6.0.1", + "node-fetch": "1.6.0", + "patternengine-node-mustache": "1.0.0", + "update-notifier": "2.2.0" }, "devDependencies": { - "eslint": "^3.5.0", - "rewire": "^2.5.2", - "tap": "^7.1.2" + "eslint": "3.5.0", + "rewire": "2.5.2", + "tap": "7.1.2" }, "keywords": [ "Pattern Lab", From 4e898c64b38909817b0f75f55172842dee17d2d0 Mon Sep 17 00:00:00 2001 From: bmuenzenmeyer Date: Tue, 3 Oct 2017 23:08:57 -0500 Subject: [PATCH 66/98] wip against #706 --- core/lib/asset_copy.js | 110 +++++++++++++++++++++++++++++++++++++-- core/lib/patternlab.js | 10 ++-- package.json | 8 +-- test/asset_copy_tests.js | 79 ++++++++++++++++++++++++++++ 4 files changed, 192 insertions(+), 15 deletions(-) create mode 100644 test/asset_copy_tests.js diff --git a/core/lib/asset_copy.js b/core/lib/asset_copy.js index 18189d588..9c071dacd 100644 --- a/core/lib/asset_copy.js +++ b/core/lib/asset_copy.js @@ -1,11 +1,111 @@ "use strict"; const plutils = require('./utilities'); -let fs = require('fs-extra'); // eslint-disable-line +const _ = require('lodash'); +const path = require('path'); +const process = require('process'); -const asset_copy = () => { - const copyDirectory = (sourceDirectoryPath, destDirectoryPath) => { - return fs.copy(sourceDirectoryPath, destDirectoryPath); +let copy = require('recursive-copy'); // eslint-disable-line +let chokidar = require('chokidar'); // eslint-disable-line + +const asset_copier = () => { + + const transform_paths = (directories) => { + //create array with all source keys minus our blacklist + const dirs = {}; + const blackList = ['root', 'patterns', 'data', 'meta', 'annotations', 'styleguide', 'patternlabFiles']; + _.each(directories.source, (dir, key) => { + + if (blackList.includes(key)) { + return; + } + + if (!dirs.key) { + dirs[key] = {}; + } + }); + + // loop through all source keys + _.each(dirs, (dir, key) => { + // add source key path + dirs[key].source = directories.source[key]; + + // add public key path + dirs[key].public = directories.public[key]; + }); + return dirs; + }; + + const copyFile = (p, dest, options) => { + copy( + p, + dest, + options + ).on(copy.events.COPY_FILE_COMPLETE, (copyOperation) => { + console.log(`Moved ${p} to ${dest}`); + }); + }; + + const asset_copy = (assetDirectories, patternlab, options) => { + //take our configured paths and sanitize best we can to only the assets + const dirs = transform_paths(assetDirectories); + + //find out where we are + const basePath = path.resolve(process.cwd()); + + const copyOptions = + { + overwrite: true + }; + + console.log(60, dirs) + + //loop through each directory asset object (source / public pairing) + _.each(dirs, (dir, key) => { + + //if we want to watch files, do so, otherwise just copy each file + if (options.watch) { + console.log(49, `watching ${path.resolve(basePath, dir.source)}`); + const watcher = chokidar.watch( + path.resolve(basePath, dir.source), + { + ignored: /(^|[\/\\])\../, + ignoreInitial: true, + awaitWriteFinish : { + stabilityThreshold: 1000, + pollInterval: 100 + } + } + ); + + //watch for changes and copy + watcher.on('addDir', (p) => { + const destination = path.resolve(basePath, dir.public + '/' + path.basename(p)); + copyFile(p, destination, copyOptions); + }).on('add', (p) => { + const destination = path.resolve(basePath, dir.public + '/' + path.basename(p)); + copyFile(p, destination, copyOptions); + }).on('change', (p) => { + const destination = path.resolve(basePath, dir.public + '/' + path.basename(p)); + copyFile(p, destination, copyOptions); + }); + + } else { + //just copy + const destination = path.resolve(basePath, dir.public); + copyFile(dir.source, destination, copyOptions); + } + }); }; + + return { + copyAssets: (assetDirectories, patternlab, options) => { + asset_copy(assetDirectories, patternlab, options); + }, + transformConfigPaths: (paths) => { + return transform_paths(paths); + } + }; + }; -module.exports = asset_copy; +module.exports = asset_copier; diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index b1387094d..8f8a3ba0d 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -34,7 +34,7 @@ const CompileState = require('./object_factory').CompileState; let fs = require('fs-extra'); // eslint-disable-line let ui_builder = require('./ui_builder'); // eslint-disable-line let pattern_exporter = new pe(); // eslint-disable-line -let assetCopy = require('./asset_copy'); +let assetCopier = require('./asset_copy'); // eslint-disable-line const pattern_assembler = new pa(); const lineage_hunter = new lh(); @@ -654,7 +654,7 @@ const patternlab_engine = function (config) { v: function () { return getVersion(); }, - build: function (callback, deletePatternDir) { + build: function (callback, deletePatternDir, options) { if (patternlab && patternlab.isBusy) { console.log('Pattern Lab is busy building a previous run - returning early.'); return Promise.resolve(); @@ -662,6 +662,7 @@ const patternlab_engine = function (config) { patternlab.isBusy = true; return buildPatterns(deletePatternDir).then(() => { new ui_builder().buildFrontend(patternlab); + assetCopier().copyAssets(patternlab.config.paths, patternlab, {watch: false}); printDebug(); patternlab.isBusy = false; callback(); @@ -693,11 +694,6 @@ const patternlab_engine = function (config) { }, getSupportedTemplateExtensions: function () { return getSupportedTemplateExtensions(); - }, - copyAssets: function () { - - // accept a filtered list of assets to copy. or use the default inferred from the config - assetCopy() } }; }; diff --git a/package.json b/package.json index 714872f55..6e04ec4a0 100644 --- a/package.json +++ b/package.json @@ -5,18 +5,20 @@ "main": "./core/lib/patternlab.js", "dependencies": { "async": "^2.1.2", - "dive": "^0.5.0", "chalk": "^1.1.3", + "chokidar": "^1.7.0", + "dive": "^0.5.0", "diveSync": "^0.3.0", "fs-extra": "^0.30.0", "fs-promise": "^1.0.0", "glob": "^7.0.0", + "graphlib": "^2.1.1", "js-beautify": "^1.6.3", "js-yaml": "^3.6.1", "lodash": "~4.13.1", "markdown-it": "^6.0.1", "node-fetch": "^1.6.0", - "graphlib": "^2.1.1" + "recursive-copy": "^2.0.6" }, "devDependencies": { "eslint": "^3.5.0", @@ -53,7 +55,7 @@ "license": "MIT", "scripts": { "lint": "eslint core/**/*.js", - "pretest" : "npm run lint", + "pretest": "npm run lint", "test": "tap test/*_tests.js --reporter spec --coverage" }, "engines": { diff --git a/test/asset_copy_tests.js b/test/asset_copy_tests.js new file mode 100644 index 000000000..651c1f702 --- /dev/null +++ b/test/asset_copy_tests.js @@ -0,0 +1,79 @@ +"use strict"; + +var tap = require('tap'); +var rewire = require("rewire"); +var _ = require('lodash'); +var eol = require('os').EOL; +var Pattern = require('../core/lib/object_factory').Pattern; +var extend = require('util')._extend; +var ac = rewire('../core/lib/asset_copy'); +var path = require('path'); +var config = require('./util/patternlab-config.json'); + +var engineLoader = require('../core/lib/pattern_engines'); +engineLoader.loadAllEngines(config); + +//set up a global mocks - we don't want to be writing/rendering any files right now +// var chokidarMock = { +// watch: function (path, data, cb) { } +// }; + +// ac.__set__({ +// 'chokidar': chokidarMock, +// }); + +const assetCopier = ac(); + +function createFakePatternLab(customProps) { + var pl = { + config: { + paths: { + source: { + img: './test/img', + css: './test/css' + }, + public: { + img: './test/output/img', + css: './test/output/css' + } + }, + styleGuideExcludes: [ ], + debug: false, + outputFileSuffixes: { + rendered: '.rendered', + rawTemplate: '', + markupOnly: '.markup-only' + } + }, + data: {} + }; + return extend(pl, customProps); +} + +// tap.test('transformConfigPaths takes configuration.paths() and maps to a better key store', function (test) { +// //arrange +// var patternlab = createFakePatternLab({}); + +// //act +// var result = assetCopy.transformConfigPaths(patternlab.config.paths); + +// //assert +// test.equals(result.img.source, './test/img'); +// test.equals(result.img.public, './test/output/img'); +// test.equals(result.css.source, './test/css'); +// test.equals(result.css.public, './test/output/css'); +// test.end(); +// }); + +tap.test('assetCopier does stuff', function(test) { + //arrange + var patternlab = createFakePatternLab({}); + + //act + + assetCopier.copyAssets(patternlab.config.paths, {}); + + //assert + + test.end(); +}) From 6e78d0a8754c4fee913aafcd7e0e44717ec6ce40 Mon Sep 17 00:00:00 2001 From: Daniel Janeiro Date: Thu, 5 Oct 2017 20:45:31 +0100 Subject: [PATCH 67/98] Add support for pattern parameter links Allow the use of link variables inside pattern parameters. Closes #688 --- core/lib/parameter_hunter.js | 2 ++ test/parameter_hunter_tests.js | 27 +++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index d9c94e597..b9d47c1ee 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -280,6 +280,8 @@ var parameter_hunter = function () { console.log(err); } + paramData = pattern_assembler.parse_data_links_specific(patternlab, paramData, pattern.patternPartial) + var allData = plutils.mergeData(globalData, localData); allData = plutils.mergeData(allData, paramData); diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 5393c077f..120426b0b 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -3,7 +3,6 @@ var tap = require('tap'); var pa = require('../core/lib/pattern_assembler'); var Pattern = require('../core/lib/object_factory').Pattern; -var CompileState = require('../core/lib/object_factory').CompileState; var PatternGraph = require('../core/lib/pattern_graph').PatternGraph; var fs = require('fs-extra'); @@ -59,12 +58,14 @@ function patternlabClosure() { }, data: { description: 'Not a quote from a smart man', - link: {} + link: { + "molecules-single-comment": "01-molecules-06-components-02-single-comment/01-molecules-06-components-02-single-comment.html" + } }, partials: {}, graph: PatternGraph.empty() - } -}; + }; +} tap.test('parameter hunter finds and extends templates', function(test) { var currentPattern = currentPatternClosure(); @@ -402,3 +403,21 @@ tap.test('parameter hunter parses parameters containing html tags', function(tes test.end(); }); + +tap.test('parameter hunter expands links inside parameters', function (test) { + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + + patternlab.patterns[0].template = '{{ description }}'; + patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; + + currentPattern.template = "{{> molecules-single-comment(url: 'link.molecules-single-comment', description: 'Link to single comment') }}"; + currentPattern.extendedTemplate = currentPattern.template; + currentPattern.parameteredPartials[0] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab); + test.equals(currentPattern.extendedTemplate, 'Link to single comment'); + + test.end(); +}); From 98322b076406cb3fe8442dcca83220fade90cab5 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 6 Oct 2017 06:37:28 -0500 Subject: [PATCH 68/98] pin proper patternengine-node-mustache version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7e3d05e44..4d4874610 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "lodash": "4.13.1", "markdown-it": "6.0.1", "node-fetch": "1.6.0", - "patternengine-node-mustache": "1.0.0", + "patternengine-node-mustache": "1.0.2", "update-notifier": "2.2.0" }, "devDependencies": { From 362e26c345ba1c460576b9609467c4efe836b348 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 6 Oct 2017 07:03:39 -0500 Subject: [PATCH 69/98] add package-lock.json support closes #709 --- package-lock.json | 3515 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3515 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..547e89b54 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3515 @@ +{ + "name": "patternlab-node", + "version": "2.12.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" + }, + "acorn": { + "version": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha1-kRy1PgNoB88Pp3jcXTcPvYZCRtc=", + "dev": true + }, + "acorn-jsx": { + "version": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" + }, + "dependencies": { + "acorn": { + "version": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" + } + }, + "ajv-keywords": { + "version": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "ansi-align": { + "version": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + } + }, + "ansi-escapes": { + "version": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "append": { + "version": "https://registry.npmjs.org/append/-/append-0.1.1.tgz", + "integrity": "sha1-fl3TJ3RweNh3KG+7Yksej00rOWs=" + }, + "argparse": { + "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + } + }, + "array-union": { + "version": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + } + }, + "array-uniq": { + "version": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "arrify": { + "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "asynckit": { + "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + } + }, + "bluebird": { + "version": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", + "dev": true + }, + "boom": { + "version": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + } + }, + "boxen": { + "version": "https://registry.npmjs.org/boxen/-/boxen-1.2.1.tgz", + "integrity": "sha1-DxHn/jRO25OXl3/BPt5/ZNlWSB0=", + "requires": { + "ansi-align": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "cli-boxes": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "term-size": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "widest-line": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz" + }, + "dependencies": { + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "requires": { + "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz" + } + }, + "chalk": { + "version": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha1-rFvs8U+iG5nGySynp9fP1bF+dD4=", + "requires": { + "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha1-iD992rwWUUKyphQn8zUt7RldGj4=", + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz" + } + } + } + }, + "brace-expansion": { + "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + }, + "caller-path": { + "version": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz" + } + }, + "callsites": { + "version": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "capture-stack-trace": { + "version": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, + "caseless": { + "version": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "chalk": { + "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + } + }, + "circular-json": { + "version": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", + "dev": true + }, + "clean-yaml-object": { + "version": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", + "dev": true + }, + "cli-boxes": { + "version": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "cli-cursor": { + "version": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz" + } + }, + "cli-width": { + "version": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "co": { + "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "requires": { + "color-name": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + } + }, + "color-name": { + "version": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-support": { + "version": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", + "dev": true + }, + "combined-stream": { + "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + } + }, + "commander": { + "version": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", + "dev": true + }, + "concat-map": { + "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "typedarray": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + } + }, + "config-chain": { + "version": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", + "requires": { + "ini": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "proto-list": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" + } + }, + "configstore": { + "version": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha1-CU7mYquD+tmRdnjeEU+q6o/NypA=", + "requires": { + "dot-prop": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "make-dir": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", + "unique-string": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "write-file-atomic": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "xdg-basedir": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz" + } + }, + "core-util-is": { + "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "coveralls": { + "version": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", + "integrity": "sha1-mtfCrlJ0F/Nh6LYmSD9I7pLdK8c=", + "dev": true, + "requires": { + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "lcov-parse": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "log-driver": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "request": "https://registry.npmjs.org/request/-/request-2.79.0.tgz" + }, + "dependencies": { + "esprima": { + "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "js-yaml": { + "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true, + "requires": { + "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + } + }, + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "create-error-class": { + "version": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz" + } + }, + "cross-spawn": { + "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "shebang-command": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + }, + "dependencies": { + "lru-cache": { + "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "requires": { + "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + } + } + } + }, + "cryptiles": { + "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" + } + }, + "crypto-random-string": { + "version": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "d": { + "version": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz" + } + }, + "dashdash": { + "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + }, + "deep-extend": { + "version": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "deep-is": { + "version": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deeper": { + "version": "https://registry.npmjs.org/deeper/-/deeper-2.1.0.tgz", + "integrity": "sha1-vFZOX3MXT98gHgiwADDooU2nQ2g=", + "dev": true + }, + "del": { + "version": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "is-path-cwd": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "is-path-in-cwd": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz" + } + }, + "delayed-stream": { + "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "diff": { + "version": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "diveSync": { + "version": "https://registry.npmjs.org/diveSync/-/diveSync-0.3.0.tgz", + "integrity": "sha1-2ZgEk64zvuw29P7G8XH/IYEwzBI=", + "requires": { + "append": "https://registry.npmjs.org/append/-/append-0.1.1.tgz" + } + }, + "doctrine": { + "version": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + }, + "dot-prop": { + "version": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", + "requires": { + "is-obj": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + } + }, + "duplexer3": { + "version": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + } + }, + "encoding": { + "version": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz" + } + }, + "entities": { + "version": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, + "es5-ext": { + "version": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", + "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", + "dev": true, + "requires": { + "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" + } + }, + "es6-iterator": { + "version": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true, + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", + "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" + } + }, + "es6-map": { + "version": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", + "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "es6-set": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "event-emitter": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" + } + }, + "es6-set": { + "version": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", + "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "event-emitter": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" + } + }, + "es6-symbol": { + "version": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz" + } + }, + "es6-weak-map": { + "version": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", + "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" + } + }, + "escape-string-regexp": { + "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "es6-weak-map": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "esrecurse": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + } + }, + "eslint": { + "version": "https://registry.npmjs.org/eslint/-/eslint-3.5.0.tgz", + "integrity": "sha1-IvyfeA6lvKEwb6srbTM2sPpix1Q=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "doctrine": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "escope": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "espree": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "file-entry-cache": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "globals": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "ignore": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", + "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "inquirer": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "is-my-json-valid": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "is-resolvable": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "natural-compare": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "path-is-inside": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "pluralize": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "progress": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "require-uncached": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "shelljs": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "table": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "text-table": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "user-home": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz" + }, + "dependencies": { + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "strip-json-comments": { + "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + } + } + }, + "espree": { + "version": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", + "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", + "dev": true, + "requires": { + "acorn": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "acorn-jsx": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz" + } + }, + "esprima": { + "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + }, + "esrecurse": { + "version": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "estraverse": { + "version": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz" + } + }, + "events-to-array": { + "version": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "execa": { + "version": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "get-stream": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "npm-run-path": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "p-finally": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "strip-eof": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" + } + }, + "exit-hook": { + "version": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "extend": { + "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extsprintf": { + "version": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-levenshtein": { + "version": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "file-entry-cache": { + "version": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "flat-cache": { + "version": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "del": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "write": "https://registry.npmjs.org/write/-/write-0.2.1.tgz" + } + }, + "foreground-child": { + "version": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" + }, + "dependencies": { + "cross-spawn": { + "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + } + }, + "lru-cache": { + "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "dev": true, + "requires": { + "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + } + } + } + }, + "forever-agent": { + "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz" + } + }, + "fs-extra": { + "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "klaw": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz" + } + }, + "fs.realpath": { + "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "generate-function": { + "version": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + } + }, + "get-stream": { + "version": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "getpass": { + "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.0.0.tgz", + "integrity": "sha1-OyCjV//89GuzhK7W+K6aZH/basQ=", + "requires": { + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "globals": { + "version": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "dev": true + }, + "globby": { + "version": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + }, + "dependencies": { + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + } + } + }, + "got": { + "version": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "duplexer3": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "get-stream": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "is-redirect": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "is-retry-allowed": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "lowercase-keys": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "timed-out": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "unzip-response": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "url-parse-lax": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz" + } + }, + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graphlib": { + "version": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.1.tgz", + "integrity": "sha1-QjUsUrovTQNctWbrkfc5X3bryVE=", + "requires": { + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz" + } + }, + "har-validator": { + "version": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "commander": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "is-my-json-valid": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "has-ansi": { + "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + } + }, + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "hawk": { + "version": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "cryptiles": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "sntp": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + } + }, + "hoek": { + "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "jsprim": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "sshpk": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz" + } + }, + "iconv-lite": { + "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=" + }, + "ignore": { + "version": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", + "integrity": "sha1-xOcVRV9gc6jX5drnLS/J1xZj26Y=", + "dev": true + }, + "import-lazy": { + "version": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "imurmurhash": { + "version": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflight": { + "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, + "inquirer": { + "version": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "cli-cursor": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "cli-width": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "figures": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", + "readline2": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "run-async": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "rx-lite": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + } + }, + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + } + } + } + }, + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-my-json-valid": { + "version": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha1-WoRnd+LCYg0eaRBOXToDsfYIjxE=", + "dev": true, + "requires": { + "generate-function": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "generate-object-property": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "jsonpointer": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + }, + "is-npm": { + "version": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-obj": { + "version": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-cwd": { + "version": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz" + } + }, + "is-path-inside": { + "version": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" + } + }, + "is-property": { + "version": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-redirect": { + "version": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-resolvable": { + "version": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz" + } + }, + "is-retry-allowed": { + "version": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isstream": { + "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-beautify": { + "version": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.6.3.tgz", + "integrity": "sha1-1/HrUVzsFsmfDXS/9f1vl2fySjc=", + "requires": { + "config-chain": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "nopt": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + } + }, + "js-yaml": { + "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "requires": { + "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + } + }, + "jsbn": { + "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-stable-stringify": { + "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" + } + }, + "json-stringify-safe": { + "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } + }, + "jsonify": { + "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "json-schema": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "verror": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "klaw": { + "version": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } + }, + "latest-version": { + "version": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz" + } + }, + "lcov-parse": { + "version": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "levn": { + "version": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + } + }, + "linkify-it": { + "version": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz", + "integrity": "sha1-B3NSbDF8j9E71TTuHRgP+Iq/iBo=", + "requires": { + "uc.micro": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz" + } + }, + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", + "integrity": "sha1-g+SxCRP0hJbU0W/sSlYK8u50S2g=" + }, + "log-driver": { + "version": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "lowercase-keys": { + "version": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "make-dir": { + "version": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", + "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "requires": { + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + } + }, + "markdown-it": { + "version": "https://registry.npmjs.org/markdown-it/-/markdown-it-6.0.1.tgz", + "integrity": "sha1-lKayVM9OYgutKyJidL/u2Vrxx8U=", + "requires": { + "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "entities": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "linkify-it": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz", + "mdurl": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "uc.micro": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz" + } + }, + "mdurl": { + "version": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "mime-db": { + "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz" + } + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" + } + }, + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mustache": { + "version": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", + "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=" + }, + "mute-stream": { + "version": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "natural-compare": { + "version": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-fetch": { + "version": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.0.tgz", + "integrity": "sha1-AMzYEcZXruni8Nef0iVvvP/XM6I=", + "requires": { + "encoding": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + } + }, + "nopt": { + "version": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + } + }, + "npm-run-path": { + "version": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + } + }, + "number-is-nan": { + "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nyc": { + "version": "https://registry.npmjs.org/nyc/-/nyc-7.1.0.tgz", + "integrity": "sha1-jhSXHzoV0au+x6xhDvVMuInp/7Q=", + "dev": true, + "requires": { + "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "caching-transform": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", + "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.3.0.tgz", + "default-require-extensions": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "find-cache-dir": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "foreground-child": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.3.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0-alpha.4.tgz", + "istanbul-lib-hook": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0-alpha.4.tgz", + "istanbul-lib-instrument": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.1.0-alpha.4.tgz", + "istanbul-lib-report": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz", + "istanbul-lib-source-maps": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.0.0-alpha.10.tgz", + "istanbul-reports": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.0.0-alpha.8.tgz", + "md5-hex": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "pkg-up": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "resolve-from": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", + "spawn-wrap": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.2.4.tgz", + "test-exclude": "https://registry.npmjs.org/test-exclude/-/test-exclude-1.1.0.tgz", + "yargs": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" + }, + "dependencies": { + "align-text": { + "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", + "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" + } + }, + "amdefine": { + "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", + "dev": true + }, + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", + "dev": true + }, + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "append-transform": { + "version": "https://registry.npmjs.org/append-transform/-/append-transform-0.3.0.tgz", + "integrity": "sha1-1pM85KhfCURdnMxMwRkFG3OBqBM=", + "dev": true + }, + "arr-diff": { + "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz" + } + }, + "arr-flatten": { + "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", + "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=", + "dev": true + }, + "array-unique": { + "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "async": { + "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "babel-code-frame": { + "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.11.0.tgz", + "integrity": "sha1-kHLdI1P7D4W2tX0sl/DRNNGIrtg=", + "dev": true, + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz" + } + }, + "babel-generator": { + "version": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.11.4.tgz", + "integrity": "sha1-FPaTOrsgxiZm0n47e59bncBxKpo=", + "dev": true, + "requires": { + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.11.1.tgz", + "detect-indent": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + } + }, + "babel-messages": { + "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz", + "integrity": "sha1-v1BHNsqWfm1l7wrbWipflHyODrk=", + "dev": true, + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz" + } + }, + "babel-runtime": { + "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", + "integrity": "sha1-1/45G8LMKbgIfB2bOYeJEun8/Vk=", + "dev": true, + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz" + } + }, + "babel-template": { + "version": "https://registry.npmjs.org/babel-template/-/babel-template-6.9.0.tgz", + "integrity": "sha1-lwkPz2vBVoW08FvmXAqUOKp+I+M=", + "dev": true, + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.11.4.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.11.1.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.8.4.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz" + } + }, + "babel-traverse": { + "version": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.11.4.tgz", + "integrity": "sha1-On3vakwf6fWLWcmiK+gfYZ+Cl2w=", + "dev": true, + "requires": { + "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.11.0.tgz", + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.11.1.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.8.4.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "globals": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", + "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz" + } + }, + "babel-types": { + "version": "https://registry.npmjs.org/babel-types/-/babel-types-6.11.1.tgz", + "integrity": "sha1-o981W6uQ3c9mMYZAcXzywVTmZIo=", + "dev": true, + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.11.4.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", + "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz" + } + }, + "babylon": { + "version": "https://registry.npmjs.org/babylon/-/babylon-6.8.4.tgz", + "integrity": "sha1-CXMGuNq66VFZIlzymz6lWRIFMYA=", + "dev": true, + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz" + } + }, + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "brace-expansion": { + "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", + "dev": true, + "requires": { + "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + }, + "braces": { + "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" + } + }, + "builtin-modules": { + "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caching-transform": { + "version": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", + "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", + "dev": true, + "requires": { + "md5-hex": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "write-file-atomic": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.1.4.tgz" + } + }, + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "center-align": { + "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "lazy-cache": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" + } + }, + "chalk": { + "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + } + }, + "cliui": { + "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "right-align": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "dependencies": { + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", + "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", + "dev": true, + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + } + }, + "commondir": { + "version": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.3.0.tgz", + "integrity": "sha1-6fPpxuJyjvwmdmlqcOs4L3MQamc=", + "dev": true + }, + "core-js": { + "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", + "dev": true + }, + "cross-spawn": { + "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.0.tgz", + "integrity": "sha1-glR3SrR4a4xbPPTfumbOVjkywlI=", + "dev": true, + "requires": { + "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.2.10.tgz" + } + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "decamelize": { + "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "default-require-extensions": { + "version": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + } + }, + "detect-indent": { + "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "dev": true, + "requires": { + "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "repeating": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz" + }, + "dependencies": { + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "error-ex": { + "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", + "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", + "dev": true, + "requires": { + "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + } + }, + "escape-string-regexp": { + "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esutils": { + "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "expand-brackets": { + "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + } + }, + "expand-range": { + "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz" + } + }, + "extglob": { + "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + }, + "filename-regex": { + "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", + "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=", + "dev": true + }, + "fill-range": { + "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "randomatic": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", + "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" + } + }, + "find-cache-dir": { + "version": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" + } + }, + "find-up": { + "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "for-in": { + "version": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz", + "integrity": "sha1-AHN04rbVxnQgoUeb23WgSHK3OMQ=", + "dev": true + }, + "for-own": { + "version": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", + "integrity": "sha1-AUm0GjkIjHUV9R6+HBOG1F+TUHI=", + "dev": true, + "requires": { + "for-in": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz" + } + }, + "foreground-child": { + "version": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.3.tgz", + "integrity": "sha1-lN1qumcTiYZ96OV+mfHC7PsVwBo=", + "dev": true, + "requires": { + "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.0.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz" + } + }, + "fs.realpath": { + "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-caller-file": { + "version": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.1.tgz", + "integrity": "sha1-qm/3uYobItwMizuQX6sytVL1rEE=", + "dev": true + }, + "get-stdin": { + "version": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", + "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", + "dev": true, + "requires": { + "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + } + }, + "glob-base": { + "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + } + }, + "glob-parent": { + "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + } + }, + "globals": { + "version": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", + "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=", + "dev": true + }, + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", + "dev": true + }, + "handlebars": { + "version": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", + "integrity": "sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc=", + "dev": true, + "requires": { + "async": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "optimist": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.0.tgz" + }, + "dependencies": { + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + } + } + } + }, + "has-ansi": { + "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + } + }, + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "hosted-git-info": { + "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", + "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", + "dev": true + }, + "imurmurhash": { + "version": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", + "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", + "dev": true, + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "invariant": { + "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", + "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", + "dev": true, + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz" + } + }, + "invert-kv": { + "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", + "integrity": "sha1-24l/w/esotUN6UtsjCiWpHcWJ68=", + "dev": true + }, + "is-builtin-module": { + "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + } + }, + "is-dotfile": { + "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", + "dev": true + }, + "is-equal-shallow": { + "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + } + }, + "is-extendable": { + "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", + "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", + "dev": true, + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + } + }, + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + } + }, + "is-glob": { + "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + }, + "is-number": { + "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz" + } + }, + "is-posix-bracket": { + "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-utf8": { + "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", + "dev": true + }, + "isobject": { + "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + }, + "istanbul-lib-coverage": { + "version": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0-alpha.4.tgz", + "integrity": "sha1-Ym9/2c+Am2479+1CqAn44LZK6XY=", + "dev": true + }, + "istanbul-lib-hook": { + "version": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0-alpha.4.tgz", + "integrity": "sha1-jFu59vvYUm4K5s9jmvKCZpBrk48=", + "dev": true, + "requires": { + "append-transform": "https://registry.npmjs.org/append-transform/-/append-transform-0.3.0.tgz" + } + }, + "istanbul-lib-instrument": { + "version": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.1.0-alpha.4.tgz", + "integrity": "sha1-d9mxE+n3YaqEmIM5ATpyA6zJitw=", + "dev": true, + "requires": { + "babel-generator": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.11.4.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.9.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.11.4.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.11.1.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.8.4.tgz", + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0-alpha.4.tgz" + } + }, + "istanbul-lib-report": { + "version": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz", + "integrity": "sha1-MtX27H8zyjpgIgnieLLm/xQ0mK8=", + "dev": true, + "requires": { + "async": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0-alpha.4.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz" + }, + "dependencies": { + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.0.0-alpha.10.tgz", + "integrity": "sha1-mxWlyLWdG5EBviy33VTHA9hq3vE=", + "dev": true, + "requires": { + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0-alpha.4.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + } + }, + "istanbul-reports": { + "version": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.0.0-alpha.8.tgz", + "integrity": "sha1-CUgw9Mfz1ILkZqrIq9oklfmuRok=", + "dev": true, + "requires": { + "handlebars": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz" + } + }, + "js-tokens": { + "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz", + "integrity": "sha1-eZA/VWPud4zBFi5tzxoAJ8l/nLU=", + "dev": true + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", + "integrity": "sha1-xhYIdH2BWwNiVW2zJ2Nip6OK3tM=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" + } + }, + "lazy-cache": { + "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcid": { + "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + } + }, + "load-json-file": { + "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", + "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + } + }, + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", + "integrity": "sha1-g+SxCRP0hJbU0W/sSlYK8u50S2g=", + "dev": true + }, + "lodash.assign": { + "version": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.0.9.tgz", + "integrity": "sha1-Cgcx2TWQ3dm6RYn61lqvbuCSF+M=", + "dev": true, + "requires": { + "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.0.7.tgz", + "lodash.rest": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.3.tgz" + } + }, + "lodash.keys": { + "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.0.7.tgz", + "integrity": "sha1-MOGzvZjlTWoGEZkYEmhba8R8tjs=", + "dev": true + }, + "lodash.rest": { + "version": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.3.tgz", + "integrity": "sha1-TBwyxAAoCHJQ+r9w1C4BUVSPSMU=", + "dev": true + }, + "longest": { + "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", + "integrity": "sha1-aaZarT3lQs9O4PT+dOjjPHCcyw8=", + "dev": true, + "requires": { + "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz" + }, + "dependencies": { + "js-tokens": { + "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", + "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=", + "dev": true + } + } + }, + "lru-cache": { + "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", + "integrity": "sha1-E0OVXtry432bnn7nJB4nxLn7cr4=", + "dev": true, + "requires": { + "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz" + } + }, + "md5-hex": { + "version": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", + "dev": true, + "requires": { + "md5-o-matic": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz" + } + }, + "md5-o-matic": { + "version": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", + "dev": true + }, + "micromatch": { + "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", + "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", + "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", + "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz" + } + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", + "integrity": "sha1-DzmKcwDqRB6cNIyD2Yq4ydv5xAo=", + "dev": true, + "requires": { + "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" + } + }, + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "normalize-package-data": { + "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", + "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", + "dev": true, + "requires": { + "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", + "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" + } + }, + "normalize-path": { + "version": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", + "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=", + "dev": true + }, + "number-is-nan": { + "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", + "dev": true + }, + "object.omit": { + "version": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", + "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", + "dev": true, + "requires": { + "for-own": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + }, + "once": { + "version": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "optimist": { + "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + } + }, + "os-homedir": { + "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", + "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", + "dev": true + }, + "os-locale": { + "version": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" + } + }, + "parse-glob": { + "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "is-dotfile": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + } + }, + "parse-json": { + "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz" + } + }, + "path-exists": { + "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "path-is-absolute": { + "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "dev": true + }, + "path-parse": { + "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "pify": { + "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + } + }, + "pkg-dir": { + "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + } + }, + "pkg-up": { + "version": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "dev": true, + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + } + }, + "preserve": { + "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pseudomap": { + "version": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "randomatic": { + "version": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", + "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", + "dev": true, + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz" + } + }, + "read-pkg": { + "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", + "path-type": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + } + }, + "read-pkg-up": { + "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + } + }, + "regenerator-runtime": { + "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz", + "integrity": "sha1-QD1tQKS9/5wzDdk5Lcuy2ai7ofw=", + "dev": true + }, + "regex-cache": { + "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "dev": true, + "requires": { + "is-equal-shallow": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + } + }, + "repeat-element": { + "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", + "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", + "dev": true + }, + "repeating": { + "version": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "dev": true, + "requires": { + "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz" + } + }, + "require-directory": { + "version": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve-from": { + "version": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "dev": true + }, + "right-align": { + "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" + } + }, + "rimraf": { + "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", + "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", + "dev": true, + "requires": { + "glob": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz" + } + }, + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "set-blocking": { + "version": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "signal-exit": { + "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", + "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", + "dev": true + }, + "slide": { + "version": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "spawn-wrap": { + "version": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.2.4.tgz", + "integrity": "sha1-kg6yEadpwJPuv71bDnpdLmirLkA=", + "dev": true, + "requires": { + "foreground-child": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.3.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.2.10.tgz" + }, + "dependencies": { + "signal-exit": { + "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", + "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=", + "dev": true + } + } + }, + "spdx-correct": { + "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz" + } + }, + "spdx-exceptions": { + "version": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz", + "integrity": "sha1-nSGsTaS9tx0GD7dOWmdTHQMsu6Y=", + "dev": true + }, + "spdx-expression-parse": { + "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", + "integrity": "sha1-1SsUtelnB3FECvIlvLVjEirEUvY=", + "dev": true, + "requires": { + "spdx-exceptions": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz", + "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz" + } + }, + "spdx-license-ids": { + "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", + "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=", + "dev": true + }, + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", + "integrity": "sha1-ySEptvHX9SrPmvQkom44ZKBc6wo=", + "dev": true, + "requires": { + "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + } + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + } + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "test-exclude": { + "version": "https://registry.npmjs.org/test-exclude/-/test-exclude-1.1.0.tgz", + "integrity": "sha1-9d3XGJJ7Ev0C8nCgqpOc627qQVE=", + "dev": true, + "requires": { + "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "lodash.assign": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.0.9.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" + } + }, + "to-fast-properties": { + "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", + "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=", + "dev": true + }, + "uglify-js": { + "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.0.tgz", + "integrity": "sha1-8CHji6LKdAhg9b1caVwqgXNF8Ow=", + "dev": true, + "optional": true, + "requires": { + "async": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "uglify-to-browserify": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + }, + "dependencies": { + "async": { + "version": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + } + } + } + }, + "uglify-to-browserify": { + "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz" + } + }, + "which": { + "version": "https://registry.npmjs.org/which/-/which-1.2.10.tgz", + "integrity": "sha1-kc2b0HUTIkEbZZtA8FSyHelXqy0=", + "dev": true, + "requires": { + "isexe": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz" + } + }, + "which-module": { + "version": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "window-size": { + "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.0.0.tgz", + "integrity": "sha1-fTD4+HP5pbvDpk2ryNF34HGuQm8=", + "dev": true, + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz" + } + }, + "wrappy": { + "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.1.4.tgz", + "integrity": "sha1-sfUtwujcDjywTRh6JfdYo4qQyjs=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", + "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "slide": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" + } + }, + "y18n": { + "version": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", + "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=", + "dev": true + }, + "yargs": { + "version": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "dev": true, + "requires": { + "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.1.tgz", + "lodash.assign": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.0.9.tgz", + "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", + "which-module": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" + }, + "dependencies": { + "cliui": { + "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "wrap-ansi": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.0.0.tgz" + } + }, + "window-size": { + "version": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true, + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "lodash.assign": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.0.9.tgz" + }, + "dependencies": { + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + } + } + }, + "oauth-sign": { + "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "onetime": { + "version": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "only-shallow": { + "version": "https://registry.npmjs.org/only-shallow/-/only-shallow-1.2.0.tgz", + "integrity": "sha1-cc7O26kyS8BRiu8Q7AgNMkncJGU=", + "dev": true + }, + "opener": { + "version": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", + "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", + "dev": true + }, + "optionator": { + "version": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "fast-levenshtein": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + } + }, + "os-homedir": { + "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "p-finally": { + "version": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "package-json": { + "version": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "requires": { + "got": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "registry-auth-token": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "registry-url": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + } + }, + "path-is-absolute": { + "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "patternengine-node-mustache": { + "version": "https://registry.npmjs.org/patternengine-node-mustache/-/patternengine-node-mustache-1.0.2.tgz", + "integrity": "sha1-HAnzo2CRiougtV5YLPfAPZjdy+M=", + "requires": { + "mustache": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz" + } + }, + "pify": { + "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + } + }, + "pluralize": { + "version": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "prelude-ls": { + "version": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "process-nextick-args": { + "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "proto-list": { + "version": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "pseudomap": { + "version": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "punycode": { + "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "rc": { + "version": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "requires": { + "deep-extend": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "ini": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + }, + "dependencies": { + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "readline2": { + "version": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "mute-stream": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + } + } + } + }, + "registry-auth-token": { + "version": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "requires": { + "rc": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, + "registry-url": { + "version": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz" + } + }, + "request": { + "version": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "caseless": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "form-data": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "har-validator": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "hawk": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "http-signature": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "qs": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "uuid": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz" + } + }, + "require-uncached": { + "version": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "resolve-from": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz" + } + }, + "resolve-from": { + "version": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "onetime": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz" + } + }, + "rewire": { + "version": "https://registry.npmjs.org/rewire/-/rewire-2.5.2.tgz", + "integrity": "sha1-ZCfee3/u+n02QBUH62SlOFvFjcc=", + "dev": true + }, + "rimraf": { + "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "requires": { + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" + }, + "dependencies": { + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "requires": { + "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + } + } + }, + "run-async": { + "version": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + } + }, + "rx-lite": { + "version": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" + }, + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" + }, + "semver-diff": { + "version": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + } + }, + "shebang-command": { + "version": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + } + }, + "shebang-regex": { + "version": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shelljs": { + "version": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", + "dev": true + }, + "signal-exit": { + "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slice-ansi": { + "version": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "sntp": { + "version": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + } + }, + "sprintf-js": { + "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "bcrypt-pbkdf": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "dashdash": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "ecc-jsbn": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "getpass": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stack-utils": { + "version": "https://registry.npmjs.org/stack-utils/-/stack-utils-0.4.0.tgz", + "integrity": "sha1-lAy4L8z6hOj/Lz/fKT/ngBa+zNE=", + "dev": true + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + } + }, + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "requires": { + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + }, + "dependencies": { + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" + } + } + } + }, + "stringstream": { + "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + } + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-json-comments": { + "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "table": { + "version": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "ajv-keywords": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", + "slice-ansi": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + } + }, + "tap": { + "version": "https://registry.npmjs.org/tap/-/tap-7.1.2.tgz", + "integrity": "sha1-36w+zxSshUe7rSW70Wzyw3Q/Zc8=", + "dev": true, + "requires": { + "bluebird": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "clean-yaml-object": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "color-support": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "coveralls": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", + "deeper": "https://registry.npmjs.org/deeper/-/deeper-2.1.0.tgz", + "foreground-child": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.0.0.tgz", + "isexe": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "nyc": "https://registry.npmjs.org/nyc/-/nyc-7.1.0.tgz", + "only-shallow": "https://registry.npmjs.org/only-shallow/-/only-shallow-1.2.0.tgz", + "opener": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "stack-utils": "https://registry.npmjs.org/stack-utils/-/stack-utils-0.4.0.tgz", + "tap-mocha-reporter": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-2.0.1.tgz", + "tap-parser": "https://registry.npmjs.org/tap-parser/-/tap-parser-2.2.3.tgz", + "tmatch": "https://registry.npmjs.org/tmatch/-/tmatch-2.0.1.tgz" + }, + "dependencies": { + "isexe": { + "version": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", + "dev": true + }, + "os-homedir": { + "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", + "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", + "dev": true + } + } + }, + "tap-mocha-reporter": { + "version": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-2.0.1.tgz", + "integrity": "sha1-xwMWFz1uOhbFjhupLV1s2N5YoS4=", + "dev": true, + "requires": { + "color-support": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "diff": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "tap-parser": "https://registry.npmjs.org/tap-parser/-/tap-parser-2.2.3.tgz", + "unicode-length": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz" + }, + "dependencies": { + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + } + } + }, + "tap-parser": { + "version": "https://registry.npmjs.org/tap-parser/-/tap-parser-2.2.3.tgz", + "integrity": "sha1-rebpbje/04zg8WLaBn80A08GiwE=", + "dev": true, + "requires": { + "events-to-array": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + } + }, + "term-size": { + "version": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz" + } + }, + "text-table": { + "version": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timed-out": { + "version": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "tmatch": { + "version": "https://registry.npmjs.org/tmatch/-/tmatch-2.0.1.tgz", + "integrity": "sha1-DFYkbzPzDaG409colauvFmYPOM8=", + "dev": true + }, + "tough-cookie": { + "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + } + }, + "tryit": { + "version": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tunnel-agent": { + "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "tweetnacl": { + "version": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + } + }, + "typedarray": { + "version": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uc.micro": { + "version": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz", + "integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=" + }, + "unicode-length": { + "version": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", + "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", + "dev": true, + "requires": { + "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + } + }, + "unique-string": { + "version": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz" + } + }, + "unzip-response": { + "version": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "update-notifier": { + "version": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", + "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", + "requires": { + "boxen": "https://registry.npmjs.org/boxen/-/boxen-1.2.1.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "configstore": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "import-lazy": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "is-npm": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "latest-version": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "semver-diff": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "xdg-basedir": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz" + } + }, + "url-parse-lax": { + "version": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" + } + }, + "user-home": { + "version": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + } + }, + "util-deprecate": { + "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", + "dev": true + }, + "verror": { + "version": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "which": { + "version": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "requires": { + "isexe": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + } + }, + "widest-line": { + "version": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + } + }, + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + } + } + } + }, + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + } + }, + "write-file-atomic": { + "version": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" + } + }, + "xdg-basedir": { + "version": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, + "xtend": { + "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yallist": { + "version": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } +} From 5b82b9b5b979c187d5c7d81624c6c0e2f9d414e6 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 6 Oct 2017 15:05:07 -0500 Subject: [PATCH 70/98] fix lint issues --- core/lib/data_loader.js | 4 ++-- core/lib/parameter_hunter.js | 2 +- core/lib/pattern_assembler.js | 6 ++++-- core/lib/patternlab.js | 1 - 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/core/lib/data_loader.js b/core/lib/data_loader.js index 84044eefd..2dbf185a2 100644 --- a/core/lib/data_loader.js +++ b/core/lib/data_loader.js @@ -39,7 +39,7 @@ function loadDataFromFolder(dataFilesPath, excludeFileNames, fsDep) { const dataFilesFullPath = dataFilesPath + '*.{json,yml,yaml}', excludeFullPath = dataFilesPath + excludeFileNames + '.{json,yml,yaml}'; - let globOptions = {}; + const globOptions = {}; if (excludeFileNames) { globOptions.ignore = [excludeFullPath]; } @@ -48,7 +48,7 @@ function loadDataFromFolder(dataFilesPath, excludeFileNames, fsDep) { let mergeObject = {}; dataFiles.forEach(function (filePath) { - let jsonData = yaml.safeLoad(fsDep.readFileSync(path.resolve(filePath), 'utf8')); + const jsonData = yaml.safeLoad(fsDep.readFileSync(path.resolve(filePath), 'utf8')); mergeObject = _.merge(mergeObject, jsonData); }); diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 32a72a815..f236f5e31 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -280,7 +280,7 @@ const parameter_hunter = function () { } // resolve any pattern links that might be present - paramData = pattern_assembler.parse_data_links_specific(patternlab, paramData, pattern.patternPartial) + paramData = pattern_assembler.parse_data_links_specific(patternlab, paramData, pattern.patternPartial); //combine all data: GLOBAL DATA => PATTERN.JSON DATA => PARAMETER DATA let allData = _.merge(globalData, localData); diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 0d52840da..701ef908d 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -14,8 +14,10 @@ const smh = require('./style_modifier_hunter'); const ph = require('./parameter_hunter'); const ch = require('./changes_hunter'); const jsonCopy = require('./json_copy'); +const da = require('./data_loader'); const markdown_parser = new mp(); const changes_hunter = new ch(); +const dataLoader = new da(); //this is mocked in unit tests let fs = require('fs-extra'); //eslint-disable-line prefer-const @@ -310,7 +312,7 @@ const pattern_assembler = function () { //look for a json file for this template try { var jsonFilename = path.resolve(patternsPath, currentPattern.subdir, currentPattern.fileName); - let configData = dataLoader.loadDataFromFile(jsonFilename, fs); + const configData = dataLoader.loadDataFromFile(jsonFilename, fs); if (configData) { currentPattern.jsonFileData = configData; @@ -327,7 +329,7 @@ const pattern_assembler = function () { //look for a listitems.json file for this template try { var listJsonFileName = path.resolve(patternsPath, currentPattern.subdir, currentPattern.fileName + ".listitems"); - let listItemsConfig = dataLoader.loadDataFromFile(listJsonFileName, fs); + const listItemsConfig = dataLoader.loadDataFromFile(listJsonFileName, fs); if (listItemsConfig) { currentPattern.listitems = listItemsConfig; diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 043ff7276..c431da149 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -12,7 +12,6 @@ const diveSync = require('diveSync'); const dive = require('dive'); -const glob = require('glob'); const _ = require('lodash'); const path = require('path'); const chalk = require('chalk'); From db370ebcc7c5bea4d2f119d9df81402c08e1a5d8 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 6 Oct 2017 15:06:40 -0500 Subject: [PATCH 71/98] update version number part of #602 --- core/lib/patternlab.js | 2 +- package-lock.json | 90 +++++++++++++++++++++++++++++++++++------- package.json | 4 +- 3 files changed, 79 insertions(+), 17 deletions(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index c431da149..ce7737012 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -1,5 +1,5 @@ /* - * patternlab-node - v2.12.0 - 2017 + * patternlab-node - v3.0.0-alpha.1 - 2017 * * Brian Muenzenmeyer, Geoff Pursell, Raphael Okon, tburny and the web community. * Licensed under the MIT license. diff --git a/package-lock.json b/package-lock.json index 547e89b54..71cb7097e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "patternlab-node", - "version": "2.12.0", + "version": "3.0.0-alpha.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -62,6 +62,11 @@ "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "append": { "version": "https://registry.npmjs.org/append/-/append-0.1.1.tgz", "integrity": "sha1-fl3TJ3RweNh3KG+7Yksej00rOWs=" @@ -101,6 +106,21 @@ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "dev": true }, + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "requires": { + "lodash": "4.17.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + } + } + }, "asynckit": { "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", @@ -469,6 +489,11 @@ "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", "dev": true }, + "dive": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/dive/-/dive-0.5.0.tgz", + "integrity": "sha1-BtDgft0l2oSVmLrKtE1R8oCb7Ec=" + }, "diveSync": { "version": "https://registry.npmjs.org/diveSync/-/diveSync-0.3.0.tgz", "integrity": "sha1-2ZgEk64zvuw29P7G8XH/IYEwzBI=", @@ -818,6 +843,29 @@ "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz" } }, + "fs-promise": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-1.0.0.tgz", + "integrity": "sha1-QkakzUVJfS7Vfm5LIhZ9OGSyNnk=", + "requires": { + "any-promise": "1.3.0", + "fs-extra": "1.0.0", + "mz": "2.7.0", + "thenify-all": "1.6.0" + }, + "dependencies": { + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "klaw": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + } + } + } + }, "fs.realpath": { "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" @@ -1317,15 +1365,21 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "mustache": { - "version": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", - "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=" - }, "mute-stream": { "version": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "1.3.0", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "thenify-all": "1.6.0" + } + }, "natural-compare": { "version": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", @@ -2778,8 +2832,7 @@ }, "object-assign": { "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "once": { "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2848,13 +2901,6 @@ "version": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, - "patternengine-node-mustache": { - "version": "https://registry.npmjs.org/patternengine-node-mustache/-/patternengine-node-mustache-1.0.2.tgz", - "integrity": "sha1-HAnzo2CRiougtV5YLPfAPZjdy+M=", - "requires": { - "mustache": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz" - } - }, "pify": { "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" @@ -3309,6 +3355,22 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "requires": { + "any-promise": "1.3.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": "3.3.0" + } + }, "through": { "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", diff --git a/package.json b/package.json index f00de67e2..9f240b073 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "patternlab-node", "description": "Pattern Lab is a collection of tools to help you create atomic design systems. This is the node command line interface (CLI).", - "version": "3.0.0", + "version": "3.0.0-alpha.1", "main": "./core/lib/patternlab.js", "dependencies": { "async": "^2.1.2", @@ -54,7 +54,7 @@ "license": "MIT", "scripts": { "lint": "eslint core/**/*.js", - "pretest" : "npm run lint", + "pretest": "npm run lint", "test": "tap test/*_tests.js --reporter spec --coverage" }, "engines": { From 54a21000f28b269f571b7e6073b89af7a73efade Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 6 Oct 2017 15:17:45 -0500 Subject: [PATCH 72/98] updating lockfile - only three failing tests so far --- package-lock.json | 6929 +++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 3820 insertions(+), 3111 deletions(-) diff --git a/package-lock.json b/package-lock.json index 71cb7097e..d37a30043 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,108 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "abbrev": { - "version": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" - }, - "acorn": { - "version": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha1-kRy1PgNoB88Pp3jcXTcPvYZCRtc=", - "dev": true - }, - "acorn-jsx": { - "version": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" - }, - "dependencies": { - "acorn": { - "version": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" - } - }, - "ajv-keywords": { - "version": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "ansi-align": { - "version": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - } - }, - "ansi-escapes": { - "version": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, - "append": { - "version": "https://registry.npmjs.org/append/-/append-0.1.1.tgz", - "integrity": "sha1-fl3TJ3RweNh3KG+7Yksej00rOWs=" - }, - "argparse": { - "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "requires": { - "sprintf-js": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - } - }, - "array-union": { - "version": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" - } - }, - "array-uniq": { - "version": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "arrify": { - "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, "async": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", @@ -121,3240 +24,3709 @@ } } }, - "asynckit": { - "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true - }, - "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "bcrypt-pbkdf": { - "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - } - }, - "bluebird": { - "version": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", - "dev": true - }, - "boom": { - "version": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" - } - }, - "boxen": { - "version": "https://registry.npmjs.org/boxen/-/boxen-1.2.1.tgz", - "integrity": "sha1-DxHn/jRO25OXl3/BPt5/ZNlWSB0=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-align": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "cli-boxes": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "term-size": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "widest-line": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", - "requires": { - "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha1-rFvs8U+iG5nGySynp9fP1bF+dD4=", - "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz" - } + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha1-iD992rwWUUKyphQn8zUt7RldGj4=", + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz" + "ansi-regex": "2.1.1" } - } - } - }, - "brace-expansion": { - "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } - }, - "caller-path": { - "version": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz" - } - }, - "callsites": { - "version": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "capture-stack-trace": { - "version": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" - }, - "caseless": { - "version": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - } - }, - "circular-json": { - "version": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", - "dev": true - }, - "clean-yaml-object": { - "version": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", - "dev": true - }, - "cli-boxes": { - "version": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "cli-cursor": { - "version": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz" - } - }, - "cli-width": { - "version": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "co": { - "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "color-convert": { - "version": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "requires": { - "color-name": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - } - }, - "color-name": { - "version": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-support": { - "version": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", - "dev": true - }, - "combined-stream": { - "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - } - }, - "commander": { - "version": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", - "dev": true - }, - "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "typedarray": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" - } - }, - "config-chain": { - "version": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", - "requires": { - "ini": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "proto-list": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" - } - }, - "configstore": { - "version": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", - "integrity": "sha1-CU7mYquD+tmRdnjeEU+q6o/NypA=", - "requires": { - "dot-prop": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "make-dir": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "unique-string": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "write-file-atomic": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "xdg-basedir": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz" - } - }, - "core-util-is": { - "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "coveralls": { - "version": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", - "integrity": "sha1-mtfCrlJ0F/Nh6LYmSD9I7pLdK8c=", - "dev": true, - "requires": { - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "lcov-parse": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "log-driver": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "request": "https://registry.npmjs.org/request/-/request-2.79.0.tgz" - }, - "dependencies": { - "esprima": { - "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true }, - "js-yaml": { - "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", - "dev": true, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + "ansi-regex": "2.1.1" } }, - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "create-error-class": { - "version": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "requires": { - "capture-stack-trace": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz" - } - }, - "cross-spawn": { - "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "shebang-command": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" - }, - "dependencies": { - "lru-cache": { - "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", - "requires": { - "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" - } - } - } - }, - "cryptiles": { - "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" - } - }, - "crypto-random-string": { - "version": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "d": { - "version": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz" - } - }, - "dashdash": { - "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - } - }, - "deep-extend": { - "version": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "deep-is": { - "version": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deeper": { - "version": "https://registry.npmjs.org/deeper/-/deeper-2.1.0.tgz", - "integrity": "sha1-vFZOX3MXT98gHgiwADDooU2nQ2g=", - "dev": true - }, - "del": { - "version": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "is-path-cwd": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "is-path-in-cwd": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz" - } - }, - "delayed-stream": { - "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "diff": { - "version": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, "dive": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/dive/-/dive-0.5.0.tgz", "integrity": "sha1-BtDgft0l2oSVmLrKtE1R8oCb7Ec=" }, "diveSync": { - "version": "https://registry.npmjs.org/diveSync/-/diveSync-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/diveSync/-/diveSync-0.3.0.tgz", "integrity": "sha1-2ZgEk64zvuw29P7G8XH/IYEwzBI=", "requires": { - "append": "https://registry.npmjs.org/append/-/append-0.1.1.tgz" - } - }, - "doctrine": { - "version": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } - }, - "dot-prop": { - "version": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", - "requires": { - "is-obj": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" - } - }, - "duplexer3": { - "version": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" - } - }, - "encoding": { - "version": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz" - } - }, - "entities": { - "version": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" - }, - "es5-ext": { - "version": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", - "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", - "dev": true, - "requires": { - "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" - } - }, - "es6-iterator": { - "version": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", - "dev": true, - "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" - } - }, - "es6-map": { - "version": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", - "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "es6-set": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "event-emitter": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" - } - }, - "es6-set": { - "version": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", - "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "event-emitter": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" - } - }, - "es6-symbol": { - "version": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz" - } - }, - "es6-weak-map": { - "version": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", - "es6-iterator": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "es6-symbol": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz" + "append": "0.1.1" + }, + "dependencies": { + "append": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/append/-/append-0.1.1.tgz", + "integrity": "sha1-fl3TJ3RweNh3KG+7Yksej00rOWs=" + } } }, - "escape-string-regexp": { - "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escope": { - "version": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, + "editorconfig": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz", + "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==", "requires": { - "es6-map": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "es6-weak-map": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "esrecurse": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + "bluebird": "3.5.1", + "commander": "2.11.0", + "lru-cache": "3.2.0", + "semver": "5.4.1", + "sigmund": "1.0.1" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + } } }, "eslint": { - "version": "https://registry.npmjs.org/eslint/-/eslint-3.5.0.tgz", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.5.0.tgz", "integrity": "sha1-IvyfeA6lvKEwb6srbTM2sPpix1Q=", "dev": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "doctrine": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "escope": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "espree": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "file-entry-cache": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "globals": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "ignore": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", - "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "inquirer": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "is-my-json-valid": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", - "is-resolvable": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "natural-compare": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "path-is-inside": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "pluralize": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "progress": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "require-uncached": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "shelljs": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "table": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "text-table": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "user-home": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz" + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "escope": "3.6.0", + "espree": "3.5.1", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.5", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.1", + "is-resolvable": "1.0.0", + "js-yaml": "3.10.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.13.1", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.6.1", + "strip-bom": "3.0.0", + "strip-json-comments": "1.0.4", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" }, "dependencies": { - "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "acorn": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "co": "4.6.0", + "json-stable-stringify": "1.0.1" } }, - "strip-json-comments": { - "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", "dev": true - } - } - }, - "espree": { - "version": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", - "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", - "dev": true, - "requires": { - "acorn": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "acorn-jsx": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz" - } - }, - "esprima": { - "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" - }, - "esrecurse": { - "version": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } - }, - "estraverse": { - "version": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "event-emitter": { - "version": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "es5-ext": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz" - } - }, - "events-to-array": { - "version": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", - "dev": true - }, - "execa": { - "version": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "get-stream": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "npm-run-path": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "p-finally": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "strip-eof": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" - } - }, - "exit-hook": { - "version": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "extend": { - "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extsprintf": { - "version": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-levenshtein": { - "version": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } - }, - "file-entry-cache": { - "version": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } - }, - "flat-cache": { - "version": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "del": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "write": "https://registry.npmjs.org/write/-/write-0.2.1.tgz" - } - }, - "foreground-child": { - "version": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" - }, - "dependencies": { - "cross-spawn": { - "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + "array-uniq": "1.0.3" } }, - "lru-cache": { - "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + "callsites": "0.2.0" } - } - } - }, - "forever-agent": { - "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz" - } - }, - "fs-extra": { - "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "klaw": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz" - } - }, - "fs-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-1.0.0.tgz", - "integrity": "sha1-QkakzUVJfS7Vfm5LIhZ9OGSyNnk=", - "requires": { - "any-promise": "1.3.0", - "fs-extra": "1.0.0", - "mz": "2.7.0", - "thenify-all": "1.6.0" - }, - "dependencies": { - "fs-extra": { + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "d": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "klaw": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + "es5-ext": "0.10.30" } - } - } - }, - "fs.realpath": { - "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "generate-function": { - "version": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" - } - }, - "get-stream": { - "version": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "getpass": { - "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true - } - } - }, - "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.0.0.tgz", - "integrity": "sha1-OyCjV//89GuzhK7W+K6aZH/basQ=", - "requires": { - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - } - }, - "globals": { - "version": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", - "dev": true - }, - "globby": { - "version": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - }, - "dependencies": { - "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" } - } - } - }, - "got": { - "version": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "requires": { - "create-error-class": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "duplexer3": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "get-stream": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "is-redirect": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "is-retry-allowed": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "lowercase-keys": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "timed-out": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "unzip-response": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "url-parse-lax": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz" - } - }, - "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "graphlib": { - "version": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.1.tgz", - "integrity": "sha1-QjUsUrovTQNctWbrkfc5X3bryVE=", - "requires": { - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz" - } - }, - "har-validator": { - "version": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "commander": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "is-my-json-valid": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "has-ansi": { - "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - } - }, - "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "hawk": { - "version": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "cryptiles": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "sntp": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" - } - }, - "hoek": { - "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "http-signature": { - "version": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "jsprim": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "sshpk": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz" - } - }, - "iconv-lite": { - "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=" - }, - "ignore": { - "version": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", - "integrity": "sha1-xOcVRV9gc6jX5drnLS/J1xZj26Y=", - "dev": true - }, - "import-lazy": { - "version": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "imurmurhash": { - "version": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "inflight": { - "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - }, - "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "inquirer": { - "version": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true, - "requires": { - "ansi-escapes": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "cli-cursor": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "cli-width": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "figures": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", - "readline2": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "run-async": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "rx-lite": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + "esutils": "2.0.2", + "isarray": "1.0.0" } }, - "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "es5-ext": { + "version": "0.10.30", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", + "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", "dev": true, "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" } - } - } - }, - "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-my-json-valid": { - "version": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", - "integrity": "sha1-WoRnd+LCYg0eaRBOXToDsfYIjxE=", - "dev": true, - "requires": { - "generate-function": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "generate-object-property": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "jsonpointer": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - }, - "is-npm": { - "version": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" - }, - "is-obj": { - "version": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-path-cwd": { - "version": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz" - } - }, - "is-path-inside": { - "version": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true, - "requires": { - "path-is-inside": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" - } - }, - "is-property": { - "version": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-redirect": { - "version": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, - "is-resolvable": { - "version": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz" - } - }, - "is-retry-allowed": { - "version": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, - "is-stream": { - "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-typedarray": { - "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isstream": { - "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-beautify": { - "version": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.6.3.tgz", - "integrity": "sha1-1/HrUVzsFsmfDXS/9f1vl2fySjc=", - "requires": { - "config-chain": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "nopt": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" - } - }, - "js-yaml": { - "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", - "requires": { - "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" - } - }, - "jsbn": { - "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-stable-stringify": { - "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" - } - }, - "json-stringify-safe": { - "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonfile": { - "version": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" - } - }, - "jsonify": { - "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "json-schema": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "verror": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "klaw": { - "version": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" - } - }, - "latest-version": { - "version": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "requires": { - "package-json": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz" - } - }, - "lcov-parse": { - "version": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "levn": { - "version": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" - } - }, - "linkify-it": { - "version": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz", - "integrity": "sha1-B3NSbDF8j9E71TTuHRgP+Iq/iBo=", - "requires": { - "uc.micro": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz" - } - }, - "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", - "integrity": "sha1-g+SxCRP0hJbU0W/sSlYK8u50S2g=" - }, - "log-driver": { - "version": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", - "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", - "dev": true - }, - "lowercase-keys": { - "version": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - }, - "make-dir": { - "version": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", - "requires": { - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - } - }, - "markdown-it": { - "version": "https://registry.npmjs.org/markdown-it/-/markdown-it-6.0.1.tgz", - "integrity": "sha1-lKayVM9OYgutKyJidL/u2Vrxx8U=", - "requires": { - "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "entities": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "linkify-it": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz", - "mdurl": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "uc.micro": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz" - } - }, - "mdurl": { - "version": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "mime-db": { - "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", - "dev": true - }, - "mime-types": { - "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "dev": true, - "requires": { - "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz" - } - }, - "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" - } - }, - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stream": { - "version": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "1.3.0", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "thenify-all": "1.6.0" - } - }, - "natural-compare": { - "version": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-fetch": { - "version": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.0.tgz", - "integrity": "sha1-AMzYEcZXruni8Nef0iVvvP/XM6I=", - "requires": { - "encoding": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" - } - }, - "nopt": { - "version": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" - } - }, - "npm-run-path": { - "version": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" - } - }, - "number-is-nan": { - "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nyc": { - "version": "https://registry.npmjs.org/nyc/-/nyc-7.1.0.tgz", - "integrity": "sha1-jhSXHzoV0au+x6xhDvVMuInp/7Q=", - "dev": true, - "requires": { - "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "caching-transform": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.3.0.tgz", - "default-require-extensions": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "find-cache-dir": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "foreground-child": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.3.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0-alpha.4.tgz", - "istanbul-lib-hook": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0-alpha.4.tgz", - "istanbul-lib-instrument": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.1.0-alpha.4.tgz", - "istanbul-lib-report": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz", - "istanbul-lib-source-maps": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.0.0-alpha.10.tgz", - "istanbul-reports": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.0.0-alpha.8.tgz", - "md5-hex": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "pkg-up": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "resolve-from": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "spawn-wrap": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.2.4.tgz", - "test-exclude": "https://registry.npmjs.org/test-exclude/-/test-exclude-1.1.0.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" - }, - "dependencies": { - "align-text": { - "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", - "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-symbol": "3.1.1" } }, - "amdefine": { - "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-iterator": "2.0.1", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } }, - "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } }, - "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } }, - "append-transform": { - "version": "https://registry.npmjs.org/append-transform/-/append-transform-0.3.0.tgz", - "integrity": "sha1-1pM85KhfCURdnMxMwRkFG3OBqBM=", + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "arr-diff": { - "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "espree": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", + "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", + "dev": true, + "requires": { + "acorn": "5.1.2", + "acorn-jsx": "3.0.1" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, "requires": { - "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz" + "estraverse": "4.2.0", + "object-assign": "4.1.1" } }, - "arr-flatten": { - "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", - "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=", + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, - "array-unique": { - "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, - "arrify": { - "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", "dev": true }, - "async": { - "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "babel-code-frame": { - "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.11.0.tgz", - "integrity": "sha1-kHLdI1P7D4W2tX0sl/DRNNGIrtg=", + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz" + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" } }, - "babel-generator": { - "version": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.11.4.tgz", - "integrity": "sha1-FPaTOrsgxiZm0n47e59bncBxKpo=", + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.11.1.tgz", - "detect-indent": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + "flat-cache": "1.3.0", + "object-assign": "4.1.1" } }, - "babel-messages": { - "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz", - "integrity": "sha1-v1BHNsqWfm1l7wrbWipflHyODrk=", + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz" + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" } }, - "babel-runtime": { - "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", - "integrity": "sha1-1/45G8LMKbgIfB2bOYeJEun8/Vk=", + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true, "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz" + "is-property": "1.0.2" } }, - "babel-template": { - "version": "https://registry.npmjs.org/babel-template/-/babel-template-6.9.0.tgz", - "integrity": "sha1-lwkPz2vBVoW08FvmXAqUOKp+I+M=", + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.11.4.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.11.1.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.8.4.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz" + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, - "babel-traverse": { - "version": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.11.4.tgz", - "integrity": "sha1-On3vakwf6fWLWcmiK+gfYZ+Cl2w=", + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "ignore": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", + "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true, "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.11.0.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.11.1.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.8.4.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "globals": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz" + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.13.1", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" } }, - "babel-types": { - "version": "https://registry.npmjs.org/babel-types/-/babel-types-6.11.1.tgz", - "integrity": "sha1-o981W6uQ3c9mMYZAcXzywVTmZIo=", + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.11.4.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz" + "number-is-nan": "1.0.1" } }, - "babylon": { - "version": "https://registry.npmjs.org/babylon/-/babylon-6.8.4.tgz", - "integrity": "sha1-CXMGuNq66VFZIlzymz6lWRIFMYA=", + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", "dev": true, "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.9.2.tgz" + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" } }, - "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", "dev": true }, - "brace-expansion": { - "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true, "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "is-path-inside": "1.0.0" } }, - "braces": { - "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", "dev": true, "requires": { - "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" + "path-is-inside": "1.0.2" } }, - "builtin-modules": { - "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", "dev": true }, - "caching-transform": { - "version": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", "dev": true, "requires": { - "md5-hex": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "write-file-atomic": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.1.4.tgz" + "tryit": "1.0.3" } }, - "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, - "center-align": { - "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, - "optional": true, "requires": { - "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "lazy-cache": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" + "jsonify": "0.0.0" } }, - "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - } + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true }, - "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, - "optional": true, "requires": { - "center-align": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "right-align": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" - }, - "dependencies": { - "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } + "prelude-ls": "1.1.2", + "type-check": "0.3.2" } }, - "code-point-at": { - "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", - "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + "minimist": "0.0.8" } }, - "commondir": { - "version": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true }, - "convert-source-map": { - "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.3.0.tgz", - "integrity": "sha1-6fPpxuJyjvwmdmlqcOs4L3MQamc=", + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "core-js": { - "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "cross-spawn": { - "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.0.tgz", - "integrity": "sha1-glR3SrR4a4xbPPTfumbOVjkywlI=", - "dev": true, - "requires": { - "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.2.10.tgz" - } + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "wrappy": "1.0.2" } }, - "decamelize": { - "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, - "default-require-extensions": { - "version": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" } }, - "detect-indent": { - "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", - "dev": true, - "requires": { - "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "repeating": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz" - }, - "dependencies": { - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true }, - "error-ex": { - "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + "pinkie": "2.0.4" } }, - "escape-string-regexp": { - "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "dev": true }, - "esutils": { - "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "dev": true }, - "expand-brackets": { - "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, - "expand-range": { - "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true, "requires": { - "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" } }, - "extglob": { - "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + "caller-path": "0.1.0", + "resolve-from": "1.0.1" } }, - "filename-regex": { - "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", - "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=", + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, - "fill-range": { - "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "randomatic": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", - "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } }, - "find-cache-dir": { - "version": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "commondir": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" + "glob": "7.1.2" } }, - "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true, "requires": { - "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "once": "1.4.0" } }, - "for-in": { - "version": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz", - "integrity": "sha1-AHN04rbVxnQgoUeb23WgSHK3OMQ=", + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", "dev": true }, - "for-own": { - "version": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", - "integrity": "sha1-AUm0GjkIjHUV9R6+HBOG1F+TUHI=", - "dev": true, - "requires": { - "for-in": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz" - } - }, - "foreground-child": { - "version": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.3.tgz", - "integrity": "sha1-lN1qumcTiYZ96OV+mfHC7PsVwBo=", - "dev": true, - "requires": { - "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.0.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz" - } - }, - "fs.realpath": { - "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, - "get-caller-file": { - "version": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.1.tgz", - "integrity": "sha1-qm/3uYobItwMizuQX6sytVL1rEE=", + "shelljs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", "dev": true }, - "get-stdin": { - "version": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, - "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", - "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + "safe-buffer": "5.1.1" } }, - "glob-base": { - "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, - "glob-parent": { - "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + "ansi-regex": "2.1.1" } }, - "globals": { - "version": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=", + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true }, - "handlebars": { - "version": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", - "integrity": "sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc=", + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { - "async": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "optimist": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.0.tgz" + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.13.1", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" }, "dependencies": { - "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { - "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" + "ansi-regex": "3.0.0" } } } }, - "has-ansi": { - "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" - } - }, - "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "hosted-git-info": { - "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "imurmurhash": { - "version": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", "dev": true }, - "inflight": { - "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "prelude-ls": "1.1.2" } }, - "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "invariant": { - "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.1.tgz", - "integrity": "sha1-sJcBBUdmjH4zcCjr6Bbr42yKjVQ=", + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true, "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz" + "os-homedir": "1.0.2" } }, - "invert-kv": { - "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "is-arrayish": { - "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "is-buffer": { - "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", - "integrity": "sha1-24l/w/esotUN6UtsjCiWpHcWJ68=", + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "is-builtin-module": { - "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + "mkdirp": "0.5.1" } }, - "is-dotfile": { - "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", - "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true + } + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "4.1.11" + } }, - "is-equal-shallow": { - "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "requires": { - "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + "graceful-fs": "4.1.11" } }, - "is-extendable": { - "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "is-extglob": { - "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + } + } + }, + "fs-promise": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-1.0.0.tgz", + "integrity": "sha1-QkakzUVJfS7Vfm5LIhZ9OGSyNnk=", + "requires": { + "any-promise": "1.3.0", + "fs-extra": "1.0.0", + "mz": "2.7.0", + "thenify-all": "1.6.0" + }, + "dependencies": { + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "klaw": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + } + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "is-finite": { - "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", - "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", - "dev": true, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + "balanced-match": "1.0.0", + "concat-map": "0.0.1" } }, - "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + "once": "1.4.0", + "wrappy": "1.0.2" } }, - "is-glob": { - "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } + }, + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graphlib": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.1.tgz", + "integrity": "sha1-QjUsUrovTQNctWbrkfc5X3bryVE=", + "requires": { + "lodash": "4.13.1" + } + }, + "js-beautify": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.3.tgz", + "integrity": "sha512-mT9skIu0OWfBQPXOGJ4CgpPBgo3tj9gxi7weQdeaxxmpKIADK2g0xS0qCtQml7Ny3Ick5Cno093LKGZTzDd2UQ==", + "requires": { + "config-chain": "1.1.11", + "editorconfig": "0.13.3", + "mkdirp": "0.5.1", + "nopt": "3.0.6" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "config-chain": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", + "requires": { + "ini": "1.3.4", + "proto-list": "1.2.4" + } + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1.1.1" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + } + } + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "1.0.3" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + } + } + }, + "jsonfile": { + "version": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } + }, + "klaw": { + "version": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } + }, + "lodash": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", + "integrity": "sha1-g+SxCRP0hJbU0W/sSlYK8u50S2g=" + }, + "lru-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", + "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", + "requires": { + "pseudomap": "1.0.2" + }, + "dependencies": { + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + } + } + }, + "markdown-it": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-6.1.1.tgz", + "integrity": "sha1-ztA39Ec+6fUVOsQU933IPJG6knw=", + "requires": { + "argparse": "1.0.9", + "entities": "1.1.1", + "linkify-it": "1.2.4", + "mdurl": "1.0.1", + "uc.micro": "1.0.3" + }, + "dependencies": { + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "1.0.3" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, + "linkify-it": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz", + "integrity": "sha1-B3NSbDF8j9E71TTuHRgP+Iq/iBo=", + "requires": { + "uc.micro": "1.0.3" + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "uc.micro": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz", + "integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=" + } + } + }, + "mustache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", + "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=" + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "1.3.0", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "thenify-all": "1.6.0" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + }, + "dependencies": { + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + "iconv-lite": "0.4.19" } }, - "is-number": { - "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + } + } + }, + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "patternengine-node-mustache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/patternengine-node-mustache/-/patternengine-node-mustache-1.0.2.tgz", + "integrity": "sha1-HAnzo2CRiougtV5YLPfAPZjdy+M=", + "requires": { + "mustache": "2.3.0" + } + }, + "rewire": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/rewire/-/rewire-2.5.2.tgz", + "integrity": "sha1-ZCfee3/u+n02QBUH62SlOFvFjcc=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "tap": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/tap/-/tap-7.1.2.tgz", + "integrity": "sha1-36w+zxSshUe7rSW70Wzyw3Q/Zc8=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "clean-yaml-object": "0.1.0", + "color-support": "1.1.3", + "coveralls": "2.13.3", + "deeper": "2.1.0", + "foreground-child": "1.5.6", + "glob": "7.1.2", + "isexe": "1.1.2", + "js-yaml": "3.10.0", + "nyc": "7.1.0", + "only-shallow": "1.2.0", + "opener": "1.4.3", + "os-homedir": "1.0.1", + "readable-stream": "2.3.3", + "signal-exit": "3.0.2", + "stack-utils": "0.4.0", + "tap-mocha-reporter": "2.0.1", + "tap-parser": "2.2.3", + "tmatch": "2.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz" + "sprintf-js": "1.0.3" } }, - "is-posix-bracket": { - "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", "dev": true }, - "is-primitive": { - "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "dev": true }, - "is-utf8": { - "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", "dev": true }, - "isexe": { - "version": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "dev": true }, - "isobject": { - "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "dev": true, + "optional": true, "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "tweetnacl": "0.14.5" } }, - "istanbul-lib-coverage": { - "version": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0-alpha.4.tgz", - "integrity": "sha1-Ym9/2c+Am2479+1CqAn44LZK6XY=", + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", "dev": true }, - "istanbul-lib-hook": { - "version": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0-alpha.4.tgz", - "integrity": "sha1-jFu59vvYUm4K5s9jmvKCZpBrk48=", + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, "requires": { - "append-transform": "https://registry.npmjs.org/append-transform/-/append-transform-0.3.0.tgz" + "hoek": "2.16.3" } }, - "istanbul-lib-instrument": { - "version": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.1.0-alpha.4.tgz", - "integrity": "sha1-d9mxE+n3YaqEmIM5ATpyA6zJitw=", + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "dev": true, "requires": { - "babel-generator": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.11.4.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.9.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.11.4.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.11.1.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.8.4.tgz", - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0-alpha.4.tgz" + "delayed-stream": "1.0.0" } }, - "istanbul-lib-report": { - "version": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz", - "integrity": "sha1-MtX27H8zyjpgIgnieLLm/xQ0mK8=", + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "coveralls": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", + "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==", "dev": true, "requires": { - "async": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0-alpha.4.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz" + "js-yaml": "3.6.1", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.79.0" }, "dependencies": { + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + } + } + }, + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deeper": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deeper/-/deeper-2.1.0.tgz", + "integrity": "sha1-vFZOX3MXT98gHgiwADDooU2nQ2g=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "4.0.2", + "signal-exit": "3.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.16.1", + "pinkie-promise": "2.0.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nyc": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-7.1.0.tgz", + "integrity": "sha1-jhSXHzoV0au+x6xhDvVMuInp/7Q=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "caching-transform": "1.0.1", + "convert-source-map": "1.3.0", + "default-require-extensions": "1.0.0", + "find-cache-dir": "0.1.1", + "find-up": "1.1.2", + "foreground-child": "1.5.3", + "glob": "7.0.5", + "istanbul-lib-coverage": "1.0.0-alpha.4", + "istanbul-lib-hook": "1.0.0-alpha.4", + "istanbul-lib-instrument": "1.1.0-alpha.4", + "istanbul-lib-report": "1.0.0-alpha.3", + "istanbul-lib-source-maps": "1.0.0-alpha.10", + "istanbul-reports": "1.0.0-alpha.8", + "md5-hex": "1.3.0", + "micromatch": "2.3.11", + "mkdirp": "0.5.1", + "pkg-up": "1.0.0", + "resolve-from": "2.0.0", + "rimraf": "2.5.4", + "signal-exit": "3.0.0", + "spawn-wrap": "1.2.4", + "test-exclude": "1.1.0", + "yargs": "4.8.1", + "yargs-parser": "2.4.1" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.0.3", + "longest": "1.0.1", + "repeat-string": "1.5.4" + } + }, + "amdefine": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "0.3.0", + "bundled": true, + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "arr-flatten": "1.0.1" + } + }, + "arr-flatten": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "async": { + "version": "1.5.2", + "bundled": true, + "dev": true + }, + "babel-code-frame": { + "version": "6.11.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.9.2", + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "2.0.0" + } + }, + "babel-generator": { + "version": "6.11.4", + "bundled": true, + "dev": true, + "requires": { + "babel-messages": "6.8.0", + "babel-runtime": "6.9.2", + "babel-types": "6.11.1", + "detect-indent": "3.0.1", + "lodash": "4.13.1", + "source-map": "0.5.6" + } + }, + "babel-messages": { + "version": "6.8.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.9.2" + } + }, + "babel-runtime": { + "version": "6.9.2", + "bundled": true, + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.9.5" + } + }, + "babel-template": { + "version": "6.9.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.9.2", + "babel-traverse": "6.11.4", + "babel-types": "6.11.1", + "babylon": "6.8.4", + "lodash": "4.13.1" + } + }, + "babel-traverse": { + "version": "6.11.4", + "bundled": true, + "dev": true, + "requires": { + "babel-code-frame": "6.11.0", + "babel-messages": "6.8.0", + "babel-runtime": "6.9.2", + "babel-types": "6.11.1", + "babylon": "6.8.4", + "debug": "2.2.0", + "globals": "8.18.0", + "invariant": "2.2.1", + "lodash": "4.13.1" + } + }, + "babel-types": { + "version": "6.11.1", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.9.2", + "babel-traverse": "6.11.4", + "esutils": "2.0.2", + "lodash": "4.13.1", + "to-fast-properties": "1.0.2" + } + }, + "babylon": { + "version": "6.8.4", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.9.2" + } + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.6", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "bundled": true, + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "caching-transform": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.1.4" + } + }, + "camelcase": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.0" + } + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "core-js": { + "version": "2.4.1", + "bundled": true, + "dev": true + }, + "cross-spawn": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "4.0.1", + "which": "1.2.10" + } + }, + "debug": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "detect-indent": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "minimist": "1.2.0", + "repeating": "1.1.3" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "error-ex": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "bundled": true, + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "bundled": true, + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "bundled": true, + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.5", + "repeat-element": "1.1.2", + "repeat-string": "1.5.4" + } + }, + "find-cache-dir": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "for-in": { + "version": "0.1.5", + "bundled": true, + "dev": true + }, + "for-own": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "for-in": "0.1.5" + } + }, + "foreground-child": { + "version": "1.5.3", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "4.0.0", + "signal-exit": "3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "get-caller-file": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "glob": { + "version": "7.0.5", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.5", + "inherits": "2.0.1", + "minimatch": "3.0.2", + "once": "1.3.3", + "path-is-absolute": "1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "8.18.0", + "bundled": true, + "dev": true + }, + "graceful-fs": { + "version": "4.1.4", + "bundled": true, + "dev": true + }, + "handlebars": { + "version": "4.0.5", + "bundled": true, + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "bundled": true, + "dev": true, + "requires": { + "amdefine": "1.0.0" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.1.5", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "once": "1.3.3", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "invariant": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "1.2.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-buffer": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-dotfile": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-finite": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.0" + } + }, + "is-glob": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.0.3" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "isobject": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.0.0-alpha.4", + "bundled": true, + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.0.0-alpha.4", + "bundled": true, + "dev": true, + "requires": { + "append-transform": "0.3.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.1.0-alpha.4", + "bundled": true, + "dev": true, + "requires": { + "babel-generator": "6.11.4", + "babel-template": "6.9.0", + "babel-traverse": "6.11.4", + "babel-types": "6.11.1", + "babylon": "6.8.4", + "istanbul-lib-coverage": "1.0.0-alpha.4" + } + }, + "istanbul-lib-report": { + "version": "1.0.0-alpha.3", + "bundled": true, + "dev": true, + "requires": { + "async": "1.5.2", + "istanbul-lib-coverage": "1.0.0-alpha.4", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "rimraf": "2.5.4", + "supports-color": "3.1.2" + }, + "dependencies": { + "supports-color": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.0.0-alpha.10", + "bundled": true, + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.0.0-alpha.4", + "mkdirp": "0.5.1", + "rimraf": "2.5.4", + "source-map": "0.5.6" + } + }, + "istanbul-reports": { + "version": "1.0.0-alpha.8", + "bundled": true, + "dev": true, + "requires": { + "handlebars": "4.0.5" + } + }, + "js-tokens": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.3" + } + }, + "lazy-cache": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.4", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "lodash": { + "version": "4.13.1", + "bundled": true, + "dev": true + }, + "lodash.assign": { + "version": "4.0.9", + "bundled": true, + "dev": true, + "requires": { + "lodash.keys": "4.0.7", + "lodash.rest": "4.0.3" + } + }, + "lodash.keys": { + "version": "4.0.7", + "bundled": true, + "dev": true + }, + "lodash.rest": { + "version": "4.0.3", + "bundled": true, + "dev": true + }, + "longest": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "loose-envify": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "js-tokens": "1.0.3" + }, + "dependencies": { + "js-tokens": { + "version": "1.0.3", + "bundled": true, + "dev": true + } + } + }, + "lru-cache": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.0.0" + } + }, + "md5-hex": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "bundled": true, + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.0", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.0.3", + "normalize-path": "2.0.1", + "object.omit": "2.0.0", + "parse-glob": "3.0.4", + "regex-cache": "0.4.3" + } + }, + "minimatch": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.6" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "0.7.1", + "bundled": true, + "dev": true + }, + "normalize-package-data": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "2.1.5", + "is-builtin-module": "1.0.0", + "semver": "5.3.0", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "number-is-nan": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "object.omit": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "for-own": "0.1.4", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "os-homedir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.2", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "error-ex": "1.3.0" + } + }, + "path-exists": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.4", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "bundled": true, + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pkg-up": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "preserve": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "randomatic": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "requires": { + "is-number": "2.1.0", + "kind-of": "3.0.3" + } + }, + "read-pkg": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.3.5", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "regenerator-runtime": { + "version": "0.9.5", + "bundled": true, + "dev": true + }, + "regex-cache": { + "version": "0.4.3", + "bundled": true, + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3", + "is-primitive": "2.0.0" + } + }, + "repeat-element": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "repeat-string": { + "version": "1.5.4", + "bundled": true, + "dev": true + }, + "repeating": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "is-finite": "1.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "right-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.5.4", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.0.5" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "source-map": { + "version": "0.5.6", + "bundled": true, + "dev": true + }, + "spawn-wrap": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "requires": { + "foreground-child": "1.5.3", + "mkdirp": "0.5.1", + "os-homedir": "1.0.1", + "rimraf": "2.5.4", + "signal-exit": "2.1.2", + "which": "1.2.10" + }, + "dependencies": { + "signal-exit": { + "version": "2.1.2", + "bundled": true, + "dev": true + } + } + }, + "spdx-correct": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "spdx-license-ids": "1.2.1" + } + }, + "spdx-exceptions": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "1.0.5", + "spdx-license-ids": "1.2.1" + } + }, + "spdx-license-ids": { + "version": "1.2.1", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.0.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "1.1.0", + "bundled": true, "dev": true, "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "arrify": "1.0.1", + "lodash.assign": "4.0.9", + "micromatch": "2.3.11", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" } - } - } - }, - "istanbul-lib-source-maps": { - "version": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.0.0-alpha.10.tgz", - "integrity": "sha1-mxWlyLWdG5EBviy33VTHA9hq3vE=", - "dev": true, - "requires": { - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0-alpha.4.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" - } - }, - "istanbul-reports": { - "version": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.0.0-alpha.8.tgz", - "integrity": "sha1-CUgw9Mfz1ILkZqrIq9oklfmuRok=", - "dev": true, - "requires": { - "handlebars": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz" - } - }, - "js-tokens": { - "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz", - "integrity": "sha1-eZA/VWPud4zBFi5tzxoAJ8l/nLU=", - "dev": true - }, - "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", - "integrity": "sha1-xhYIdH2BWwNiVW2zJ2Nip6OK3tM=", - "dev": true, - "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" - } - }, - "lazy-cache": { - "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lcid": { - "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" - } - }, - "load-json-file": { - "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" - } - }, - "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", - "integrity": "sha1-g+SxCRP0hJbU0W/sSlYK8u50S2g=", - "dev": true - }, - "lodash.assign": { - "version": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.0.9.tgz", - "integrity": "sha1-Cgcx2TWQ3dm6RYn61lqvbuCSF+M=", - "dev": true, - "requires": { - "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.0.7.tgz", - "lodash.rest": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.3.tgz" - } - }, - "lodash.keys": { - "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.0.7.tgz", - "integrity": "sha1-MOGzvZjlTWoGEZkYEmhba8R8tjs=", - "dev": true - }, - "lodash.rest": { - "version": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.3.tgz", - "integrity": "sha1-TBwyxAAoCHJQ+r9w1C4BUVSPSMU=", - "dev": true - }, - "longest": { - "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.2.0.tgz", - "integrity": "sha1-aaZarT3lQs9O4PT+dOjjPHCcyw8=", - "dev": true, - "requires": { - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz" - }, - "dependencies": { - "js-tokens": { - "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.3.tgz", - "integrity": "sha1-FOVutoyPGpLEPVn1AU7CncIPKuE=", + }, + "to-fast-properties": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uglify-js": { + "version": "2.7.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "async": "0.2.10", + "source-map": "0.5.6", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "bundled": true, + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.2" + } + }, + "which": { + "version": "1.2.10", + "bundled": true, + "dev": true, + "requires": { + "isexe": "1.1.2" + } + }, + "which-module": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "window-size": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, "dev": true + }, + "write-file-atomic": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.4", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "4.8.1", + "bundled": true, + "dev": true, + "requires": { + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.1", + "lodash.assign": "4.0.9", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.1", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "2.4.1" + }, + "dependencies": { + "cliui": { + "version": "3.2.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.1", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.0.0" + } + }, + "window-size": { + "version": "0.2.0", + "bundled": true, + "dev": true + } + } + }, + "yargs-parser": { + "version": "2.4.1", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "3.0.0", + "lodash.assign": "4.0.9" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } } } }, - "lru-cache": { - "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", - "integrity": "sha1-E0OVXtry432bnn7nJB4nxLn7cr4=", - "dev": true, - "requires": { - "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz" - } - }, - "md5-hex": { - "version": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", - "dev": true, - "requires": { - "md5-o-matic": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz" - } - }, - "md5-o-matic": { - "version": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", - "dev": true - }, - "micromatch": { - "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", - "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", - "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", - "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz" - } - }, - "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", - "integrity": "sha1-DzmKcwDqRB6cNIyD2Yq4ydv5xAo=", - "dev": true, - "requires": { - "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" - } - }, - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "dev": true }, - "normalize-package-data": { - "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "dev": true, - "requires": { - "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" - } - }, - "normalize-path": { - "version": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", - "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=", + "only-shallow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/only-shallow/-/only-shallow-1.2.0.tgz", + "integrity": "sha1-cc7O26kyS8BRiu8Q7AgNMkncJGU=", "dev": true }, - "number-is-nan": { - "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", + "opener": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", + "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", "dev": true }, - "object.omit": { - "version": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", - "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", - "dev": true, - "requires": { - "for-own": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - } - }, - "once": { - "version": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - }, - "optimist": { - "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" - } - }, "os-homedir": { - "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", "dev": true }, - "os-locale": { - "version": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" - } - }, - "parse-glob": { - "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "is-dotfile": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" - } - }, - "parse-json": { - "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz" - } - }, - "path-exists": { - "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "path-is-absolute": { - "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - }, - "path-parse": { - "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-type": { - "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, "pinkie": { - "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true }, "pinkie-promise": { - "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - } - }, - "pkg-dir": { - "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" - } - }, - "pkg-up": { - "version": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "dev": true, - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + "pinkie": "2.0.4" } }, - "preserve": { - "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, "pseudomap": { - "version": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, - "randomatic": { - "version": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", - "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", - "dev": true, - "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz" - } - }, - "read-pkg": { - "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "path-type": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" - } - }, - "read-pkg-up": { - "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" - } - }, - "regenerator-runtime": { - "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz", - "integrity": "sha1-QD1tQKS9/5wzDdk5Lcuy2ai7ofw=", - "dev": true - }, - "regex-cache": { - "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" - } - }, - "repeat-element": { - "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true - }, - "repeating": { - "version": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "dev": true, - "requires": { - "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz" - } - }, - "require-directory": { - "version": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve-from": { - "version": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true - }, - "right-align": { - "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" - } - }, - "rimraf": { - "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", - "dev": true, - "requires": { - "glob": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz" - } - }, - "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "set-blocking": { - "version": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "signal-exit": { - "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true - }, - "slide": { - "version": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "spawn-wrap": { - "version": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.2.4.tgz", - "integrity": "sha1-kg6yEadpwJPuv71bDnpdLmirLkA=", - "dev": true, - "requires": { - "foreground-child": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.3.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.2.10.tgz" - }, - "dependencies": { - "signal-exit": { - "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", - "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=", - "dev": true - } - } - }, - "spdx-correct": { - "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz" - } - }, - "spdx-exceptions": { - "version": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz", - "integrity": "sha1-nSGsTaS9tx0GD7dOWmdTHQMsu6Y=", - "dev": true - }, - "spdx-expression-parse": { - "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", - "integrity": "sha1-1SsUtelnB3FECvIlvLVjEirEUvY=", - "dev": true, - "requires": { - "spdx-exceptions": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz", - "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz" - } + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true }, - "spdx-license-ids": { - "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", - "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=", + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", "dev": true }, - "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", - "integrity": "sha1-ySEptvHX9SrPmvQkom44ZKBc6wo=", + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, - "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", "dev": true, "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" } }, - "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" - } + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true }, - "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "test-exclude": { - "version": "https://registry.npmjs.org/test-exclude/-/test-exclude-1.1.0.tgz", - "integrity": "sha1-9d3XGJJ7Ev0C8nCgqpOc627qQVE=", + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, "requires": { - "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "lodash.assign": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.0.9.tgz", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" + "hoek": "2.16.3" } }, - "to-fast-properties": { - "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz", - "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=", + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "uglify-js": { - "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.0.tgz", - "integrity": "sha1-8CHji6LKdAhg9b1caVwqgXNF8Ow=", + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", "dev": true, - "optional": true, "requires": { - "async": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "uglify-to-browserify": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" }, "dependencies": { - "async": { - "version": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true, - "optional": true - }, - "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" - } + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true } } }, - "uglify-to-browserify": { - "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true + "stack-utils": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-0.4.0.tgz", + "integrity": "sha1-lAy4L8z6hOj/Lz/fKT/ngBa+zNE=", + "dev": true }, - "validate-npm-package-license": { - "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "spdx-correct": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz" + "safe-buffer": "5.1.1" } }, - "which": { - "version": "https://registry.npmjs.org/which/-/which-1.2.10.tgz", - "integrity": "sha1-kc2b0HUTIkEbZZtA8FSyHelXqy0=", + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "isexe": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz" + "ansi-regex": "2.1.1" } }, - "which-module": { - "version": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true + "tap-mocha-reporter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-2.0.1.tgz", + "integrity": "sha1-xwMWFz1uOhbFjhupLV1s2N5YoS4=", + "dev": true, + "requires": { + "color-support": "1.1.3", + "debug": "2.6.9", + "diff": "1.4.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "js-yaml": "3.10.0", + "readable-stream": "2.3.3", + "tap-parser": "2.2.3", + "unicode-length": "1.0.3" + } }, - "window-size": { - "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "tap-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-2.2.3.tgz", + "integrity": "sha1-rebpbje/04zg8WLaBn80A08GiwE=", "dev": true, - "optional": true + "requires": { + "events-to-array": "1.1.2", + "js-yaml": "3.10.0", + "readable-stream": "2.3.3" + } }, - "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "tmatch": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-2.0.1.tgz", + "integrity": "sha1-DFYkbzPzDaG409colauvFmYPOM8=", "dev": true }, - "wrap-ansi": { - "version": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.0.0.tgz", - "integrity": "sha1-fTD4+HP5pbvDpk2ryNF34HGuQm8=", + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", "dev": true, "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz" + "punycode": "1.4.1" } }, - "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", "dev": true }, - "write-file-atomic": { - "version": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.1.4.tgz", - "integrity": "sha1-sfUtwujcDjywTRh6JfdYo4qQyjs=", + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "unicode-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", + "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", "dev": true, "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "slide": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" + "punycode": "1.4.1", + "strip-ansi": "3.0.1" } }, - "y18n": { - "version": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "yallist": { - "version": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", - "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=", - "dev": true - }, - "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, - "requires": { - "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.1.tgz", - "lodash.assign": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.0.9.tgz", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", - "which-module": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" }, "dependencies": { - "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "wrap-ansi": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.0.0.tgz" - } - }, - "window-size": { - "version": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, - "yargs-parser": { - "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "lodash.assign": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.0.9.tgz" + "isexe": "2.0.0" }, "dependencies": { - "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true } } - } - } - }, - "oauth-sign": { - "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "once": { - "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - }, - "onetime": { - "version": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "only-shallow": { - "version": "https://registry.npmjs.org/only-shallow/-/only-shallow-1.2.0.tgz", - "integrity": "sha1-cc7O26kyS8BRiu8Q7AgNMkncJGU=", - "dev": true - }, - "opener": { - "version": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", - "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", - "dev": true - }, - "optionator": { - "version": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "fast-levenshtein": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" - } - }, - "os-homedir": { - "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "p-finally": { - "version": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "package-json": { - "version": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "registry-auth-token": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "registry-url": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" - } - }, - "path-is-absolute": { - "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - } - }, - "pluralize": { - "version": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "prelude-ls": { - "version": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "process-nextick-args": { - "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "progress": { - "version": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "proto-list": { - "version": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "pseudomap": { - "version": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "rc": { - "version": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "requires": { - "deep-extend": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "ini": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - }, - "dependencies": { - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } - }, - "readline2": { - "version": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "mute-stream": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - } - } - } - }, - "registry-auth-token": { - "version": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", - "requires": { - "rc": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" - } - }, - "registry-url": { - "version": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "requires": { - "rc": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz" - } - }, - "request": { - "version": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "caseless": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "form-data": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "har-validator": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "hawk": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "http-signature": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "uuid": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz" - } - }, - "require-uncached": { - "version": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "resolve-from": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz" - } - }, - "resolve-from": { - "version": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "restore-cursor": { - "version": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "onetime": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz" - } - }, - "rewire": { - "version": "https://registry.npmjs.org/rewire/-/rewire-2.5.2.tgz", - "integrity": "sha1-ZCfee3/u+n02QBUH62SlOFvFjcc=", - "dev": true - }, - "rimraf": { - "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", - "requires": { - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" - }, - "dependencies": { - "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - } - } - } - }, - "run-async": { - "version": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true, - "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - } - }, - "rx-lite": { - "version": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "safe-buffer": { - "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" - }, - "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" - }, - "semver-diff": { - "version": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" - } - }, - "shebang-command": { - "version": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" - } - }, - "shebang-regex": { - "version": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shelljs": { - "version": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", - "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", - "dev": true - }, - "signal-exit": { - "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "slice-ansi": { - "version": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "sntp": { - "version": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" - } - }, - "sprintf-js": { - "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "requires": { - "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "bcrypt-pbkdf": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "dashdash": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "ecc-jsbn": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "getpass": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "stack-utils": { - "version": "https://registry.npmjs.org/stack-utils/-/stack-utils-0.4.0.tgz", - "integrity": "sha1-lAy4L8z6hOj/Lz/fKT/ngBa+zNE=", - "dev": true - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" - } - }, - "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "requires": { - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - }, - "dependencies": { - "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" - } - } - } - }, - "stringstream": { - "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - } - }, - "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-json-comments": { - "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "table": { - "version": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", - "dev": true, - "requires": { - "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "ajv-keywords": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", - "slice-ansi": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - } - }, - "tap": { - "version": "https://registry.npmjs.org/tap/-/tap-7.1.2.tgz", - "integrity": "sha1-36w+zxSshUe7rSW70Wzyw3Q/Zc8=", - "dev": true, - "requires": { - "bluebird": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "clean-yaml-object": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "color-support": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "coveralls": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", - "deeper": "https://registry.npmjs.org/deeper/-/deeper-2.1.0.tgz", - "foreground-child": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.0.0.tgz", - "isexe": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "nyc": "https://registry.npmjs.org/nyc/-/nyc-7.1.0.tgz", - "only-shallow": "https://registry.npmjs.org/only-shallow/-/only-shallow-1.2.0.tgz", - "opener": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "stack-utils": "https://registry.npmjs.org/stack-utils/-/stack-utils-0.4.0.tgz", - "tap-mocha-reporter": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-2.0.1.tgz", - "tap-parser": "https://registry.npmjs.org/tap-parser/-/tap-parser-2.2.3.tgz", - "tmatch": "https://registry.npmjs.org/tmatch/-/tmatch-2.0.1.tgz" - }, - "dependencies": { - "isexe": { - "version": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true }, - "os-homedir": { - "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - } - } - }, - "tap-mocha-reporter": { - "version": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-2.0.1.tgz", - "integrity": "sha1-xwMWFz1uOhbFjhupLV1s2N5YoS4=", - "dev": true, - "requires": { - "color-support": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "diff": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "tap-parser": "https://registry.npmjs.org/tap-parser/-/tap-parser-2.2.3.tgz", - "unicode-length": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz" - }, - "dependencies": { - "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "dev": true, - "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - } + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true } } }, - "tap-parser": { - "version": "https://registry.npmjs.org/tap-parser/-/tap-parser-2.2.3.tgz", - "integrity": "sha1-rebpbje/04zg8WLaBn80A08GiwE=", - "dev": true, - "requires": { - "events-to-array": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" - } - }, - "term-size": { - "version": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz" - } - }, - "text-table": { - "version": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, "thenify": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", @@ -3371,207 +3743,544 @@ "thenify": "3.3.0" } }, - "through": { - "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "timed-out": { - "version": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "tmatch": { - "version": "https://registry.npmjs.org/tmatch/-/tmatch-2.0.1.tgz", - "integrity": "sha1-DFYkbzPzDaG409colauvFmYPOM8=", - "dev": true - }, - "tough-cookie": { - "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "dev": true, - "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - } - }, - "tryit": { - "version": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, - "tunnel-agent": { - "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - }, - "tweetnacl": { - "version": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-check": { - "version": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" - } - }, - "typedarray": { - "version": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uc.micro": { - "version": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz", - "integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=" - }, - "unicode-length": { - "version": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", - "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", - "dev": true, - "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - } - }, - "unique-string": { - "version": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "requires": { - "crypto-random-string": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz" - } - }, - "unzip-response": { - "version": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, "update-notifier": { - "version": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", "requires": { - "boxen": "https://registry.npmjs.org/boxen/-/boxen-1.2.1.tgz", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "configstore": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", - "import-lazy": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "is-npm": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "latest-version": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "semver-diff": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "xdg-basedir": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz" - } - }, - "url-parse-lax": { - "version": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" - } - }, - "user-home": { - "version": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" - } - }, - "util-deprecate": { - "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", - "dev": true - }, - "verror": { - "version": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "which": { - "version": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", - "requires": { - "isexe": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - } - }, - "widest-line": { - "version": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", - "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", - "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + "boxen": "1.2.1", + "chalk": "1.1.3", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" }, "dependencies": { + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "2.1.1" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.0" + } + }, + "boxen": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.1.tgz", + "integrity": "sha1-DxHn/jRO25OXl3/BPt5/ZNlWSB0=", + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.1.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "1.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.4.0" + } + } + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.0.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "4.0.1" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", + "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "requires": { + "pify": "2.3.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.4.1" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "registry-auth-token": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "requires": { + "rc": "1.2.1", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + "rc": "1.2.1" } }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "5.4.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "requires": { + "has-flag": "2.0.0" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "0.7.0" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "1.0.4" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "widest-line": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" } } - }, - "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" - } - }, - "write-file-atomic": { - "version": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" - } - }, - "xdg-basedir": { - "version": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - }, - "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yallist": { - "version": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" } } } diff --git a/package.json b/package.json index 9f240b073..802845523 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "main": "./core/lib/patternlab.js", "dependencies": { "async": "^2.1.2", - "dive": "^0.5.0", "chalk": "^1.1.3", + "dive": "^0.5.0", "diveSync": "^0.3.0", "fs-extra": "^0.30.0", "fs-promise": "^1.0.0", From 4814789c680dded97fe04408ebd4b783be4eb0b7 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 6 Oct 2017 15:31:30 -0500 Subject: [PATCH 73/98] fix test --- test/pattern_assembler_tests.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 75b97cb84..0de62ea52 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -479,16 +479,21 @@ tap.test('processPatternRecursive - 685 ensure listitems data is used', function pattern_assembler.combine_listItems(pl); var listPatternPath = path.join('00-test', '685-list.mustache'); - var listPattern = pattern_assembler.process_pattern_iterative(listPatternPath, pl); + var listPattern = pattern_assembler.load_pattern_iterative(listPatternPath, pl); - //act - pattern_assembler.process_pattern_recursive(listPatternPath, pl); + return Promise.all([ + pattern_assembler.process_pattern_iterative(listPattern, pl) + ]).then((results) => { - //assert - test.true(listPattern.extendedTemplate.indexOf(1) > -1); - test.true(listPattern.extendedTemplate.indexOf(2) > -1); - test.true(listPattern.extendedTemplate.indexOf(3) > -1); - test.end(); + //act + pattern_assembler.process_pattern_recursive(listPatternPath, pl); + + //assert + test.true(results[0].extendedTemplate.indexOf(1) > -1); + test.true(results[0].extendedTemplate.indexOf(2) > -1); + test.true(results[0].extendedTemplate.indexOf(3) > -1); + test.end(); + }).catch(test.threw); }); tap.test('setState - applies any patternState matching the pattern', function(test) { From b545979a3176adbc9c423a9ba0a0db93e72d6383 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 6 Oct 2017 15:38:13 -0500 Subject: [PATCH 74/98] removes deleted code tests per https://github.com/pattern-lab/patternlab-node/pull/620 somehow got readded --- test/pattern_assembler_tests.js | 43 --------------------------------- 1 file changed, 43 deletions(-) diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 0de62ea52..fe35e6fb6 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -496,49 +496,6 @@ tap.test('processPatternRecursive - 685 ensure listitems data is used', function }).catch(test.threw); }); -tap.test('setState - applies any patternState matching the pattern', function(test) { - //arrange - var pa = require('../core/lib/pattern_assembler'); - var pattern_assembler = new pa(); - var patternlab = {}; - patternlab.config = {}; - patternlab.config.patternStates = {}; - patternlab.config.patternStates["pages-homepage-emergency"] = "inprogress"; - - var pattern = { - patternPartial: "pages-homepage-emergency" - }; - - //act - pattern_assembler.setPatternState(pattern, patternlab); - - //assert - test.equals(pattern.patternState, "inprogress"); - test.end(); -}); - -tap.test('setState - does not apply any patternState if nothing matches the pattern', function(test) { - //arrange - var pa = require('../core/lib/pattern_assembler'); - var pattern_assembler = new pa(); - var patternlab = {}; - patternlab.config = {}; - patternlab.config.patternStates = {}; - patternlab.config.patternStates["pages-homepage-emergency"] = "inprogress"; - - var pattern = { - key: "pages-homepage", - patternState: "" - }; - - //act - pattern_assembler.setPatternState(pattern, patternlab); - - //assert - test.equals(pattern.patternState, ""); - test.end(); -}); - tap.test('parseDataLinks - replaces found link.* data for their expanded links', function(test) { //arrange var diveSync = require('diveSync'); From f4039a6ffbb962c797c8dfc49c4e39a0d5f86f17 Mon Sep 17 00:00:00 2001 From: Tobias Brennecke Date: Sun, 8 Oct 2017 13:29:52 +0200 Subject: [PATCH 75/98] fix typo --- .github/CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index cb619e57b..d3f39da78 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,5 +1,5 @@ -Contributing to Patternlab Node -=============================== +Contributing to Pattern Lab Node +================================ If you'd like to contribute to Pattern Lab Node, please do so! There is always a lot of ground to cover and something for your wheelhouse. From 58d40ddd6347446e6c96d7a70dd9911897af2630 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Thu, 12 Oct 2017 11:01:10 -0500 Subject: [PATCH 76/98] super asset copy / watch WIP, but getting closer API change to put clean inside options, coinciding with watch stubbed in serve --- core/lib/asset_copy.js | 30 +- core/lib/patternlab.js | 16 +- core/lib/serve.js | 14 + package-lock.json | 1093 +++++++++++++++++++++++++++++++++++++++- package.json | 1 + 5 files changed, 1136 insertions(+), 18 deletions(-) create mode 100644 core/lib/serve.js diff --git a/core/lib/asset_copy.js b/core/lib/asset_copy.js index 9c071dacd..6a7f92314 100644 --- a/core/lib/asset_copy.js +++ b/core/lib/asset_copy.js @@ -41,11 +41,18 @@ const asset_copier = () => { dest, options ).on(copy.events.COPY_FILE_COMPLETE, (copyOperation) => { - console.log(`Moved ${p} to ${dest}`); + if (options.debug) { + console.log(`Moved ${p} to ${dest}`); + } + options.emitter.emit('patternlab-file-change', { + file: p, + dest: dest + }); }); }; const asset_copy = (assetDirectories, patternlab, options) => { + //take our configured paths and sanitize best we can to only the assets const dirs = transform_paths(assetDirectories); @@ -54,24 +61,26 @@ const asset_copier = () => { const copyOptions = { - overwrite: true + overwrite: true, + emitter: patternlab.events, + debug: patternlab.config.debug }; - console.log(60, dirs) - //loop through each directory asset object (source / public pairing) _.each(dirs, (dir, key) => { //if we want to watch files, do so, otherwise just copy each file if (options.watch) { - console.log(49, `watching ${path.resolve(basePath, dir.source)}`); + if (patternlab.config.debug) { + console.log(`Pattern Lab is watching ${path.resolve(basePath, dir.source)} for changes`); + } const watcher = chokidar.watch( path.resolve(basePath, dir.source), { ignored: /(^|[\/\\])\../, ignoreInitial: true, awaitWriteFinish : { - stabilityThreshold: 1000, + stabilityThreshold: 200, pollInterval: 100 } } @@ -95,6 +104,15 @@ const asset_copier = () => { copyFile(dir.source, destination, copyOptions); } }); + + + //we need to special case patterns/**/*.md|.json|.pattern-extensions + if (options.watch) { + console.log(111, basePath, assetDirectories.source.patterns) + const patterns = patternlab.engines.getSupportedFileExtensions().map(dotExtension => path.join(basePath, assetDirectories.source.patterns, `/**/*${dotExtension}`)); + console.log(112, patterns); + } + }; return { diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index e49ada221..b49ebc64e 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -36,6 +36,7 @@ let fs = require('fs-extra'); // eslint-disable-line let ui_builder = require('./ui_builder'); // eslint-disable-line let pattern_exporter = new pe(); // eslint-disable-line let assetCopier = require('./asset_copy'); // eslint-disable-line +let serve = require('./serve'); // eslint-disable-line const pattern_assembler = new pa(); const lineage_hunter = new lh(); @@ -661,15 +662,15 @@ const patternlab_engine = function (config) { v: function () { return getVersion(); }, - build: function (callback, deletePatternDir, options) { + build: function (callback, options) { if (patternlab && patternlab.isBusy) { console.log('Pattern Lab is busy building a previous run - returning early.'); return Promise.resolve(); } patternlab.isBusy = true; - return buildPatterns(deletePatternDir).then(() => { + return buildPatterns(options.cleanPublic).then(() => { new ui_builder().buildFrontend(patternlab); - assetCopier().copyAssets(patternlab.config.paths, patternlab, {watch: false}); + assetCopier().copyAssets(patternlab.config.paths, patternlab, options); printDebug(); patternlab.isBusy = false; callback(); @@ -701,7 +702,14 @@ const patternlab_engine = function (config) { }, getSupportedTemplateExtensions: function () { return getSupportedTemplateExtensions(); - } + }, + serve: function (options) { + options.watch = true; + return this.build(() => {}, options).then(function () { + serve(patternlab); + }); + }, + events: patternlab.events }; }; diff --git a/core/lib/serve.js b/core/lib/serve.js new file mode 100644 index 000000000..467da326d --- /dev/null +++ b/core/lib/serve.js @@ -0,0 +1,14 @@ +"use strict"; +const plutils = require('./utilities'); +const path = require('path'); +const process = require('process'); +const assetCopier = require('./asset_copy'); + +let copy = require('recursive-copy'); // eslint-disable-line +let chokidar = require('chokidar'); // eslint-disable-line + +const serve = (patternlab) => { + console.log('serve'); +}; + +module.exports = serve; diff --git a/package-lock.json b/package-lock.json index d37a30043..a9695116e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,11 +4,88 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "apache-crypt": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.1.tgz", + "integrity": "sha1-1vxyqm0n2ZyVqU/RiNcx7v/6Zjw=", + "requires": { + "unix-crypt-td-js": "1.0.0" + } + }, + "apache-md5": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.2.tgz", + "integrity": "sha1-7klza2ObTxCLbp5ibG2pkwa0FpI=" + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, "async": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", @@ -24,6 +101,58 @@ } } }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -74,6 +203,102 @@ } } }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "connect": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.5.1.tgz", + "integrity": "sha1-bTDXpjx/FwhXprOqazY9lz3KWI4=", + "requires": { + "debug": "2.2.0", + "finalhandler": "0.5.1", + "parseurl": "1.3.2", + "utils-merge": "1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "4.1.1", + "vary": "1.1.2" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + } + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + } + } + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, "dive": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/dive/-/dive-0.5.0.tgz", @@ -94,6 +319,11 @@ } } }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, "editorconfig": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz", @@ -123,6 +353,34 @@ } } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "emitter-mixin": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/emitter-mixin/-/emitter-mixin-0.0.3.tgz", + "integrity": "sha1-WUjLKG8uSO3DslGnz8H3iDOW1lw=" + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "requires": { + "prr": "0.0.0" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, "eslint": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.5.0.tgz", @@ -1091,6 +1349,109 @@ } } }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "requires": { + "websocket-driver": "0.7.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.1.tgz", + "integrity": "sha1-LEANjUUwk1vCMlScX6OF7Afeb80=", + "requires": { + "debug": "2.2.0", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "1.0.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + }, "fs-extra": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", @@ -1241,6 +1602,43 @@ } } }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "2.0.1" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + } + } + }, "graceful-fs": { "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" @@ -1253,6 +1651,139 @@ "lodash": "4.13.1" } }, + "http-auth": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz", + "integrity": "sha1-lFz63WZSHq+PfISRPTd9exXyTjE=", + "requires": { + "apache-crypt": "1.2.1", + "apache-md5": "1.1.2", + "bcryptjs": "2.4.3", + "uuid": "3.1.0" + } + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + } + }, + "http-parser-js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", + "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, "js-beautify": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.3.tgz", @@ -1347,6 +1878,19 @@ "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" } }, + "junk": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", + "integrity": "sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + }, "klaw": { "version": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", @@ -1354,6 +1898,31 @@ "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" } }, + "live-server": { + "version": "github:pattern-lab/live-server#d46ec211455efb0ae2ad140b09e151bc2649c496", + "requires": { + "chokidar": "1.7.0", + "colors": "1.1.2", + "connect": "3.5.1", + "cors": "2.8.4", + "event-stream": "3.3.4", + "faye-websocket": "0.11.1", + "http-auth": "3.1.3", + "morgan": "1.9.0", + "object-assign": "4.1.1", + "opn": "5.1.0", + "proxy-middleware": "0.15.0", + "send": "0.16.1", + "serve-index": "1.9.1" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + } + } + }, "lodash": { "version": "4.13.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", @@ -1374,6 +1943,11 @@ } } }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" + }, "markdown-it": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-6.1.1.tgz", @@ -1424,10 +1998,107 @@ } } }, - "mustache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", - "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=" + "maximatch": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", + "integrity": "sha1-hs2NawTJ8wfAWmuUGZBtA2D7E6I=", + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "morgan": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", + "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", + "requires": { + "basic-auth": "2.0.0", + "debug": "2.6.9", + "depd": "1.1.1", + "on-finished": "2.3.0", + "on-headers": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" }, "mz": { "version": "2.7.0", @@ -1439,6 +2110,11 @@ "thenify-all": "1.6.0" } }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -1468,29 +2144,381 @@ } } }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, "object-assign": { "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "patternengine-node-mustache": { + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "requires": { + "is-wsl": "1.1.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/patternengine-node-mustache/-/patternengine-node-mustache-1.0.2.tgz", - "integrity": "sha1-HAnzo2CRiougtV5YLPfAPZjdy+M=", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "requires": { + "through": "2.3.8" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "2.0.6" + } + }, + "proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=" + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "requires": { - "mustache": "2.3.0" + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + } + } + }, + "recursive-copy": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/recursive-copy/-/recursive-copy-2.0.6.tgz", + "integrity": "sha1-1ZD5618WW5ahuAvI+cvLXG+ciek=", + "requires": { + "del": "2.2.2", + "emitter-mixin": "0.0.3", + "errno": "0.1.4", + "graceful-fs": "4.1.11", + "junk": "1.0.3", + "maximatch": "0.1.0", + "mkdirp": "0.5.1", + "pify": "2.3.0", + "promise": "7.3.1", + "slash": "1.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + } + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "0.1.3" } }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, "rewire": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/rewire/-/rewire-2.5.2.tgz", "integrity": "sha1-ZCfee3/u+n02QBUH62SlOFvFjcc=", "dev": true }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.2", + "mime-types": "2.1.17", + "parseurl": "1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, "sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "requires": { + "through": "2.3.8" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "requires": { + "duplexer": "0.1.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, "tap": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/tap/-/tap-7.1.2.tgz", @@ -3743,6 +4771,21 @@ "thenify": "3.3.0" } }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "unix-crypt-td-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz", + "integrity": "sha1-HAgkFQSBvHoB1J6Y8exmjYJBLzs=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "update-notifier": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", @@ -4281,6 +5324,40 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" } } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "requires": { + "http-parser-js": "0.4.9", + "websocket-extensions": "0.1.2" + } + }, + "websocket-extensions": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.2.tgz", + "integrity": "sha1-Dhh4HeYpoYMIzhSBZQ9n/6JpOl0=" } } } diff --git a/package.json b/package.json index 8f1e6c6f1..bb5c26f46 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "graphlib": "^2.1.1", "js-beautify": "^1.6.3", "js-yaml": "^3.6.1", + "live-server": "github:pattern-lab/live-server#d46ec21", "lodash": "~4.13.1", "markdown-it": "^6.0.1", "node-fetch": "^1.6.0", From c198aad033d39715aa4f7c2b27ca76e63b558318 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Thu, 12 Oct 2017 14:03:16 -0500 Subject: [PATCH 77/98] first draft of @raphaelokon's custom live-server part of #609 --- core/lib/serve.js | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/core/lib/serve.js b/core/lib/serve.js index 467da326d..18829813c 100644 --- a/core/lib/serve.js +++ b/core/lib/serve.js @@ -1,14 +1,38 @@ "use strict"; -const plutils = require('./utilities'); const path = require('path'); -const process = require('process'); -const assetCopier = require('./asset_copy'); - -let copy = require('recursive-copy'); // eslint-disable-line -let chokidar = require('chokidar'); // eslint-disable-line +const liveServer = require('live-server'); const serve = (patternlab) => { - console.log('serve'); + + // our default liveserver config + const defaults = { + root: patternlab.config.paths.public.root, + open: true, + ignore: path.join(path.resolve(patternlab.config.paths.public.root)), + file: 'index.html', + logLevel: 0 // errors only + }; + + // allow for overrides should they exist inside patternlab-config.json + const liveServerConfig = Object.assign({}, defaults, patternlab.config.serverOptions); + + // watch for asset changes, and reload appropriately + patternlab.events.on('patternlab-asset-change', (data) => { + if (data.file.indexOf('css') > -1) { + liveServer.refreshCSS(); + } else { + liveServer.reload(); + } + }); + + //watch for pattern changes, and reload + patternlab.events.on('patternlab-pattern-change', () => { + liveServer.reload(); + }); + + //start! + liveServer.start(liveServerConfig); + }; module.exports = serve; From 20954f26b7d569a2efb76cb0b25112ee541d500a Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Thu, 12 Oct 2017 14:51:27 -0500 Subject: [PATCH 78/98] copy / watch / serve part of #609 part of #706 --- core/lib/asset_copy.js | 58 +++++++++++++++++++++++++++++++++--------- core/lib/patternlab.js | 14 ++++++++-- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/core/lib/asset_copy.js b/core/lib/asset_copy.js index 6a7f92314..a88911aec 100644 --- a/core/lib/asset_copy.js +++ b/core/lib/asset_copy.js @@ -1,11 +1,10 @@ "use strict"; -const plutils = require('./utilities'); const _ = require('lodash'); const path = require('path'); const process = require('process'); -let copy = require('recursive-copy'); // eslint-disable-line -let chokidar = require('chokidar'); // eslint-disable-line +let copy = require('recursive-copy'); // eslint-disable-line prefer-const +let chokidar = require('chokidar'); // eslint-disable-line prefer-const const asset_copier = () => { @@ -44,7 +43,7 @@ const asset_copier = () => { if (options.debug) { console.log(`Moved ${p} to ${dest}`); } - options.emitter.emit('patternlab-file-change', { + options.emitter.emit('patternlab-asset-change', { file: p, dest: dest }); @@ -67,14 +66,14 @@ const asset_copier = () => { }; //loop through each directory asset object (source / public pairing) - _.each(dirs, (dir, key) => { + _.each(dirs, (dir) => { //if we want to watch files, do so, otherwise just copy each file if (options.watch) { if (patternlab.config.debug) { console.log(`Pattern Lab is watching ${path.resolve(basePath, dir.source)} for changes`); } - const watcher = chokidar.watch( + const assetWatcher = chokidar.watch( path.resolve(basePath, dir.source), { ignored: /(^|[\/\\])\../, @@ -87,7 +86,7 @@ const asset_copier = () => { ); //watch for changes and copy - watcher.on('addDir', (p) => { + assetWatcher.on('addDir', (p) => { const destination = path.resolve(basePath, dir.public + '/' + path.basename(p)); copyFile(p, destination, copyOptions); }).on('add', (p) => { @@ -105,14 +104,49 @@ const asset_copier = () => { } }); - //we need to special case patterns/**/*.md|.json|.pattern-extensions if (options.watch) { - console.log(111, basePath, assetDirectories.source.patterns) - const patterns = patternlab.engines.getSupportedFileExtensions().map(dotExtension => path.join(basePath, assetDirectories.source.patterns, `/**/*${dotExtension}`)); - console.log(112, patterns); - } + const baseFileExtensions = ['.json', '.yml', '.yaml', '.md']; + const patternWatches = baseFileExtensions.concat(patternlab.engines.getSupportedFileExtensions()).map( + dotExtension => path.join( + basePath, + assetDirectories.source.patterns, + `/**/*${dotExtension}` + ) + ); + _.each(patternWatches, (patternWatchPath) => { + if (patternlab.config.debug) { + console.log(`Pattern Lab is watching ${patternWatchPath} for changes`); + } + + const patternWatcher = chokidar.watch( + path.resolve(patternWatchPath), + { + ignored: /(^|[\/\\])\../, + ignoreInitial: true, + awaitWriteFinish : { + stabilityThreshold: 200, + pollInterval: 100 + } + } + ); + //watch for changes and rebuild + patternWatcher.on('addDir', (p) => { + patternlab.events.emit('patternlab-pattern-change', { + file: p + }); + }).on('add', (p) => { + patternlab.events.emit('patternlab-pattern-change', { + file: p + }); + }).on('change', (p) => { + patternlab.events.emit('patternlab-pattern-change', { + file: p + }); + }); + }); + } }; return { diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index b49ebc64e..e7aa98ad1 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -669,8 +669,18 @@ const patternlab_engine = function (config) { } patternlab.isBusy = true; return buildPatterns(options.cleanPublic).then(() => { + new ui_builder().buildFrontend(patternlab); assetCopier().copyAssets(patternlab.config.paths, patternlab, options); + + this.events.on('patternlab-pattern-change', () => { + if (!patternlab.isBusy) { + options.cleanPublic = false; + return this.build(callback, options); + } + return Promise.resolve(); + }); + printDebug(); patternlab.isBusy = false; callback(); @@ -679,13 +689,13 @@ const patternlab_engine = function (config) { help: function () { help(); }, - patternsonly: function (callback, deletePatternDir) { + patternsonly: function (callback, options) { if (patternlab && patternlab.isBusy) { console.log('Pattern Lab is busy building a previous run - returning early.'); return Promise.resolve(); } patternlab.isBusy = true; - return buildPatterns(deletePatternDir).then(() => { + return buildPatterns(options.cleanPublic).then(() => { printDebug(); patternlab.isBusy = false; callback(); From 9b48fd10f7978124a64d0311539bd572b2c67785 Mon Sep 17 00:00:00 2001 From: bmuenzenmeyer Date: Tue, 17 Oct 2017 22:25:35 -0500 Subject: [PATCH 79/98] watch and emit events on global file change part of #706 --- core/lib/asset_copy.js | 51 ++++++++++++++++++++++++++++++++++++++++-- core/lib/patternlab.js | 8 +++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/core/lib/asset_copy.js b/core/lib/asset_copy.js index a88911aec..9bd9d668d 100644 --- a/core/lib/asset_copy.js +++ b/core/lib/asset_copy.js @@ -104,8 +104,55 @@ const asset_copier = () => { } }); - //we need to special case patterns/**/*.md|.json|.pattern-extensions + //we need to special case patterns/**/*.md|.json|.pattern-extensions as well as the global structures if (options.watch) { + + // watch global structures, such as _data/* and _meta/ + const globalSources = [assetDirectories.source.data, assetDirectories.source.meta] + const globalPaths = globalSources.map(globalSource => path.join( + basePath, + globalSource, + '*' + )); + + _.each(globalPaths, (globalPath) => { + + if (patternlab.config.debug) { + console.log(`Pattern Lab is watching ${globalPath} for changes`); + } + + const globalWatcher = chokidar.watch( + path.resolve(globalPath), + { + ignored: /(^|[\/\\])\../, + ignoreInitial: true, + awaitWriteFinish : { + stabilityThreshold: 200, + pollInterval: 100 + } + } + ); + + //watch for changes and rebuild + globalWatcher.on('addDir', (p) => { + patternlab.events.emit('patternlab-global-change', { + file: p + }) + }) + .on('add', (p) => { + patternlab.events.emit('patternlab-global-change', { + file: p + }); + }).on('change', (p) => { + console.log(145, 'global change watch') + patternlab.events.emit('patternlab-global-change', { + file: p + }); + }); + + }); + + // watch patterns const baseFileExtensions = ['.json', '.yml', '.yaml', '.md']; const patternWatches = baseFileExtensions.concat(patternlab.engines.getSupportedFileExtensions()).map( dotExtension => path.join( @@ -143,7 +190,7 @@ const asset_copier = () => { }).on('change', (p) => { patternlab.events.emit('patternlab-pattern-change', { file: p - }); + }); }); }); } diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index e7aa98ad1..116aeba44 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -681,6 +681,14 @@ const patternlab_engine = function (config) { return Promise.resolve(); }); + this.events.on('patternlab-global-change', () => { + if (!patternlab.isBusy) { + options.cleanPublic = false; + return this.build(callback, options); + } + return Promise.resolve(); + }); + printDebug(); patternlab.isBusy = false; callback(); From 52e6d3ed7d2baba786c7d2635e04095c63aea461 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Tue, 17 Oct 2017 23:05:09 -0500 Subject: [PATCH 80/98] force a full rebuild on a global change --- core/lib/patternlab.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 116aeba44..6b20de7a6 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -539,7 +539,6 @@ const patternlab_engine = function (config) { plutils.log.info("Incremental builds enabled."); } else { // needs to be done BEFORE processing patterns - fs.removeSync(paths.public.patterns); fs.emptyDirSync(paths.public.patterns); } @@ -683,7 +682,7 @@ const patternlab_engine = function (config) { this.events.on('patternlab-global-change', () => { if (!patternlab.isBusy) { - options.cleanPublic = false; + options.cleanPublic = true; //rebuild everything return this.build(callback, options); } return Promise.resolve(); From dda2055f1b7efa1d1e8d76d0a058d6348d70391e Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Wed, 18 Oct 2017 01:05:55 -0500 Subject: [PATCH 81/98] finish up copy closes #706 --- core/lib/asset_copy.js | 23 +++++++++++++++++++++-- core/lib/patternlab.js | 1 + core/lib/serve.js | 3 ++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/core/lib/asset_copy.js b/core/lib/asset_copy.js index 9bd9d668d..6b902c3dd 100644 --- a/core/lib/asset_copy.js +++ b/core/lib/asset_copy.js @@ -11,7 +11,7 @@ const asset_copier = () => { const transform_paths = (directories) => { //create array with all source keys minus our blacklist const dirs = {}; - const blackList = ['root', 'patterns', 'data', 'meta', 'annotations', 'styleguide', 'patternlabFiles']; + const blackList = ['root', 'patterns', 'data', 'meta', 'annotations', 'patternlabFiles']; _.each(directories.source, (dir, key) => { if (blackList.includes(key)) { @@ -66,13 +66,18 @@ const asset_copier = () => { }; //loop through each directory asset object (source / public pairing) - _.each(dirs, (dir) => { + _.each(dirs, (dir, key) => { //if we want to watch files, do so, otherwise just copy each file if (options.watch) { if (patternlab.config.debug) { console.log(`Pattern Lab is watching ${path.resolve(basePath, dir.source)} for changes`); } + + if (patternlab.watchers[key]) { + patternlab.watchers[key].close(); + } + const assetWatcher = chokidar.watch( path.resolve(basePath, dir.source), { @@ -97,6 +102,8 @@ const asset_copier = () => { copyFile(p, destination, copyOptions); }); + patternlab.watchers[key] = assetWatcher; + } else { //just copy const destination = path.resolve(basePath, dir.public); @@ -104,6 +111,12 @@ const asset_copier = () => { } }); + // copy the styleguide + copyFile(assetDirectories.source.styleguide, assetDirectories.public.root, copyOptions); + + // copy the favicon + copyFile(`${assetDirectories.source.root}/favicon.ico`, `${assetDirectories.public.root}/favicon.ico`, copyOptions); + //we need to special case patterns/**/*.md|.json|.pattern-extensions as well as the global structures if (options.watch) { @@ -121,6 +134,10 @@ const asset_copier = () => { console.log(`Pattern Lab is watching ${globalPath} for changes`); } + if (patternlab.watchers[globalPath]) { + patternlab.watchers[globalPath].close(); + } + const globalWatcher = chokidar.watch( path.resolve(globalPath), { @@ -150,6 +167,8 @@ const asset_copier = () => { }); }); + patternlab.watchers[globalPath] = globalWatcher; + }); // watch patterns diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 6b20de7a6..38227371f 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -200,6 +200,7 @@ const patternlab_engine = function (config) { patternlab.package = fs.readJSONSync(path.resolve(__dirname, '../../package.json')); patternlab.config = config || fs.readJSONSync(path.resolve(__dirname, '../../patternlab-config.json')); patternlab.events = new PatternLabEventEmitter(); + patternlab.watchers = {}; // Initialized when building patternlab.graph = null; diff --git a/core/lib/serve.js b/core/lib/serve.js index 18829813c..a773acde9 100644 --- a/core/lib/serve.js +++ b/core/lib/serve.js @@ -10,7 +10,8 @@ const serve = (patternlab) => { open: true, ignore: path.join(path.resolve(patternlab.config.paths.public.root)), file: 'index.html', - logLevel: 0 // errors only + logLevel: 0, // errors only + wait: 1000 }; // allow for overrides should they exist inside patternlab-config.json From 29c5f774a953c6dae70832f5114cf0351601cf8c Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Wed, 18 Oct 2017 01:28:36 -0500 Subject: [PATCH 82/98] delete vscode file --- .vscode/launch.json | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 8663f7a28..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - // Use IntelliSense to learn about possible Node.js debug attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Launch Program", - "program": "${workspaceRoot}\\core\\lib\\patternlab.js" - }, - { - "type": "node", - "request": "launch", - "name": "Debug", - "program": "${workspaceRoot}\\test\\patternlab_tests.js" - } - ] -} From 388adea957a0cdb80c7b0d9d12fbc98d0fde1d67 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Wed, 18 Oct 2017 01:39:15 -0500 Subject: [PATCH 83/98] fix lint errors --- core/lib/asset_copy.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/lib/asset_copy.js b/core/lib/asset_copy.js index 6b902c3dd..a28b808b9 100644 --- a/core/lib/asset_copy.js +++ b/core/lib/asset_copy.js @@ -39,7 +39,7 @@ const asset_copier = () => { p, dest, options - ).on(copy.events.COPY_FILE_COMPLETE, (copyOperation) => { + ).on(copy.events.COPY_FILE_COMPLETE, () => { if (options.debug) { console.log(`Moved ${p} to ${dest}`); } @@ -121,7 +121,7 @@ const asset_copier = () => { if (options.watch) { // watch global structures, such as _data/* and _meta/ - const globalSources = [assetDirectories.source.data, assetDirectories.source.meta] + const globalSources = [assetDirectories.source.data, assetDirectories.source.meta]; const globalPaths = globalSources.map(globalSource => path.join( basePath, globalSource, @@ -154,14 +154,13 @@ const asset_copier = () => { globalWatcher.on('addDir', (p) => { patternlab.events.emit('patternlab-global-change', { file: p - }) + }); }) .on('add', (p) => { patternlab.events.emit('patternlab-global-change', { file: p }); }).on('change', (p) => { - console.log(145, 'global change watch') patternlab.events.emit('patternlab-global-change', { file: p }); From 1bc0b1f3bcde4d18a744e1a24873f88eef3416f9 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Wed, 18 Oct 2017 01:39:23 -0500 Subject: [PATCH 84/98] remove junk test --- test/asset_copy_tests.js | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/test/asset_copy_tests.js b/test/asset_copy_tests.js index 651c1f702..9d2346912 100644 --- a/test/asset_copy_tests.js +++ b/test/asset_copy_tests.js @@ -50,30 +50,17 @@ function createFakePatternLab(customProps) { return extend(pl, customProps); } -// tap.test('transformConfigPaths takes configuration.paths() and maps to a better key store', function (test) { -// //arrange -// var patternlab = createFakePatternLab({}); - -// //act -// var result = assetCopy.transformConfigPaths(patternlab.config.paths); - -// //assert -// test.equals(result.img.source, './test/img'); -// test.equals(result.img.public, './test/output/img'); -// test.equals(result.css.source, './test/css'); -// test.equals(result.css.public, './test/output/css'); -// test.end(); -// }); - -tap.test('assetCopier does stuff', function(test) { +tap.test('transformConfigPaths takes configuration.paths() and maps to a better key store', function (test) { //arrange var patternlab = createFakePatternLab({}); //act - - assetCopier.copyAssets(patternlab.config.paths, {}); + var result = assetCopier.transformConfigPaths(patternlab.config.paths); //assert - + test.equals(result.img.source, './test/img'); + test.equals(result.img.public, './test/output/img'); + test.equals(result.css.source, './test/css'); + test.equals(result.css.public, './test/output/css'); test.end(); -}) +}); From 81ec3f2f473664730d5e4526ed09e1e6a1c082cd Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Wed, 18 Oct 2017 01:39:44 -0500 Subject: [PATCH 85/98] update name to scoped package! --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index a9695116e..8db5e864b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "patternlab-node", + "name": "@pattern-lab/patternlab-node", "version": "3.0.0-alpha.1", "lockfileVersion": 1, "requires": true, diff --git a/package.json b/package.json index bb5c26f46..d9aab8d89 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "patternlab-node", + "name": "@pattern-lab/patternlab-node", "description": "Pattern Lab is a collection of tools to help you create atomic design systems. This is the node command line interface (CLI).", "version": "3.0.0-alpha.1", "main": "./core/lib/patternlab.js", From fdcc158923cd43f9a4d40f9ff09040382e65b06b Mon Sep 17 00:00:00 2001 From: bmuenzenmeyer Date: Wed, 18 Oct 2017 07:51:15 -0500 Subject: [PATCH 86/98] document public API closes #614 --- core/lib/patternlab.js | 68 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 38227371f..c76651bf4 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -656,12 +656,31 @@ const patternlab_engine = function (config) { } return { + /** + * logs current version + * + * @returns {void} current patternlab-node version as defined in package.json, as console output + */ version: function () { return logVersion(); }, + + /** + * return current version + * + * @returns {string} current patternlab-node version as defined in package.json, as string + */ v: function () { return getVersion(); }, + + /** + * build patterns, copy assets, and construct ui + * + * @param {function} callback a function invoked when build is complete + * @param {object} options an object used to control build behavior + * @returns {Promise} a promise fulfilled when build is complete + */ build: function (callback, options) { if (patternlab && patternlab.isBusy) { console.log('Pattern Lab is busy building a previous run - returning early.'); @@ -694,9 +713,23 @@ const patternlab_engine = function (config) { callback(); }); }, + + /** + * logs usage + * + * @returns {void} pattern lab API usage, as console output + */ help: function () { help(); }, + + /** + * build patterns only, leaving existing public files intact + * + * @param {function} callback a function invoked when build is complete + * @param {object} options an object used to control build behavior + * @returns {Promise} a promise fulfilled when build is complete + */ patternsonly: function (callback, options) { if (patternlab && patternlab.isBusy) { console.log('Pattern Lab is busy building a previous run - returning early.'); @@ -709,18 +742,53 @@ const patternlab_engine = function (config) { callback(); }); }, + + /** + * fetches starterkit repos from pattern-lab github org that contain 'starterkit' in their name + * + * @returns {Promise} Returns an Array<{name,url}> for the starterkit repos + */ liststarterkits: function () { return listStarterkits(); }, + + /** + * load starterkit already available via `node_modules/` + * + * @param {string} starterkitName name of starterkit + * @param {boolean} clean whether or not to delete contents of source/ before load + * @returns {void} + */ loadstarterkit: function (starterkitName, clean) { loadStarterKit(starterkitName, clean); }, + + + /** + * install plugin already available via `node_modules/` + * + * @param {string} pluginName name of plugin + * @returns {void} + */ installplugin: function (pluginName) { installPlugin(pluginName); }, + + /** + * returns all file extensions supported by installed PatternEngines + * + * @returns {Array} all supported file extensions + */ getSupportedTemplateExtensions: function () { return getSupportedTemplateExtensions(); }, + + /** + * build patterns, copy assets, and construct ui, watch source files, and serve locally + * + * @param {object} options an object used to control build, copy, and serve behavior + * @returns {Promise} TODO: validate + */ serve: function (options) { options.watch = true; return this.build(() => {}, options).then(function () { From e9fb138429d0ee1a21af1afec729c03e3880e82a Mon Sep 17 00:00:00 2001 From: bmuenzenmeyer Date: Wed, 18 Oct 2017 09:13:11 -0500 Subject: [PATCH 87/98] ensure initial copy of assets --- core/lib/asset_copy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/asset_copy.js b/core/lib/asset_copy.js index a28b808b9..9ac0d7a3c 100644 --- a/core/lib/asset_copy.js +++ b/core/lib/asset_copy.js @@ -82,7 +82,7 @@ const asset_copier = () => { path.resolve(basePath, dir.source), { ignored: /(^|[\/\\])\../, - ignoreInitial: true, + ignoreInitial: false, awaitWriteFinish : { stabilityThreshold: 200, pollInterval: 100 From ac55c0f6209ed7081127c612bea3fa59715b280f Mon Sep 17 00:00:00 2001 From: Tobias Brennecke Date: Wed, 18 Oct 2017 22:03:38 +0200 Subject: [PATCH 88/98] Update branching scheme for 3.0 --- .github/CONTRIBUTING.md | 53 ++++++++++++++++++++--------------- .github/branching-scheme.png | Bin 51103 -> 31300 bytes 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d3f39da78..86c6e2dd9 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -5,27 +5,27 @@ If you'd like to contribute to Pattern Lab Node, please do so! There is always a No pull request is too small. Check out any [up for grabs issues](https://github.com/pattern-lab/patternlab-node/labels/up%20for%20grabs) as a good way to get your feet wet, or add some more unit tests. -## Developing Locally +Developing Locally +------------------ The best way to make changes to the Pattern Lab Node core and test them is through your existing edition. -* Fork this repository on Github. -* Create a new branch in your fork and push your changes in that fork. -* `npm install` -* `npm link` -* `cd /path/to/your/edition` -* `npm link patternlab-node` - +- Fork this repository on Github. +- Create a new branch in your fork and push your changes in that fork. +- `npm install` +- `npm link` +- `cd /path/to/your/edition` +- `npm link patternlab-node` Guidelines ---------- -* _ALWAYS_ submit pull requests against the [dev branch](https://github.com/pattern-lab/patternlab-node/tree/dev). If this does not occur, I will first, try to redirect you gently, second, port over your contribution manually if time allows, and/or third, close your pull request. If you have a major feature to stabilize over time, talk to @bmuenzenmeyer via an issue about making a dedicated `feature-branch` -* Please keep your pull requests concise and limited to **ONE** substantive change at a time. This makes reviewing and testing so much easier. -* Commits should reference the issue you are adressing. For any Pull Request that you send, use the template provided. -* If you can, add some unit tests using the existing patterns in the `./test` directory -* Large enhancements should begin with opening an issue. This will result in a more systematic way for us to review your contribution and determine if a [specifcation discussion](https://github.com/pattern-lab/the-spec/issues) needs to occur. -* Please mention the issue number in commits if you can, so anyone can see to which issue your changes belong to. For instance: +- *ALWAYS* submit pull requests against the [dev branch](https://github.com/pattern-lab/patternlab-node/tree/dev). If this does not occur, I will first, try to redirect you gently, second, port over your contribution manually if time allows, and/or third, close your pull request. If you have a major feature to stabilize over time, talk to @bmuenzenmeyer via an issue about making a dedicated `feature-branch` +- Please keep your pull requests concise and limited to **ONE** substantive change at a time. This makes reviewing and testing so much easier. +- Commits should reference the issue you are adressing. For any Pull Request that you send, use the template provided. +- If you can, add some unit tests using the existing patterns in the `./test` directory +- Large enhancements should begin with opening an issue. This will result in a more systematic way for us to review your contribution and determine if a [specifcation discussion](https://github.com/pattern-lab/the-spec/issues) needs to occur. +- Please mention the issue number in commits if you can, so anyone can see to which issue your changes belong to. For instance: - `#123 Fix resolving patterns in pattern_hunter` - `Feature #42: improve improbability drive` @@ -37,21 +37,28 @@ Two files combine within the project to define and maintain our coding style. - The `.editorconfig` controls spaces / tabs within supported editors. Check out their [site](http://editorconfig.org/). - The `.eslintrc` defines our javascript standards. Some editors will evaluate this real-time - otherwise it's run using `grunt|gulp build` +Tests +----- + +Please add unit and integration tests if you can. It's always nice if our code coverage improves bit by bit (literally!). We are using [Node Tap](http://www.node-tap.org/) as test framework and [Rewire](https://github.com/jhnns/rewire) for mocking things like file system access. + Branching Scheme ---------------- -![alt text](branching-scheme.png) While actively maintaining `2.X` on `master`, there is heavy development going on for Patternlab `3.X`. Currently Pattern Lab has the following branches: +![branching scheme](branching-scheme.png) Currently Pattern Lab has the following branches: -- **master** contains the latext stable, released `2.X` version -- **dev**: for `2.X` development. Please target pull requests against this branch -- **dev-3.0** Development branch for version `3.0`. Pattern Lab has undergone some major changes and the source trees have diverged a lot and we will try to forward-port any changes made in `2.X` -- **feature-branches** for larger changes. Allows merging all changes into both `2.X` and `3.X` easily. +- **master** contains the latext stable, released version +- **dev**: for development. *Please target pull requests against this branch.* +- **feature-branches** for larger changes. Allows merging all changes into both `dev` easily. - **long running branches** for changes that involve major changes to the code, architecture and take a lot of time (i.e. making Pattern Lab async) -Development mainly happens in the `dev` branch, but you can help us a lot if you also do a pull request against `dev-3.0`. When `dev` seems stable enough, we do releases of `2.X` by merging `dev` to `master` and creating a release tag. +Development mainly happens in the `dev` branch, but you can help us a lot if you also do a pull request. When `dev` seems stable enough, we do releases by merging `dev` to `master` and creating a release tag. + +Feature branches target `dev` and should be updated regularly. -Feature branches may target either `dev` and/or `dev-3.0` and should be updated regularly. +Long running branches should only target the latest version of Pattern Lab and may be lagging behind a lot. -Long running branches should only target the latest version of Pattern Lab, currently `dev-3.0`, and may be lagging behind a lot. +Gitter.im Chat +============== -If you have any questions or you would like to help, feel free to ask on [our Gitter.im](https://gitter.im/pattern-lab/node-team) +If you have any questions or you would like to help, feel free to ask on [our Gitter.im channel](https://gitter.im/pattern-lab/node) :smiley: diff --git a/.github/branching-scheme.png b/.github/branching-scheme.png index ca610f2522f5cf91c24cda3e2e7ab62525ad33a5..9d7b7628a0aa58d10a6dfbdd357d098c38924c9a 100644 GIT binary patch literal 31300 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 OH4MErwgYSANie< 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 JmMB{X{SSY1F`obc literal 51103 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

BtGh+netKy>N99>t$FMp;bGO}pn-)S?NIH2-tg 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 Q0RNQFsh@p&#`xa<0PBg`uK)l5 From 36093c7c2fdca7fd66567dc7e9a59a261b162608 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Thu, 19 Oct 2017 05:55:30 -0500 Subject: [PATCH 89/98] wip readme changes part of #724 --- README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9eb9eed3b..4a7990e2d 100644 --- a/README.md +++ b/README.md @@ -21,15 +21,24 @@ Pattern Lab Node wouldn't be what it is today without the support of the communi ## Installation -Pattern Lab Node Core is designed to be consumed, and by default is included as a dependency within two example [Node Editions](https://github.com/pattern-lab?utf8=%E2%9C%93&query=edition-node). +Pattern Lab Node can be worked with a couple different ways. +As of Pattern Lab Node 3.X, `patternlab-node` can run standalone, in conjunction with the rest of the [Pattern Lab Ecosystem](http://patternlab.io/docs/advanced-ecosystem-overview.html) elements. + + + + + +For users wanting a more pre-packaged experience several editions are available. * [Pattern Lab/Node: Gulp Edition](https://github.com/pattern-lab/edition-node-gulp) contains info how to get started within a Gulp task running environment. * [Pattern Lab/Node: Grunt Edition](https://github.com/pattern-lab/edition-node-grunt) contains info how to get started within a Grunt task running environment. +* [Pattern Lab/Node: Vanilla Edition](https://github.com/pattern-lab/edition-node) contains info how to get started within a pure node environment. +* [Pattern Lab/Node: Webpack Edition](https://github.com/Comcast/patternlab-edition-node-webpack) contains info how to get started within a webpack environment. Thanks to Comcast for open-sourcing this stellar work! ![Pattern Lab Ecosystem](http://patternlab.io/assets/pattern-lab-2-image_18-large-opt.png) -Core, and Editions, are part of the [Pattern Lab Ecosystem](http://patternlab.io/docs/advanced-ecosystem-overview.html). With this architecture, we encourage people to write and maintain their own editions. +Core, and Editions, are part of the [Pattern Lab Ecosystem](http://patternlab.io/docs/advanced-ecosystem-overview.html). With this architecture, we encourage people to write and maintain their own Editions, Starterkits, and even PatternEngines. ## Usage From 117e05e22ef0c35a0ea7afa71cf875f09b0e016a Mon Sep 17 00:00:00 2001 From: bmuenzenmeyer Date: Thu, 19 Oct 2017 07:32:38 -0500 Subject: [PATCH 90/98] finish updates closes #724 --- README.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 4a7990e2d..fdb9767ce 100644 --- a/README.md +++ b/README.md @@ -21,20 +21,27 @@ Pattern Lab Node wouldn't be what it is today without the support of the communi ## Installation -Pattern Lab Node can be worked with a couple different ways. +Pattern Lab Node can be used different ways. Editions are **example** pairings of Pattern Lab code and do not always have an upgrade path or simple means to run as a dependency within a larger project. Users wishing to be most current and have the greatest flexibility are encouraged to consume `patternlab-node` directly. Users wanting to learn more about Pattern Lab and have a tailored default experience are encouraged to start with an Edition. Both methods still expect to interact with other elements of the [Pattern Lab Ecosystem](#ecosystem). -As of Pattern Lab Node 3.X, `patternlab-node` can run standalone, in conjunction with the rest of the [Pattern Lab Ecosystem](http://patternlab.io/docs/advanced-ecosystem-overview.html) elements. +### Direct Consumption +As of Pattern Lab Node 3.X, `patternlab-node` can run standalone, without the need for task runners like gulp or grunt. +`npm install patternlab-node` +See [Usage](#Usage) for more information. +### Editions For users wanting a more pre-packaged experience several editions are available. * [Pattern Lab/Node: Gulp Edition](https://github.com/pattern-lab/edition-node-gulp) contains info how to get started within a Gulp task running environment. * [Pattern Lab/Node: Grunt Edition](https://github.com/pattern-lab/edition-node-grunt) contains info how to get started within a Grunt task running environment. * [Pattern Lab/Node: Vanilla Edition](https://github.com/pattern-lab/edition-node) contains info how to get started within a pure node environment. -* [Pattern Lab/Node: Webpack Edition](https://github.com/Comcast/patternlab-edition-node-webpack) contains info how to get started within a webpack environment. Thanks to Comcast for open-sourcing this stellar work! +* [Pattern Lab/Node: Webpack Edition](https://github.com/Comcast/patternlab-edition-node-webpack) contains info how to get started within a webpack environment. + >Thanks to the team at Comcast for open-sourcing this stellar work! + +## Ecosystem ![Pattern Lab Ecosystem](http://patternlab.io/assets/pattern-lab-2-image_18-large-opt.png) @@ -42,16 +49,55 @@ Core, and Editions, are part of the [Pattern Lab Ecosystem](http://patternlab.io ## Usage +`patternlab-node` can be required within any Node environment, taking in a configuration file at instantiation. + ``` javascript + const config = require('./patternlab-config.json'); const patternlab = require('patternlab-node')(config); -patternlab.build(doneCallBack, boolCleanOutputDir); + + +// build, optionally watching or choosing incremental builds +patternlab.build({ + cleanPublic: true, + watch: true +}); + +// or build, watch, and then self-host +patternlab.serve({ + cleanPublic: true +}); + ``` -* Read more about configuration via `patternlab-config.json`: https://github.com/pattern-lab/patternlab-node/wiki/Configuration -* The rest of the [api / command line interface](https://github.com/pattern-lab/patternlab-node/wiki/Command-Line-Interface) is documented in the wiki, and already implemented for you within [Node Editions](https://github.com/pattern-lab?utf8=%E2%9C%93&query=edition-node). -A [full-featured command line interface](https://github.com/pattern-lab/patternlab-node-cli) is in the works, courtesy of [@raphaelokon](https://github.com/raphaelokon). +* Read more about [configuration](https://github.com/pattern-lab/patternlab-node/wiki/Configuration) via `patternlab-config.json`. + +* Read more about the rest of [api](https://github.com/pattern-lab/patternlab-node/wiki/Public-API), and already implemented for you within [Editions](#editions). + +* A full-featured [command line interface](https://github.com/pattern-lab/patternlab-node-cli) is also available courtesy of [@raphaelokon](https://github.com/raphaelokon). + +### Events + +Many [events](https://github.com/pattern-lab/patternlab-node/wiki/Creating-Plugins#events) are emitted during Pattern Lab operations, originally built to support plugins. Below is a sample, allowing users to be informed of asset or pattern changes. + +``` javascript + +patternlab.serve(...); + +patternlab.events.on('patternlab-asset-change', (data) => { + console.log(data); // {file: 'path/to/file.css', dest: 'path/to/destination'} +}); + +patternlab.events.on('patternlab-pattern-change', (data) => { + console.log(data); // {file: 'path/to/file.ext'} +}); + +patternlab.events.on('patternlab-global-change', (data) => { + console.log(data); // {file: 'path/to/file.ext'} +}); + +``` ## Development Installation / Workflow @@ -63,7 +109,7 @@ cd /patternlab-node git clone https://github.com/pattern-lab/patternlab-node.git npm install npm link -cd location/of/edition +cd location/of/editionOrSourceAndConfig npm link patternlab-node ``` @@ -72,7 +118,7 @@ The above is a bit verbose, but illustrates: 1. how to clone this repository to an arbitrary location 2. install all dependencies (run `npm install --dev` if your NODE_ENV is production for some reason) 3. setup the `npm link` to your local copy -4. use the local copy of patternlab-node in your edition +4. use the local copy of patternlab-node in your edition / working directory > Make sure to change to whichever branch you intend to hack on or test within your cloned repository, such as `dev` or `bugfix/fixes-broken-unittest` From 529728c2e513450e2bb2399dfbc074410a1339ac Mon Sep 17 00:00:00 2001 From: Evan Lovely Date: Thu, 19 Oct 2017 13:34:32 -0700 Subject: [PATCH 91/98] Removing redundant config.theme --- core/lib/ui_builder.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/lib/ui_builder.js b/core/lib/ui_builder.js index 2df7218f0..21865a2dd 100644 --- a/core/lib/ui_builder.js +++ b/core/lib/ui_builder.js @@ -592,9 +592,6 @@ var ui_builder = function () { //plugins output += 'var plugins = ' + JSON.stringify(patternlab.plugins || []) + ';' + eol; - //theme - output += 'var theme = ' + JSON.stringify(patternlab.config.theme) + ';' + eol; - //smaller config elements output += 'var defaultShowPatternInfo = ' + (patternlab.config.defaultShowPatternInfo ? patternlab.config.defaultShowPatternInfo : 'false') + ';' + eol; output += 'var defaultPattern = "' + (patternlab.config.defaultPattern ? patternlab.config.defaultPattern : 'all') + '";' + eol; From c68e6a79252129c292b95790985cf63528e0276d Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 20 Oct 2017 03:15:56 -0500 Subject: [PATCH 92/98] feat(README): Add coveralls badge to README closes #728 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fdb9767ce..7a215c591 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Pattern Lab Logo](/patternlab.png "Pattern Lab Logo") -[![Build Status](https://travis-ci.org/pattern-lab/patternlab-node.svg?branch=master)](https://travis-ci.org/pattern-lab/patternlab-node) ![current release](https://img.shields.io/github/release/pattern-lab/patternlab-node.svg) ![license](https://img.shields.io/github/license/pattern-lab/patternlab-node.svg) [![Join the chat at Gitter](https://badges.gitter.im/pattern-lab/node.svg)](https://gitter.im/pattern-lab/node) +[![Build Status](https://travis-ci.org/pattern-lab/patternlab-node.svg?branch=master)](https://travis-ci.org/pattern-lab/patternlab-node) ![current release](https://img.shields.io/github/release/pattern-lab/patternlab-node.svg) ![license](https://img.shields.io/github/license/pattern-lab/patternlab-node.svg) [![Coverage Status](https://coveralls.io/repos/github/pattern-lab/patternlab-node/badge.svg?branch=master)](https://coveralls.io/github/pattern-lab/patternlab-node?branch=master) [![Join the chat at Gitter](https://badges.gitter.im/pattern-lab/node.svg)](https://gitter.im/pattern-lab/node) # Pattern Lab Node Core From 1db99158a65173ce4fbbab9295c5ccb49d65f770 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Fri, 20 Oct 2017 03:28:25 -0500 Subject: [PATCH 93/98] chore(gitgraph): Use CDN assets, removing need for installation part of #696 --- .github/gitgraph/README.md | 6 ------ .github/gitgraph/branching-scheme.html | 6 +++--- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/gitgraph/README.md b/.github/gitgraph/README.md index e87ca5248..02cc14ca4 100644 --- a/.github/gitgraph/README.md +++ b/.github/gitgraph/README.md @@ -3,12 +3,6 @@ Generating a new graph This folder uses http://gitgraphjs.com/ for generating the git graph model. -To generate a new one, install `gitgraph.js` via `bower`. - -``` -bower install gitgraph.js -``` - 1. Change `patternlab-flow.js` to your needs according to the documentation on http://gitgraphjs.com/ 2. Open branching-scheme.html in browse, right click the graph and "Save as...". 3. Overwrite `/.github/branching-scheme.png` diff --git a/.github/gitgraph/branching-scheme.html b/.github/gitgraph/branching-scheme.html index 39d1deb13..32d2ffb80 100644 --- a/.github/gitgraph/branching-scheme.html +++ b/.github/gitgraph/branching-scheme.html @@ -1,7 +1,7 @@ - +