> ## Documentation Index
> Fetch the complete documentation index at: https://docs.endorlabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

<AgentInstructions>

## Submitting Feedback

If you encounter incorrect, outdated, or confusing documentation on this page, submit feedback:

POST https://docs.endorlabs.com/feedback

```json
{
  "path": "/scan/sca/index",
  "feedback": "Description of the issue"
}
```

Only submit feedback when you have something specific and actionable to report.

</AgentInstructions>

# SCA (Software Composition Analysis)

> Identify vulnerabilities in open source dependencies with reachability analysis.

export const SupportedLanguagesList = () => {
  return <code>c,c#,go,java,javascript,kotlin,php,python,ruby,rust,scala,swift,typescript,swifturl</code>;
};

export const YamlTable = ({children, data: propData, content}) => {
  const KV_RE = /^([A-Za-z][A-Za-z0-9_()/#\s-]+?):\s*(.+)$/;
  const INLINE_MD_RE = /(\[([^\]]+)\]\(([^)]+)\))|(`([^`]+)`)|(\*\*([^*]+)\*\*)|(\*([^*]+)\*)/g;
  const YES_RE = /^-yes-$/i;
  const NO_RE = /^-no-$/i;
  const LIMITED_RE = /^-(limited|partial)-$/i;
  const NA_RE = /^-(na|none)-$/i;
  const NA2_RE = /^-na2-$/i;
  const SIMPLE_TAG_RE = /(<br\s*\/?>)|(<p\s*\/?>)|(-note-)|(-warning-)/gi;
  const tryParseKV = trimmed => {
    const m = KV_RE.exec(trimmed);
    return m ? {
      key: m[1],
      value: m[2].trim()
    } : null;
  };
  const registerKey = (key, seenKeys, orderedKeys) => {
    if (!seenKeys.has(key)) {
      orderedKeys.push(key);
      seenKeys.add(key);
    }
  };
  const flushEntry = (currentEntry, entries) => {
    if (Object.keys(currentEntry).length > 0) entries.push(currentEntry);
  };
  const parseDashPrefixed = (lines, entries, orderedKeys, seenKeys) => {
    let currentEntry = {};
    let inEntry = false;
    for (const line of lines) {
      const trimmed = line.trim();
      if (trimmed.startsWith('- ')) {
        if (inEntry) entries.push(currentEntry);
        currentEntry = {};
        inEntry = true;
        const kv = tryParseKV(trimmed.substring(2).trim());
        if (kv) {
          registerKey(kv.key, seenKeys, orderedKeys);
          currentEntry[kv.key] = kv.value;
        }
      } else if (inEntry && trimmed !== '') {
        const kv = tryParseKV(trimmed);
        if (kv) {
          registerKey(kv.key, seenKeys, orderedKeys);
          currentEntry[kv.key] = kv.value;
        }
      }
    }
    flushEntry(currentEntry, entries);
  };
  const parseBlankSeparated = (lines, entries, orderedKeys, seenKeys) => {
    let currentEntry = {};
    let inEntry = false;
    for (const line of lines) {
      const trimmed = line.trim();
      if (trimmed === '') {
        if (inEntry) {
          flushEntry(currentEntry, entries);
          currentEntry = {};
          inEntry = false;
        }
        continue;
      }
      const kv = tryParseKV(trimmed);
      if (!kv) continue;
      const isNewEntry = !line.startsWith(' ') && !line.startsWith('\t');
      if (isNewEntry && inEntry && Object.keys(currentEntry).length > 0) {
        entries.push(currentEntry);
        currentEntry = {};
      }
      registerKey(kv.key, seenKeys, orderedKeys);
      currentEntry[kv.key] = kv.value;
      inEntry = true;
    }
    flushEntry(currentEntry, entries);
  };
  const normalizeEntries = (entries, orderedKeys) => entries.map(entry => {
    const filled = {};
    for (const key of orderedKeys) filled[key] = entry[key] || '';
    return filled;
  });
  const parseYamlTableContent = contentStr => {
    if (!contentStr) return [];
    const entries = [];
    const orderedKeys = [];
    const seenKeys = new Set();
    const lines = contentStr.split('\n');
    if (lines.some(line => line.trim().startsWith('- '))) {
      parseDashPrefixed(lines, entries, orderedKeys, seenKeys);
    } else {
      parseBlankSeparated(lines, entries, orderedKeys, seenKeys);
    }
    return normalizeEntries(entries, orderedKeys);
  };
  const processText = text => {
    if (!text) return text;
    const parts = [];
    let keyIndex = 0;
    let lastIndex = 0;
    let match;
    while ((match = INLINE_MD_RE.exec(text)) !== null) {
      if (match.index > lastIndex) parts.push(text.slice(lastIndex, match.index));
      if (match[1]) {
        parts.push(<a key={keyIndex++} href={match[3]}>{match[2]}</a>);
      } else if (match[4]) {
        parts.push(<code key={keyIndex++}>{match[5]}</code>);
      } else if (match[6]) {
        parts.push(<strong key={keyIndex++}>{match[7]}</strong>);
      } else if (match[8]) {
        parts.push(<em key={keyIndex++}>{match[9]}</em>);
      }
      lastIndex = match.index + match[0].length;
    }
    if (lastIndex < text.length) parts.push(text.slice(lastIndex));
    if (parts.length === 0) return text;
    const keyRef = {
      current: keyIndex
    };
    return expandHtmlTags(parts, keyRef);
  };
  const processBadges = text => {
    if (!text || typeof text !== 'string') return text;
    if (YES_RE.test(text)) return <span className="yt-badge-yes" role="img" aria-label="Supported" title="Supported">✓</span>;
    if (NO_RE.test(text)) return <span className="yt-badge-no" role="img" aria-label="Not supported" title="Not supported">✗</span>;
    if (LIMITED_RE.test(text)) return <span className="yt-badge-limited" role="img" aria-label="Partially supported" title="Partially supported">◐</span>;
    if (NA_RE.test(text) || NA2_RE.test(text)) return <span className="yt-sr-only" title="Not applicable">Not applicable</span>;
    return processText(text);
  };
  const cellClassName = text => {
    if (!text || typeof text !== 'string') return undefined;
    if (NA_RE.test(text)) return 'yt-cell-na';
    if (NA2_RE.test(text)) return 'yt-cell-na2';
    return undefined;
  };
  const expandSimpleTags = (str, keyRef) => {
    const result = [];
    let last = 0;
    SIMPLE_TAG_RE.lastIndex = 0;
    let m;
    while ((m = SIMPLE_TAG_RE.exec(str)) !== null) {
      if (m.index > last) result.push(str.slice(last, m.index));
      if (m[1]) {
        result.push(<br key={keyRef.current++} />);
      } else if (m[2]) {
        result.push(<br key={keyRef.current++} />, <br key={keyRef.current++} />);
      } else if (m[3]) {
        result.push(<span key={keyRef.current++} className="yt-badge-note" style={{
          fontWeight: 600
        }}>Note: </span>);
      } else if (m[4]) {
        result.push(<span key={keyRef.current++} className="yt-badge-warning" style={{
          fontWeight: 600
        }}>Warning: </span>);
      }
      last = m.index + m[0].length;
    }
    if (last < str.length) result.push(str.slice(last));
    return result;
  };
  const expandHtmlTags = (chunks, keyRef) => {
    const out = [];
    for (const chunk of chunks) {
      if (typeof chunk === 'string') {
        out.push(...expandSimpleTags(chunk, keyRef));
      } else {
        out.push(chunk);
      }
    }
    return out;
  };
  const extractText = node => {
    if (node === null || node === undefined) return '';
    if (typeof node === 'string') return node;
    if (typeof node === 'number') return String(node);
    if (typeof node === 'boolean') return '';
    if (Array.isArray(node)) return node.map(extractText).join('');
    if (node && typeof node === 'object' && node.type) {
      const props = node.props || ({});
      if (typeof props.children === 'string') return props.children;
      if (props.children) return extractText(props.children);
      return '';
    }
    return String(node || '');
  };
  const [mounted, setMounted] = useState(false);
  useEffect(() => {
    setMounted(true);
  }, []);
  const data = useMemo(() => {
    if (propData) return propData;
    if (content && typeof content === 'string') return parseYamlTableContent(content);
    if (!children) return [];
    if (typeof children === 'string') return parseYamlTableContent(children);
    const childrenArray = Array.isArray(children) ? children : [children];
    return parseYamlTableContent(childrenArray.map(extractText).join('').trim());
  }, [children, propData, content]);
  const columns = useMemo(() => {
    if (!data || data.length === 0) return [];
    const firstRow = data[0];
    if (!firstRow || typeof firstRow !== 'object') return [];
    return Object.keys(firstRow);
  }, [data]);
  if (!mounted) return null;
  if (!data || data.length === 0) return null;
  const rowKey = row => columns.map(c => row[c] || '').join('|');
  return <table>
      <thead>
        <tr>
          {columns.map(col => <th key={col}>{col.replaceAll('_', ' ')}</th>)}
        </tr>
      </thead>
      <tbody>
        {data.map(row => <tr key={rowKey(row)}>
            {columns.map(col => <td key={col} className={cellClassName(row[col])}>{processBadges(row[col])}</td>)}
          </tr>)}
      </tbody>
    </table>;
};

Software composition analysis is the identification of the bill of materials for first-party software packages and the mapping of vulnerabilities to these software component versions. SCA helps teams to maintain compliance and get visibility into the risks of their software inventory.

<Tip>
  Endor Labs does not scan the files and paths included in `.gitignore` files during SCA scans. If certain dependencies or paths are not appearing in your scan results, verify they are not excluded by your `.gitignore` configuration.
</Tip>

Endor Labs supports the following major capabilities to help teams reduce the risk and expense of software dependency management across the lifecycle of software reuse.

* [**Endor Scores**](/scan/sca/scores): Endor Labs provides a holistic risk score that includes the security, quality, popularity and activity of a package. Risk scores help in identifying leading indicators of risk in addition to if a software component is outdated, or unmaintained. Risk analysis helps teams to go beyond vulnerabilities and approach the risk of their software holistically.
* [**Reachability Analysis**](/scan/sca/reachability-analysis): Reachability analysis is Endor Labs' capability to perform static analysis on your software packages to give context to how each vulnerability may be reached in the context of your code. This includes mapping vulnerabilities back to vulnerable functions so that deep static analysis can target vulnerabilities with higher levels of granularity as well as the identification of unused software dependencies.
* [**Upgrade Impact Analysis**](/risk-remediation/upgrade-impact-analysis): Upgrade impact analysis allows security teams to set better expectations with their development teams by identifying breaking changes associated with an update of a direct dependency.

The resource requirements, both minimum and recommended, for build runners or workers executing scans using **endorctl** are listed here.

<Note>
  Large applications may require additional resources to complete or enhance the scan performance.
</Note>

## System specifications for local and CI/CD scan

Ensure that your local machine or CI/CD runner has the minimum and recommended resources to successfully scan your software.

<YamlTable>
  {`


    - Resource: Minimum
    CPU: 4 core
    Memory: 16 GB RAM
    - Resource: Recommended
    CPU: 8 core
    Memory: 32 GB RAM


    `}
</YamlTable>

## Supported languages

<YamlTable>
  {`


    - Language: [Java](/scan/sca/java)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -yes-
    Pre-computed_Reachability_Analysis: -yes-
    Phantom_Dependencies: -no-
    Upgrade_Impact_Analysis: -yes-
    Install_Toolchains: -yes-
    - Language: [C/C++](/scan/sca/c)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -no-
    Pre-computed_Reachability_Analysis: -no-
    Phantom_Dependencies: -yes-
    Upgrade_Impact_Analysis: -no-
    Install_Toolchains: -no-
    - Language: [Python](/scan/sca/python)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -yes-
    Pre-computed_Reachability_Analysis: -yes-
    Phantom_Dependencies: -yes-
    Upgrade_Impact_Analysis: -yes-
    Install_Toolchains: -yes-
    - Language: [Rust](/scan/sca/rust)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -no-
    Pre-computed_Reachability_Analysis: -no-
    Phantom_Dependencies: -no-
    Upgrade_Impact_Analysis: -no-
    Install_Toolchains: -yes-
    - Language: [JavaScript](/scan/sca/javascript)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -yes-
    Pre-computed_Reachability_Analysis: -yes-
    Phantom_Dependencies: -yes-
    Upgrade_Impact_Analysis: -yes-
    Install_Toolchains: -yes-
    - Language: [Golang](/scan/sca/golang)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -yes-
    Pre-computed_Reachability_Analysis: -no-
    Phantom_Dependencies: -no-
    Upgrade_Impact_Analysis: -no-
    Install_Toolchains: -yes-
    - Language: [.NET (C#)](/scan/sca/dotnet)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -yes-
    Pre-computed_Reachability_Analysis: -yes-
    Phantom_Dependencies: -no-
    Upgrade_Impact_Analysis: -yes-
    Install_Toolchains: -yes-
    - Language: [Kotlin](/scan/sca/kotlin)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -yes-
    Pre-computed_Reachability_Analysis: -yes-
    Phantom_Dependencies: -no-
    Upgrade_Impact_Analysis: -yes-
    Install_Toolchains: -yes-
    - Language: [Scala](/scan/sca/scala)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -yes-
    Pre-computed_Reachability_Analysis: -yes-
    Phantom_Dependencies: -no-
    Upgrade_Impact_Analysis: -yes-
    Install_Toolchains: -yes-
    - Language: [Ruby](/scan/sca/ruby)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -no-
    Pre-computed_Reachability_Analysis: -no-
    Phantom_Dependencies: -no-
    Upgrade_Impact_Analysis: -no-
    Install_Toolchains: -no-
    - Language: [Swift/Objective-C](/scan/sca/swift-objective-c)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -no-
    Pre-computed_Reachability_Analysis: -no-
    Phantom_Dependencies: -no-
    Upgrade_Impact_Analysis: -no-
    Install_Toolchains: -no-
    - Language: [PHP](/scan/sca/php)
    SCA: -yes-
    Endor_Scores: -yes-
    Reachability_Analysis: -no-
    Pre-computed_Reachability_Analysis: -no-
    Phantom_Dependencies: -no-
    Upgrade_Impact_Analysis: -no-
    Install_Toolchains: -no-


    `}
</YamlTable>

For scanning monorepos or projects that use **Bazel** as the build tool (Java, Go, JavaScript, Python, Scala, Rust, Swift), see [Bazel](/scan/bazel).

## Complete support matrix

The following comprehensive matrix lists the supported languages, build tools, manifest files, and supported requirements.

<YamlTable>
  {`


    - Language: [Java](/scan/sca/java)
    Package_Managers_/_Build_Tool: Maven
    Manifest_Files: \`pom.xml\`
    Extensions: \`.java\`
    Supported_Requirements: JDK version 11-25; Maven 3.6.1 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Gradle
    Manifest_Files: \`build.gradle\` or \`build.gradle.kts\`
    Extensions: \`.java\`
    Supported_Requirements: JDK version 11-25; Gradle 6.0.0 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Bazel
    Manifest_Files: \`WORKSPACE\`, \`MODULE.bazel\`, \`BUILD.bazel\`
    Extensions: \`.java\`
    Supported_Requirements: JDK version 11-25; Bazel versions \`5.x.x\`, \`6.x.x\`, \`7.x.x\`, \`8.x.x\`, and \`9.x.x\`<br>Supports Bazel aspects and Bzlmod
    - Language: [C/C++](/scan/sca/c)
    Package_Managers_/_Build_Tool: Not applicable
    Manifest_Files: Not applicable
    Extensions: \`.c\`, \`.cc\`, \`.cpp\`, \`.cxx\`, \`.h\`, \`.hpp\`, \`.hxx\` \`
    Supported_Requirements: Not applicable
    - Language: [Kotlin](/scan/sca/kotlin)
    Package_Managers_/_Build_Tool: Maven
    Manifest_Files: \`pom.xml\`
    Extensions: \`.kt\`
    Supported_Requirements: JDK version 11-25; Maven 3.6.1 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Gradle
    Manifest_Files: \`build.gradle\` or \`build.gradle.kts\`
    Extensions: \`.kt\`
    Supported_Requirements: JDK version 11-25; Gradle 6.0.0 and higher versions
    - Language: [Golang](/scan/sca/golang)
    Package_Managers_/_Build_Tool: Go
    Manifest_Files: \`go.mod\`, \`go.sum\`
    Extensions: \`.go\`
    Supported_Requirements: Go 1.12 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Bazel
    Manifest_Files: \`WORKSPACE\`, \`MODULE.bazel\`, \`BUILD.bazel\`
    Extensions: \`.go\`
    Supported_Requirements: Bazel versions \`5.x.x\`, \`6.x.x\`, \`7.x.x\`, \`8.x.x\`, and \`9.x.x\`<br />Supports Bazel aspects and Bzlmod
    - Language: [Rust](/scan/sca/rust)
    Package_Managers_/_Build_Tool: Cargo
    Manifest_Files: \`cargo.toml\`, \`cargo.lock\`
    Extensions: \`.rs\`
    Supported_Requirements: Rust 1.63.0 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Bazel
    Manifest_Files: \`WORKSPACE\`, \`MODULE.bazel\`, \`BUILD.bazel\`
    Extensions: \`.rs\`
    Supported_Requirements: Bazel versions \`5.x.x\`, \`6.x.x\`, \`7.x.x\`, \`8.x.x\`, and \`9.x.x\`<br />Requires Bazel aspects and supports Bzlmod
    - Language: [JavaScript](/scan/sca/javascript)
    Package_Managers_/_Build_Tool: npm
    Manifest_Files: \`package-lock.json\`, \`package.json\`
    Extensions: \`.js\`
    Supported_Requirements: npm 6.14.18 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: pnpm
    Manifest_Files: \`pnpm-lock.yaml\`, \`package.json\`
    Extensions: \`.js\`
    Supported_Requirements: pnpm 3.0.0 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Yarn
    Manifest_Files: \`yarn.lock\`, \`package.json\`
    Extensions: \`.js\`
    Supported_Requirements: Yarn all versions
    - Language:
    Package_Managers_/_Build_Tool: Rush
    Manifest_Files: \`rush.json\`, \`package.json\`
    Extensions: \`.js\`
    Supported_Requirements: Rush 5.90.0 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Bazel
    Manifest_Files: \`MODULE.bazel\`, \`BUILD.bazel\`
    Extensions: \`.js\`
    Supported_Requirements: Bazel versions \`5.x.x\`, \`6.x.x\`, \`7.x.x\`, \`8.x.x\`, and \`9.x.x\`<br />Requires Bazel aspects and supports Bzlmod
    - Language: [TypeScript](/scan/sca/javascript)
    Package_Managers_/_Build_Tool: npm
    Manifest_Files: \`package-lock.json\`, \`package.json\`
    Extensions: \`.ts\`
    Supported_Requirements: npm 6.14.18 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: pnpm
    Manifest_Files: \`pnpm-lock.yaml\`, \`package.json\`
    Extensions: \`.ts\`
    Supported_Requirements: pnpm 3.0.0 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Yarn
    Manifest_Files: \`yarn.lock\`, \`package.json\`
    Extensions: \`.ts\`
    Supported_Requirements: Yarn all versions
    - Language:
    Package_Managers_/_Build_Tool: Rush
    Manifest_Files: \`rush.json\`, \`package.json\`
    Extensions: \`.ts\`
    Supported_Requirements: Rush 5.90.0 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Bazel
    Manifest_Files: \`MODULE.bazel\`, \`BUILD.bazel\`
    Extensions: \`.ts\`
    Supported_Requirements: Bazel versions \`5.x.x\`, \`6.x.x\`, \`7.x.x\`, \`8.x.x\`, and \`9.x.x\`<br />Requires Bazel aspects and supports Bzlmod
    - Language: [Python](/scan/sca/python)
    Package_Managers_/_Build_Tool: \`pip\`
    Manifest_Files: \`requirements.txt\`
    Extensions: \`.py\`
    Supported_Requirements: Python 3.6 and higher versions; pip 10.0.0 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Poetry
    Manifest_Files: \`pyproject.toml\`, \`poetry.lock\`
    Extensions: \`.py\`
    Supported_Requirements:
    - Language:
    Package_Managers_/_Build_Tool: PyPI
    Manifest_Files: \`setup.py\`, \`setup.cfg\`, \`pyproject.toml\`
    Extensions: \`.py\`
    Supported_Requirements:
    - Language:
    Package_Managers_/_Build_Tool: UV
    Manifest_Files: \`uv.lock\`, \`pyproject.toml\`
    Extensions: \`.py\`
    Supported_Requirements: Python 3.8 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Bazel
    Manifest_Files: \`WORKSPACE\`, \`MODULE.bazel\`, \`BUILD.bazel\`
    Extensions: \`.py\`
    Supported_Requirements: Bazel versions \`5.x.x\`, \`6.x.x\`, \`7.x.x\`, \`8.x.x\`, and \`9.x.x\`<br />Supports Bazel aspects; Bzlmod requires \`rules_python\` 0.30.0 or higher (below 0.30.0, WORKSPACE only)<br />Reachability analysis supported
    - Language: [.NET (C#)](/scan/sca/dotnet)
    Package_Managers_/_Build_Tool: NuGet
    Manifest_Files: \`*.csproj\`, \`package.lock.json\`, \`projects.assets.json\`, \`Directory.Build.props\`, \`Directory.Packages.props\`, \`*.props\`
    Extensions: \`.cs\`
    Supported_Requirements: .NET 5.0 and higher versions <br />.NET Core 1.0 and higher versions <br />.NET Framework 4.5 and higher versions
    - Language: [Scala](/scan/sca/scala)
    Package_Managers_/_Build_Tool: sbt
    Manifest_Files: \`build.sbt\`
    Extensions: \`.sc\` or \`.scala\`
    Supported_Requirements: sbt 1.3 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Gradle
    Manifest_Files: \`build.gradle\`, \`build.gradle.kts\`
    Extensions: \`.sc\` or \`.scala\`
    Supported_Requirements: JDK version 11-25; Gradle 6.0.0 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Bazel
    Manifest_Files: \`WORKSPACE\`, \`MODULE.bazel\`, \`BUILD.bazel\`
    Extensions: \`.sc\` or \`.scala\`
    Supported_Requirements: Bazel versions \`5.x.x\`, \`6.x.x\`, \`7.x.x\`, \`8.x.x\`, and \`9.x.x\`<br />Supports Bazel aspects and Bzlmod
    - Language: [Ruby](/scan/sca/ruby)
    Package_Managers_/_Build_Tool: Bundler
    Manifest_Files: \`Gemfile\`, \`*.gemspec\`, \`gemfile.lock\`
    Extensions: \`.rb\`
    Supported_Requirements: Ruby 2.6 and higher versions
    - Language: [Swift/Objective-C](/scan/sca/swift-objective-c)
    Package_Managers_/_Build_Tool: CocoaPods
    Manifest_Files: \`Podfile\`, \`Podfile.lock\`
    Extensions: \`.swift\`, \`.h\`, \`.m\`
    Supported_Requirements: CocoaPods 0.9.0 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: SwiftPM
    Manifest_Files: \`Package.swift\`
    Extensions: \`.swift\`, \`.h\`, \`.m\`
    Supported_Requirements: SwiftPM 5.0.0 and higher versions
    - Language:
    Package_Managers_/_Build_Tool: Bazel
    Manifest_Files: \`WORKSPACE\`, \`MODULE.bazel\`, \`BUILD.bazel\`
    Extensions: \`.swift\`, \`.h\`, \`.m\`
    Supported_Requirements: Bazel versions \`5.x.x\`, \`6.x.x\`, \`7.x.x\`, \`8.x.x\`, and \`9.x.x\`<br />Requires Bazel aspects and supports Bzlmod
    - Language: [PHP](/scan/sca/php)
    Package_Managers_/_Build_Tool: Composer
    Manifest_Files: \`composer.json\`, \`composer.lock\`
    Extensions: \`.php\`
    Supported_Requirements: PHP 5.3.2 and higher versions; Composer 2.2.0 and higher versions


    `}
</YamlTable>

Define supported languages when running endorctl `scan` command as a comma-separated list: <SupportedLanguagesList />
