Skip to content

⬅️ Back to Table of Contents

📄 inferSingleRun.ts

📊 Analysis Summary

Metric Count
🔧 Functions 1
📦 Imports 2
📊 Variables & Constants 1

📚 Table of Contents

🛠️ File Location:

📂 packages/typescript-estree/src/parseSettings/inferSingleRun.ts

📦 Imports

Name Source
path node:path
TSESTreeOptions ../parser-options

Variables & Constants

Name Type Kind Value Exported
possibleEslintBinPaths string[] const `[
'node_modules/.bin/eslint', // npm or yarn repo
'node_modules/eslint/bin/eslint.js', // pnpm repo
]`

Functions

inferSingleRun(options: TSESTreeOptions | undefined): boolean

Code
export function inferSingleRun(options: TSESTreeOptions | undefined): boolean {
  // https://github.com/typescript-eslint/typescript-eslint/issues/9504
  // There's no support (yet?) for extraFileExtensions in single-run hosts.
  // Only watch program hosts and project service can support that.
  if (options?.extraFileExtensions?.length) {
    return false;
  }

  if (
    // single-run implies type-aware linting - no projects means we can't be in single-run mode
    options?.project == null ||
    // programs passed via options means the user should be managing the programs, so we shouldn't
    // be creating our own single-run programs accidentally
    options.programs != null
  ) {
    return false;
  }

  // Allow users to explicitly inform us of their intent to perform a single run (or not) with TSESTREE_SINGLE_RUN
  if (process.env.TSESTREE_SINGLE_RUN === 'false') {
    return false;
  }
  if (process.env.TSESTREE_SINGLE_RUN === 'true') {
    return true;
  }

  // Ideally, we'd like to try to auto-detect CI or CLI usage that lets us infer a single CLI run.
  if (!options.disallowAutomaticSingleRunInference) {
    const possibleEslintBinPaths = [
      'node_modules/.bin/eslint', // npm or yarn repo
      'node_modules/eslint/bin/eslint.js', // pnpm repo
    ];
    if (
      // Default to single runs for CI processes. CI=true is set by most CI providers by default.
      process.env.CI === 'true' ||
      // This will be true for invocations such as `npx eslint ...` and `./node_modules/.bin/eslint ...`
      possibleEslintBinPaths.some(
        binPath =>
          process.argv.length > 1 &&
          process.argv[1].endsWith(path.normalize(binPath)),
      )
    ) {
      return !process.argv.includes('--fix');
    }
  }

  /**
   * We default to assuming that this run could be part of a long-running session (e.g. in an IDE)
   * and watch programs will therefore be required.
   *
   * Unless we can reliably infer otherwise, we default to assuming that this run could be part
   * of a long-running session (e.g. in an IDE) and watch programs will therefore be required
   */
  return false;
}
  • JSDoc:

    /**
     * ESLint (and therefore typescript-eslint) is used in both "single run"/one-time contexts,
     * such as an ESLint CLI invocation, and long-running sessions (such as continuous feedback
     * on a file in an IDE).
     *
     * When typescript-eslint handles TypeScript Program management behind the scenes, this distinction
     * is important because there is significant overhead to managing the so called Watch Programs
     * needed for the long-running use-case. We therefore use the following logic to figure out which
     * of these contexts applies to the current execution.
     *
     * @returns Whether this is part of a single run, rather than a long-running process.
     */
    

  • Parameters:

  • options: TSESTreeOptions | undefined
  • Return Type: boolean
  • Calls:
  • possibleEslintBinPaths.some
  • process.argv[1].endsWith
  • path.normalize
  • process.argv.includes
  • Internal Comments:
    // https://github.com/typescript-eslint/typescript-eslint/issues/9504
    // There's no support (yet?) for extraFileExtensions in single-run hosts.
    // Only watch program hosts and project service can support that.
    // single-run implies type-aware linting - no projects means we can't be in single-run mode (x4)
    // programs passed via options means the user should be managing the programs, so we shouldn't (x3)
    // be creating our own single-run programs accidentally (x3)
    // Allow users to explicitly inform us of their intent to perform a single run (or not) with TSESTREE_SINGLE_RUN
    // Ideally, we'd like to try to auto-detect CI or CLI usage that lets us infer a single CLI run.
    // Default to single runs for CI processes. CI=true is set by most CI providers by default. (x5)
    // This will be true for invocations such as `npx eslint ...` and `./node_modules/.bin/eslint ...` (x3)
    /**
       * We default to assuming that this run could be part of a long-running session (e.g. in an IDE)
       * and watch programs will therefore be required.
       *
       * Unless we can reliably infer otherwise, we default to assuming that this run could be part
       * of a long-running session (e.g. in an IDE) and watch programs will therefore be required
       */