Skip to content

Commit 7813180

Browse files
committed
Perform replacement in one pass of the output
1 parent 9644adb commit 7813180

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

src/GenerateTemplateFiles.ts

+17-9
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ export default class GenerateTemplateFiles {
193193
* Create every variation for the for the replacement keys
194194
*/
195195
private _getReplacers(replacers: IReplacer[], defaultCase: CaseConverterEnum): IReplacer[] {
196-
const caseTypes: string[] = Object.values(CaseConverterEnum);
196+
const caseTypes: CaseConverterEnum[] = Object.values(CaseConverterEnum);
197197

198198
return replacers.reduce(
199199
(previousReplacers: IReplacer[], answeredReplacer: IReplacer): IReplacer[] => {
@@ -202,10 +202,10 @@ export default class GenerateTemplateFiles {
202202
return [
203203
...previousReplacers,
204204
...caseTypes.map(
205-
(caseType: string): IReplacer => {
205+
(caseType: CaseConverterEnum): IReplacer => {
206206
return {
207207
slot: `${slot}${caseType}`,
208-
slotValue: StringUtility.toCase(slotValue, caseType as CaseConverterEnum),
208+
slotValue: StringUtility.toCase(slotValue, caseType),
209209
};
210210
}
211211
),
@@ -291,6 +291,19 @@ export default class GenerateTemplateFiles {
291291
): Promise<string[]> {
292292
const outputtedFilesAndFolders: string[] = [];
293293

294+
// Create a function to apply the transformations in one go
295+
const regexEscape = (text: string) => text.replace(/([^a-zA-Z0-9_])/g, '\\$1');
296+
const replacerLookup: Record<string, string> = {};
297+
const replacerRegexBase = replacers
298+
.map((replacer: IReplacer) => {
299+
replacerLookup[replacer.slot] = replacer.slotValue;
300+
return regexEscape(replacer.slot);
301+
})
302+
.join('|');
303+
const replacerRegex = new RegExp(`^${replacerRegexBase}$`, 'g');
304+
const replacer = (text: string) => text.replace(replacerRegex, (slot) => replacerLookup[slot]);
305+
306+
// Apply the transformations on all files recursively
294307
const recursiveCopyOptions: any = {
295308
overwrite: true,
296309
expand: false,
@@ -313,12 +326,7 @@ export default class GenerateTemplateFiles {
313326
},
314327
transform: (src: string, dest: string, stats: unknown) => {
315328
return through((chunk: any, enc: any, done: any) => {
316-
let output: string = chunk.toString();
317-
318-
replacers.forEach((replacer: IReplacer) => {
319-
output = replaceString(output, replacer.slot, replacer.slotValue);
320-
});
321-
329+
let output: string = replacer(chunk.toString());
322330
done(null, output);
323331
});
324332
},

0 commit comments

Comments
 (0)