diff --git a/.eslintrc.json b/.eslintrc.json index 69a7bd2fd03..4ef8fce2fff 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -30,6 +30,7 @@ "@typescript-eslint/class-name-casing": "warn", "code-translation-remind": "warn", "code-no-nls-in-standalone-editor": "warn", + "code-no-standalone-editor": "warn", "code-layering": [ "warn", { diff --git a/build/lib/eslint/code-no-standalone-editor.js b/build/lib/eslint/code-no-standalone-editor.js new file mode 100644 index 00000000000..249c6a69965 --- /dev/null +++ b/build/lib/eslint/code-no-standalone-editor.js @@ -0,0 +1,54 @@ +"use strict"; +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +const path_1 = require("path"); +module.exports = new class NoNlsInStandaloneEditorRule { + constructor() { + this.meta = { + type: 'problem', + schema: {}, + messages: { + badImport: 'Not allowed to import standalone editor modules. See https://github.com/Microsoft/vscode/wiki/Code-Organization' + } + }; + } + create(context) { + if (/vs(\/|\\)editor/.test(context.getFilename())) { + // the vs/editor folder is allowed to use the standalone editor + return {}; + } + return { + ImportDeclaration: (node) => { + this._checkImport(context, node, node.source.value); + }, + CallExpression: (node) => { + var _a; + const { callee, arguments: args } = node; + if (callee.type === 'Import' && ((_a = args[0]) === null || _a === void 0 ? void 0 : _a.type) === 'Literal') { + this._checkImport(context, node, args[0].value); + } + } + }; + } + _checkImport(context, node, path) { + if (typeof path !== 'string') { + return; + } + // resolve relative paths + if (path[0] === '.') { + path = path_1.join(context.getFilename(), path); + } + if (/vs(\/|\\)editor(\/|\\)standalone(\/|\\)/.test(path) + || /vs(\/|\\)editor(\/|\\)common(\/|\\)standalone(\/|\\)/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.api/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.main/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.worker/.test(path)) { + context.report({ + node, + messageId: 'badImport' + }); + } + } +}; diff --git a/build/lib/eslint/code-no-standalone-editor.ts b/build/lib/eslint/code-no-standalone-editor.ts new file mode 100644 index 00000000000..bd748663e66 --- /dev/null +++ b/build/lib/eslint/code-no-standalone-editor.ts @@ -0,0 +1,64 @@ +/*--------------------------------------------------------------------------------------------- + * 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 * as estree from 'estree'; +import { join } from 'path'; + +export = new class NoNlsInStandaloneEditorRule implements eslint.Rule.RuleModule { + + readonly meta = { + type: 'problem', + schema: {}, + messages: { + badImport: 'Not allowed to import standalone editor modules. See https://github.com/Microsoft/vscode/wiki/Code-Organization' + } + }; + + create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { + + if (/vs(\/|\\)editor/.test(context.getFilename())) { + // the vs/editor folder is allowed to use the standalone editor + return {}; + } + + return { + ImportDeclaration: (node: estree.Node) => { + this._checkImport(context, node, (node).source.value); + }, + CallExpression: (node: estree.Node) => { + const { callee, arguments: args } = node; + if ((callee.type) === 'Import' && args[0]?.type === 'Literal') { + this._checkImport(context, node, (args[0]).value); + } + } + }; + } + + private _checkImport(context: eslint.Rule.RuleContext, node: estree.Node, path: any) { + if (typeof path !== 'string') { + return; + } + + // resolve relative paths + if (path[0] === '.') { + path = join(context.getFilename(), path); + } + + if ( + /vs(\/|\\)editor(\/|\\)standalone(\/|\\)/.test(path) + || /vs(\/|\\)editor(\/|\\)common(\/|\\)standalone(\/|\\)/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.api/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.main/.test(path) + || /vs(\/|\\)editor(\/|\\)editor.worker/.test(path) + ) { + context.report({ + node, + messageId: 'badImport' + }); + } + } +}; +