Skip to content

Commit 1f5af94

Browse files
Merge pull request #694 from pattern-lab/623-multiple-extensions
Allow engines to support multiple extensions
2 parents 0a41103 + eb92780 commit 1f5af94

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

core/lib/pattern_engines.js

+13-4
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,19 @@ const PatternEngines = Object.create({
123123
const of = require('./object_factory');
124124
if (pattern instanceof of.Pattern && typeof pattern.fileExtension === 'string' && pattern.fileExtension) {
125125
//loop through known engines and find the one that supports the pattern's fileExtension
126-
//TODO: support multiple extensions someday, such as .handlebars and .hbs
127126
const engineNames = Object.keys(this);
128127
for (let i = 0; i < engineNames.length; i++) {
129128
const engine = this[engineNames[i]];
130-
if (engine.engineFileExtension === pattern.fileExtension) {
131-
return engine.engineName;
129+
130+
if (Array.isArray(engine.engineFileExtension)) {
131+
if (engine.engineFileExtension.includes(pattern.fileExtension)) {
132+
return engine.engineName;
133+
}
134+
} else {
135+
//this likely means the users engines are out of date. todo: tell them to upgrade
136+
if (engine.engineFileExtension === pattern.fileExtension) {
137+
return engine.engineName;
138+
}
132139
}
133140
}
134141
}
@@ -147,11 +154,13 @@ const PatternEngines = Object.create({
147154
}
148155
},
149156

157+
// combine all found engines into a single array of supported extensions
150158
getSupportedFileExtensions: function () {
151159
const engineNames = Object.keys(PatternEngines);
152-
return engineNames.map(function (engineName) {
160+
const allEnginesExtensions = engineNames.map((engineName) => {
153161
return PatternEngines[engineName].engineFileExtension;
154162
});
163+
return [].concat.apply([], allEnginesExtensions);
155164
},
156165

157166
isFileExtensionSupported: function (fileExtension) {

test/pattern_engines_tests.js

+23-2
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ function testProps(object, propTests, test) {
125125
});
126126

127127
test.ok(object.hasOwnProperty(propName), '"' + propName + '" prop should be present');
128-
test.ok(isOneOfTheseTypes, '"' + propName + '" prop should be one of types ' + possibleTypes);
128+
test.ok(isOneOfTheseTypes, '"' + propName + '" prop should be one of types ' + possibleTypes + ' but was instead ' + typeof propName);
129129
}
130130

131131
// go over each property test and run it
@@ -154,7 +154,7 @@ engineNames.forEach(function (engineName) {
154154
var propertyTests = {
155155
'engine': ['object', 'function'],
156156
'engineName': 'string',
157-
'engineFileExtension': 'string',
157+
'engineFileExtension': ['string', 'object'],
158158
'renderPattern': 'function',
159159
'findPartials': 'function'
160160
};
@@ -164,3 +164,24 @@ engineNames.forEach(function (engineName) {
164164
test.end();
165165
});
166166
});
167+
168+
tap.test('patternEngines getSupportedFileExtensions flattens known engine extensions into a single array', function (test) {
169+
170+
//arrange
171+
patternEngines.fooEngine = {
172+
engineFileExtension : ['.foo1', '.foo2']
173+
};
174+
patternEngines.barEngine = {
175+
engineFileExtension : '.bar'
176+
};
177+
178+
const exts = patternEngines.getSupportedFileExtensions();
179+
test.ok(exts.includes('.foo1'));
180+
test.ok(exts.includes('.foo2'));
181+
test.ok(exts.includes('.bar'));
182+
183+
delete patternEngines.fooEngine;
184+
delete patternEngines.barEngine;
185+
186+
test.end();
187+
});

0 commit comments

Comments
 (0)