pyfig 0.7.0 → 0.7.1

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.
Files changed (79) hide show
  1. package/README.md +76 -178
  2. package/SECURITY.md +16 -5
  3. package/dist/cjs/index.js +482 -1131
  4. package/dist/cjs/index.js.map +6 -16
  5. package/dist/index.d.ts +2 -8
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -5
  8. package/dist/index.js.map +1 -1
  9. package/dist/process.d.ts +6 -12
  10. package/dist/process.d.ts.map +1 -1
  11. package/dist/process.js +35 -54
  12. package/dist/process.js.map +1 -1
  13. package/dist/pyfig.d.ts +31 -0
  14. package/dist/pyfig.d.ts.map +1 -0
  15. package/dist/pyfig.js +275 -0
  16. package/dist/pyfig.js.map +1 -0
  17. package/dist/uv.d.ts +3 -0
  18. package/dist/uv.d.ts.map +1 -0
  19. package/dist/uv.js +423 -0
  20. package/dist/uv.js.map +1 -0
  21. package/package.json +6 -12
  22. package/dist/cjs/sync-resolver.js +0 -1342
  23. package/dist/cjs/sync-resolver.js.map +0 -20
  24. package/dist/cli.d.ts +0 -3
  25. package/dist/cli.d.ts.map +0 -1
  26. package/dist/cli.js +0 -57
  27. package/dist/cli.js.map +0 -1
  28. package/dist/client.d.ts +0 -15
  29. package/dist/client.d.ts.map +0 -1
  30. package/dist/client.js +0 -35
  31. package/dist/client.js.map +0 -1
  32. package/dist/config.d.ts +0 -69
  33. package/dist/config.d.ts.map +0 -1
  34. package/dist/config.js +0 -159
  35. package/dist/config.js.map +0 -1
  36. package/dist/package-target.d.ts +0 -8
  37. package/dist/package-target.d.ts.map +0 -1
  38. package/dist/package-target.js +0 -81
  39. package/dist/package-target.js.map +0 -1
  40. package/dist/pep440.d.ts +0 -12
  41. package/dist/pep440.d.ts.map +0 -1
  42. package/dist/pep440.js +0 -21
  43. package/dist/pep440.js.map +0 -1
  44. package/dist/probes.d.ts +0 -37
  45. package/dist/probes.d.ts.map +0 -1
  46. package/dist/probes.js +0 -145
  47. package/dist/probes.js.map +0 -1
  48. package/dist/project-root.d.ts +0 -3
  49. package/dist/project-root.d.ts.map +0 -1
  50. package/dist/project-root.js +0 -22
  51. package/dist/project-root.js.map +0 -1
  52. package/dist/provision-lock.d.ts +0 -10
  53. package/dist/provision-lock.d.ts.map +0 -1
  54. package/dist/provision-lock.js +0 -24
  55. package/dist/provision-lock.js.map +0 -1
  56. package/dist/provision.d.ts +0 -20
  57. package/dist/provision.d.ts.map +0 -1
  58. package/dist/provision.js +0 -673
  59. package/dist/provision.js.map +0 -1
  60. package/dist/python-venv.d.ts +0 -12
  61. package/dist/python-venv.d.ts.map +0 -1
  62. package/dist/python-venv.js +0 -52
  63. package/dist/python-venv.js.map +0 -1
  64. package/dist/runners.d.ts +0 -14
  65. package/dist/runners.d.ts.map +0 -1
  66. package/dist/runners.js +0 -71
  67. package/dist/runners.js.map +0 -1
  68. package/dist/runtime-files.d.ts +0 -3
  69. package/dist/runtime-files.d.ts.map +0 -1
  70. package/dist/runtime-files.js +0 -12
  71. package/dist/runtime-files.js.map +0 -1
  72. package/dist/sync-resolver.d.ts +0 -2
  73. package/dist/sync-resolver.d.ts.map +0 -1
  74. package/dist/sync-resolver.js +0 -15
  75. package/dist/sync-resolver.js.map +0 -1
  76. package/dist/venv-identity.d.ts +0 -36
  77. package/dist/venv-identity.d.ts.map +0 -1
  78. package/dist/venv-identity.js +0 -80
  79. package/dist/venv-identity.js.map +0 -1
package/dist/process.js CHANGED
@@ -1,91 +1,72 @@
1
- import { spawn, spawnSync } from 'node:child_process';
1
+ import { spawn } from 'node:child_process';
2
2
  import path from 'node:path';
3
3
  import which from 'which';
4
- export async function resolveExecutable(value, env) {
5
- if (!value)
6
- return null;
7
- if (path.isAbsolute(value)) {
8
- return await which(value, { nothrow: true, path: env['PATH'], pathExt: env['PATHEXT'] });
9
- }
10
- if (!/^[A-Za-z0-9_.-]+$/u.test(value))
11
- return null;
12
- return await which(value, { nothrow: true, path: env['PATH'], pathExt: env['PATHEXT'] });
13
- }
14
- export function run(executable, args, env, timeoutMs) {
15
- const result = spawnSync(executable, args, {
16
- encoding: 'utf8',
17
- env,
18
- timeout: timeoutMs,
19
- maxBuffer: 4 * 1024 * 1024,
20
- windowsHide: true,
4
+ const OUTPUT_LIMIT = 1024 * 1024;
5
+ /** Resolve a command name or path to an executable without invoking it. */
6
+ export async function findExecutable(requested, cwd, env) {
7
+ const candidate = path.isAbsolute(requested) || /[\\/]/u.test(requested)
8
+ ? path.resolve(cwd, requested)
9
+ : requested;
10
+ const resolved = await which(candidate, {
11
+ nothrow: true,
12
+ path: environmentValue(env, 'PATH'),
13
+ pathExt: environmentValue(env, 'PATHEXT'),
21
14
  });
22
- if (result.status !== 0 || result.error) {
23
- const detail = result.stderr?.trim() || result.error?.message || `exit ${result.status}`;
24
- throw new Error(`${path.basename(executable)} ${args.slice(0, 3).join(' ')} failed: ${detail}`);
25
- }
26
- return { stdout: result.stdout, stderr: result.stderr };
15
+ return resolved ? path.resolve(cwd, resolved) : null;
27
16
  }
28
- /** Run a child without blocking lock heartbeats or other coordination timers. */
29
- export async function runAsync(executable, args, env, timeoutMs, signal, cwd) {
17
+ /** Capture a bounded child-process response or throw with its stderr. */
18
+ export async function capture(executable, args, cwd, env) {
30
19
  return new Promise((resolve, reject) => {
31
20
  const child = spawn(executable, args, {
32
- env,
33
21
  cwd,
22
+ env,
34
23
  stdio: ['ignore', 'pipe', 'pipe'],
35
24
  windowsHide: true,
36
25
  });
37
26
  let stdout = '';
38
27
  let stderr = '';
39
28
  let settled = false;
40
- const finish = (error, result) => {
29
+ const finish = (error) => {
41
30
  if (settled)
42
31
  return;
43
32
  settled = true;
44
- clearTimeout(timer);
45
- signal?.removeEventListener('abort', abort);
46
33
  if (error)
47
34
  reject(error);
48
- else if (result)
49
- resolve(result);
35
+ else
36
+ resolve(stdout);
50
37
  };
51
- const abort = () => {
52
- child.kill();
53
- const reason = signal?.reason;
54
- finish(reason instanceof Error ? reason : new Error(`${path.basename(executable)} was aborted.`));
55
- };
56
- const timer = setTimeout(() => {
57
- child.kill();
58
- finish(new Error(`${path.basename(executable)} timed out after ${timeoutMs}ms.`));
59
- }, timeoutMs);
60
38
  child.stdout.setEncoding('utf8');
61
39
  child.stderr.setEncoding('utf8');
62
40
  child.stdout.on('data', (chunk) => {
63
41
  stdout += chunk;
64
- if (stdout.length > 4 * 1024 * 1024) {
42
+ if (stdout.length > OUTPUT_LIMIT) {
65
43
  child.kill();
66
- finish(new Error(`${path.basename(executable)} exceeded the output limit.`));
44
+ finish(new Error(`${path.basename(executable)} exceeded its stdout limit.`));
67
45
  }
68
46
  });
69
47
  child.stderr.on('data', (chunk) => {
70
48
  stderr += chunk;
71
- if (stderr.length > 4 * 1024 * 1024) {
49
+ if (stderr.length > OUTPUT_LIMIT) {
72
50
  child.kill();
73
- finish(new Error(`${path.basename(executable)} exceeded the error-output limit.`));
51
+ finish(new Error(`${path.basename(executable)} exceeded its stderr limit.`));
74
52
  }
75
53
  });
76
- child.once('error', (error) => finish(error));
77
- child.once('close', (code, childSignal) => {
78
- if (code !== 0) {
79
- const detail = stderr.trim() || (childSignal ? `signal ${childSignal}` : `exit ${code}`);
80
- finish(new Error(`${path.basename(executable)} ${args.slice(0, 3).join(' ')} failed: ${detail}`));
54
+ child.once('error', error => finish(error));
55
+ child.once('close', (code, signal) => {
56
+ if (code === 0) {
57
+ finish();
81
58
  return;
82
59
  }
83
- finish(undefined, { stdout, stderr });
60
+ const detail = stderr.trim() || (signal ? `signal ${signal}` : `exit ${code}`);
61
+ finish(new Error(`${path.basename(executable)} ${args.slice(0, 3).join(' ')} failed: ${detail}`));
84
62
  });
85
- if (signal?.aborted)
86
- abort();
87
- else
88
- signal?.addEventListener('abort', abort, { once: true });
89
63
  });
90
64
  }
65
+ /** Read environment keys case-insensitively on Windows. */
66
+ export function environmentValue(env, name) {
67
+ if (env[name] !== undefined || process.platform !== 'win32')
68
+ return env[name];
69
+ const key = Object.keys(env).find(candidate => candidate.toLowerCase() === name.toLowerCase());
70
+ return key ? env[key] : undefined;
71
+ }
91
72
  //# sourceMappingURL=process.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type ChildProcess, type SpawnOptions } from 'node:child_process';
2
+ export interface PyfigOptions {
3
+ /** uv executable or PEP 440 constraint. Executables take precedence. */
4
+ uv?: string;
5
+ /** Python executable or PEP 440 constraint. Executables take precedence. */
6
+ python?: string;
7
+ /** Require CPython headers, a linkable library, and matching runtime architecture. */
8
+ requireEmbedding?: boolean;
9
+ /** Reject free-threaded Python builds. */
10
+ requireGil?: boolean;
11
+ /** Directory used for uv project and configuration discovery. */
12
+ cwd?: string;
13
+ /** Environment used to locate executables and invoke child processes. */
14
+ env?: Readonly<Record<string, string | undefined>>;
15
+ }
16
+ export declare class PythonContext {
17
+ #private;
18
+ /** Absolute path to the resolved uv executable. */
19
+ readonly uv: string;
20
+ /** Absolute path to the resolved Python interpreter. */
21
+ readonly python: string;
22
+ constructor(uvPath: string, pythonPath: string, cwd?: string, env?: NodeJS.ProcessEnv);
23
+ /** Spawn `uv run` with the resolved Python pinned before the command separator. */
24
+ run(...args: string[]): ChildProcess;
25
+ run(...args: [...command: string[], options: SpawnOptions]): ChildProcess;
26
+ }
27
+ /** Resolve compatible uv and Python executables without owning either environment. */
28
+ export declare function pyfig(options?: PyfigOptions): Promise<PythonContext>;
29
+ /** @internal Build a safe `uv run` argv array from the public variadic input. */
30
+ export declare function buildRunArgs(pythonPath: string, args: readonly string[]): string[];
31
+ //# sourceMappingURL=pyfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyfig.d.ts","sourceRoot":"","sources":["../src/pyfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAuDjF,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0CAA0C;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACpD;AAED,qBAAa,aAAa;;IAGxB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YACE,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,GAAG,SAAgB,EACnB,GAAG,GAAE,MAAM,CAAC,UAAwB,EAOrC;IAED,mFAAmF;IACnF,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;IACrC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,GAAG,YAAY,CAAC;CAW3E;AAED,sFAAsF;AACtF,wBAAsB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAsB9E;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAalF"}
package/dist/pyfig.js ADDED
@@ -0,0 +1,275 @@
1
+ import { spawn } from 'node:child_process';
2
+ import path from 'node:path';
3
+ import { filter, valid as validVersion, validRange, } from '@renovatebot/pep440';
4
+ import { capture, findExecutable } from './process.js';
5
+ import { resolveUv } from './uv.js';
6
+ const DEFAULT_UV = '>=0.10,<1';
7
+ const PYTHON_PROBE = String.raw `
8
+ import json
9
+ import os
10
+ import platform
11
+ import struct
12
+ import sys
13
+ import sysconfig
14
+
15
+ base_prefix = getattr(sys, "base_prefix", sys.prefix)
16
+ include_directory = sysconfig.get_path("include") or ""
17
+ header_path = os.path.join(include_directory, "Python.h") if include_directory else ""
18
+ library_candidates = []
19
+ if os.name == "nt":
20
+ library_directory = sysconfig.get_config_var("LIBDIR") or os.path.join(base_prefix, "libs")
21
+ configured_library = sysconfig.get_config_var("LDLIBRARY") or ""
22
+ if configured_library:
23
+ library_candidates.append(os.path.join(library_directory, os.path.splitext(configured_library)[0] + ".lib"))
24
+ library_candidates.append(os.path.join(library_directory, f"python{sys.version_info.major}{sys.version_info.minor}.lib"))
25
+ else:
26
+ for directory in [
27
+ sysconfig.get_config_var("LIBDIR"),
28
+ sysconfig.get_config_var("LIBPL"),
29
+ os.path.join(base_prefix, "lib"),
30
+ ]:
31
+ for name in [sysconfig.get_config_var("LDLIBRARY"), sysconfig.get_config_var("LIBRARY")]:
32
+ if directory and name:
33
+ library_candidates.append(os.path.join(directory, name))
34
+
35
+ release_suffix = {"alpha": "a", "beta": "b", "candidate": "rc", "final": ""}[sys.version_info.releaselevel]
36
+ if release_suffix:
37
+ release_suffix += str(sys.version_info.serial)
38
+
39
+ print(json.dumps({
40
+ "executable": sys.executable,
41
+ "version": ".".join(map(str, sys.version_info[:3])) + release_suffix,
42
+ "implementation": sys.implementation.name,
43
+ "architecture": platform.machine().lower(),
44
+ "pointerBits": struct.calcsize("P") * 8,
45
+ "gilDisabled": bool(sysconfig.get_config_var("Py_GIL_DISABLED")),
46
+ "embedding": os.path.isfile(header_path) and any(os.path.isfile(path) for path in library_candidates),
47
+ }))
48
+ `;
49
+ export class PythonContext {
50
+ #cwd;
51
+ #env;
52
+ /** Absolute path to the resolved uv executable. */
53
+ uv;
54
+ /** Absolute path to the resolved Python interpreter. */
55
+ python;
56
+ constructor(uvPath, pythonPath, cwd = process.cwd(), env = process.env) {
57
+ this.#cwd = cwd;
58
+ this.#env = { ...env };
59
+ this.uv = uvPath;
60
+ this.python = pythonPath;
61
+ Object.freeze(this);
62
+ }
63
+ run(...input) {
64
+ const { args, spawnOptions } = splitRunInput(input);
65
+ return spawn(this.uv, buildRunArgs(this.python, args), {
66
+ cwd: this.#cwd,
67
+ env: this.#env,
68
+ stdio: 'inherit',
69
+ windowsHide: true,
70
+ ...spawnOptions,
71
+ });
72
+ }
73
+ }
74
+ /** Resolve compatible uv and Python executables without owning either environment. */
75
+ export async function pyfig(options = {}) {
76
+ const { uv: uvRequest = DEFAULT_UV, python: pythonRequest, requireEmbedding = false, requireGil = false, cwd = process.cwd(), env: suppliedEnvironment, } = options;
77
+ const env = mergeEnvironment(suppliedEnvironment);
78
+ const workingDirectory = path.resolve(cwd);
79
+ const uvPath = await selectUv(uvRequest, workingDirectory, env);
80
+ const selectedPythonPath = await selectPython({
81
+ cwd: workingDirectory,
82
+ env,
83
+ pythonRequest,
84
+ requireEmbedding,
85
+ requireGil,
86
+ uvPath,
87
+ });
88
+ return new PythonContext(uvPath, selectedPythonPath, workingDirectory, env);
89
+ }
90
+ /** @internal Build a safe `uv run` argv array from the public variadic input. */
91
+ export function buildRunArgs(pythonPath, args) {
92
+ const separator = args.indexOf('--');
93
+ if (separator < 0) {
94
+ return ['run', '--python', pythonPath, '--', ...args];
95
+ }
96
+ const uvArgs = args.slice(0, separator);
97
+ const command = args.slice(separator + 1);
98
+ if (uvArgs.some(argument => argument === '--python' || argument.startsWith('--python='))) {
99
+ throw new TypeError('run() does not accept --python before --; Python is selected by pyfig().');
100
+ }
101
+ uvArgs.push('--python', pythonPath);
102
+ return ['run', ...uvArgs, '--', ...command];
103
+ }
104
+ function splitRunInput(input) {
105
+ const values = [...input];
106
+ const last = values.at(-1);
107
+ const spawnOptions = typeof last === 'object' && last !== null && !Array.isArray(last)
108
+ ? values.pop()
109
+ : {};
110
+ if (!values.every((value) => typeof value === 'string')) {
111
+ throw new TypeError('uv run arguments must be strings with an optional SpawnOptions object last.');
112
+ }
113
+ return { args: values, spawnOptions };
114
+ }
115
+ async function selectUv(request, cwd, env) {
116
+ const selection = await executableOrSpecifier('uv', request, cwd, env);
117
+ if (selection.executable)
118
+ return selection.executable;
119
+ const specifier = selection.specifier;
120
+ if (!specifier)
121
+ throw new Error('uv selection did not contain a version specifier.');
122
+ return resolveUv(specifier, cwd, env);
123
+ }
124
+ async function selectPython(options) {
125
+ if (options.pythonRequest !== undefined) {
126
+ const selection = await executableOrSpecifier('python', options.pythonRequest, options.cwd, options.env);
127
+ if (selection.executable) {
128
+ const explicit = await probePython(selection.executable, options.cwd, options.env);
129
+ validatePythonCapabilities(explicit, options);
130
+ return explicit.executable;
131
+ }
132
+ if (!selection.specifier)
133
+ throw new Error('Python selection did not contain a version specifier.');
134
+ return selectDiscoveredPython(selection.specifier, options);
135
+ }
136
+ return selectDiscoveredPython(null, options);
137
+ }
138
+ async function selectDiscoveredPython(specifier, options) {
139
+ const request = specifier ? [specifier] : [];
140
+ let systemFailure;
141
+ try {
142
+ // `--system` excludes virtual environments; `--no-managed-python` also
143
+ // excludes uv's cache so this pass genuinely prefers host installations.
144
+ const systemPath = await findPython(options.uvPath, ['--system', '--no-managed-python', ...request], options);
145
+ const system = await probePython(systemPath, options.cwd, options.env);
146
+ validatePythonVersion(system, specifier);
147
+ validatePythonCapabilities(system, options);
148
+ return system.executable;
149
+ }
150
+ catch (error) {
151
+ systemFailure = error;
152
+ }
153
+ try {
154
+ const managedPath = await findPython(options.uvPath, ['--managed-python', ...request], options);
155
+ const managed = await probePython(managedPath, options.cwd, options.env);
156
+ validatePythonVersion(managed, specifier);
157
+ validatePythonCapabilities(managed, options);
158
+ return managed.executable;
159
+ }
160
+ catch (error) {
161
+ throw new Error(`No compatible Python was found. System: ${errorMessage(systemFailure)} Managed: ${errorMessage(error)}`, { cause: error });
162
+ }
163
+ }
164
+ async function findPython(uvPath, args, options) {
165
+ const output = await capture(uvPath, ['python', 'find', ...args], options.cwd, options.env);
166
+ const executable = output.trim().split(/\r?\n/u).at(-1) ?? '';
167
+ if (!path.isAbsolute(executable)) {
168
+ throw new Error(`uv did not report an absolute Python path: ${executable || '<empty>'}`);
169
+ }
170
+ return path.normalize(executable);
171
+ }
172
+ async function probePython(executable, cwd, env) {
173
+ const output = await capture(executable, ['-I', '-S', '-c', PYTHON_PROBE], cwd, env);
174
+ const line = output.trim().split(/\r?\n/u).at(-1) ?? '';
175
+ let value;
176
+ try {
177
+ value = JSON.parse(line);
178
+ }
179
+ catch (error) {
180
+ throw new Error(`${JSON.stringify(executable)} did not return valid Python metadata.`, {
181
+ cause: error,
182
+ });
183
+ }
184
+ if (!isPythonProbe(value)) {
185
+ throw new Error(`${JSON.stringify(executable)} returned incomplete Python metadata.`);
186
+ }
187
+ if (!path.isAbsolute(value.executable)) {
188
+ throw new Error(`${JSON.stringify(executable)} reported a non-absolute executable path.`);
189
+ }
190
+ return { ...value, executable: path.normalize(value.executable) };
191
+ }
192
+ function validatePythonVersion(python, specifier) {
193
+ if (!specifier)
194
+ return;
195
+ const version = validVersion(python.version);
196
+ if (!version)
197
+ throw new Error(`Python ${python.executable} reported invalid version ${python.version}.`);
198
+ if (filter([version], specifier).length !== 1) {
199
+ throw new Error(`Python ${version} does not satisfy ${specifier}.`);
200
+ }
201
+ }
202
+ function validatePythonCapabilities(python, options) {
203
+ if (options.requireEmbedding) {
204
+ if (python.implementation !== 'cpython') {
205
+ throw new Error(`Python embedding requires CPython, received ${python.implementation}.`);
206
+ }
207
+ if (!python.embedding) {
208
+ throw new Error(`Python ${python.executable} does not provide embedding headers and a library.`);
209
+ }
210
+ if (!pythonArchitectureMatchesRuntime(python)) {
211
+ throw new Error(`Python ${python.executable} does not match the JavaScript runtime architecture.`);
212
+ }
213
+ }
214
+ if (options.requireGil && python.gilDisabled) {
215
+ throw new Error(`Python ${python.executable} is free-threaded but requireGil is enabled.`);
216
+ }
217
+ }
218
+ function pythonArchitectureMatchesRuntime(python) {
219
+ if (python.pointerBits !== (process.arch === 'ia32' ? 32 : 64))
220
+ return false;
221
+ if (process.arch === 'x64')
222
+ return python.architecture === 'x86_64' || python.architecture === 'amd64';
223
+ if (process.arch === 'arm64')
224
+ return python.architecture === 'aarch64' || python.architecture === 'arm64';
225
+ if (process.arch === 'ia32') {
226
+ return python.architecture === 'x86' || python.architecture === 'i386' ||
227
+ python.architecture === 'i686';
228
+ }
229
+ return python.architecture === process.arch;
230
+ }
231
+ async function executableOrSpecifier(name, value, cwd, env) {
232
+ assertNonempty(name, value);
233
+ const executable = await findExecutable(value, cwd, env);
234
+ if (executable)
235
+ return { executable, specifier: null };
236
+ if (validRange(value))
237
+ return { executable: null, specifier: value };
238
+ throw new TypeError(`${name} must resolve to an executable or be a valid PEP 440 specifier, received ${JSON.stringify(value)}.`);
239
+ }
240
+ function isPythonProbe(value) {
241
+ if (!value || typeof value !== 'object' || Array.isArray(value))
242
+ return false;
243
+ const probe = value;
244
+ return typeof probe['architecture'] === 'string' &&
245
+ typeof probe['embedding'] === 'boolean' &&
246
+ typeof probe['executable'] === 'string' &&
247
+ typeof probe['gilDisabled'] === 'boolean' &&
248
+ typeof probe['implementation'] === 'string' &&
249
+ typeof probe['pointerBits'] === 'number' &&
250
+ typeof probe['version'] === 'string';
251
+ }
252
+ function errorMessage(error) {
253
+ return error instanceof Error ? error.message : String(error);
254
+ }
255
+ /** Apply caller overrides without leaving case-variant duplicate keys on Windows. */
256
+ function mergeEnvironment(supplied) {
257
+ const environment = { ...process.env };
258
+ for (const [key, value] of Object.entries(supplied ?? {})) {
259
+ if (process.platform === 'win32') {
260
+ const existing = Object.keys(environment).find(candidate => candidate.toLowerCase() === key.toLowerCase());
261
+ if (existing && existing !== key)
262
+ delete environment[existing];
263
+ }
264
+ if (value === undefined)
265
+ delete environment[key];
266
+ else
267
+ environment[key] = value;
268
+ }
269
+ return environment;
270
+ }
271
+ function assertNonempty(name, value) {
272
+ if (value.trim() === '')
273
+ throw new TypeError(`${name} must not be empty.`);
274
+ }
275
+ //# sourceMappingURL=pyfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyfig.js","sourceRoot":"","sources":["../src/pyfig.ts"],"names":[],"mappings":"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"}
package/dist/uv.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ /** Prefer a compatible PATH or cached uv, then provision an official release. */
2
+ export declare function resolveUv(specifier: string, cwd: string, env: NodeJS.ProcessEnv): Promise<string>;
3
+ //# sourceMappingURL=uv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uv.d.ts","sourceRoot":"","sources":["../src/uv.ts"],"names":[],"mappings":"AAoDA,iFAAiF;AACjF,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,OAAO,CAAC,MAAM,CAAC,CAmCjB"}