@o3r/eslint-config-otter
Version:
Recommended eslint configuration for Otter project
149 lines • 6.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateLinterConfigs = updateLinterConfigs;
const node_path_1 = require("node:path");
const schematics_1 = require("@angular-devkit/schematics");
const schematics_2 = require("@o3r/schematics");
/**
* Add or update the Linter configuration
* @param options @see RuleFactory.options
* @param options.projectName
* @param rootPath @see RuleFactory.rootPath
*/
function updateLinterConfigs(options, rootPath) {
/**
* Update or create the eslint.json file
* @param tree
* @param context
*/
const updateTslintExtend = (tree, context) => {
const eslintFilePath = '/.eslintrc.json';
if (tree.exists(eslintFilePath)) {
const eslintFile = tree.readJson(eslintFilePath);
eslintFile.extends = eslintFile.extends ? (Array.isArray(eslintFile.extends) ? eslintFile.extends : [eslintFile.extends]) : [];
const eslintConfigOtter = '@o3r/eslint-config-otter';
if (!eslintFile.extends.includes(eslintConfigOtter)) {
eslintFile.extends.push(eslintConfigOtter);
}
tree.overwrite(eslintFilePath, JSON.stringify(eslintFile, null, 2));
}
else {
const eslintConfigFiles = (0, schematics_2.getAllFilesInTree)(tree, '/', ['**/.eslintrc.js'], false).filter((file) => /\.eslintrc/i.test(file));
if (eslintConfigFiles.length === 0) {
return (0, schematics_1.mergeWith)((0, schematics_1.apply)((0, schematics_1.url)((0, schematics_2.getTemplateFolder)(rootPath, __dirname, 'templates/workspace')), [
(0, schematics_1.template)({
dot: '.'
}),
(0, schematics_1.renameTemplateFiles)()
]), schematics_1.MergeStrategy.Overwrite);
}
else {
context.logger.warn('An unsupported format ESLint configuration already exists, an automatic update cannot be applied.');
context.logger.warn(`You can manually extend "@o3r/eslint-config-otter" in your configuration ${eslintConfigFiles.map((f) => `"${f}"`).join(', ')}`);
return;
}
}
};
/**
* Create linter files for the project
* @param tree
* @param context
*/
const createProjectFiles = (tree, context) => {
if (!options.projectName) {
return;
}
const workspace = (0, schematics_2.getWorkspaceConfig)(tree);
if (!workspace) {
return;
}
const workspaceProject = workspace.projects[options.projectName];
if (!workspaceProject) {
context.logger.warn('No project detected, linter task can not be added.');
return;
}
const projectRoot = workspaceProject.root;
const projectType = workspaceProject.projectType;
const eslintFilePath = node_path_1.posix.join(projectRoot, '/.eslintrc.js');
if (tree.exists(eslintFilePath)) {
context.logger.info(`${eslintFilePath} already exists.`);
return;
}
else {
const rootRelativePath = node_path_1.posix.relative(projectRoot, tree.root.path.replace(/^\//, './'));
return (0, schematics_1.mergeWith)((0, schematics_1.apply)((0, schematics_1.url)((0, schematics_2.getTemplateFolder)(rootPath, __dirname, 'templates/project')), [
(0, schematics_1.template)({
dot: '.',
projectTsConfig: projectType === 'application' ? 'tsconfig.app' : 'tsconfig.lib',
rootRelativePath
}),
(0, schematics_1.move)(projectRoot),
(0, schematics_1.renameTemplateFiles)()
]), schematics_1.MergeStrategy.Overwrite);
}
};
/**
* Update angular.json file to use ESLint builder.
* @param tree
* @param context
*/
const editAngularJson = (tree, context) => {
const workspace = (0, schematics_2.getWorkspaceConfig)(tree);
if (!workspace) {
return;
}
const workspaceProject = options.projectName ? workspace.projects[options.projectName] : undefined;
if (!workspaceProject) {
context.logger.warn('No project detected, linter task can not be added.');
return;
}
workspaceProject.architect ||= {};
workspaceProject.architect.lint ||= {
builder: '@angular-eslint/builder:lint',
options: {
eslintConfig: `${workspaceProject.root}/.eslintrc.js`,
lintFilePatterns: [
`${workspaceProject.sourceRoot || node_path_1.posix.join(workspaceProject.root, 'src')}/**/*.ts`
]
}
};
workspace.projects[options.projectName] = workspaceProject;
tree.overwrite('/angular.json', JSON.stringify(workspace, null, 2));
};
/**
* Handle linter errors to comply with Otter rules
* @param tree
* @param context
*/
const handleOtterEslintErrors = (tree, context) => {
if (!options.projectName) {
return;
}
const workspace = (0, schematics_2.getWorkspaceConfig)(tree);
if (!workspace) {
return;
}
const workspaceProject = workspace.projects[options.projectName];
if (!workspaceProject) {
context.logger.warn('No project detected, linter task can not be added.');
return;
}
const projectRoot = workspaceProject.root;
const mainTsPath = node_path_1.posix.join(projectRoot, 'src/main.ts');
if (tree.exists(mainTsPath)) {
const mainTsContent = tree.readText(mainTsPath);
tree.overwrite(mainTsPath, '/* eslint-disable no-console */\n' + mainTsContent);
}
else {
context.logger.warn(`No file found under '${mainTsPath}'. Linter errors may occur and should be fixed by hand.`);
}
};
return (0, schematics_1.chain)([
updateTslintExtend,
createProjectFiles,
editAngularJson,
handleOtterEslintErrors,
(0, schematics_2.applyEditorConfig)()
]);
}
//# sourceMappingURL=index.js.map