Skip to content

Commit 579990c

Browse files
committed
Perform replacement in one pass of the output
1 parent a7c4b18 commit 579990c

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

src/GenerateTemplateFiles.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ export default class GenerateTemplateFiles {
223223
* Create every variation for the for the replacement keys
224224
*/
225225
private _getReplacers(replacers: IReplacer[], defaultCase: CaseConverterEnum): IReplacer[] {
226-
const caseTypes: string[] = Object.values(CaseConverterEnum);
226+
const caseTypes: CaseConverterEnum[] = Object.values(CaseConverterEnum);
227227

228228
return replacers.reduce(
229229
(previousReplacers: IReplacer[], answeredReplacer: IReplacer): IReplacer[] => {
@@ -232,10 +232,10 @@ export default class GenerateTemplateFiles {
232232
return [
233233
...previousReplacers,
234234
...caseTypes.map(
235-
(caseType: string): IReplacer => {
235+
(caseType: CaseConverterEnum): IReplacer => {
236236
return {
237237
slot: `${slot}${caseType}`,
238-
slotValue: StringUtility.toCase(slotValue, caseType as CaseConverterEnum),
238+
slotValue: StringUtility.toCase(slotValue, caseType),
239239
};
240240
}
241241
),
@@ -329,6 +329,19 @@ export default class GenerateTemplateFiles {
329329
): Promise<string[]> {
330330
const outputtedFilesAndFolders: string[] = [];
331331

332+
// Create a function to apply the transformations in one go
333+
const regexEscape = (text: string) => text.replace(/([^a-zA-Z0-9_])/g, '\\$1');
334+
const replacerLookup: Record<string, string> = {};
335+
const replacerRegexBase = replacers
336+
.map((replacer: IReplacer) => {
337+
replacerLookup[replacer.slot] = replacer.slotValue;
338+
return regexEscape(replacer.slot);
339+
})
340+
.join('|');
341+
const replacerRegex = new RegExp(`^${replacerRegexBase}$`, 'g');
342+
const replacer = (text: string) => text.replace(replacerRegex, (slot) => replacerLookup[slot]);
343+
344+
// Apply the transformations on all files recursively
332345
const recursiveCopyOptions: any = {
333346
overwrite: true,
334347
expand: false,
@@ -351,12 +364,7 @@ export default class GenerateTemplateFiles {
351364
},
352365
transform: (src: string, dest: string, stats: unknown) => {
353366
return through((chunk: any, enc: any, done: any) => {
354-
let output: string = chunk.toString();
355-
356-
replacers.forEach((replacer: IReplacer) => {
357-
output = replaceString(output, replacer.slot, replacer.slotValue);
358-
});
359-
367+
let output: string = replacer(chunk.toString());
360368
done(null, output);
361369
});
362370
},

0 commit comments

Comments
 (0)