migrate import-patterns rule to eslint

This commit is contained in:
Johannes Rieken 2019-12-30 10:03:52 +01:00
parent b0d38052b5
commit 9819da68ab
3 changed files with 722 additions and 14 deletions

View file

@ -12,9 +12,22 @@
"no-extra-semi": "off",
"no-unused-vars": "off",
"eqeqeq": "warn",
"no-duplicate-imports": "warn",
"constructor-super": "warn",
"curly": "warn",
"no-caller": "warn",
"no-debugger": "warn",
"no-duplicate-case": "warn",
"no-eval": "warn",
"no-new-wrappers": "warn",
"no-sparse-arrays": "warn",
"no-throw-literal": "warn",
"no-unsafe-finally": "warn",
"no-unused-labels": "warn",
"no-var": "warn",
"semi": "off",
"@typescript-eslint/semi": "warn",
"no-duplicate-imports": "warn",
"@typescript-eslint/class-name-casing": "warn",
"code-layering": [
"warn",
{
@ -36,18 +49,555 @@
]
}
],
"@typescript-eslint/class-name-casing": "warn",
"constructor-super": "warn",
"curly": "warn",
"no-caller": "warn",
"no-debugger": "warn",
"no-duplicate-case": "warn",
"no-eval": "warn",
"no-new-wrappers": "warn",
"no-sparse-arrays": "warn",
"no-throw-literal": "warn",
"no-unsafe-finally": "warn",
"no-unused-labels": "warn",
"no-var": "warn"
"code-import-patterns": [
"warn",
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!! Do not relax these rules !!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
"target": "**/vs/base/common/**",
"restrictions": [
"vs/nls",
"**/vs/base/common/**"
]
},
{
"target": "**/vs/base/test/common/**",
"restrictions": [
"assert",
"sinon",
"vs/nls",
"**/vs/base/common/**",
"**/vs/base/test/common/**"
]
},
{
"target": "**/vs/base/browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/{common,browser}/**"
]
},
{
"target": "**/vs/base/node/**",
"restrictions": [
"vs/nls",
"**/vs/base/{common,node}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
// vs/base/test/browser contains tests for vs/base/browser
"target": "**/vs/base/test/browser/**",
"restrictions": [
"assert",
"sinon",
"vs/nls",
"**/vs/base/{common,browser}/**",
"**/vs/base/test/{common,browser}/**"
]
},
{
"target": "**/vs/base/parts/*/common/**",
"restrictions": [
"vs/nls",
"**/vs/base/common/**",
"**/vs/base/parts/*/common/**"
]
},
{
"target": "**/vs/base/parts/*/browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/{common,browser}/**",
"**/vs/base/parts/*/{common,browser}/**"
]
},
{
"target": "**/vs/base/parts/*/node/**",
"restrictions": [
"vs/nls",
"**/vs/base/{common,node}/**",
"**/vs/base/parts/*/{common,node}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/base/parts/*/electron-browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/{common,browser,node,electron-browser}/**",
"**/vs/base/parts/*/{common,browser,node,electron-browser}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/base/parts/*/electron-main/**",
"restrictions": [
"vs/nls",
"**/vs/base/{common,node,electron-main}/**",
"**/vs/base/parts/*/{common,node,electron-main}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/platform/*/common/**",
"restrictions": [
"vs/nls",
"**/vs/base/common/**",
"**/vs/base/parts/*/common/**",
"**/vs/platform/*/common/**"
]
},
{
"target": "**/vs/platform/*/test/common/**",
"restrictions": [
"assert",
"sinon",
"vs/nls",
"**/vs/base/common/**",
"**/vs/platform/*/common/**",
"**/vs/platform/*/test/common/**"
]
},
{
"target": "**/vs/platform/*/browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/{common,browser}/**",
"**/vs/base/parts/*/{common,browser}/**",
"**/vs/platform/*/{common,browser}/**"
]
},
{
"target": "**/vs/platform/*/node/**",
"restrictions": [
"vs/nls",
"**/vs/base/{common,node}/**",
"**/vs/base/parts/*/{common,node}/**",
"**/vs/platform/*/{common,node}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/platform/*/electron-browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/{common,browser,node}/**",
"**/vs/base/parts/*/{common,browser,node,electron-browser}/**",
"**/vs/platform/*/{common,browser,node,electron-browser}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/platform/*/electron-main/**",
"restrictions": [
"vs/nls",
"**/vs/base/{common,node,electron-main}/**",
"**/vs/base/parts/*/{common,node,electron-main}/**",
"**/vs/platform/*/{common,node,electron-main}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/platform/*/test/browser/**",
"restrictions": [
"assert",
"sinon",
"vs/nls",
"**/vs/base/{common,browser}/**",
"**/vs/platform/*/{common,browser}/**",
"**/vs/platform/*/test/{common,browser}/**"
]
},
{
"target": "**/vs/editor/common/**",
"restrictions": [
"vs/nls",
"**/vs/base/common/**",
"**/vs/base/worker/**",
"**/vs/platform/*/common/**",
"**/vs/editor/common/**"
]
},
{
"target": "**/vs/editor/test/common/**",
"restrictions": [
"assert",
"sinon",
"vs/nls",
"**/vs/base/common/**",
"**/vs/platform/*/common/**",
"**/vs/platform/*/test/common/**",
"**/vs/editor/common/**",
"**/vs/editor/test/common/**"
]
},
{
"target": "**/vs/editor/browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/{common,browser}/**",
"**/vs/platform/*/{common,browser}/**",
"**/vs/editor/{common,browser}/**"
]
},
{
"target": "**/vs/editor/test/browser/**",
"restrictions": [
"assert",
"sinon",
"vs/nls",
"**/vs/base/{common,browser}/**",
"**/vs/platform/*/{common,browser}/**",
"**/vs/platform/*/test/{common,browser}/**",
"**/vs/editor/{common,browser}/**",
"**/vs/editor/test/{common,browser}/**"
]
},
{
"target": "**/vs/editor/standalone/common/**",
"restrictions": [
"vs/nls",
"**/vs/base/common/**",
"**/vs/platform/*/common/**",
"**/vs/editor/common/**",
"**/vs/editor/standalone/common/**"
]
},
{
"target": "**/vs/editor/standalone/test/common/**",
"restrictions": [
"assert",
"sinon",
"vs/nls",
"**/vs/base/common/**",
"**/vs/platform/*/common/**",
"**/vs/platform/*/test/common/**",
"**/vs/editor/common/**",
"**/vs/editor/test/common/**"
]
},
{
"target": "**/vs/editor/standalone/browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/{common,browser}/**",
"**/vs/base/parts/*/{common,browser}/**",
"**/vs/platform/*/{common,browser}/**",
"**/vs/editor/{common,browser}/**",
"**/vs/editor/contrib/**",
"**/vs/editor/standalone/{common,browser}/**"
]
},
{
"target": "**/vs/editor/standalone/test/browser/**",
"restrictions": [
"assert",
"sinon",
"vs/nls",
"**/vs/base/{common,browser}/**",
"**/vs/platform/*/{common,browser}/**",
"**/vs/platform/*/test/{common,browser}/**",
"**/vs/editor/{common,browser}/**",
"**/vs/editor/standalone/{common,browser}/**",
"**/vs/editor/test/{common,browser}/**"
]
},
{
"target": "**/vs/editor/contrib/*/test/**",
"restrictions": [
"assert",
"sinon",
"vs/nls",
"**/vs/base/{common,browser}/**",
"**/vs/base/test/{common,browser}/**",
"**/vs/base/parts/*/{common,browser}/**",
"**/vs/platform/*/{common,browser}/**",
"**/vs/platform/*/test/{common,browser}/**",
"**/vs/editor/{common,browser}/**",
"**/vs/editor/test/{common,browser}/**",
"**/vs/editor/contrib/**"
]
},
{
"target": "**/vs/editor/contrib/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/{common,browser}/**",
"**/vs/base/parts/*/{common,browser}/**",
"**/vs/platform/{common,browser}/**",
"**/vs/platform/*/{common,browser}/**",
"**/vs/editor/{common,browser}/**",
"**/vs/editor/contrib/**"
]
},
{
"target": "**/vs/workbench/common/**",
"restrictions": [
"vs/nls",
"**/vs/base/common/**",
"**/vs/base/parts/*/common/**",
"**/vs/platform/*/common/**",
"**/vs/editor/common/**",
"**/vs/editor/contrib/*/common/**",
"**/vs/workbench/common/**",
"**/vs/workbench/services/*/common/**",
"assert"
]
},
{
"target": "**/vs/workbench/browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/{common,browser}/**",
"**/vs/base/parts/*/{common,browser}/**",
"**/vs/platform/*/{common,browser}/**",
"**/vs/editor/{common,browser}/**",
"**/vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention
"**/vs/workbench/workbench.web.api",
"**/vs/workbench/{common,browser}/**",
"**/vs/workbench/services/*/{common,browser}/**",
"assert"
]
},
{
"target": "**/vs/workbench/workbench.desktop.main.ts",
"restrictions": [
"**"
]
},
{
"target": "**/vs/workbench/api/common/**",
"restrictions": [
"vscode",
"vs/nls",
"**/vs/base/common/**",
"**/vs/platform/*/common/**",
"**/vs/editor/common/**",
"**/vs/editor/contrib/*/common/**",
"**/vs/workbench/api/common/**",
"**/vs/workbench/common/**",
"**/vs/workbench/services/*/common/**",
"**/vs/workbench/contrib/*/common/**"
]
},
{
"target": "**/vs/workbench/api/worker/**",
"restrictions": [
"vscode",
"vs/nls",
"**/vs/**/{common,worker}/**"
]
},
{
"target": "**/vs/workbench/electron-browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/{common,browser,node,electron-browser}/**",
"**/vs/base/parts/*/{common,browser,node,electron-browser}/**",
"**/vs/platform/*/{common,browser,node,electron-browser}/**",
"**/vs/editor/{common,browser,node,electron-browser}/**",
"**/vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention
"**/vs/workbench/{common,browser,node,electron-browser,api}/**",
"**/vs/workbench/services/*/{common,browser,node,electron-browser}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/workbench/services/**/test/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/**",
"**/vs/platform/**",
"**/vs/editor/**",
"**/vs/workbench/{common,browser,node,electron-browser}/**",
"vs/workbench/contrib/files/common/editors/fileEditorInput",
"**/vs/workbench/services/**",
"**/vs/workbench/test/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/workbench/services/**/common/**",
"restrictions": [
"vs/nls",
"**/vs/base/**/common/**",
"**/vs/platform/**/common/**",
"**/vs/editor/common/**",
"**/vs/workbench/workbench.web.api",
"**/vs/workbench/common/**",
"**/vs/workbench/services/**/common/**",
"**/vs/workbench/api/**/common/**",
"vscode-textmate"
]
},
{
"target": "**/vs/workbench/services/**/worker/**",
"restrictions": [
"vs/nls",
"**/vs/base/**/common/**",
"**/vs/platform/**/common/**",
"**/vs/editor/common/**",
"**/vs/workbench/**/common/**",
"**/vs/workbench/**/worker/**",
"**/vs/workbench/services/**/common/**",
"vscode"
]
},
{
"target": "**/vs/workbench/services/**/browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/**/{common,browser,worker}/**",
"**/vs/platform/**/{common,browser}/**",
"**/vs/editor/{common,browser}/**",
"**/vs/workbench/workbench.web.api",
"**/vs/workbench/{common,browser}/**",
"**/vs/workbench/api/{common,browser}/**",
"**/vs/workbench/services/**/{common,browser}/**",
"vscode-textmate",
"onigasm-umd"
]
},
{
"target": "**/vs/workbench/services/**/node/**",
"restrictions": [
"vs/nls",
"**/vs/base/**/{common,node}/**",
"**/vs/platform/**/{common,node}/**",
"**/vs/editor/{common,node}/**",
"**/vs/workbench/{common,node}/**",
"**/vs/workbench/api/{common,node}/**",
"**/vs/workbench/services/**/{common,node}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/workbench/services/**/electron-browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/**/{common,browser,worker,node,electron-browser}/**",
"**/vs/platform/**/{common,browser,node,electron-browser}/**",
"**/vs/editor/**",
"**/vs/workbench/{common,browser,node,electron-browser,api}/**",
"**/vs/workbench/services/**/{common,browser,node,electron-browser}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/workbench/contrib/terminal/browser/**",
"restrictions": [
// xterm and its addons are strictly browser-only components
"xterm",
"xterm-addon-*",
"**/vs/**"
]
},
{
"target": "**/vs/workbench/contrib/extensions/browser/**",
"restrictions": [
"semver-umd",
"**/vs/**"
]
},
{
"target": "**/vs/workbench/contrib/update/browser/update.ts",
"restrictions": [
"semver-umd",
"**/vs/**"
]
},
{
"target": "**/vs/code/node/**",
"restrictions": [
"vs/nls",
"**/vs/base/**/{common,node}/**",
"**/vs/base/parts/**/{common,node}/**",
"**/vs/platform/**/{common,node}/**",
"**/vs/code/**/{common,node}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/code/electron-browser/**",
"restrictions": [
"vs/nls",
"vs/css!./**/*",
"**/vs/base/**/{common,browser,node,electron-browser}/**",
"**/vs/base/parts/**/{common,browser,node,electron-browser}/**",
"**/vs/platform/**/{common,browser,node,electron-browser}/**",
"**/vs/code/**/{common,browser,node,electron-browser}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/code/electron-main/**",
"restrictions": [
"vs/nls",
"**/vs/base/**/{common,node,electron-main}/**",
"**/vs/base/parts/**/{common,node,electron-main}/**",
"**/vs/platform/**/{common,node,electron-main}/**",
"**/vs/code/**/{common,node,electron-main}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/vs/server/**",
"restrictions": [
"vs/nls",
"**/vs/base/**/{common,node}/**",
"**/vs/base/parts/**/{common,node}/**",
"**/vs/platform/**/{common,node}/**",
"**/vs/workbench/**/{common,node}/**",
"**/vs/server/**",
"**/vs/code/**/{common,node}/**",
"!path" // node modules (except path where we have our own impl)
]
},
{
"target": "**/{node,electron-browser,electron-main}/**",
"restrictions": "**/*"
},
{
"target": "**/extensions/**",
"restrictions": "**/*"
},
{
"target": "**/test/smoke/**",
"restrictions": [
"**/test/smoke/**",
"*"
]
},
{
"target": "**/test/automation/**",
"restrictions": [
"**/test/automation/**",
"*"
]
},
{
"target": "{**/**.test.ts,**/test/**}",
"restrictions": "{**/vs/**,assert,sinon,crypto}"
},
{
"target": "**/{common,browser,workbench}/**",
"restrictions": "**/vs/**"
}
]
}
}

View file

@ -0,0 +1,71 @@
"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");
const minimatch = require("minimatch");
module.exports = new class {
constructor() {
this.meta = {
type: 'problem',
schema: {},
messages: {
badImport: 'Imports violates \'{{restrictions}}\' restrictions. See https://github.com/Microsoft/vscode/wiki/Code-Organization'
}
};
}
create(context) {
const configs = context.options;
for (const config of configs) {
if (minimatch(context.getFilename(), config.target)) {
return {
ImportDeclaration: (node) => {
this._checkImport(context, config, 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, config, node, args[0].value);
}
}
};
}
}
return {};
}
_checkImport(context, config, node, path) {
if (typeof path !== 'string') {
return;
}
// resolve relative paths
if (path[0] === '.') {
path = path_1.join(context.getFilename(), path);
}
let restrictions;
if (typeof config.restrictions === 'string') {
restrictions = [config.restrictions];
}
else {
restrictions = config.restrictions;
}
let matched = false;
for (const pattern of restrictions) {
if (minimatch(path, pattern)) {
matched = true;
break;
}
}
if (!matched) {
// None of the restrictions matched
context.report({
node,
messageId: 'badImport',
data: {
restrictions: restrictions.join(' or ')
}
});
}
}
};

View file

@ -0,0 +1,87 @@
/*---------------------------------------------------------------------------------------------
* 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';
import * as minimatch from 'minimatch';
interface ImportPatternsConfig {
target: string;
restrictions: string | string[];
}
export = new class implements eslint.Rule.RuleModule {
readonly meta = {
type: 'problem',
schema: {},
messages: {
badImport: 'Imports violates \'{{restrictions}}\' restrictions. See https://github.com/Microsoft/vscode/wiki/Code-Organization'
}
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
const configs = <ImportPatternsConfig[]>context.options;
for (const config of configs) {
if (minimatch(context.getFilename(), config.target)) {
return {
ImportDeclaration: (node: estree.Node) => {
this._checkImport(context, config!, node, (<estree.ImportDeclaration>node).source.value);
},
CallExpression: (node: estree.Node) => {
const { callee, arguments: args } = <estree.CallExpression>node;
if ((<any>callee.type) === 'Import' && args[0]?.type === 'Literal') {
this._checkImport(context, config!, node, (<estree.Literal>args[0]).value);
}
}
};
}
}
return {};
}
private _checkImport(context: eslint.Rule.RuleContext, config: ImportPatternsConfig, node: estree.Node, path: any) {
if (typeof path !== 'string') {
return;
}
// resolve relative paths
if (path[0] === '.') {
path = join(context.getFilename(), path);
}
let restrictions: string[];
if (typeof config.restrictions === 'string') {
restrictions = [config.restrictions];
} else {
restrictions = config.restrictions;
}
let matched = false;
for (const pattern of restrictions) {
if (minimatch(path, pattern)) {
matched = true;
break;
}
}
if (!matched) {
// None of the restrictions matched
context.report({
node,
messageId: 'badImport',
data: {
restrictions: restrictions.join(' or ')
}
});
}
}
};