Skip to content

Commit c8fcc75

Browse files
committed
refactor(dlx): extract spawn-opengrep.mts from spawn.mts
1 parent 70d39ba commit c8fcc75

2 files changed

Lines changed: 86 additions & 64 deletions

File tree

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/**
2+
* Spawn OpenGrep for AST-based code-pattern scanning.
3+
*
4+
* - spawnOpengrepDlx: download from GitHub releases, then exec.
5+
* - spawnOpengrepVfs: extract from SEA bundle, then exec.
6+
* - spawnOpengrep: auto-detect SEA vs npm-CLI mode and dispatch.
7+
*/
8+
9+
import { spawn } from '@socketsecurity/lib/spawn'
10+
11+
import {
12+
downloadGitHubReleaseBinary,
13+
spawnToolVfs,
14+
} from './spawn.mts'
15+
import { resolveOpengrep } from './resolve-binary.mjs'
16+
import { areExternalToolsAvailable } from './vfs-extract.mjs'
17+
import { isSeaBinary } from '../sea/detect.mts'
18+
19+
import type { DlxOptions, DlxSpawnResult } from './spawn.mts'
20+
import type { StdioOptions } from 'node:child_process'
21+
import type { SpawnExtra } from '@socketsecurity/lib/spawn'
22+
23+
export async function spawnOpengrepDlx(
24+
args: string[] | readonly string[],
25+
options?: DlxOptions | undefined,
26+
spawnExtra?: SpawnExtra | undefined,
27+
): Promise<DlxSpawnResult> {
28+
const resolution = resolveOpengrep()
29+
30+
if (resolution.type !== 'github-release') {
31+
throw new Error(
32+
`internal: resolveOpengrep returned resolution.type="${resolution.type}" (expected "github-release"); this is a resolver contract bug — re-run with --debug and report the output`,
33+
)
34+
}
35+
36+
const { env: spawnEnv, ...dlxOptions } = {
37+
__proto__: null,
38+
...options,
39+
} as DlxOptions
40+
41+
const binaryPath = await downloadGitHubReleaseBinary(resolution.details)
42+
43+
const spawnPromise = spawn(binaryPath, args, {
44+
...dlxOptions,
45+
env: {
46+
...process.env,
47+
...spawnEnv,
48+
},
49+
stdio: (spawnExtra?.['stdio'] as StdioOptions | undefined) ?? 'inherit',
50+
})
51+
52+
return {
53+
spawnPromise,
54+
}
55+
}
56+
57+
/**
58+
* Spawn OpenGrep from VFS (SEA mode).
59+
*/
60+
export async function spawnOpengrepVfs(
61+
args: string[] | readonly string[],
62+
options?: DlxOptions | undefined,
63+
spawnExtra?: SpawnExtra | undefined,
64+
): Promise<DlxSpawnResult> {
65+
return await spawnToolVfs('opengrep', args, options, spawnExtra)
66+
}
67+
68+
/**
69+
* Spawn OpenGrep.
70+
* Auto-detects SEA mode and uses appropriate spawn method.
71+
*/
72+
export async function spawnOpengrep(
73+
args: string[] | readonly string[],
74+
options?: DlxOptions | undefined,
75+
spawnExtra?: SpawnExtra | undefined,
76+
): Promise<DlxSpawnResult> {
77+
if (isSeaBinary() && areExternalToolsAvailable()) {
78+
return await spawnOpengrepVfs(args, options, spawnExtra)
79+
}
80+
return await spawnOpengrepDlx(args, options, spawnExtra)
81+
}

packages/cli/src/utils/dlx/spawn.mts

Lines changed: 5 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import { whichReal } from '@socketsecurity/lib/bin'
3434
import {
3535
resolveCdxgen,
3636
resolveCoana,
37-
resolveOpengrep,
3837
resolvePyCli,
3938
resolveSfw,
4039
resolveSocketPatch,
@@ -1733,66 +1732,8 @@ export {
17331732
spawnTrufflehogVfs,
17341733
} from './spawn-trufflehog.mts'
17351734

1736-
/**
1737-
* Spawn OpenGrep via GitHub download (npm CLI mode).
1738-
* Downloads from GitHub releases (opengrep/opengrep).
1739-
*/
1740-
export async function spawnOpengrepDlx(
1741-
args: string[] | readonly string[],
1742-
options?: DlxOptions | undefined,
1743-
spawnExtra?: SpawnExtra | undefined,
1744-
): Promise<DlxSpawnResult> {
1745-
const resolution = resolveOpengrep()
1746-
1747-
if (resolution.type !== 'github-release') {
1748-
throw new Error(
1749-
`internal: resolveOpengrep returned resolution.type="${resolution.type}" (expected "github-release"); this is a resolver contract bug — re-run with --debug and report the output`,
1750-
)
1751-
}
1752-
1753-
const { env: spawnEnv, ...dlxOptions } = {
1754-
__proto__: null,
1755-
...options,
1756-
} as DlxOptions
1757-
1758-
const binaryPath = await downloadGitHubReleaseBinary(resolution.details)
1759-
1760-
const spawnPromise = spawn(binaryPath, args, {
1761-
...dlxOptions,
1762-
env: {
1763-
...process.env,
1764-
...spawnEnv,
1765-
},
1766-
stdio: (spawnExtra?.['stdio'] as StdioOptions | undefined) ?? 'inherit',
1767-
})
1768-
1769-
return {
1770-
spawnPromise,
1771-
}
1772-
}
1773-
1774-
/**
1775-
* Spawn OpenGrep from VFS (SEA mode).
1776-
*/
1777-
export async function spawnOpengrepVfs(
1778-
args: string[] | readonly string[],
1779-
options?: DlxOptions | undefined,
1780-
spawnExtra?: SpawnExtra | undefined,
1781-
): Promise<DlxSpawnResult> {
1782-
return await spawnToolVfs('opengrep', args, options, spawnExtra)
1783-
}
1784-
1785-
/**
1786-
* Spawn OpenGrep.
1787-
* Auto-detects SEA mode and uses appropriate spawn method.
1788-
*/
1789-
export async function spawnOpengrep(
1790-
args: string[] | readonly string[],
1791-
options?: DlxOptions | undefined,
1792-
spawnExtra?: SpawnExtra | undefined,
1793-
): Promise<DlxSpawnResult> {
1794-
if (isSeaBinary() && areExternalToolsAvailable()) {
1795-
return await spawnOpengrepVfs(args, options, spawnExtra)
1796-
}
1797-
return await spawnOpengrepDlx(args, options, spawnExtra)
1798-
}
1735+
export {
1736+
spawnOpengrep,
1737+
spawnOpengrepDlx,
1738+
spawnOpengrepVfs,
1739+
} from './spawn-opengrep.mts'

0 commit comments

Comments
 (0)