Skip to content

Commit 774b827

Browse files
committed
feat(meta patterns): Async support
1 parent ea69bdc commit 774b827

File tree

3 files changed

+101
-117
lines changed

3 files changed

+101
-117
lines changed

core/index.js

Lines changed: 74 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ const pe = require('./lib/pattern_exporter');
2222
const lh = require('./lib/lineage_hunter');
2323
const markModifiedPatterns = require('./lib/markModifiedPatterns');
2424
const parseAllLinks = require('./lib/parseAllLinks');
25-
const renderSync = require('./lib/renderSync');
25+
const processMetaPattern = require('./lib/processMetaPattern');
26+
const render = require('./lib/render');
27+
const Pattern = require('./lib/object_factory').Pattern;
2628

2729
const defaultConfig = require('../patternlab-config.json');
2830

@@ -40,7 +42,6 @@ updateNotifier({
4042
updateCheckInterval: 1000 * 60 * 60 * 24 // notify at most once a day
4143
}).notify();
4244

43-
4445
/**
4546
* Returns the standardized default config
4647
*
@@ -186,73 +187,85 @@ const patternlab_module = function (config) {
186187
patternlab.processAllPatternsRecursive(paths.source.patterns, patternlab);
187188

188189
//take the user defined head and foot and process any data and patterns that apply
189-
// GTP: should these really be invoked from outside?
190-
// TODO: should these be wrapped in promises?
191-
patternlab.processHeadPattern();
192-
patternlab.processFootPattern();
193-
194-
//cascade any patternStates
195-
lineage_hunter.cascade_pattern_states(patternlab);
196-
197-
//set pattern-specific header if necessary
198-
let head;
199-
if (patternlab.userHead) {
200-
head = patternlab.userHead;
201-
} else {
202-
head = patternlab.header;
203-
}
204-
205-
//set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header
206-
patternlab.data.patternLabHead = renderSync(patternlab.header, {
207-
cacheBuster: patternlab.cacheBuster
208-
});
209-
210-
// If deletePatternDir == true or graph needs to be updated
211-
// rebuild all patterns
212-
let patternsToBuild = null;
190+
const headPatternPromise = processMetaPattern(`_00-head.${patternlab.config.patternExtension}`, 'userHead', patternlab);
191+
const footPatternPromise = processMetaPattern(`_01-foot.${patternlab.config.patternExtension}`, 'userFoot', patternlab);
213192

214-
// If deletePatternDir == true or graph needs to be updated
215-
// rebuild all patterns
216-
patternsToBuild = null;
193+
return Promise.all([headPatternPromise, footPatternPromise]).then(() => {
217194

218-
if (patternlab.incrementalBuildsEnabled) {
219-
// When the graph was loaded from file, some patterns might have been moved/deleted between runs
220-
// so the graph data become out of sync
221-
patternlab.graph.sync().forEach(n => {
222-
logger.info("[Deleted/Moved] " + n);
223-
});
195+
//cascade any patternStates
196+
lineage_hunter.cascade_pattern_states(patternlab);
224197

225-
// TODO Find created or deleted files
226-
const now = new Date().getTime();
227-
markModifiedPatterns(now, patternlab);
228-
patternsToBuild = patternlab.graph.compileOrder();
229-
} else {
230-
// build all patterns, mark all to be rebuilt
231-
patternsToBuild = patternlab.patterns;
232-
for (const p of patternsToBuild) {
233-
p.compileState = CompileState.NEEDS_REBUILD;
198+
//set pattern-specific header if necessary
199+
let head;
200+
if (patternlab.userHead) {
201+
head = patternlab.userHead;
202+
} else {
203+
head = patternlab.header;
234204
}
235-
}
236205

237-
//render all patterns last, so lineageR works
238-
return patternsToBuild
239-
.reduce((previousPromise, pattern) => {
240-
return previousPromise.then(() => patternlab.renderSinglePattern(pattern, head));
241-
}, Promise.resolve())
242-
.then(() => {
243-
// Saves the pattern graph when all files have been compiled
244-
PatternGraph.storeToFile(patternlab);
245-
if (patternlab.config.exportToGraphViz) {
246-
PatternGraph.exportToDot(patternlab, "dependencyGraph.dot");
247-
logger.info(`Exported pattern graph to ${path.join(config.paths.public.root, "dependencyGraph.dot")}`);
206+
//set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header
207+
return render(Pattern.createEmpty({extendedTemplate: patternlab.header}), {
208+
cacheBuster: patternlab.cacheBuster
209+
}).then((results) => {
210+
patternlab.data.patternLabHead = results;
211+
212+
// If deletePatternDir == true or graph needs to be updated
213+
// rebuild all patterns
214+
let patternsToBuild = null;
215+
216+
// If deletePatternDir == true or graph needs to be updated
217+
// rebuild all patterns
218+
patternsToBuild = null;
219+
220+
if (patternlab.incrementalBuildsEnabled) {
221+
// When the graph was loaded from file, some patterns might have been moved/deleted between runs
222+
// so the graph data become out of sync
223+
patternlab.graph.sync().forEach(n => {
224+
logger.info("[Deleted/Moved] " + n);
225+
});
226+
227+
// TODO Find created or deleted files
228+
const now = new Date().getTime();
229+
markModifiedPatterns(now, patternlab);
230+
patternsToBuild = patternlab.graph.compileOrder();
231+
} else {
232+
// build all patterns, mark all to be rebuilt
233+
patternsToBuild = patternlab.patterns;
234+
for (const p of patternsToBuild) {
235+
p.compileState = CompileState.NEEDS_REBUILD;
236+
}
248237
}
249238

250-
//export patterns if necessary
251-
pattern_exporter.export_patterns(patternlab);
239+
//render all patterns last, so lineageR works
240+
return patternsToBuild
241+
.reduce((previousPromise, pattern) => {
242+
return previousPromise.then(() => patternlab.renderSinglePattern(pattern, head));
243+
}, Promise.resolve())
244+
.then(() => {
245+
// Saves the pattern graph when all files have been compiled
246+
PatternGraph.storeToFile(patternlab);
247+
if (patternlab.config.exportToGraphViz) {
248+
PatternGraph.exportToDot(patternlab, "dependencyGraph.dot");
249+
logger.info(`Exported pattern graph to ${path.join(config.paths.public.root, "dependencyGraph.dot")}`);
250+
}
251+
252+
//export patterns if necessary
253+
pattern_exporter.export_patterns(patternlab);
254+
});
255+
256+
}).catch((reason) => {
257+
console.log(reason);
258+
logger.error('Error rendering pattern lab header');
252259
});
253-
}).catch((err) => {
254-
console.log(err);
255-
logger.info('Error in buildPatterns()');
260+
261+
}).catch((reason) => {
262+
console.log(reason);
263+
logger.error('Error processing meta patterns');
264+
});
265+
266+
}).catch((reason) => {
267+
console.log(reason);
268+
logger.error('Error in buildPatterns()');
256269
});
257270
}
258271

core/lib/patternlab.js

Lines changed: 3 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ const pm = require('./plugin_manager');
1111
const packageInfo = require('../../package.json');
1212
const buildListItems = require('./buildListItems');
1313
const dataLoader = require('./data_loader')();
14-
const decompose = require('./decompose');
1514
const logger = require('./log');
1615
const processIterative = require('./processIterative');
1716
const processRecursive = require('./processRecursive');
@@ -210,58 +209,6 @@ module.exports = class PatternLab {
210209
starterkit_manager.load_starterkit(starterkitName, clean);
211210
}
212211

213-
214-
// Pattern processing methods
215-
216-
/**
217-
* Process the user-defined pattern head and prepare it for rendering
218-
*/
219-
processHeadPattern() {
220-
try {
221-
const headPath = path.resolve(this.config.paths.source.meta, '_00-head.mustache');
222-
const headPattern = new Pattern(headPath, null, this);
223-
headPattern.template = fs.readFileSync(headPath, 'utf8');
224-
headPattern.isPattern = false;
225-
headPattern.isMetaPattern = true;
226-
decompose(headPattern, this, true).then(() => {
227-
this.userHead = headPattern.extendedTemplate;
228-
});
229-
}
230-
catch (ex) {
231-
logger.warning(`Could not find the user-editable header template, currently configured to be at ${path.join(this.config.paths.source.meta, '_00-head.ext')}. Your configured path may be incorrect (check this.config.paths.source.meta in your config file), the file may have been deleted, or it may have been left in the wrong place during a migration or update.`);
232-
logger.warning(ex);
233-
234-
// GTP: it seems increasingly naughty as we refactor to just unilaterally do this here,
235-
// but whatever. For now.
236-
process.exit(1);
237-
}
238-
}
239-
240-
/**
241-
* Process the user-defined pattern footer and prepare it for rendering
242-
*/
243-
processFootPattern() {
244-
try {
245-
const footPath = path.resolve(this.config.paths.source.meta, '_01-foot.mustache');
246-
const footPattern = new Pattern(footPath, null, this);
247-
footPattern.template = fs.readFileSync(footPath, 'utf8');
248-
footPattern.isPattern = false;
249-
footPattern.isMetaPattern = true;
250-
decompose(footPattern, this, true).then(() => {
251-
this.userFoot = footPattern.extendedTemplate;
252-
});
253-
}
254-
catch (ex) {
255-
logger.error(`Could not find the user-editable footer template, currently configured to be at ${path.join(this.config.paths.source.meta, '_01-foot.ext')}. Your configured path may be incorrect (check this.config.paths.source.meta in your config file), the file may have been deleted, or it may have been left in the wrong place during a migration or update.`);
256-
logger.warning(ex);
257-
258-
// GTP: it seems increasingly naughty as we refactor to just unilaterally do this here,
259-
// but whatever. For now.
260-
process.exit(1);
261-
}
262-
}
263-
264-
265212
// info methods
266213
getVersion() {
267214
return this.package.version;
@@ -367,7 +314,7 @@ module.exports = class PatternLab {
367314
pattern.header = head;
368315

369316
// const headHTML
370-
const headPromise = Promise.resolve(render(Pattern.createEmpty({extendedTemplate: pattern.header}), allData));
317+
const headPromise = render(Pattern.createEmpty({extendedTemplate: pattern.header}), allData);
371318

372319
///////////////
373320
// PATTERN
@@ -417,11 +364,11 @@ module.exports = class PatternLab {
417364

418365
//set the pattern-specific footer by compiling the general-footer with data, and then adding it to the meta footer
419366
// footerPartial
420-
const footerPartialPromise = Promise.resolve(render(Pattern.createEmpty({extendedTemplate: this.footer}), {
367+
const footerPartialPromise = render(Pattern.createEmpty({extendedTemplate: this.footer}), {
421368
isPattern: pattern.isPattern,
422369
patternData: pattern.patternData,
423370
cacheBuster: this.cacheBuster
424-
}));
371+
});
425372

426373
const self = this;
427374

core/lib/processMetaPattern.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"use strict";
2+
3+
const path = require('path');
4+
5+
const Pattern = require('./object_factory').Pattern;
6+
const decompose = require('./decompose');
7+
const logger = require('./log');
8+
9+
//this may be mocked in unit tests, so let it be overridden
10+
let fs = require('fs-extra'); // eslint-disable-line
11+
12+
module.exports = function (fileName, metaType, patternlab) {
13+
const metaPath = path.resolve(patternlab.config.paths.source.meta, fileName);
14+
const metaPattern = new Pattern(metaPath, null, patternlab);
15+
metaPattern.template = fs.readFileSync(metaPath, 'utf8');
16+
metaPattern.isPattern = false;
17+
metaPattern.isMetaPattern = true;
18+
return decompose(metaPattern, patternlab, true).then(() => {
19+
patternlab[metaType] = metaPattern.extendedTemplate;
20+
}).catch((reason) => {
21+
logger.warning(`Could not find the user-editable template ${fileName}, currently configured to be at ${patternlab.config.paths.source.meta}. Your configured path may be incorrect (check paths.source.meta in your config file), the file may have been deleted, or it may have been left in the wrong place during a migration or update.`);
22+
logger.warning(reason);
23+
});
24+
};

0 commit comments

Comments
 (0)