UNPKG

@o3r/eslint-config-otter

Version:

Recommended eslint configuration for Otter project

149 lines 6.33 kB
"use strict"; 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