in server/aws-lsp-codewhisperer/src/shared/utils.ts [96:165]
export function scrubNames(s: string, username?: string) {
let r = ''
const fileExtRe = /\.[^.\/]+$/
const slashdot = /^[~.]*[\/\\]*/
/** Allowlisted filepath segments. */
const keep = new Set<string>([
'~',
'.',
'..',
'.aws',
'aws',
'sso',
'cache',
'credentials',
'config',
'Users',
'users',
'home',
'tmp',
'aws-toolkit-vscode',
'globalStorage', // from vscode globalStorageUri
crashMonitoringDirName,
])
if (username && username.length > 2) {
s = s.replaceAll(username, 'x')
}
// Replace contiguous whitespace with 1 space.
s = s.replace(/\s+/g, ' ')
// 1. split on whitespace.
// 2. scrub words that match username or look like filepaths.
const words = s.split(/\s+/)
for (const word of words) {
const pathSegments = word.split(/[\/\\]/)
if (pathSegments.length < 2) {
// Not a filepath.
r += ' ' + word
continue
}
// Replace all (non-allowlisted) ASCII filepath segments with "x".
// "/foo/bar/aws/sso/" => "/x/x/aws/sso/"
let scrubbed = ''
// Get the frontmatter ("/", "../", "~/", or "./").
const start = word.trimStart().match(slashdot)?.[0] ?? ''
pathSegments[0] = pathSegments[0].trimStart().replace(slashdot, '')
for (const seg of pathSegments) {
if (driveLetterRegex.test(seg)) {
scrubbed += seg
} else if (keep.has(seg)) {
scrubbed += '/' + seg
} else {
// Save the first non-ASCII (unicode) char, if any.
const nonAscii = seg.match(/[^\p{ASCII}]/u)?.[0] ?? ''
// Replace all chars (except [^…]) with "x" .
const ascii = seg.replace(/[^$[\](){}:;'" ]+/g, 'x')
scrubbed += `/${ascii}${nonAscii}`
}
}
// includes leading '.', eg: '.json'
const fileExt = pathSegments[pathSegments.length - 1].match(fileExtRe) ?? ''
r += ` ${start.replace(/\\/g, '/')}${scrubbed.replace(/^[\/\\]+/, '')}${fileExt}`
}
return r.trim()
}