eae5d8c807
These conflicts will be resolved in the following commits. We do it this way so that PR review is possible.
69 lines
2.5 KiB
JavaScript
69 lines
2.5 KiB
JavaScript
"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 utils_1 = require("./utils");
|
|
module.exports = new class {
|
|
constructor() {
|
|
this.meta = {
|
|
messages: {
|
|
layerbreaker: 'Bad layering. You are not allowed to access {{from}} from here, allowed layers are: [{{allowed}}]'
|
|
},
|
|
docs: {
|
|
url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
|
|
}
|
|
};
|
|
}
|
|
create(context) {
|
|
const fileDirname = path_1.dirname(context.getFilename());
|
|
const parts = fileDirname.split(/\\|\//);
|
|
const ruleArgs = context.options[0];
|
|
let config;
|
|
for (let i = parts.length - 1; i >= 0; i--) {
|
|
if (ruleArgs[parts[i]]) {
|
|
config = {
|
|
allowed: new Set(ruleArgs[parts[i]]).add(parts[i]),
|
|
disallowed: new Set()
|
|
};
|
|
Object.keys(ruleArgs).forEach(key => {
|
|
if (!config.allowed.has(key)) {
|
|
config.disallowed.add(key);
|
|
}
|
|
});
|
|
break;
|
|
}
|
|
}
|
|
if (!config) {
|
|
// nothing
|
|
return {};
|
|
}
|
|
return utils_1.createImportRuleListener((node, path) => {
|
|
if (path[0] === '.') {
|
|
path = path_1.join(path_1.dirname(context.getFilename()), path);
|
|
}
|
|
const parts = path_1.dirname(path).split(/\\|\//);
|
|
for (let i = parts.length - 1; i >= 0; i--) {
|
|
const part = parts[i];
|
|
if (config.allowed.has(part)) {
|
|
// GOOD - same layer
|
|
break;
|
|
}
|
|
if (config.disallowed.has(part)) {
|
|
// BAD - wrong layer
|
|
context.report({
|
|
loc: node.loc,
|
|
messageId: 'layerbreaker',
|
|
data: {
|
|
from: part,
|
|
allowed: [...config.allowed.keys()].join(', ')
|
|
}
|
|
});
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
};
|