pyfig 0.2.0 → 0.3.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 +144 -22
- package/SECURITY.md +5 -3
- package/dist/cjs/index.js +1504 -0
- package/dist/cjs/index.js.map +21 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/sync-resolver.js +1242 -0
- package/dist/cjs/sync-resolver.js.map +18 -0
- package/dist/cli.js +17 -6
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +20 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +23 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +45 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +130 -9
- package/dist/config.js.map +1 -1
- package/dist/coordination.d.ts +25 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +187 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/package-target.d.ts +12 -0
- package/dist/package-target.d.ts.map +1 -0
- package/dist/package-target.js +97 -0
- package/dist/package-target.js.map +1 -0
- package/dist/probes.d.ts +19 -0
- package/dist/probes.d.ts.map +1 -1
- package/dist/probes.js +115 -36
- package/dist/probes.js.map +1 -1
- package/dist/process.d.ts +2 -0
- package/dist/process.d.ts.map +1 -1
- package/dist/process.js +63 -1
- package/dist/process.js.map +1 -1
- package/dist/project-root.d.ts +3 -0
- package/dist/project-root.d.ts.map +1 -0
- package/dist/project-root.js +83 -0
- package/dist/project-root.js.map +1 -0
- package/dist/provision.d.ts +3 -1
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +375 -97
- package/dist/provision.js.map +1 -1
- package/dist/runners.d.ts +5 -2
- package/dist/runners.d.ts.map +1 -1
- package/dist/runners.js +94 -28
- package/dist/runners.js.map +1 -1
- package/dist/runtime-files.d.ts +3 -0
- package/dist/runtime-files.d.ts.map +1 -0
- package/dist/runtime-files.js +12 -0
- package/dist/runtime-files.js.map +1 -0
- package/dist/state.d.ts +10 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +62 -0
- package/dist/state.js.map +1 -0
- package/dist/sync-resolver.js +11 -2
- package/dist/sync-resolver.js.map +1 -1
- package/dist/virtual-environment.d.ts +9 -0
- package/dist/virtual-environment.d.ts.map +1 -0
- package/dist/virtual-environment.js +42 -0
- package/dist/virtual-environment.js.map +1 -0
- package/package.json +18 -7
package/dist/probes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;AAGxE,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC7C;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;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAuED,wBAAsB,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAuB1F;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,aAAa,GAAG,kBAAkB,GAAG,YAAY,CAAC,GACrF,OAAO,CAQT;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,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,CAKlF;AAED,wBAAgB,OAAO,CACrB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,oBAAoB,GAC5B,MAAM,GAAG,IAAI,CAQf"}
|
package/dist/probes.js
CHANGED
|
@@ -1,10 +1,75 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import semver from 'semver';
|
|
3
3
|
import { resolveExecutable, run } from './process.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import { activateVirtualEnvironment } from './virtual-environment.js';
|
|
5
|
+
const PYTHON_PROBE = `
|
|
6
|
+
import json
|
|
7
|
+
import os
|
|
8
|
+
import platform
|
|
9
|
+
import struct
|
|
10
|
+
import sys
|
|
11
|
+
import sysconfig
|
|
12
|
+
|
|
13
|
+
base_prefix = getattr(sys, "base_prefix", sys.prefix)
|
|
14
|
+
include_directory = sysconfig.get_path("include") or ""
|
|
15
|
+
header_path = os.path.join(include_directory, "Python.h") if include_directory else ""
|
|
16
|
+
library_candidates = []
|
|
17
|
+
if os.name == "nt":
|
|
18
|
+
library_directory = sysconfig.get_config_var("LIBDIR") or os.path.join(base_prefix, "libs")
|
|
19
|
+
configured_library = sysconfig.get_config_var("LDLIBRARY") or ""
|
|
20
|
+
if configured_library:
|
|
21
|
+
library_candidates.append(os.path.join(library_directory, os.path.splitext(configured_library)[0] + ".lib"))
|
|
22
|
+
library_candidates.append(os.path.join(library_directory, f"python{sys.version_info.major}{sys.version_info.minor}.lib"))
|
|
23
|
+
else:
|
|
24
|
+
library_directories = [
|
|
25
|
+
sysconfig.get_config_var("LIBDIR"),
|
|
26
|
+
sysconfig.get_config_var("LIBPL"),
|
|
27
|
+
os.path.join(base_prefix, "lib"),
|
|
28
|
+
]
|
|
29
|
+
library_names = [
|
|
30
|
+
sysconfig.get_config_var("LDLIBRARY"),
|
|
31
|
+
sysconfig.get_config_var("LIBRARY"),
|
|
32
|
+
]
|
|
33
|
+
for directory in library_directories:
|
|
34
|
+
for name in library_names:
|
|
35
|
+
if directory and name:
|
|
36
|
+
library_candidates.append(os.path.join(directory, name))
|
|
37
|
+
|
|
38
|
+
library_path = next((candidate for candidate in library_candidates if os.path.isfile(candidate)), "")
|
|
39
|
+
embedding = None
|
|
40
|
+
if os.path.isfile(header_path) and library_path:
|
|
41
|
+
library_name = os.path.basename(library_path)
|
|
42
|
+
library_kind = "import" if os.name == "nt" else ("static" if library_name.endswith(".a") else "shared")
|
|
43
|
+
embedding = {
|
|
44
|
+
"includeDirectory": include_directory,
|
|
45
|
+
"headerPath": header_path,
|
|
46
|
+
"libraryPath": library_path,
|
|
47
|
+
"libraryDirectory": os.path.dirname(library_path),
|
|
48
|
+
"libraryName": library_name,
|
|
49
|
+
"libraryKind": library_kind,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
release_level = sys.version_info.releaselevel
|
|
53
|
+
release_suffix = "" if release_level == "final" else f"-{release_level}.{sys.version_info.serial}"
|
|
54
|
+
|
|
55
|
+
print(json.dumps({
|
|
56
|
+
"executable": sys.executable,
|
|
57
|
+
"baseExecutable": getattr(sys, "_base_executable", sys.executable),
|
|
58
|
+
"version": ".".join(map(str, sys.version_info[:3])) + release_suffix,
|
|
59
|
+
"major": sys.version_info.major,
|
|
60
|
+
"minor": sys.version_info.minor,
|
|
61
|
+
"patch": sys.version_info.micro,
|
|
62
|
+
"releaseLevel": release_level,
|
|
63
|
+
"implementation": sys.implementation.name,
|
|
64
|
+
"architecture": platform.machine().lower(),
|
|
65
|
+
"pointerBits": struct.calcsize("P") * 8,
|
|
66
|
+
"prefix": sys.prefix,
|
|
67
|
+
"basePrefix": base_prefix,
|
|
68
|
+
"virtualEnvironment": sys.prefix if sys.prefix != base_prefix else None,
|
|
69
|
+
"gilDisabled": bool(sysconfig.get_config_var("Py_GIL_DISABLED")),
|
|
70
|
+
"embedding": embedding,
|
|
71
|
+
}))
|
|
72
|
+
`;
|
|
8
73
|
export async function findPython(options) {
|
|
9
74
|
const candidates = [];
|
|
10
75
|
if (options.python)
|
|
@@ -18,11 +83,18 @@ export async function findPython(options) {
|
|
|
18
83
|
}
|
|
19
84
|
for (const candidate of candidates) {
|
|
20
85
|
const info = await probePython(candidate, options);
|
|
21
|
-
if (info &&
|
|
86
|
+
if (info && pythonSatisfiesRequirements(info, options))
|
|
22
87
|
return info;
|
|
23
88
|
}
|
|
24
89
|
return null;
|
|
25
90
|
}
|
|
91
|
+
export function pythonSatisfiesRequirements(python, options) {
|
|
92
|
+
return semver.satisfies(python.version, options.pythonRange) &&
|
|
93
|
+
(!options.requireEmbedding || (python.implementation === 'cpython' &&
|
|
94
|
+
python.embedding !== null &&
|
|
95
|
+
pythonArchitectureMatchesRuntime(python))) &&
|
|
96
|
+
(!options.requireGil || !python.gilDisabled);
|
|
97
|
+
}
|
|
26
98
|
export async function probePython(candidate, options) {
|
|
27
99
|
const executable = await resolveExecutable(candidate.executable, options.env);
|
|
28
100
|
if (!executable)
|
|
@@ -37,37 +109,30 @@ export async function probePython(candidate, options) {
|
|
|
37
109
|
}
|
|
38
110
|
}
|
|
39
111
|
export async function findPip(python, options) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
if (!
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
pythonExecutable: python.executable,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
// Try the next conventional pip spelling.
|
|
68
|
-
}
|
|
112
|
+
if (!python.virtualEnvironment) {
|
|
113
|
+
throw new Error('pip discovery requires a virtual-environment Python interpreter.');
|
|
114
|
+
}
|
|
115
|
+
const activeEnv = activateVirtualEnvironment(options.env, python.virtualEnvironment, python.executable);
|
|
116
|
+
try {
|
|
117
|
+
const { stdout } = run(python.executable, ['-m', 'pip', '--version'], activeEnv, options.probeTimeoutMs);
|
|
118
|
+
const details = parsePipVersionOutput(stdout);
|
|
119
|
+
const version = normalizeVersion(details?.version);
|
|
120
|
+
if (!version || !semver.satisfies(version, options.pipRange))
|
|
121
|
+
return null;
|
|
122
|
+
if (!details || !pipBelongsToPython(details, python))
|
|
123
|
+
return null;
|
|
124
|
+
return {
|
|
125
|
+
kind: 'pip',
|
|
126
|
+
executable: python.executable,
|
|
127
|
+
prefixArgs: ['-m', 'pip'],
|
|
128
|
+
version,
|
|
129
|
+
pythonExecutable: python.executable,
|
|
130
|
+
virtualEnvironment: python.virtualEnvironment,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return null;
|
|
69
135
|
}
|
|
70
|
-
return null;
|
|
71
136
|
}
|
|
72
137
|
export function parsePipVersionOutput(output) {
|
|
73
138
|
const match = output.trim().match(/^pip\s+(\S+)\s+from\s+(.+?)\s+\(python\s+(\d+)\.(\d+)(?:\.\d+)?\)$/iu);
|
|
@@ -93,7 +158,8 @@ export function pipBelongsToPython(pip, python) {
|
|
|
93
158
|
export async function findUv(options) {
|
|
94
159
|
const configured = options.env['PYFIG_UV'] ?? 'uv';
|
|
95
160
|
const executable = await resolveExecutable(configured, options.env);
|
|
96
|
-
|
|
161
|
+
const uv = executable ? probeUv(executable, options) : null;
|
|
162
|
+
return uv && semver.satisfies(uv.version, options.uvRange) ? uv : null;
|
|
97
163
|
}
|
|
98
164
|
export function probeUv(executable, options) {
|
|
99
165
|
try {
|
|
@@ -113,4 +179,17 @@ function normalizeVersion(value) {
|
|
|
113
179
|
function normalizePathForComparison(value) {
|
|
114
180
|
return process.platform === 'win32' ? value.toLowerCase() : value;
|
|
115
181
|
}
|
|
182
|
+
function pythonArchitectureMatchesRuntime(python) {
|
|
183
|
+
const architecture = python.architecture.toLowerCase();
|
|
184
|
+
if (python.pointerBits !== (process.arch === 'ia32' ? 32 : 64))
|
|
185
|
+
return false;
|
|
186
|
+
if (process.arch === 'x64')
|
|
187
|
+
return architecture === 'x86_64' || architecture === 'amd64';
|
|
188
|
+
if (process.arch === 'arm64')
|
|
189
|
+
return architecture === 'aarch64' || architecture === 'arm64';
|
|
190
|
+
if (process.arch === 'ia32') {
|
|
191
|
+
return architecture === 'x86' || architecture === 'i386' || architecture === 'i686';
|
|
192
|
+
}
|
|
193
|
+
return architecture === process.arch;
|
|
194
|
+
}
|
|
116
195
|
//# sourceMappingURL=probes.js.map
|
package/dist/probes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probes.js","sourceRoot":"","sources":["../src/probes.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAoB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"probes.js","sourceRoot":"","sources":["../src/probes.ts"],"names":[],"mappings":"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"}
|
package/dist/process.d.ts
CHANGED
|
@@ -8,4 +8,6 @@ export interface RunResult {
|
|
|
8
8
|
}
|
|
9
9
|
export declare function resolveExecutable(value: string, env: NodeJS.ProcessEnv): Promise<string | null>;
|
|
10
10
|
export declare function run(executable: string, args: string[], env: NodeJS.ProcessEnv, timeoutMs: number): RunResult;
|
|
11
|
+
/** Run a child without blocking lock heartbeats or other coordination timers. */
|
|
12
|
+
export declare function runAsync(executable: string, args: string[], env: NodeJS.ProcessEnv, timeoutMs: number, signal?: AbortSignal): Promise<RunResult>;
|
|
11
13
|
//# sourceMappingURL=process.d.ts.map
|
package/dist/process.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;AAED,wBAAgB,GAAG,CACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,SAAS,EAAE,MAAM,GAChB,SAAS,CAaX"}
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;AAED,wBAAgB,GAAG,CACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,SAAS,EAAE,MAAM,GAChB,SAAS,CAaX;AAED,iFAAiF;AACjF,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC,CAyDpB"}
|
package/dist/process.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { spawnSync } from 'node:child_process';
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import which from 'which';
|
|
4
4
|
export async function resolveExecutable(value, env) {
|
|
@@ -25,4 +25,66 @@ export function run(executable, args, env, timeoutMs) {
|
|
|
25
25
|
}
|
|
26
26
|
return { stdout: result.stdout, stderr: result.stderr };
|
|
27
27
|
}
|
|
28
|
+
/** Run a child without blocking lock heartbeats or other coordination timers. */
|
|
29
|
+
export async function runAsync(executable, args, env, timeoutMs, signal) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const child = spawn(executable, args, {
|
|
32
|
+
env,
|
|
33
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
34
|
+
windowsHide: true,
|
|
35
|
+
});
|
|
36
|
+
let stdout = '';
|
|
37
|
+
let stderr = '';
|
|
38
|
+
let settled = false;
|
|
39
|
+
const finish = (error, result) => {
|
|
40
|
+
if (settled)
|
|
41
|
+
return;
|
|
42
|
+
settled = true;
|
|
43
|
+
clearTimeout(timer);
|
|
44
|
+
signal?.removeEventListener('abort', abort);
|
|
45
|
+
if (error)
|
|
46
|
+
reject(error);
|
|
47
|
+
else if (result)
|
|
48
|
+
resolve(result);
|
|
49
|
+
};
|
|
50
|
+
const abort = () => {
|
|
51
|
+
child.kill();
|
|
52
|
+
const reason = signal?.reason;
|
|
53
|
+
finish(reason instanceof Error ? reason : new Error(`${path.basename(executable)} was aborted.`));
|
|
54
|
+
};
|
|
55
|
+
const timer = setTimeout(() => {
|
|
56
|
+
child.kill();
|
|
57
|
+
finish(new Error(`${path.basename(executable)} timed out after ${timeoutMs}ms.`));
|
|
58
|
+
}, timeoutMs);
|
|
59
|
+
child.stdout.setEncoding('utf8');
|
|
60
|
+
child.stderr.setEncoding('utf8');
|
|
61
|
+
child.stdout.on('data', (chunk) => {
|
|
62
|
+
stdout += chunk;
|
|
63
|
+
if (stdout.length > 4 * 1024 * 1024) {
|
|
64
|
+
child.kill();
|
|
65
|
+
finish(new Error(`${path.basename(executable)} exceeded the output limit.`));
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
child.stderr.on('data', (chunk) => {
|
|
69
|
+
stderr += chunk;
|
|
70
|
+
if (stderr.length > 4 * 1024 * 1024) {
|
|
71
|
+
child.kill();
|
|
72
|
+
finish(new Error(`${path.basename(executable)} exceeded the error-output limit.`));
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
child.once('error', (error) => finish(error));
|
|
76
|
+
child.once('close', (code, childSignal) => {
|
|
77
|
+
if (code !== 0) {
|
|
78
|
+
const detail = stderr.trim() || (childSignal ? `signal ${childSignal}` : `exit ${code}`);
|
|
79
|
+
finish(new Error(`${path.basename(executable)} ${args.slice(0, 3).join(' ')} failed: ${detail}`));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
finish(undefined, { stdout, stderr });
|
|
83
|
+
});
|
|
84
|
+
if (signal?.aborted)
|
|
85
|
+
abort();
|
|
86
|
+
else
|
|
87
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
88
|
+
});
|
|
89
|
+
}
|
|
28
90
|
//# sourceMappingURL=process.js.map
|
package/dist/process.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-root.d.ts","sourceRoot":"","sources":["../src/project-root.ts"],"names":[],"mappings":"AAkBA,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,cAAc,GAAE,MAAsB,GAAG,MAAM,CAgBjF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createFileSystemProject } from 'pacwich';
|
|
4
|
+
const PACKAGE_MANAGER_LOCKFILES = [
|
|
5
|
+
'bun.lock',
|
|
6
|
+
'bun.lockb',
|
|
7
|
+
'npm-shrinkwrap.json',
|
|
8
|
+
'package-lock.json',
|
|
9
|
+
'pnpm-lock.yaml',
|
|
10
|
+
'yarn.lock',
|
|
11
|
+
];
|
|
12
|
+
const PYTHON_PROJECT_MARKERS = [
|
|
13
|
+
'pyproject.toml',
|
|
14
|
+
'uv.lock',
|
|
15
|
+
];
|
|
16
|
+
/** Resolve the repository root from a working directory without requiring Git. */
|
|
17
|
+
export function resolveProjectRoot(startDirectory = process.cwd()) {
|
|
18
|
+
const start = path.resolve(startDirectory);
|
|
19
|
+
const workspaceRoot = findWorkspaceProjectRoot(start);
|
|
20
|
+
if (workspaceRoot) {
|
|
21
|
+
try {
|
|
22
|
+
return path.resolve(createFileSystemProject({
|
|
23
|
+
rootDirectory: start,
|
|
24
|
+
disableExecutableConfigs: true,
|
|
25
|
+
}).rootDirectory);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Pacwich can reject an otherwise recognizable root when workspace metadata is incomplete.
|
|
29
|
+
return workspaceRoot;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return findConventionalProjectRoot(start);
|
|
33
|
+
}
|
|
34
|
+
function findWorkspaceProjectRoot(startDirectory) {
|
|
35
|
+
for (const directory of ancestors(startDirectory)) {
|
|
36
|
+
const packageJson = path.join(directory, 'package.json');
|
|
37
|
+
if (!fs.existsSync(packageJson))
|
|
38
|
+
continue;
|
|
39
|
+
if (fs.existsSync(path.join(directory, 'pnpm-workspace.yaml')))
|
|
40
|
+
return directory;
|
|
41
|
+
try {
|
|
42
|
+
const manifest = JSON.parse(fs.readFileSync(packageJson, 'utf8'));
|
|
43
|
+
if (hasWorkspaceDeclaration(manifest.workspaces))
|
|
44
|
+
return directory;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Keep walking so malformed nested package metadata cannot hide a valid ancestor.
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
function findConventionalProjectRoot(startDirectory) {
|
|
53
|
+
let nearestPackageDirectory = null;
|
|
54
|
+
let nearestPythonDirectory = null;
|
|
55
|
+
for (const directory of ancestors(startDirectory)) {
|
|
56
|
+
const hasPackage = fs.existsSync(path.join(directory, 'package.json'));
|
|
57
|
+
if (hasPackage && !nearestPackageDirectory)
|
|
58
|
+
nearestPackageDirectory = directory;
|
|
59
|
+
if (!nearestPythonDirectory && PYTHON_PROJECT_MARKERS.some((file) => fs.existsSync(path.join(directory, file)))) {
|
|
60
|
+
nearestPythonDirectory = directory;
|
|
61
|
+
}
|
|
62
|
+
if (hasPackage && PACKAGE_MANAGER_LOCKFILES.some((file) => fs.existsSync(path.join(directory, file)))) {
|
|
63
|
+
return directory;
|
|
64
|
+
}
|
|
65
|
+
if (fs.existsSync(path.join(directory, '.git')))
|
|
66
|
+
return directory;
|
|
67
|
+
}
|
|
68
|
+
return nearestPackageDirectory ?? nearestPythonDirectory ?? startDirectory;
|
|
69
|
+
}
|
|
70
|
+
function hasWorkspaceDeclaration(value) {
|
|
71
|
+
return Array.isArray(value) || (value !== null && typeof value === 'object');
|
|
72
|
+
}
|
|
73
|
+
function* ancestors(startDirectory) {
|
|
74
|
+
let directory = startDirectory;
|
|
75
|
+
while (true) {
|
|
76
|
+
yield directory;
|
|
77
|
+
const parent = path.dirname(directory);
|
|
78
|
+
if (parent === directory)
|
|
79
|
+
return;
|
|
80
|
+
directory = parent;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=project-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-root.js","sourceRoot":"","sources":["../src/project-root.ts"],"names":[],"mappings":"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"}
|
package/dist/provision.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { type PyfigOptions } from './config.js';
|
|
2
|
-
import { type PackageManagerInfo, type PythonInfo } from './probes.js';
|
|
2
|
+
import { type PackageManagerInfo, type PythonInfo, type UvInfo } from './probes.js';
|
|
3
3
|
export interface PythonEnvironment {
|
|
4
4
|
python: PythonInfo;
|
|
5
5
|
packageManager: PackageManagerInfo;
|
|
6
6
|
}
|
|
7
7
|
export declare function ensurePython(options?: PyfigOptions): Promise<PythonInfo>;
|
|
8
8
|
export declare function ensurePip(options?: PyfigOptions, python?: PythonInfo): Promise<PackageManagerInfo>;
|
|
9
|
+
export declare function ensureVirtualEnvironment(options?: PyfigOptions): Promise<PythonInfo>;
|
|
10
|
+
export declare function ensureUv(options?: PyfigOptions): Promise<UvInfo>;
|
|
9
11
|
export declare function ensureEnvironment(options?: PyfigOptions): Promise<PythonEnvironment>;
|
|
10
12
|
//# sourceMappingURL=provision.d.ts.map
|
package/dist/provision.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../src/provision.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../src/provision.ts"],"names":[],"mappings":"AAmBA,OAAO,EAIL,KAAK,YAAY,EAElB,MAAM,aAAa,CAAC;AAErB,OAAO,EAOL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;AAUrB,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,kBAAkB,CAAC;CACpC;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CASlF;AAED,wBAAsB,SAAS,CAC7B,OAAO,GAAE,YAAiB,EAC1B,MAAM,CAAC,EAAE,UAAU,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAM7B;AAED,wBAAsB,wBAAwB,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAW9F;AAED,wBAAsB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAS1E;AAED,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAa9F"}
|