import { cliTest } from "../../support/cli/cliFixture.js"; import { writeFile } from "node:fs/promises"; import { join } from "node:path"; import { expect } from "vitest"; import { parseEvidence } from "../../../src/domain/evidence.js"; import { javascriptApplicationAnalysisResultSchema } from "../../../src/domain/javascript/javascriptApplicationAnalysis.js"; import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js"; cliTest( "reports partial JavaScript request targets through the public CLI", async ({ cli: driver }) => { const root = await createTestTempDirectory("rea-js-partial-endpoints-cli-"); await writeFile( join(root, "main.js"), "fetch(target); fetch('target'); fetch(`https://${hosts['a@b']}/items/${id}`); function other(target) { fetch(target); }", ); const cliResult = await driver.run({ arguments: ["analyze-javascript-application", root, "--json"], environment: process.env, timeoutMs: 15_000, }); expect(cliResult.exitCode, cliResult.stderr).toBe(0); const result = javascriptApplicationAnalysisResultSchema.parse( parseEvidence(cliResult.json).normalized_result, ); const endpoints = result.graph.nodes.filter( ({ kind }) => kind === "endpoint", ); const partial = endpoints.flatMap(({ observations, node_id }) => observations .filter(({ properties }) => properties.resolution === "partial") .map((observation) => ({ node_id, ...observation })), ); expect(partial.map(({ properties }) => properties.value).sort()).toEqual([ "`https://${hosts['a@b']}/items/${id}`", "target", "target", ]); expect(new Set(partial.map(({ node_id }) => node_id)).size).toBe(3); expect( partial.find(({ properties }) => properties.value === "target")?.evidence, ).toMatchObject({ authority: "ast-static-analysis", state: "observed", limitations: [expect.stringContaining("not an exact literal")], }); expect( endpoints.some(({ observations }) => observations.some( ({ properties }) => properties.value === "target" && properties.resolution === undefined, ), ), ).toBe(true); }, 20_000, );