@sourcegraph/stylelint-plugin-sourcegraph
Version:
Custom stylelint rules for Sourcegraph
73 lines • 3.02 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.noRestrictedImports = exports.messages = exports.ruleName = void 0;
const tslib_1 = require("tslib");
const path_1 = (0, tslib_1.__importDefault)(require("path"));
const find_root_1 = require("@manypkg/find-root");
const ignore_1 = (0, tslib_1.__importDefault)(require("ignore"));
const postcss_value_parser_1 = (0, tslib_1.__importDefault)(require("postcss-value-parser"));
const stylelint_1 = (0, tslib_1.__importDefault)(require("stylelint"));
const utils_1 = require("../../utils");
exports.ruleName = '@sourcegraph/no-restricted-imports';
exports.messages = stylelint_1.default.utils.ruleMessages(exports.ruleName, {
rejected: importPath => {
return `'${String(importPath)}' import is restricted from being used.`;
},
});
const ROOT_DIR = (0, find_root_1.findRootSync)(process.cwd());
function getImportURI(node) {
if (node.type === 'function' && node.value === 'url') {
return node.nodes[0].value;
}
return node.value;
}
exports.noRestrictedImports = (0, utils_1.createPlugin)(exports.ruleName, (isEnabled, config) => {
if (!config) {
throw new Error(`The ${exports.ruleName} rule configuration is not provided!`);
}
const { paths = [] } = config;
const ignorer = (0, ignore_1.default)().add(paths);
return function (postcssRoot, postcssResult) {
if (!isEnabled) {
return;
}
const areOptionsValid = stylelint_1.default.utils.validateOptions(postcssResult, exports.ruleName, {
actual: isEnabled,
optional: false,
possible: [true, false],
}, {
actual: config,
optional: false,
possible: {
paths: [utils_1.isString],
},
});
if (!areOptionsValid) {
return;
}
const fileName = postcssRoot.source?.input.from;
const fileDirectory = fileName ? path_1.default.parse(fileName).dir : '';
postcssRoot.walkAtRules(/^import$/i, atRule => {
const { nodes } = (0, postcss_value_parser_1.default)(atRule.params);
if (nodes.length === 0) {
return;
}
const [firstNode] = nodes;
const importURI = getImportURI(firstNode);
const importPath = importURI.startsWith('.')
? path_1.default.relative(ROOT_DIR, path_1.default.join(fileDirectory, importURI))
: importURI;
const isRestricted = paths.includes(importPath) || ignorer.ignores(importPath);
if (isRestricted) {
stylelint_1.default.utils.report({
message: exports.messages.rejected(importURI),
node: atRule,
result: postcssResult,
ruleName: exports.ruleName,
});
return;
}
});
};
});
//# sourceMappingURL=no-restricted-imports.js.map