From bd485d29603424248a5795cd3ded0594fcd27fb1 Mon Sep 17 00:00:00 2001 From: Brian Muenzenmeyer Date: Mon, 22 Jan 2018 14:25:31 -0600 Subject: [PATCH] feat(index): Make the cleaning of public/ an asynchronous adventure Updated fs-extra to latest --- core/index.js | 254 ++++++++++++++++++++------------------- package-lock.json | 106 ++++++++-------- package.json | 2 +- test/index_tests.js | 7 +- test/patternlab_tests.js | 7 +- 5 files changed, 194 insertions(+), 182 deletions(-) diff --git a/core/index.js b/core/index.js index b68071f23..6b6943f54 100644 --- a/core/index.js +++ b/core/index.js @@ -160,10 +160,17 @@ const patternlab_module = function(config) { function cleanBuildDirectory(incrementalBuildsEnabled) { if (incrementalBuildsEnabled) { logger.info('Incremental builds enabled.'); + return Promise.resolve(); } else { // needs to be done BEFORE processing patterns - fs.removeSync(paths.public.patterns); - fs.emptyDirSync(paths.public.patterns); + return fs + .emptyDir(paths.public.patterns) + .then(() => { + return Promise.resolve(); + }) + .catch(reason => { + logger.error(reason); + }); } } @@ -193,129 +200,134 @@ const patternlab_module = function(config) { // // CLEAN BUILD DIRECTORY, maybe // - cleanBuildDirectory(patternlab.incrementalBuildsEnabled); - - patternlab.buildGlobalData(additionalData); - - return patternlab - .processAllPatternsIterative(paths.source.patterns) - .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 - parseAllLinks(patternlab); - - //dive again to recursively include partials, filling out the - //extendedTemplate property of the patternlab.patterns elements - - return patternlab - .processAllPatternsRecursive(paths.source.patterns) - .then(() => { - //take the user defined head and foot and process any data and patterns that apply - const headPatternPromise = processMetaPattern( - `_00-head.${patternlab.config.patternExtension}`, - 'userHead', - patternlab - ); - const footPatternPromise = processMetaPattern( - `_01-foot.${patternlab.config.patternExtension}`, - 'userFoot', - patternlab - ); - - return Promise.all([headPatternPromise, footPatternPromise]) - .then(() => { - //cascade any patternStates - lineage_hunter.cascade_pattern_states(patternlab); - - //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header - return render( - Pattern.createEmpty({ extendedTemplate: patternlab.header }), - { - cacheBuster: patternlab.cacheBuster, - } - ) - .then(results => { - patternlab.data.patternLabHead = results; - - // If deletePatternDir == true or graph needs to be updated - // rebuild all patterns - let patternsToBuild = null; - - // If deletePatternDir == true or graph needs to be updated - // rebuild all patterns - patternsToBuild = null; - - if (patternlab.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 - patternlab.graph.sync().forEach(n => { - logger.info('[Deleted/Moved] ' + n); - }); - - // TODO Find created or deleted files - const now = new Date().getTime(); - markModifiedPatterns(now, patternlab); - patternsToBuild = patternlab.graph.compileOrder(); - } else { - // build all patterns, mark all to be rebuilt - patternsToBuild = patternlab.patterns; - for (const p of patternsToBuild) { - p.compileState = CompileState.NEEDS_REBUILD; - } + return cleanBuildDirectory(patternlab.incrementalBuildsEnabled).then(() => { + patternlab.buildGlobalData(additionalData); + + return patternlab + .processAllPatternsIterative(paths.source.patterns) + .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 + parseAllLinks(patternlab); + + //dive again to recursively include partials, filling out the + //extendedTemplate property of the patternlab.patterns elements + + return patternlab + .processAllPatternsRecursive(paths.source.patterns) + .then(() => { + //take the user defined head and foot and process any data and patterns that apply + const headPatternPromise = processMetaPattern( + `_00-head.${patternlab.config.patternExtension}`, + 'userHead', + patternlab + ); + const footPatternPromise = processMetaPattern( + `_01-foot.${patternlab.config.patternExtension}`, + 'userFoot', + patternlab + ); + + return Promise.all([headPatternPromise, footPatternPromise]) + .then(() => { + //cascade any patternStates + lineage_hunter.cascade_pattern_states(patternlab); + + //set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header + return render( + Pattern.createEmpty({ + extendedTemplate: patternlab.header, + }), + { + cacheBuster: patternlab.cacheBuster, } + ) + .then(results => { + patternlab.data.patternLabHead = results; + + // If deletePatternDir == true or graph needs to be updated + // rebuild all patterns + let patternsToBuild = null; + + // If deletePatternDir == true or graph needs to be updated + // rebuild all patterns + patternsToBuild = null; + + if (patternlab.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 + patternlab.graph.sync().forEach(n => { + logger.info('[Deleted/Moved] ' + n); + }); + + // TODO Find created or deleted files + const now = new Date().getTime(); + markModifiedPatterns(now, patternlab); + patternsToBuild = patternlab.graph.compileOrder(); + } else { + // build all patterns, mark all to be rebuilt + patternsToBuild = patternlab.patterns; + for (const p of patternsToBuild) { + p.compileState = CompileState.NEEDS_REBUILD; + } + } - //render all patterns last, so lineageR works - return patternsToBuild - .reduce((previousPromise, pattern) => { - return previousPromise.then(() => - patternlab.renderSinglePattern(pattern) - ); - }, Promise.resolve()) - .then(() => { - // Saves the pattern graph when all files have been compiled - PatternGraph.storeToFile(patternlab); - if (patternlab.config.exportToGraphViz) { - PatternGraph.exportToDot( - patternlab, - 'dependencyGraph.dot' + //render all patterns last, so lineageR works + return patternsToBuild + .reduce((previousPromise, pattern) => { + return previousPromise.then(() => + patternlab.renderSinglePattern(pattern) ); - logger.info( - `Exported pattern graph to ${path.join( - config.paths.public.root, + }, Promise.resolve()) + .then(() => { + // Saves the pattern graph when all files have been compiled + PatternGraph.storeToFile(patternlab); + if (patternlab.config.exportToGraphViz) { + PatternGraph.exportToDot( + patternlab, 'dependencyGraph.dot' - )}` - ); - } - - //export patterns if necessary - pattern_exporter.export_patterns(patternlab); - }) - .catch(reason => { - console.log(reason); - logger.error('Error rendering patterns'); - }); - }) - .catch(reason => { - console.log(reason); - logger.error('Error rendering pattern lab header'); - }); - }) - .catch(reason => { - console.log(reason); - logger.error('Error processing meta patterns'); - }); - }) - .catch(reason => { - console.log(reason); - logger.error('Error processing patterns recursively'); - }); - }) - .catch(reason => { - console.log(reason); - logger.error('Error in buildPatterns()'); - }); + ); + logger.info( + `Exported pattern graph to ${path.join( + config.paths.public.root, + 'dependencyGraph.dot' + )}` + ); + } + + //export patterns if necessary + pattern_exporter.export_patterns(patternlab); + }) + .catch(reason => { + console.log(reason); + logger.error('Error rendering patterns'); + }); + }) + .catch(reason => { + console.log(reason); + logger.error('Error rendering pattern lab header'); + }); + }) + .catch(reason => { + console.log(reason); + logger.error('Error processing meta patterns'); + }); + }) + .catch(reason => { + console.log(reason); + logger.error('Error processing patterns recursively'); + }); + }) + .catch(reason => { + console.log(reason); + logger.error('Error in buildPatterns()'); + }); + }); } return { diff --git a/package-lock.json b/package-lock.json index 9badb6256..629c2c4ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,6 +43,32 @@ "requires": { "fs-extra": "0.30.0", "handlebars": "4.0.11" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": + "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": + "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + } } }, "@pattern-lab/patternengine-node-mustache": { @@ -51,7 +77,6 @@ "https://registry.npmjs.org/@pattern-lab/patternengine-node-mustache/-/patternengine-node-mustache-2.0.0-alpha.2.tgz", "integrity": "sha1-5gEHXs5ygzA9LDMeZ5CZMseUdfg=", "requires": { - "fs-extra": "0.30.0", "mustache": "2.3.0" } }, @@ -2469,55 +2494,14 @@ "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=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": + "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", "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" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "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=" - }, - "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" - } - } + "jsonfile": "4.0.0", + "universalify": "0.1.1" } }, "fsevents": { @@ -3563,8 +3547,7 @@ "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "graphlib": { "version": "2.1.1", @@ -4092,6 +4075,14 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "4.1.11" + } + }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -4139,6 +4130,15 @@ "is-buffer": "1.1.5" } }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, "lazy-cache": { "version": "1.0.4", "resolved": @@ -7491,6 +7491,12 @@ "strip-ansi": "3.0.1" } }, + "universalify": { + "version": "0.1.1", + "resolved": + "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + }, "unix-crypt-td-js": { "version": "1.0.0", "resolved": diff --git a/package.json b/package.json index 0376ed4e8..ece7bfdee 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "chalk": "^1.1.3", "chokidar": "^1.7.0", "dive": "^0.5.0", - "fs-extra": "^0.30.0", + "fs-extra": "^5.0.0", "glob": "^7.0.0", "graphlib": "^2.1.1", "js-beautify": "^1.6.3", diff --git a/test/index_tests.js b/test/index_tests.js index 12b2e5b03..d8cf5405a 100644 --- a/test/index_tests.js +++ b/test/index_tests.js @@ -30,11 +30,8 @@ const fsMock = { readJSONSync: function(path, encoding) { return fs.readJSONSync(path, encoding); }, - removeSync: function(path) { - fs.removeSync(path); - }, - emptyDirSync: function(path) { - fs.emptyDirSync(path); + emptyDir: function(path) { + return fs.emptyDir(path); }, readFileSync: function(path, encoding) { return fs.readFileSync(path, encoding); diff --git a/test/patternlab_tests.js b/test/patternlab_tests.js index 197e68f53..f1b33717c 100644 --- a/test/patternlab_tests.js +++ b/test/patternlab_tests.js @@ -15,11 +15,8 @@ const fsMock = { readJSONSync: function(path, encoding) { return fs.readJSONSync(path, encoding); }, - removeSync: function(path) { - fs.removeSync(path); - }, - emptyDirSync: function(path) { - fs.emptyDirSync(path); + emptyDir: function(path) { + return fs.emptyDir(path); }, readFileSync: function(path, encoding) { return fs.readFileSync(path, encoding);