Skip to content

Commit 1143a21

Browse files
TypeScript BotDanielRosenwasser
TypeScript Bot
andauthored
🤖 Pick PR #54454 (Use replaceAll instead of an inco...) into release-5.1 (#54456)
Co-authored-by: Daniel Rosenwasser <[email protected]>
1 parent b7d523e commit 1143a21

File tree

1 file changed

+54
-22
lines changed

1 file changed

+54
-22
lines changed

Diff for: ‎src/testRunner/unittests/helpers/tsserver.ts

+54-22
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,29 @@ export const customTypesMap = {
3636
}`
3737
};
3838

39+
function replaceAll(source: string, searchValue: string, replaceValue: string): string {
40+
let result: string | undefined =
41+
(source as string & { replaceAll: typeof source.replace }).replaceAll?.(searchValue, replaceValue);
42+
43+
if (result !== undefined) {
44+
return result;
45+
}
46+
47+
result = "";
48+
const searchLength = searchValue.length;
49+
while (true) {
50+
const index = source.indexOf(searchValue);
51+
if (index < 0) {
52+
break;
53+
}
54+
result += source.slice(0, index);
55+
result += replaceValue;
56+
source = source.slice(index + searchLength);
57+
}
58+
result += source;
59+
return result;
60+
}
61+
3962
export interface PostExecAction {
4063
readonly success: boolean;
4164
requestId: number;
@@ -115,23 +138,24 @@ export function createLoggerWritingToConsole(host: TestServerHost): Logger {
115138
}, host);
116139
}
117140

118-
function sanitizeLog(s: string) {
119-
return s.replace(/Elapsed::?\s*\d+(?:\.\d+)?ms/g, "Elapsed:: *ms")
120-
.replace(/\"updateGraphDurationMs\"\:\s*\d+(?:\.\d+)?/g, `"updateGraphDurationMs": *`)
121-
.replace(/\"createAutoImportProviderProgramDurationMs\"\:\s*\d+(?:\.\d+)?/g, `"createAutoImportProviderProgramDurationMs": *`)
122-
.replace(versionRegExp, `FakeVersion`)
123-
.replace(/getCompletionData: Get current token: \d+(?:\.\d+)?/g, `getCompletionData: Get current token: *`)
124-
.replace(/getCompletionData: Is inside comment: \d+(?:\.\d+)?/g, `getCompletionData: Is inside comment: *`)
125-
.replace(/getCompletionData: Get previous token: \d+(?:\.\d+)?/g, `getCompletionData: Get previous token: *`)
126-
.replace(/getCompletionsAtPosition: isCompletionListBlocker: \d+(?:\.\d+)?/g, `getCompletionsAtPosition: isCompletionListBlocker: *`)
127-
.replace(/getCompletionData: Semantic work: \d+(?:\.\d+)?/g, `getCompletionData: Semantic work: *`)
128-
.replace(/getCompletionsAtPosition: getCompletionEntriesFromSymbols: \d+(?:\.\d+)?/g, `getCompletionsAtPosition: getCompletionEntriesFromSymbols: *`)
129-
.replace(/forEachExternalModuleToImportFrom autoImportProvider: \d+(?:\.\d+)?/g, `forEachExternalModuleToImportFrom autoImportProvider: *`)
130-
.replace(/getExportInfoMap: done in \d+(?:\.\d+)?/g, `getExportInfoMap: done in *`)
131-
.replace(/collectAutoImports: \d+(?:\.\d+)?/g, `collectAutoImports: *`)
132-
.replace(/continuePreviousIncompleteResponse: \d+(?:\.\d+)?/g, `continuePreviousIncompleteResponse: *`)
133-
.replace(/dependencies in \d+(?:\.\d+)?/g, `dependencies in *`)
134-
.replace(/\"exportMapKey\"\:\s*\"[_$a-zA-Z][_$_$a-zA-Z0-9]*\|\d+\|/g, match => match.replace(/\|\d+\|/, `|*|`));
141+
function sanitizeLog(s: string): string {
142+
s = s.replace(/Elapsed::?\s*\d+(?:\.\d+)?ms/g, "Elapsed:: *ms");
143+
s = s.replace(/\"updateGraphDurationMs\"\:\s*\d+(?:\.\d+)?/g, `"updateGraphDurationMs": *`);
144+
s = s.replace(/\"createAutoImportProviderProgramDurationMs\"\:\s*\d+(?:\.\d+)?/g, `"createAutoImportProviderProgramDurationMs": *`);
145+
s = replaceAll(s, ts.version, "FakeVersion");
146+
s = s.replace(/getCompletionData: Get current token: \d+(?:\.\d+)?/g, `getCompletionData: Get current token: *`);
147+
s = s.replace(/getCompletionData: Is inside comment: \d+(?:\.\d+)?/g, `getCompletionData: Is inside comment: *`);
148+
s = s.replace(/getCompletionData: Get previous token: \d+(?:\.\d+)?/g, `getCompletionData: Get previous token: *`);
149+
s = s.replace(/getCompletionsAtPosition: isCompletionListBlocker: \d+(?:\.\d+)?/g, `getCompletionsAtPosition: isCompletionListBlocker: *`);
150+
s = s.replace(/getCompletionData: Semantic work: \d+(?:\.\d+)?/g, `getCompletionData: Semantic work: *`);
151+
s = s.replace(/getCompletionsAtPosition: getCompletionEntriesFromSymbols: \d+(?:\.\d+)?/g, `getCompletionsAtPosition: getCompletionEntriesFromSymbols: *`);
152+
s = s.replace(/forEachExternalModuleToImportFrom autoImportProvider: \d+(?:\.\d+)?/g, `forEachExternalModuleToImportFrom autoImportProvider: *`);
153+
s = s.replace(/getExportInfoMap: done in \d+(?:\.\d+)?/g, `getExportInfoMap: done in *`);
154+
s = s.replace(/collectAutoImports: \d+(?:\.\d+)?/g, `collectAutoImports: *`);
155+
s = s.replace(/continuePreviousIncompleteResponse: \d+(?:\.\d+)?/g, `continuePreviousIncompleteResponse: *`);
156+
s = s.replace(/dependencies in \d+(?:\.\d+)?/g, `dependencies in *`);
157+
s = s.replace(/\"exportMapKey\"\:\s*\"[_$a-zA-Z][_$_$a-zA-Z0-9]*\|\d+\|/g, match => match.replace(/\|\d+\|/, `|*|`));
158+
return s;
135159
}
136160

137161
export function createLoggerWithInMemoryLogs(host: TestServerHost): Logger {
@@ -159,14 +183,22 @@ export function appendAllScriptInfos(session: TestSession) {
159183
session.logger.log("");
160184
}
161185

162-
const versionRegExp = new RegExp(ts.version, "g");
163-
const tsMajorMinorVersion = new RegExp(`@ts${ts.versionMajorMinor}`, "g");
164186
function loggerToTypingsInstallerLog(logger: Logger): ts.server.typingsInstaller.Log | undefined {
165187
return logger?.loggingEnabled() ? {
166188
isEnabled: ts.returnTrue,
167-
writeLine: s => logger.log(`TI:: [${nowString(logger.host!)}] ${sanitizeLog(s).replace(versionRegExp, "FakeVersion")
168-
.replace(tsMajorMinorVersion, `@tsFakeMajor.Minor`)
169-
}`),
189+
writeLine: s => {
190+
// This is a VERY VERY NAIVE sanitization strategy.
191+
// If a substring containing the exact TypeScript version is found,
192+
// even if it's unrelated to TypeScript itself, then it will be replaced,
193+
// leaving us with two options:
194+
//
195+
// 1. Deal with flip-flopping baselines.
196+
// 2. Change the TypeScript version until no matching substring is found.
197+
//
198+
const initialLog = sanitizeLog(s);
199+
const pseudoSanitizedLog = replaceAll(initialLog, `@ts${ts.versionMajorMinor}`, `@tsFakeMajor.Minor`);
200+
return logger.log(`TI:: [${nowString(logger.host!)}] ${pseudoSanitizedLog}`);
201+
},
170202
} : undefined;
171203
}
172204

0 commit comments

Comments
 (0)