UNPKG

@typescript-eslint/typescript-estree

Version:

A parser that converts TypeScript source code into an ESTree compatible form

75 lines (74 loc) 4.26 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createProjectProgramError = createProjectProgramError; const node_path_1 = __importDefault(require("node:path")); const describeFilePath_1 = require("./describeFilePath"); const shared_1 = require("./shared"); function createProjectProgramError(parseSettings, programsForProjects) { const describedFilePath = (0, describeFilePath_1.describeFilePath)(parseSettings.filePath, parseSettings.tsconfigRootDir); return [ getErrorStart(describedFilePath, parseSettings), ...getErrorDetails(describedFilePath, parseSettings, programsForProjects), ]; } function getErrorStart(describedFilePath, parseSettings) { const relativeProjects = [...parseSettings.projects.values()].map(projectFile => (0, describeFilePath_1.describeFilePath)(projectFile, parseSettings.tsconfigRootDir)); const describedPrograms = relativeProjects.length === 1 ? ` ${relativeProjects[0]}` : `\n${relativeProjects.map(project => `- ${project}`).join('\n')}`; return `ESLint was configured to run on \`${describedFilePath}\` using \`parserOptions.project\`:${describedPrograms}`; } function getErrorDetails(describedFilePath, parseSettings, programsForProjects) { if (programsForProjects.length === 1 && programsForProjects[0].getProjectReferences()?.length) { return [ `That TSConfig uses project "references" and doesn't include \`${describedFilePath}\` directly, which is not supported by \`parserOptions.project\`.`, `Either:`, `- Switch to \`parserOptions.projectService\``, `- Use an ESLint-specific TSConfig`, `See the typescript-eslint docs for more info: https://typescript-eslint.io/troubleshooting/typed-linting#are-typescript-project-references-supported`, ]; } const { extraFileExtensions } = parseSettings; const details = []; for (const extraExtension of extraFileExtensions) { if (!extraExtension.startsWith('.')) { details.push(`Found unexpected extension \`${extraExtension}\` specified with the \`parserOptions.extraFileExtensions\` option. Did you mean \`.${extraExtension}\`?`); } if (shared_1.DEFAULT_EXTRA_FILE_EXTENSIONS.has(extraExtension)) { details.push(`You unnecessarily included the extension \`${extraExtension}\` with the \`parserOptions.extraFileExtensions\` option. This extension is already handled by the parser by default.`); } } const fileExtension = node_path_1.default.extname(parseSettings.filePath); if (!shared_1.DEFAULT_EXTRA_FILE_EXTENSIONS.has(fileExtension)) { const nonStandardExt = `The extension for the file (\`${fileExtension}\`) is non-standard`; if (extraFileExtensions.length > 0) { if (!extraFileExtensions.includes(fileExtension)) { return [ ...details, `${nonStandardExt}. It should be added to your existing \`parserOptions.extraFileExtensions\`.`, ]; } } else { return [ ...details, `${nonStandardExt}. You should add \`parserOptions.extraFileExtensions\` to your config.`, ]; } } const [describedInclusions, describedSpecifiers] = parseSettings.projects.size === 1 ? ['that TSConfig does not', 'that TSConfig'] : ['none of those TSConfigs', 'one of those TSConfigs']; return [ ...details, `However, ${describedInclusions} include this file. Either:`, `- Change ESLint's list of included files to not include this file`, `- Change ${describedSpecifiers} to include this file`, `- Create a new TSConfig that includes this file and include it in your parserOptions.project`, `See the typescript-eslint docs for more info: https://typescript-eslint.io/troubleshooting/typed-linting#i-get-errors-telling-me-eslint-was-configured-to-run--however-that-tsconfig-does-not--none-of-those-tsconfigs-include-this-file`, ]; }