Skip to content

Commit 87c9d0d

Browse files
committed
feat(uikits): filter out excluded pattern states from uikit output
1 parent ef882d0 commit 87c9d0d

File tree

5 files changed

+145
-35
lines changed

5 files changed

+145
-35
lines changed

packages/core/src/lib/compose.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const jsonCopy = require('./json_copy');
77
const logger = require('./log');
88
const parseLink = require('./parseLink');
99
const render = require('./render');
10+
const uikitExcludePattern = require('./uikitExcludePattern');
1011

1112
const Pattern = require('./object_factory').Pattern;
1213
const CompileState = require('./object_factory').CompileState;
@@ -37,6 +38,11 @@ module.exports = function(pattern, patternlab) {
3738

3839
return Promise.all(
3940
_.map(patternlab.uikits, uikit => {
41+
// exclude pattern from uikit rendering
42+
if (uikitExcludePattern(pattern, uikit)) {
43+
return Promise.resolve();
44+
}
45+
4046
//render the pattern, but first consolidate any data we may have
4147
let allData;
4248

packages/core/src/lib/ui_builder.js

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const _ = require('lodash');
66
const of = require('./object_factory');
77
const Pattern = of.Pattern;
88
const logger = require('./log');
9+
const uikitExcludePattern = require('./uikitExcludePattern');
910

1011
//these are mocked in unit tests, so let them be overridden
1112
let render = require('./render'); //eslint-disable-line prefer-const
@@ -64,15 +65,29 @@ const ui_builder = function() {
6465
* Returns whether or not the pattern should be excluded from direct rendering or navigation on the front end
6566
* @param pattern - the pattern to test for inclusion/exclusion
6667
* @param patternlab - global data store
68+
* @param uikit - the current uikit being built
6769
* @returns boolean - whether or not the pattern is excluded
6870
*/
69-
function isPatternExcluded(pattern, patternlab) {
71+
function isPatternExcluded(pattern, patternlab, uikit) {
7072
let isOmitted;
7173

74+
// skip patterns that the uikit does not want to render
75+
isOmitted = uikitExcludePattern(pattern, uikit);
76+
if (isOmitted) {
77+
logger.info(
78+
`Omitting ${
79+
pattern.patternPartial
80+
} from styleguide patterns because its pattern state or tag is excluded within ${
81+
uikit.name
82+
}.`
83+
);
84+
return true;
85+
}
86+
7287
// skip underscore-prefixed files
7388
isOmitted = pattern.isPattern && pattern.fileName.charAt(0) === '_';
7489
if (isOmitted) {
75-
logger.debug(
90+
logger.info(
7691
`Omitting ${
7792
pattern.patternPartial
7893
} from styleguide patterns because it has an underscore suffix.`
@@ -83,7 +98,7 @@ const ui_builder = function() {
8398
//this is meant to be a homepage that is not present anywhere else
8499
isOmitted = pattern.patternPartial === patternlab.config.defaultPattern;
85100
if (isOmitted) {
86-
logger.debug(
101+
logger.info(
87102
`Omitting ${
88103
pattern.patternPartial
89104
} from styleguide patterns because it is defined as a defaultPattern.`
@@ -97,7 +112,7 @@ const ui_builder = function() {
97112
pattern.relPath.charAt(0) === '_' ||
98113
pattern.relPath.indexOf(path.sep + '_') > -1;
99114
if (isOmitted) {
100-
logger.debug(
115+
logger.info(
101116
`Omitting ${
102117
pattern.patternPartial
103118
} from styleguide patterns because its contained within an underscored directory.`
@@ -108,7 +123,7 @@ const ui_builder = function() {
108123
//this pattern is a head or foot pattern
109124
isOmitted = pattern.isMetaPattern;
110125
if (isOmitted) {
111-
logger.debug(
126+
logger.info(
112127
`Omitting ${
113128
pattern.patternPartial
114129
} from styleguide patterns because its a meta pattern.`
@@ -427,16 +442,21 @@ const ui_builder = function() {
427442
/**
428443
* Returns an object representing how the front end styleguide and navigation is structured
429444
* @param patternlab - global data store
445+
* @param uikit - the current uikit being built
430446
* @returns ptterns grouped by type -> subtype like atoms -> global -> pattern, pattern, pattern
431447
*/
432-
function groupPatterns(patternlab) {
448+
function groupPatterns(patternlab, uikit) {
433449
const groupedPatterns = {
434450
patternGroups: {},
435451
};
436452

437453
_.forEach(patternlab.patterns, function(pattern) {
438454
//ignore patterns we can omit from rendering directly
439-
pattern.omitFromStyleguide = isPatternExcluded(pattern, patternlab);
455+
pattern.omitFromStyleguide = isPatternExcluded(
456+
pattern,
457+
patternlab,
458+
uikit
459+
);
440460
if (pattern.omitFromStyleguide) {
441461
return;
442462
}
@@ -729,10 +749,10 @@ const ui_builder = function() {
729749

730750
const paths = patternlab.config.paths;
731751

732-
//determine which patterns should be included in the front-end rendering
733-
const styleguidePatterns = groupPatterns(patternlab);
734-
735752
const uikitPromises = _.map(patternlab.uikits, uikit => {
753+
//determine which patterns should be included in the front-end rendering
754+
const styleguidePatterns = groupPatterns(patternlab, uikit);
755+
736756
return new Promise(resolve => {
737757
//set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header
738758
const headerPromise = render(
@@ -880,11 +900,11 @@ const ui_builder = function() {
880900
buildFrontend: function(patternlab) {
881901
return buildFrontend(patternlab);
882902
},
883-
isPatternExcluded: function(pattern, patternlab) {
884-
return isPatternExcluded(pattern, patternlab);
903+
isPatternExcluded: function(pattern, patternlab, uikit) {
904+
return isPatternExcluded(pattern, patternlab, uikit);
885905
},
886-
groupPatterns: function(patternlab) {
887-
return groupPatterns(patternlab);
906+
groupPatterns: function(patternlab, uikit) {
907+
return groupPatterns(patternlab, uikit);
888908
},
889909
resetUIBuilderState: function(patternlab) {
890910
resetUIBuilderState(patternlab);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
const uikitExcludePattern = (pattern, uikit) => {
4+
const state = pattern.patternState;
5+
return uikit.excludedPatternStates.includes(state);
6+
};
7+
module.exports = uikitExcludePattern;

packages/core/test/ui_builder_tests.js

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ uiModule.__set__({
3333
buildFooter: buildFooterMock,
3434
});
3535

36+
const uikit = {
37+
name: 'uikit-workshop',
38+
modulePath: '',
39+
outputDir: 'test/output',
40+
excludedPatternStates: [],
41+
};
42+
3643
var ui = uiModule();
3744

3845
function createFakePatternLab(customProps) {
@@ -55,13 +62,7 @@ function createFakePatternLab(customProps) {
5562
},
5663
},
5764
data: {},
58-
uikits: {
59-
'uikit-workshop': {
60-
name: 'workshop',
61-
modulePath: '',
62-
outputDir: 'test/output',
63-
},
64-
},
65+
uikits: [uikit],
6566
};
6667
return extend(pl, customProps);
6768
}
@@ -74,7 +75,7 @@ tap.test(
7475
var pattern = new Pattern('00-test/_ignored-pattern.mustache');
7576

7677
//act
77-
var result = ui.isPatternExcluded(pattern, patternlab);
78+
var result = ui.isPatternExcluded(pattern, patternlab, uikit);
7879

7980
//assert
8081
test.equals(result, true);
@@ -91,7 +92,7 @@ tap.test(
9192
patternlab.config.defaultPattern = 'test-foo';
9293

9394
//act
94-
var result = ui.isPatternExcluded(pattern, patternlab);
95+
var result = ui.isPatternExcluded(pattern, patternlab, uikit);
9596

9697
//assert
9798
test.equals(result, true);
@@ -118,7 +119,7 @@ tap.test(
118119
});
119120

120121
//act
121-
var result = ui.isPatternExcluded(pattern, patternlab);
122+
var result = ui.isPatternExcluded(pattern, patternlab, uikit);
122123

123124
//assert
124125
test.equals(result, true);
@@ -140,7 +141,32 @@ tap.test(
140141
});
141142

142143
//act
143-
var result = ui.isPatternExcluded(pattern, patternlab);
144+
var result = ui.isPatternExcluded(pattern, patternlab, uikit);
145+
146+
//assert
147+
test.equals(result, true);
148+
test.end();
149+
}
150+
);
151+
152+
tap.test(
153+
'isPatternExcluded - returns true when pattern state found withing uikit exclusions',
154+
function(test) {
155+
//arrange
156+
var patternlab = createFakePatternLab({});
157+
var pattern = Pattern.createEmpty({
158+
relPath:
159+
'shown' + path.sep + '_patternsubtype' + path.sep + 'foo.mustache',
160+
isPattern: true,
161+
fileName: 'foo.mustache',
162+
patternPartial: 'shown-foo',
163+
patternState: 'complete',
164+
});
165+
166+
//act
167+
var result = ui.isPatternExcluded(pattern, patternlab, {
168+
excludedPatternStates: 'complete',
169+
});
144170

145171
//assert
146172
test.equals(result, true);
@@ -169,7 +195,7 @@ tap.test('groupPatterns - creates pattern groups correctly', function(test) {
169195
ui.resetUIBuilderState(patternlab);
170196

171197
//act
172-
var result = ui.groupPatterns(patternlab);
198+
var result = ui.groupPatterns(patternlab, uikit);
173199

174200
test.equals(
175201
result.patternGroups.patternType1.patternSubType1.blue.patternPartial,
@@ -232,7 +258,7 @@ tap.test('groupPatterns - orders patterns when provided from md', function(
232258
patternlab.patterns[1].order = 1;
233259

234260
//act
235-
ui.groupPatterns(patternlab);
261+
ui.groupPatterns(patternlab, uikit);
236262

237263
let patternType = _.find(patternlab.patternTypes, [
238264
'patternType',
@@ -272,7 +298,7 @@ tap.test(
272298
patternlab.patterns[1].order = 'notanumber!';
273299

274300
//act
275-
ui.groupPatterns(patternlab);
301+
ui.groupPatterns(patternlab, uikit);
276302

277303
let patternType = _.find(patternlab.patternTypes, [
278304
'patternType',
@@ -315,7 +341,7 @@ tap.test(
315341
patternlab.patterns[2].order = 2;
316342

317343
//act
318-
ui.groupPatterns(patternlab);
344+
ui.groupPatterns(patternlab, uikit);
319345

320346
let patternType = _.find(patternlab.patternTypes, [
321347
'patternType',
@@ -363,7 +389,7 @@ tap.test(
363389
ui.resetUIBuilderState(patternlab);
364390

365391
//act
366-
var result = ui.groupPatterns(patternlab);
392+
var result = ui.groupPatterns(patternlab, uikit);
367393

368394
//assert
369395
test.equals(
@@ -406,7 +432,7 @@ tap.test(
406432
ui.resetUIBuilderState(patternlab);
407433

408434
//act
409-
var result = ui.groupPatterns(patternlab);
435+
var result = ui.groupPatterns(patternlab, uikit);
410436

411437
//assert
412438
test.equals(patternlab.patternPaths['test']['foo'], '00-test-foo');
@@ -463,7 +489,7 @@ tap.test(
463489
ui.resetUIBuilderState(patternlab);
464490

465491
//act
466-
var result = ui.groupPatterns(patternlab);
492+
var result = ui.groupPatterns(patternlab, uikit);
467493

468494
//assert
469495
test.equals('todo', 'todo');
@@ -517,9 +543,7 @@ tap.test(
517543
);
518544
ui.resetUIBuilderState(patternlab);
519545

520-
const styleguidePatterns = ui.groupPatterns(patternlab);
521-
522-
const uikit = patternlab.uikits['uikit-workshop'];
546+
const styleguidePatterns = ui.groupPatterns(patternlab, uikit);
523547

524548
//act
525549
ui
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
'use strict';
2+
3+
const tap = require('tap');
4+
5+
const uikitExcludePattern = require('../src/lib/uikitExcludePattern');
6+
7+
tap.test(
8+
'uikitExcludePattern - returns false when uikit has no excluded states',
9+
test => {
10+
//arrange
11+
const uikit = { excludedPatternStates: [] };
12+
const pattern = { patternState: 'complete' };
13+
14+
//act
15+
const result = uikitExcludePattern(pattern, uikit);
16+
17+
//assert
18+
test.false(result);
19+
test.end();
20+
}
21+
);
22+
23+
tap.test(
24+
'uikitExcludePattern - returns false pattern does not have same state as uikit exclusions',
25+
test => {
26+
//arrange
27+
const uikit = { excludedPatternStates: ['complete'] };
28+
const pattern = { patternState: 'inprogress' };
29+
30+
//act
31+
const result = uikitExcludePattern(pattern, uikit);
32+
33+
//assert
34+
test.false(result);
35+
test.end();
36+
}
37+
);
38+
39+
tap.test(
40+
'uikitExcludePattern - returns true when uikit has same state as pattern',
41+
test => {
42+
//arrange
43+
const uikit = { excludedPatternStates: ['inreview', 'complete'] };
44+
const pattern = { patternState: 'complete' };
45+
46+
//act
47+
const result = uikitExcludePattern(pattern, uikit);
48+
49+
//assert
50+
test.true(result);
51+
test.end();
52+
}
53+
);

0 commit comments

Comments
 (0)