Skip to content

Commit ba1c436

Browse files
committed
feat(parameter_hunter): Async support
with initial test coverage
1 parent 47c9eee commit ba1c436

File tree

6 files changed

+188
-147
lines changed

6 files changed

+188
-147
lines changed

core/lib/parameter_hunter.js

Lines changed: 83 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
'use strict';
22

3+
const path = require('path');
4+
const extend = require('util')._extend;
5+
const _ = require('lodash');
6+
7+
const getPartial = require('./get');
8+
const logger = require('./log');
9+
const parseLink = require('./parseLink');
10+
const render = require('./render');
11+
const jsonCopy = require('./json_copy');
12+
const pa = require('./pattern_assembler');
13+
const smh = require('./style_modifier_hunter');
14+
15+
const style_modifier_hunter = new smh();
16+
const pattern_assembler = new pa();
17+
318
const parameter_hunter = function () {
4-
const extend = require('util')._extend;
5-
const _ = require('lodash');
6-
const jsonCopy = require('./json_copy');
7-
const pa = require('./pattern_assembler');
8-
const smh = require('./style_modifier_hunter');
9-
const style_modifier_hunter = new smh();
10-
const pattern_assembler = new pa();
11-
const logger = require('./log');
12-
const parseLink = require('./parseLink');
13-
const render = require('./render');
1419

1520
/**
1621
* This function is really to accommodate the lax JSON-like syntax allowed by
@@ -242,70 +247,88 @@ const parameter_hunter = function () {
242247
return paramStringWellFormed;
243248
}
244249

250+
//compile this partial immeadiately, essentially consuming it.
245251
function findparameters(pattern, patternlab) {
246-
247252
if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) {
248253

249-
//compile this partial immeadiately, essentially consuming it.
250-
pattern.parameteredPartials.forEach(function (pMatch) {
251-
//find the partial's name and retrieve it
252-
const partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0];
253-
const partialPattern = pattern_assembler.getPartial(partialName, patternlab);
254-
255-
//if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #190
256-
partialPattern.extendedTemplate = partialPattern.template;
257-
258-
logger.debug(`found patternParameters for ${partialName}`);
259-
260-
//strip out the additional data, convert string to JSON.
261-
const leftParen = pMatch.indexOf('(');
262-
const rightParen = pMatch.lastIndexOf(')');
263-
const paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}';
264-
const paramStringWellFormed = paramToJson(paramString);
265-
266-
let paramData = {};
267-
let globalData = {};
268-
let localData = {};
269-
270-
try {
271-
paramData = JSON.parse(paramStringWellFormed);
272-
globalData = jsonCopy(patternlab.data, 'config.paths.source.data global data');
273-
localData = jsonCopy(pattern.jsonFileData || {}, `pattern ${pattern.patternPartial} data`);
274-
} catch (err) {
275-
logger.warning(`There was an error parsing JSON for ${pattern.relPath}`);
276-
logger.warning(err);
277-
}
254+
logger.debug(`processing patternParameters for ${pattern.partialName}`);
278255

279-
// resolve any pattern links that might be present
280-
paramData = parseLink(patternlab, paramData, pattern.patternPartial);
256+
return pattern.parameteredPartials.reduce((previousPromise, pMatch) => {
257+
return previousPromise.then(() => {
281258

282-
//combine all data: GLOBAL DATA => PATTERN.JSON DATA => PARAMETER DATA
283-
let allData = _.merge(globalData, localData);
284-
allData = _.merge(allData, paramData);
259+
logger.debug(`processing patternParameter ${pMatch}`);
285260

286-
//if the partial has pattern parameters itself, we need to handle those
287-
findparameters(partialPattern, patternlab);
261+
//find the partial's name and retrieve it
262+
const partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0];
263+
const partialPattern = getPartial(path.normalize(partialName), patternlab);
288264

289-
//if partial has style modifier data, replace the styleModifier value
290-
if (pattern.stylePartials && pattern.stylePartials.length > 0) {
291-
style_modifier_hunter.consume_style_modifier(partialPattern, pMatch, patternlab);
292-
}
265+
//if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #190
266+
partialPattern.extendedTemplate = partialPattern.template;
267+
268+
logger.debug(`retrieved pattern ${partialName}`);
269+
270+
//strip out the additional data, convert string to JSON.
271+
const leftParen = pMatch.indexOf('(');
272+
const rightParen = pMatch.lastIndexOf(')');
273+
const paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}';
274+
const paramStringWellFormed = paramToJson(paramString);
275+
276+
let paramData = {};
277+
let globalData = {};
278+
let localData = {};
279+
280+
try {
281+
paramData = JSON.parse(paramStringWellFormed);
282+
globalData = jsonCopy(patternlab.data, 'config.paths.source.data global data');
283+
localData = jsonCopy(pattern.jsonFileData || {}, `pattern ${pattern.patternPartial} data`);
284+
} catch (err) {
285+
logger.warning(`There was an error parsing JSON for ${pattern.relPath}`);
286+
logger.warning(err);
287+
}
288+
289+
// resolve any pattern links that might be present
290+
paramData = parseLink(patternlab, paramData, pattern.patternPartial);
291+
292+
//combine all data: GLOBAL DATA => PATTERN.JSON DATA => PARAMETER DATA
293+
let allData = _.merge(globalData, localData);
294+
allData = _.merge(allData, paramData);
295+
296+
//if the partial has pattern parameters itself, we need to handle those
297+
return findparameters(partialPattern, patternlab).then(() => {
298+
299+
logger.debug(`recursively checking the partial itself ${partialPattern.patternPartial}`);
300+
301+
//if partial has style modifier data, replace the styleModifier value
302+
if (pattern.stylePartials && pattern.stylePartials.length > 0) {
303+
style_modifier_hunter.consume_style_modifier(partialPattern, pMatch, patternlab);
304+
}
305+
306+
//extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally
307+
allData.link = extend({}, patternlab.data.link);
293308

294-
//extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally
295-
allData.link = extend({}, patternlab.data.link);
309+
return render(partialPattern, allData).then((results) => {
296310

297-
const renderPromise = render(pattern, allData);
311+
logger.debug(`rendering the partialpattern ${partialPattern.patternPartial}`);
298312

299-
return renderPromise.then((results) => {
313+
//defensively do this in case not set yet
314+
if (!pattern.extendedTemplate) {
315+
pattern.extendedTemplate = pattern.template;
316+
}
300317

301-
//remove the parameter from the partial and replace it with the rendered partial + paramData
302-
pattern.extendedTemplate = pattern.extendedTemplate.replace(pMatch, results);
318+
//remove the parameter from the partial and replace it with the rendered partial + paramData
319+
pattern.extendedTemplate = pattern.extendedTemplate.replace(pMatch, results);
303320

304-
//update the extendedTemplate in the partials object in case this pattern is consumed later
305-
patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate;
321+
//update the extendedTemplate in the partials object in case this pattern is consumed later
322+
patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate;
323+
});
324+
});
325+
}).catch((reason) => {
326+
logger.error(reason);
306327
});
307-
});
328+
}, Promise.resolve());
308329
}
330+
logger.debug(`pattern has no partials ${pattern.patternPartial}`);
331+
return Promise.resolve();
309332
}
310333

311334
return {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<p>{{description}}</p>
1+
<h1>{{foo}}</h1><p>{{description}}</p>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{> 00-test/comment.mustache(description: 'A life is like a garden. Perfect moments can be had, but not preserved, except in memory.') }}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{> 00-test/comment(description: 'A life is like a garden. Perfect moments can be had, but not preserved, except in memory.') }}

0 commit comments

Comments
 (0)