pyfig 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,9 +22,24 @@ console.log(environment.python);
22
22
  console.log(environment.packageManager);
23
23
  ```
24
24
 
25
+ Run Python and pip with Node's standard argument arrays and spawn options:
26
+
27
+ ```ts
28
+ import { pipSpawn, pipSpawnSync, pythonSpawn, pythonSpawnSync } from 'pyfig';
29
+
30
+ const python = await pythonSpawn(['script.py', '--verbose'], { stdio: 'inherit' });
31
+ const pythonVersion = pythonSpawnSync(['--version'], { encoding: 'utf8' });
32
+
33
+ const pip = await pipSpawn(['install', 'ruff'], { stdio: 'inherit' });
34
+ const pipVersion = pipSpawnSync(['--version'], { encoding: 'utf8' });
35
+ ```
36
+
37
+ The asynchronous helpers return `Promise<ChildProcess>` because discovery or installation may be needed before spawning. The synchronous helpers perform that same setup in a blocking child process before returning the standard `spawnSync` result.
38
+ Pass any `PyfigOptions` as the third argument when a helper needs a custom Python range, pip range, cache directory, or installation policy.
39
+
25
40
  Defaults are Python `>=3.10.0 <4.0.0`, pip `>=20.3.0`, managed Python `3.12`, and uv `0.13.6`. Pass any npm-compatible SemVer range.
26
41
 
27
- If pip is unsuitable, `packageManager.kind` is `uv`; its `prefixArgs` is `['pip']`. If Python is unsuitable, pyfig installs the configured managed Python with uv and returns that interpreter.
42
+ pip is always bound to the selected interpreter. pyfig prefers that interpreter's `python -m pip`; standalone `pip3` or `pip` is accepted only when its reported Python version and installation prefix match. If pip is unsuitable, `packageManager.kind` is `uv`, its `prefixArgs` is `['pip']`, and spawned uv commands receive a forced `UV_PYTHON` pointing to the selected interpreter. If Python is unsuitable, pyfig installs the configured managed Python with uv and returns that exact executable.
28
43
 
29
44
  ## CLI
30
45
 
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import { ensureEnvironment } from './provision.js';
4
4
  const program = new Command()
5
5
  .name('pyfig')
6
6
  .description('Find compatible Python and pip executables, using uv as a locked fallback.')
7
- .version('0.1.0')
7
+ .version('0.2.0')
8
8
  .option('--python <path>', 'Python executable to check first')
9
9
  .option('--pip <path>', 'pip executable to check first')
10
10
  .option('--python-range <range>', 'accepted Python SemVer range')
package/dist/index.d.ts CHANGED
@@ -4,4 +4,5 @@ export { findPip, findPython, findUv, probePython, probeUv } from './probes.js';
4
4
  export type { PackageManagerInfo, PythonInfo, UvInfo } from './probes.js';
5
5
  export { ensureEnvironment, ensurePip, ensurePython } from './provision.js';
6
6
  export type { PythonEnvironment } from './provision.js';
7
+ export { pipSpawn, pipSpawnSync, pythonSpawn, pythonSpawnSync } from './runners.js';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { DEFAULT_MANAGED_PYTHON, DEFAULT_PIP_RANGE, DEFAULT_PYTHON_RANGE, DEFAULT_UV_VERSION, resolveOptions, } from './config.js';
2
2
  export { findPip, findPython, findUv, probePython, probeUv } from './probes.js';
3
3
  export { ensureEnvironment, ensurePip, ensurePython } from './provision.js';
4
+ export { pipSpawn, pipSpawnSync, pythonSpawn, pythonSpawnSync } from './runners.js';
4
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEhF,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEhF,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
package/dist/probes.d.ts CHANGED
@@ -22,6 +22,14 @@ export interface UvInfo {
22
22
  export declare function findPython(options: ResolvedPyfigOptions): Promise<PythonInfo | null>;
23
23
  export declare function probePython(candidate: CommandSpec, options: ResolvedPyfigOptions): Promise<PythonInfo | null>;
24
24
  export declare function findPip(python: PythonInfo, options: ResolvedPyfigOptions): Promise<PackageManagerInfo | null>;
25
+ export interface PipVersionDetails {
26
+ version: string;
27
+ location: string;
28
+ pythonMajor: number;
29
+ pythonMinor: number;
30
+ }
31
+ export declare function parsePipVersionOutput(output: string): PipVersionDetails | null;
32
+ export declare function pipBelongsToPython(pip: PipVersionDetails, python: PythonInfo): boolean;
25
33
  export declare function findUv(options: ResolvedPyfigOptions): Promise<UvInfo | null>;
26
34
  export declare function probeUv(executable: string, options: ResolvedPyfigOptions): UvInfo | null;
27
35
  //# sourceMappingURL=probes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../src/probes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAsB,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAuB1F;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAe5B;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA+BpC;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIlF;AAED,wBAAgB,OAAO,CACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,oBAAoB,GAC5B,MAAM,GAAG,IAAI,CAQf"}
1
+ {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../src/probes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAsB,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAuB1F;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAe5B;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAoCpC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAW9E;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,UAAU,GACjB,OAAO,CAWT;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIlF;AAED,wBAAgB,OAAO,CACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,oBAAoB,GAC5B,MAAM,GAAG,IAAI,CAQf"}
package/dist/probes.js CHANGED
@@ -1,3 +1,4 @@
1
+ import path from 'node:path';
1
2
  import semver from 'semver';
2
3
  import { resolveExecutable, run } from './process.js';
3
4
  const PYTHON_PROBE = [
@@ -37,20 +38,23 @@ export async function probePython(candidate, options) {
37
38
  }
38
39
  export async function findPip(python, options) {
39
40
  const candidates = [
40
- { executable: python.executable, args: ['-m', 'pip'] },
41
+ { executable: python.executable, args: ['-m', 'pip'], boundToPython: true },
41
42
  ];
42
43
  if (options.pip)
43
- candidates.push({ executable: options.pip, args: [] });
44
- candidates.push({ executable: 'pip3', args: [] }, { executable: 'pip', args: [] });
44
+ candidates.push({ executable: options.pip, args: [], boundToPython: false });
45
+ candidates.push({ executable: 'pip3', args: [], boundToPython: false }, { executable: 'pip', args: [], boundToPython: false });
45
46
  for (const candidate of candidates) {
46
47
  const executable = await resolveExecutable(candidate.executable, options.env);
47
48
  if (!executable)
48
49
  continue;
49
50
  try {
50
51
  const { stdout } = run(executable, [...candidate.args, '--version'], options.env, options.probeTimeoutMs);
51
- const version = normalizeVersion(stdout.match(/^pip\s+(\S+)/iu)?.[1]);
52
+ const details = parsePipVersionOutput(stdout);
53
+ const version = normalizeVersion(details?.version);
52
54
  if (!version || !semver.satisfies(version, options.pipRange))
53
55
  continue;
56
+ if (!candidate.boundToPython && (!details || !pipBelongsToPython(details, python)))
57
+ continue;
54
58
  return {
55
59
  kind: 'pip',
56
60
  executable,
@@ -65,6 +69,27 @@ export async function findPip(python, options) {
65
69
  }
66
70
  return null;
67
71
  }
72
+ export function parsePipVersionOutput(output) {
73
+ const match = output.trim().match(/^pip\s+(\S+)\s+from\s+(.+?)\s+\(python\s+(\d+)\.(\d+)(?:\.\d+)?\)$/iu);
74
+ if (!match?.[1] || !match[2] || !match[3] || !match[4])
75
+ return null;
76
+ return {
77
+ version: match[1],
78
+ location: match[2],
79
+ pythonMajor: Number.parseInt(match[3], 10),
80
+ pythonMinor: Number.parseInt(match[4], 10),
81
+ };
82
+ }
83
+ export function pipBelongsToPython(pip, python) {
84
+ if (pip.pythonMajor !== python.major || pip.pythonMinor !== python.minor)
85
+ return false;
86
+ const prefix = normalizePathForComparison(path.resolve(python.prefix));
87
+ const location = normalizePathForComparison(path.resolve(pip.location));
88
+ const relative = path.relative(prefix, location);
89
+ return relative === '' || (relative !== '..' &&
90
+ !relative.startsWith(`..${path.sep}`) &&
91
+ !path.isAbsolute(relative));
92
+ }
68
93
  export async function findUv(options) {
69
94
  const configured = options.env['PYFIG_UV'] ?? 'uv';
70
95
  const executable = await resolveExecutable(configured, options.env);
@@ -85,4 +110,7 @@ function normalizeVersion(value) {
85
110
  return null;
86
111
  return semver.valid(value) ?? semver.coerce(value)?.version ?? null;
87
112
  }
113
+ function normalizePathForComparison(value) {
114
+ return process.platform === 'win32' ? value.toLowerCase() : value;
115
+ }
88
116
  //# sourceMappingURL=probes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"probes.js","sourceRoot":"","sources":["../src/probes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"probes.js","sourceRoot":"","sources":["../src/probes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { spawnSync, type ChildProcess, type SpawnOptions, type SpawnSyncOptions } from 'node:child_process';
2
+ import { type PyfigOptions } from './config.js';
3
+ import type { PackageManagerInfo, PythonInfo } from './probes.js';
4
+ export interface ResolvedCommand {
5
+ executable: string;
6
+ args: string[];
7
+ env: NodeJS.ProcessEnv;
8
+ }
9
+ export declare function pythonSpawn(args?: readonly string[], spawnOptions?: SpawnOptions, pyfigOptions?: PyfigOptions): Promise<ChildProcess>;
10
+ export declare function pythonSpawnSync(args?: readonly string[], spawnOptions?: SpawnSyncOptions, pyfigOptions?: PyfigOptions): ReturnType<typeof spawnSync>;
11
+ export declare function pipSpawn(args?: readonly string[], spawnOptions?: SpawnOptions, pyfigOptions?: PyfigOptions): Promise<ChildProcess>;
12
+ export declare function pipSpawnSync(args?: readonly string[], spawnOptions?: SpawnSyncOptions, pyfigOptions?: PyfigOptions): ReturnType<typeof spawnSync>;
13
+ export declare function buildPythonCommand(python: PythonInfo, args: readonly string[], env: NodeJS.ProcessEnv): ResolvedCommand;
14
+ export declare function buildPipCommand(packageManager: PackageManagerInfo, args: readonly string[], env: NodeJS.ProcessEnv): ResolvedCommand;
15
+ //# sourceMappingURL=runners.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runners.d.ts","sourceRoot":"","sources":["../src/runners.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAkB,KAAK,YAAY,EAA6B,MAAM,aAAa,CAAC;AAC3F,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGlE,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAOD,wBAAsB,WAAW,CAC/B,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,YAAY,GAAE,YAAiB,EAC/B,YAAY,GAAE,YAAiB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAQvB;AAED,wBAAgB,eAAe,CAC7B,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,YAAY,GAAE,gBAAqB,EACnC,YAAY,GAAE,YAAiB,GAC9B,UAAU,CAAC,OAAO,SAAS,CAAC,CAQ9B;AAED,wBAAsB,QAAQ,CAC5B,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,YAAY,GAAE,YAAiB,EAC/B,YAAY,GAAE,YAAiB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAYvB;AAED,wBAAgB,YAAY,CAC1B,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,YAAY,GAAE,gBAAqB,EACnC,YAAY,GAAE,YAAiB,GAC9B,UAAU,CAAC,OAAO,SAAS,CAAC,CAY9B;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,eAAe,CAMjB;AAED,wBAAgB,eAAe,CAC7B,cAAc,EAAE,kBAAkB,EAClC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,eAAe,CAQjB"}
@@ -0,0 +1,85 @@
1
+ import { spawn, spawnSync, } from 'node:child_process';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { resolveOptions } from './config.js';
4
+ import { ensureEnvironment, ensurePython } from './provision.js';
5
+ export async function pythonSpawn(args = [], spawnOptions = {}, pyfigOptions = {}) {
6
+ const options = optionsForInvocation(pyfigOptions, spawnOptions.env);
7
+ const python = await ensurePython(options);
8
+ const command = buildPythonCommand(python, args, resolveOptions(options).env);
9
+ return spawn(command.executable, command.args, {
10
+ ...spawnOptions,
11
+ env: command.env,
12
+ });
13
+ }
14
+ export function pythonSpawnSync(args = [], spawnOptions = {}, pyfigOptions = {}) {
15
+ const options = optionsForInvocation(pyfigOptions, spawnOptions.env);
16
+ const python = resolveSynchronously('python', options);
17
+ const command = buildPythonCommand(python, args, resolveOptions(options).env);
18
+ return spawnSync(command.executable, command.args, {
19
+ ...spawnOptions,
20
+ env: command.env,
21
+ });
22
+ }
23
+ export async function pipSpawn(args = [], spawnOptions = {}, pyfigOptions = {}) {
24
+ const options = optionsForInvocation(pyfigOptions, spawnOptions.env);
25
+ const environment = await ensureEnvironment(options);
26
+ const command = buildPipCommand(environment.packageManager, args, resolveOptions(options).env);
27
+ return spawn(command.executable, command.args, {
28
+ ...spawnOptions,
29
+ env: command.env,
30
+ });
31
+ }
32
+ export function pipSpawnSync(args = [], spawnOptions = {}, pyfigOptions = {}) {
33
+ const options = optionsForInvocation(pyfigOptions, spawnOptions.env);
34
+ const environment = resolveSynchronously('environment', options);
35
+ const command = buildPipCommand(environment.packageManager, args, resolveOptions(options).env);
36
+ return spawnSync(command.executable, command.args, {
37
+ ...spawnOptions,
38
+ env: command.env,
39
+ });
40
+ }
41
+ export function buildPythonCommand(python, args, env) {
42
+ return {
43
+ executable: python.executable,
44
+ args: [...args],
45
+ env,
46
+ };
47
+ }
48
+ export function buildPipCommand(packageManager, args, env) {
49
+ return {
50
+ executable: packageManager.executable,
51
+ args: [...packageManager.prefixArgs, ...args],
52
+ env: packageManager.kind === 'uv'
53
+ ? { ...env, UV_PYTHON: packageManager.pythonExecutable }
54
+ : env,
55
+ };
56
+ }
57
+ function optionsForInvocation(pyfigOptions, spawnEnv) {
58
+ return spawnEnv === undefined ? pyfigOptions : { ...pyfigOptions, env: spawnEnv };
59
+ }
60
+ function resolveSynchronously(target, options) {
61
+ const resolved = resolveOptions(options);
62
+ const bridgeExtension = fileURLToPath(import.meta.url).endsWith('.ts') ? 'ts' : 'js';
63
+ const bridge = fileURLToPath(new URL(`./sync-resolver.${bridgeExtension}`, import.meta.url));
64
+ const request = { target, options: resolved };
65
+ const result = spawnSync(process.execPath, [bridge], {
66
+ input: JSON.stringify(request),
67
+ encoding: 'utf8',
68
+ env: resolved.env,
69
+ timeout: resolved.installTimeoutMs + resolved.probeTimeoutMs + 30_000,
70
+ maxBuffer: 4 * 1024 * 1024,
71
+ windowsHide: true,
72
+ });
73
+ if (result.status !== 0 || result.error) {
74
+ const detail = result.stderr.trim() || result.error?.message || `exit ${result.status}`;
75
+ throw new Error(`Could not resolve ${target} synchronously: ${detail}`);
76
+ }
77
+ try {
78
+ return JSON.parse(result.stdout);
79
+ }
80
+ catch (error) {
81
+ const detail = error instanceof Error ? error.message : String(error);
82
+ throw new Error(`Could not parse synchronous ${target} resolution: ${detail}`);
83
+ }
84
+ }
85
+ //# sourceMappingURL=runners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runners.js","sourceRoot":"","sources":["../src/runners.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sync-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-resolver.d.ts","sourceRoot":"","sources":["../src/sync-resolver.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { ensureEnvironment, ensurePython } from './provision.js';
3
+ async function main() {
4
+ const request = JSON.parse(readFileSync(0, 'utf8'));
5
+ const result = request.target === 'python'
6
+ ? await ensurePython(request.options)
7
+ : await ensureEnvironment(request.options);
8
+ process.stdout.write(JSON.stringify(result));
9
+ }
10
+ main().catch((error) => {
11
+ const message = error instanceof Error ? error.message : String(error);
12
+ process.stderr.write(message);
13
+ process.exitCode = 1;
14
+ });
15
+ //# sourceMappingURL=sync-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-resolver.js","sourceRoot":"","sources":["../src/sync-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAOjE,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAA0B,CAAC;IAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,QAAQ;QACxC,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;QACrC,CAAC,CAAC,MAAM,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pyfig",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Find compatible Python and pip executables, with a locked uv fallback.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -37,6 +37,14 @@
37
37
  ],
38
38
  "author": "Reggie Bowser",
39
39
  "license": "MIT",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/regbo/pyfig.git"
43
+ },
44
+ "bugs": {
45
+ "url": "https://github.com/regbo/pyfig/issues"
46
+ },
47
+ "homepage": "https://github.com/regbo/pyfig#readme",
40
48
  "publishConfig": {
41
49
  "access": "public"
42
50
  },