in client/src/extension.ts [1075:1255]
configuration: async (params, _token, _next): Promise<any[]> => {
if (params.items === undefined) {
return [];
}
const result: (ConfigurationSettings | null)[] = [];
for (const item of params.items) {
if (item.section || !item.scopeUri) {
result.push(null);
continue;
}
const resource = client.protocol2CodeConverter.asUri(item.scopeUri);
const config = Workspace.getConfiguration('eslint', resource);
const workspaceFolder = resource.scheme === 'untitled'
? Workspace.workspaceFolders !== undefined ? Workspace.workspaceFolders[0] : undefined
: Workspace.getWorkspaceFolder(resource);
await migrationSemaphore.lock(async () => {
const globalMigration = Workspace.getConfiguration('eslint').get('migration.2_x', 'on');
if (notNow === false && globalMigration === 'on') {
try {
migration = new Migration(resource);
migration.record();
interface Item extends MessageItem {
id: 'yes' | 'no' | 'readme' | 'global' | 'local';
}
if (migration.needsUpdate()) {
const folder = workspaceFolder?.name;
const file = path.basename(resource.fsPath);
const selected = await Window.showInformationMessage<Item>(
[
`The ESLint 'autoFixOnSave' setting needs to be migrated to the new 'editor.codeActionsOnSave' setting`,
folder !== undefined ? `for the workspace folder: ${folder}.` : `for the file: ${file}.`,
`For compatibility reasons the 'autoFixOnSave' remains and needs to be removed manually.`,
`Do you want to migrate the setting?`
].join(' '),
{ modal: true},
{ id: 'yes', title: 'Yes'},
{ id: 'global', title: 'Never migrate Settings' },
{ id: 'readme', title: 'Open Readme' },
{ id: 'no', title: 'Not now', isCloseAffordance: true }
);
if (selected !== undefined) {
if (selected.id === 'yes') {
try {
await migration.update();
} catch (error) {
migrationFailed(error);
}
} else if (selected.id === 'no') {
notNow = true;
} else if (selected.id === 'global') {
await config.update('migration.2_x', 'off', ConfigurationTarget.Global);
} else if (selected.id === 'readme') {
notNow = true;
void Env.openExternal(Uri.parse('https://github.com/microsoft/vscode-eslint#settings-migration'));
}
}
}
} finally {
migration = undefined;
}
}
});
const settings: ConfigurationSettings = {
validate: Validate.off,
packageManager: config.get('packageManager', 'npm'),
useESLintClass: config.get('useESLintClass', false),
codeActionOnSave: {
enable: false,
mode: CodeActionsOnSaveMode.all
},
format: false,
quiet: config.get('quiet', false),
onIgnoredFiles: ESLintSeverity.from(config.get<string>('onIgnoredFiles', ESLintSeverity.off)),
options: config.get('options', {}),
rulesCustomizations: parseRulesCustomizations(config.get('rules.customizations')),
run: config.get('run', 'onType'),
nodePath: config.get<string | undefined>('nodePath', undefined) ?? null,
workingDirectory: undefined,
workspaceFolder: undefined,
codeAction: {
disableRuleComment: config.get('codeAction.disableRuleComment', { enable: true, location: 'separateLine' as 'separateLine' }),
showDocumentation: config.get('codeAction.showDocumentation', { enable: true })
}
};
const document: TextDocument | undefined = syncedDocuments.get(item.scopeUri);
if (document === undefined) {
result.push(settings);
continue;
}
if (config.get('enabled', true)) {
settings.validate = computeValidate(document);
}
if (settings.validate !== Validate.off) {
settings.format = !!config.get('format.enable', false);
settings.codeActionOnSave.enable = readCodeActionsOnSaveSetting(document);
settings.codeActionOnSave.mode = CodeActionsOnSaveMode.from(config.get('codeActionsOnSave.mode', CodeActionsOnSaveMode.all));
settings.codeActionOnSave.rules = CodeActionsOnSaveRules.from(config.get('codeActionsOnSave.rules', null));
}
if (workspaceFolder !== undefined) {
settings.workspaceFolder = {
name: workspaceFolder.name,
uri: client.code2ProtocolConverter.asUri(workspaceFolder.uri)
};
}
const workingDirectories = config.get<(string | LegacyDirectoryItem | DirectoryItem | PatternItem | ModeItem)[] | undefined>('workingDirectories', undefined);
if (Array.isArray(workingDirectories)) {
let workingDirectory: ModeItem | DirectoryItem | undefined = undefined;
const workspaceFolderPath = workspaceFolder && workspaceFolder.uri.scheme === 'file' ? workspaceFolder.uri.fsPath : undefined;
for (const entry of workingDirectories) {
let directory: string | undefined;
let pattern: string | undefined;
let noCWD = false;
if (Is.string(entry)) {
directory = entry;
} else if (LegacyDirectoryItem.is(entry)) {
directory = entry.directory;
noCWD = !entry.changeProcessCWD;
} else if (DirectoryItem.is(entry)) {
directory = entry.directory;
if (entry['!cwd'] !== undefined) {
noCWD = entry['!cwd'];
}
} else if (PatternItem.is(entry)) {
pattern = entry.pattern;
if (entry['!cwd'] !== undefined) {
noCWD = entry['!cwd'];
}
} else if (ModeItem.is(entry)) {
workingDirectory = entry;
continue;
}
let itemValue: string | undefined;
if (directory !== undefined || pattern !== undefined) {
const filePath = document.uri.scheme === 'file' ? document.uri.fsPath : undefined;
if (filePath !== undefined) {
if (directory !== undefined) {
directory = toOSPath(directory);
if (!path.isAbsolute(directory) && workspaceFolderPath !== undefined) {
directory = path.join(workspaceFolderPath, directory);
}
if (directory.charAt(directory.length - 1) !== path.sep) {
directory = directory + path.sep;
}
if (filePath.startsWith(directory)) {
itemValue = directory;
}
} else if (pattern !== undefined && pattern.length > 0) {
if (!path.posix.isAbsolute(pattern) && workspaceFolderPath !== undefined) {
pattern = path.posix.join(toPosixPath(workspaceFolderPath), pattern);
}
if (pattern.charAt(pattern.length - 1) !== path.posix.sep) {
pattern = pattern + path.posix.sep;
}
const regExp: RegExp | undefined = convert2RegExp(pattern);
if (regExp !== undefined) {
const match = regExp.exec(filePath);
if (match !== null && match.length > 0) {
itemValue = match[0];
}
}
}
}
}
if (itemValue !== undefined) {
if (workingDirectory === undefined || ModeItem.is(workingDirectory)) {
workingDirectory = { directory: itemValue, '!cwd': noCWD };
} else {
if (workingDirectory.directory.length < itemValue.length) {
workingDirectory.directory = itemValue;
workingDirectory['!cwd'] = noCWD;
}
}
}
}
settings.workingDirectory = workingDirectory;
}
result.push(settings);
}
return result;
}