mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-28 20:43:31 +01:00
* Run our custom eslint rules using ts-node Use `ts-node` to run our custom eslint rules. This lets us delete the pre-compiled js. It also means you can don't have to compile the rules while editing them As part of this change, I've also switched us to using an eslint plugin instead of a rulesDir. This is now the preferred way to ship custom rules * Fix two more disables * Move ts-node to project root * Enable transpileOnly
68 lines
2.1 KiB
TypeScript
68 lines
2.1 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import * as eslint from 'eslint';
|
|
import { TSESTree } from '@typescript-eslint/experimental-utils';
|
|
import { readFileSync } from 'fs';
|
|
import { createImportRuleListener } from './utils';
|
|
|
|
|
|
export = new class TranslationRemind implements eslint.Rule.RuleModule {
|
|
|
|
private static NLS_MODULE = 'vs/nls';
|
|
|
|
readonly meta: eslint.Rule.RuleMetaData = {
|
|
messages: {
|
|
missing: 'Please add \'{{resource}}\' to ./build/lib/i18n.resources.json file to use translations here.'
|
|
}
|
|
};
|
|
|
|
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
|
|
return createImportRuleListener((node, path) => this._checkImport(context, node, path));
|
|
}
|
|
|
|
private _checkImport(context: eslint.Rule.RuleContext, node: TSESTree.Node, path: string) {
|
|
|
|
if (path !== TranslationRemind.NLS_MODULE) {
|
|
return;
|
|
}
|
|
|
|
const currentFile = context.getFilename();
|
|
const matchService = currentFile.match(/vs\/workbench\/services\/\w+/);
|
|
const matchPart = currentFile.match(/vs\/workbench\/contrib\/\w+/);
|
|
if (!matchService && !matchPart) {
|
|
return;
|
|
}
|
|
|
|
const resource = matchService ? matchService[0] : matchPart![0];
|
|
let resourceDefined = false;
|
|
|
|
let json;
|
|
try {
|
|
json = readFileSync('./build/lib/i18n.resources.json', 'utf8');
|
|
} catch (e) {
|
|
console.error('[translation-remind rule]: File with resources to pull from Transifex was not found. Aborting translation resource check for newly defined workbench part/service.');
|
|
return;
|
|
}
|
|
const workbenchResources = JSON.parse(json).workbench;
|
|
|
|
workbenchResources.forEach((existingResource: any) => {
|
|
if (existingResource.name === resource) {
|
|
resourceDefined = true;
|
|
return;
|
|
}
|
|
});
|
|
|
|
if (!resourceDefined) {
|
|
context.report({
|
|
loc: node.loc,
|
|
messageId: 'missing',
|
|
data: { resource }
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|