pyfig 0.3.1 → 0.5.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 +116 -123
- package/SECURITY.md +2 -2
- package/dist/cjs/index.js +525 -888
- package/dist/cjs/index.js.map +15 -15
- package/dist/cjs/sync-resolver.js +482 -676
- package/dist/cjs/sync-resolver.js.map +13 -12
- package/dist/cli.js +7 -10
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +3 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +13 -11
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +9 -18
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +22 -59
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +5 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/package-target.d.ts +7 -11
- package/dist/package-target.d.ts.map +1 -1
- package/dist/package-target.js +41 -57
- package/dist/package-target.js.map +1 -1
- package/dist/probes.d.ts +1 -19
- package/dist/probes.d.ts.map +1 -1
- package/dist/probes.js +13 -74
- package/dist/probes.js.map +1 -1
- package/dist/process.d.ts +1 -1
- package/dist/process.d.ts.map +1 -1
- package/dist/process.js +2 -1
- package/dist/process.js.map +1 -1
- package/dist/project-root.d.ts +1 -1
- package/dist/project-root.d.ts.map +1 -1
- package/dist/project-root.js +3 -64
- package/dist/project-root.js.map +1 -1
- package/dist/provision-lock.d.ts +10 -0
- package/dist/provision-lock.d.ts.map +1 -0
- package/dist/provision-lock.js +24 -0
- package/dist/provision-lock.js.map +1 -0
- package/dist/provision.d.ts +18 -6
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +297 -235
- package/dist/provision.js.map +1 -1
- package/dist/python-version.d.ts +10 -0
- package/dist/python-version.d.ts.map +1 -0
- package/dist/python-version.js +17 -0
- package/dist/python-version.js.map +1 -0
- package/dist/runners.d.ts +3 -7
- package/dist/runners.d.ts.map +1 -1
- package/dist/runners.js +35 -115
- package/dist/runners.js.map +1 -1
- package/dist/sync-resolver.js +4 -13
- package/dist/sync-resolver.js.map +1 -1
- package/dist/virtual-environment.d.ts +3 -1
- package/dist/virtual-environment.d.ts.map +1 -1
- package/dist/virtual-environment.js +8 -1
- package/dist/virtual-environment.js.map +1 -1
- package/package.json +9 -10
- package/dist/coordination.d.ts +0 -25
- package/dist/coordination.d.ts.map +0 -1
- package/dist/coordination.js +0 -187
- package/dist/coordination.js.map +0 -1
- package/dist/state.d.ts +0 -10
- package/dist/state.d.ts.map +0 -1
- package/dist/state.js +0 -62
- package/dist/state.js.map +0 -1
package/dist/client.js
CHANGED
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { memoize } from 'loqkit';
|
|
2
|
+
import { ensureEnvironment, ensureUv, } from './provision.js';
|
|
3
|
+
import { uvSpawn, uvSpawnSync } from './runners.js';
|
|
4
4
|
/** Bind configuration once so consumers cannot accidentally diverge between calls. */
|
|
5
5
|
export function createPyfig(options = {}) {
|
|
6
6
|
const scopedOptions = {
|
|
7
7
|
...options,
|
|
8
8
|
env: options.env ? { ...options.env } : undefined,
|
|
9
9
|
};
|
|
10
|
+
const baseEnvironment = memoize(() => ensureEnvironment(scopedOptions));
|
|
11
|
+
const uvInfo = memoize(() => ensureUv(scopedOptions));
|
|
10
12
|
return {
|
|
11
|
-
prepare: () =>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
prepare: (dependencies = [], dependencyOptions = {}) => dependencies.length === 0 &&
|
|
14
|
+
!dependencyOptions.allExtras &&
|
|
15
|
+
(dependencyOptions.extras?.length ?? 0) === 0 &&
|
|
16
|
+
(dependencyOptions.groups?.length ?? 0) === 0
|
|
17
|
+
? baseEnvironment()
|
|
18
|
+
: ensureEnvironment(scopedOptions, dependencies, dependencyOptions),
|
|
19
|
+
pythonInfo: async () => (await baseEnvironment()).python,
|
|
20
|
+
uvInfo,
|
|
18
21
|
uv: (args = [], spawnOptions = {}) => uvSpawn(args, spawnOptions, scopedOptions),
|
|
19
22
|
uvSync: (args = [], spawnOptions = {}) => uvSpawnSync(args, spawnOptions, scopedOptions),
|
|
20
|
-
clearCache: clearPyfigCaches,
|
|
21
23
|
};
|
|
22
24
|
}
|
|
23
25
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGjC,OAAO,EACL,iBAAiB,EACjB,QAAQ,GAGT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAiBpD,sFAAsF;AACtF,MAAM,UAAU,WAAW,CAAC,OAAO,GAAiB,EAAE;IACpD,MAAM,aAAa,GAAiB;QAClC,GAAG,OAAO;QACV,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;KAClD,CAAC;IACF,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IACtD,OAAO;QACL,OAAO,EAAE,CAAC,YAAY,GAAG,EAAE,EAAE,iBAAiB,GAAG,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAC/E,CAAC,iBAAiB,CAAC,SAAS;YAC5B,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC;YAC7C,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC;YAC7C,CAAC,CAAC,eAAe,EAAE;YACnB,CAAC,CAAC,iBAAiB,CAAC,aAAa,EAAE,YAAY,EAAE,iBAAiB,CAAC;QACrE,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC,MAAM;QACxD,MAAM;QACN,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,EAAE,YAAY,GAAG,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC;QAChF,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,EAAE,YAAY,GAAG,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC;KACzF,CAAC;AACJ,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
export declare const
|
|
2
|
-
export declare const DEFAULT_PIP_RANGE = ">=20.3.0";
|
|
1
|
+
export declare const DEFAULT_REQUIRES_PYTHON = ">=3.10,<4";
|
|
3
2
|
export declare const DEFAULT_MANAGED_PYTHON = "3.12";
|
|
4
3
|
export declare const DEFAULT_UV_VERSION = "0.13.6";
|
|
5
|
-
export declare const DEFAULT_UV_RANGE = ">=0.
|
|
4
|
+
export declare const DEFAULT_UV_RANGE = ">=0.10.0 <1.0.0";
|
|
6
5
|
export interface PyfigOptions {
|
|
7
6
|
/** Exact interpreter path that an existing or newly created venv must derive from. */
|
|
8
7
|
python?: string;
|
|
9
|
-
/**
|
|
10
|
-
|
|
11
|
-
/** Accepted python -m pip version when uv installation is disabled. */
|
|
12
|
-
pipRange?: string;
|
|
8
|
+
/** PEP 440 Python version specifier, matching pyproject.toml requires-python. */
|
|
9
|
+
requiresPython?: string;
|
|
13
10
|
/** uv Python request used only when no compatible interpreter exists. */
|
|
14
11
|
managedPython?: string;
|
|
15
12
|
/** Exact uv release installed into Pyfig's private cache. */
|
|
@@ -20,17 +17,17 @@ export interface PyfigOptions {
|
|
|
20
17
|
requireEmbedding?: boolean;
|
|
21
18
|
/** Reject free-threaded CPython builds when the consumer requires the GIL ABI. */
|
|
22
19
|
requireGil?: boolean;
|
|
23
|
-
/**
|
|
20
|
+
/** Shared default for the three specific setup policies. */
|
|
24
21
|
autoInstall?: boolean;
|
|
25
22
|
/** Allow uv to install a managed Python when no compatible interpreter exists. */
|
|
26
23
|
installPython?: boolean;
|
|
27
24
|
/** Allow Pyfig to install its pinned, checksum-verified uv executable. */
|
|
28
25
|
installUv?: boolean;
|
|
29
|
-
/** Allow creation of
|
|
26
|
+
/** Allow creation of Pyfig's private environment under node_modules. */
|
|
30
27
|
createVirtualEnvironment?: boolean;
|
|
31
28
|
/** Private cache root for uv, managed Python, downloads, and coordination. */
|
|
32
29
|
cacheDir?: string;
|
|
33
|
-
/** Repository root that owns
|
|
30
|
+
/** Repository root that owns node_modules/.pyfig. */
|
|
34
31
|
projectRoot?: string;
|
|
35
32
|
/** Maximum duration of one executable capability probe. */
|
|
36
33
|
probeTimeoutMs?: number;
|
|
@@ -40,15 +37,12 @@ export interface PyfigOptions {
|
|
|
40
37
|
downloadTimeoutMs?: number;
|
|
41
38
|
/** Maximum wait for another worker or process provisioning the same resource. */
|
|
42
39
|
coordinationTimeoutMs?: number;
|
|
43
|
-
/** Lifetime of validated realm-local resolution results; zero disables completed caching. */
|
|
44
|
-
cacheTtlMs?: number;
|
|
45
40
|
/** Complete child environment and configuration source for this invocation. */
|
|
46
41
|
env?: NodeJS.ProcessEnv;
|
|
47
42
|
}
|
|
48
43
|
export interface ResolvedPyfigOptions {
|
|
49
44
|
python: string;
|
|
50
|
-
|
|
51
|
-
pipRange: string;
|
|
45
|
+
requiresPython: string;
|
|
52
46
|
managedPython: string;
|
|
53
47
|
uvVersion: string;
|
|
54
48
|
uvRange: string;
|
|
@@ -64,12 +58,9 @@ export interface ResolvedPyfigOptions {
|
|
|
64
58
|
installTimeoutMs: number;
|
|
65
59
|
downloadTimeoutMs: number;
|
|
66
60
|
coordinationTimeoutMs: number;
|
|
67
|
-
cacheTtlMs: number;
|
|
68
61
|
env: NodeJS.ProcessEnv;
|
|
69
62
|
}
|
|
70
63
|
export declare function resolveOptions(options?: PyfigOptions): ResolvedPyfigOptions;
|
|
71
|
-
/**
|
|
72
|
-
export declare function configurationFingerprint(options: ResolvedPyfigOptions): string;
|
|
73
|
-
/** Keep uv-managed Python and cache data inside pyfig's configured cache root. */
|
|
64
|
+
/** Keep uv data private while preferring a compatible system interpreter. */
|
|
74
65
|
export declare function uvEnvironment(options: ResolvedPyfigOptions): NodeJS.ProcessEnv;
|
|
75
66
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,uBAAuB,cAAc,CAAC;AACnD,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAC7C,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAG3C,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAkBlD,MAAM,WAAW,YAAY;IAC3B,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kFAAkF;IAClF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kFAAkF;IAClF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iFAAiF;IACjF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,wBAAwB,EAAE,OAAO,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,YAAiB,GAAG,oBAAoB,CAuE/E;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAQ9E"}
|
package/dist/config.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
2
1
|
import path from 'node:path';
|
|
3
2
|
import * as envPaths from 'env-paths';
|
|
4
3
|
import semver from 'semver';
|
|
5
4
|
import { resolveProjectRoot } from './project-root.js';
|
|
6
|
-
|
|
7
|
-
export const
|
|
5
|
+
import { isValidPythonSpecifier, pythonVersionSatisfies } from './python-version.js';
|
|
6
|
+
export const DEFAULT_REQUIRES_PYTHON = '>=3.10,<4';
|
|
8
7
|
export const DEFAULT_MANAGED_PYTHON = '3.12';
|
|
9
8
|
export const DEFAULT_UV_VERSION = '0.13.6';
|
|
10
|
-
|
|
9
|
+
// External uv only needs to support the command and isolation flags Pyfig uses.
|
|
10
|
+
// Keep that compatibility floor separate from the newer version Pyfig installs.
|
|
11
|
+
export const DEFAULT_UV_RANGE = '>=0.10.0 <1.0.0';
|
|
11
12
|
const DEFAULT_PROBE_TIMEOUT_MS = 10_000;
|
|
12
13
|
const DEFAULT_INSTALL_TIMEOUT_MS = 10 * 60_000;
|
|
13
14
|
const DEFAULT_DOWNLOAD_TIMEOUT_MS = 5 * 60_000;
|
|
14
|
-
const DEFAULT_CACHE_TTL_MS = 30_000;
|
|
15
15
|
// Bun's CommonJS bundler wraps an external ESM default one level deeper than
|
|
16
16
|
// Node.js. Normalize that boundary once instead of leaking runtime checks into
|
|
17
17
|
// configuration resolution.
|
|
@@ -26,22 +26,20 @@ export function resolveOptions(options = {}) {
|
|
|
26
26
|
// Snapshot the environment so callers cannot change an in-flight policy by
|
|
27
27
|
// mutating process.env or a reused options object after resolution.
|
|
28
28
|
const env = { ...(options.env ?? process.env) };
|
|
29
|
-
const
|
|
30
|
-
|
|
29
|
+
const requiresPython = options.requiresPython ??
|
|
30
|
+
env['PYFIG_REQUIRES_PYTHON'] ?? DEFAULT_REQUIRES_PYTHON;
|
|
31
31
|
const uvRange = options.uvRange ?? env['PYFIG_UV_RANGE'] ?? DEFAULT_UV_RANGE;
|
|
32
|
-
|
|
33
|
-
assertRange('pip', pipRange);
|
|
32
|
+
assertPythonSpecifier(requiresPython);
|
|
34
33
|
assertRange('uv', uvRange);
|
|
35
34
|
const managedPython = options.managedPython ??
|
|
36
35
|
env['PYFIG_MANAGED_PYTHON'] ?? DEFAULT_MANAGED_PYTHON;
|
|
37
36
|
const uvVersion = options.uvVersion ?? env['PYFIG_UV_VERSION'] ?? DEFAULT_UV_VERSION;
|
|
38
|
-
assertManagedPythonRequest(managedPython,
|
|
37
|
+
assertManagedPythonRequest(managedPython, requiresPython);
|
|
39
38
|
assertUvVersion(uvVersion, uvRange);
|
|
40
39
|
const probeTimeoutMs = resolveDuration('probeTimeoutMs', options.probeTimeoutMs, env['PYFIG_PROBE_TIMEOUT_MS'], DEFAULT_PROBE_TIMEOUT_MS);
|
|
41
40
|
const installTimeoutMs = resolveDuration('installTimeoutMs', options.installTimeoutMs, env['PYFIG_INSTALL_TIMEOUT_MS'], DEFAULT_INSTALL_TIMEOUT_MS);
|
|
42
41
|
const downloadTimeoutMs = resolveDuration('downloadTimeoutMs', options.downloadTimeoutMs, env['PYFIG_DOWNLOAD_TIMEOUT_MS'], DEFAULT_DOWNLOAD_TIMEOUT_MS);
|
|
43
42
|
const coordinationTimeoutMs = resolveDuration('coordinationTimeoutMs', options.coordinationTimeoutMs, env['PYFIG_COORDINATION_TIMEOUT_MS'], installTimeoutMs + downloadTimeoutMs + 60_000);
|
|
44
|
-
const cacheTtlMs = resolveDuration('cacheTtlMs', options.cacheTtlMs, env['PYFIG_CACHE_TTL_MS'], DEFAULT_CACHE_TTL_MS, true);
|
|
45
43
|
const configuredHome = options.cacheDir ?? env['PYFIG_HOME'];
|
|
46
44
|
const cacheDir = configuredHome
|
|
47
45
|
? path.resolve(configuredHome)
|
|
@@ -49,12 +47,11 @@ export function resolveOptions(options = {}) {
|
|
|
49
47
|
const configuredProjectRoot = options.projectRoot ?? env['PYFIG_PROJECT_ROOT'];
|
|
50
48
|
const projectRoot = configuredProjectRoot
|
|
51
49
|
? path.resolve(configuredProjectRoot)
|
|
52
|
-
: resolveProjectRoot();
|
|
50
|
+
: resolveProjectRoot(env['INIT_CWD'] ?? process.cwd());
|
|
53
51
|
const autoInstall = options.autoInstall ?? parseBoolean(env['PYFIG_AUTO_INSTALL'], true);
|
|
54
52
|
return {
|
|
55
53
|
python: options.python ?? env['PYFIG_PYTHON'] ?? '',
|
|
56
|
-
|
|
57
|
-
pipRange,
|
|
54
|
+
requiresPython,
|
|
58
55
|
managedPython,
|
|
59
56
|
uvVersion,
|
|
60
57
|
uvRange,
|
|
@@ -71,42 +68,17 @@ export function resolveOptions(options = {}) {
|
|
|
71
68
|
installTimeoutMs,
|
|
72
69
|
downloadTimeoutMs,
|
|
73
70
|
coordinationTimeoutMs,
|
|
74
|
-
cacheTtlMs,
|
|
75
71
|
env,
|
|
76
72
|
};
|
|
77
73
|
}
|
|
78
|
-
/**
|
|
79
|
-
export function configurationFingerprint(options) {
|
|
80
|
-
const policy = [
|
|
81
|
-
normalizedPath(options.projectRoot),
|
|
82
|
-
normalizedPath(options.cacheDir),
|
|
83
|
-
options.python,
|
|
84
|
-
options.pythonRange,
|
|
85
|
-
options.pipRange,
|
|
86
|
-
options.managedPython,
|
|
87
|
-
options.uvVersion,
|
|
88
|
-
options.uvRange,
|
|
89
|
-
options.requireEmbedding,
|
|
90
|
-
options.requireGil,
|
|
91
|
-
options.autoInstall,
|
|
92
|
-
options.installPython,
|
|
93
|
-
options.installUv,
|
|
94
|
-
options.createVirtualEnvironment,
|
|
95
|
-
options.probeTimeoutMs,
|
|
96
|
-
options.installTimeoutMs,
|
|
97
|
-
options.downloadTimeoutMs,
|
|
98
|
-
options.coordinationTimeoutMs,
|
|
99
|
-
options.cacheTtlMs,
|
|
100
|
-
environmentFingerprint(options.env),
|
|
101
|
-
];
|
|
102
|
-
return createHash('sha256').update(JSON.stringify(policy)).digest('hex');
|
|
103
|
-
}
|
|
104
|
-
/** Keep uv-managed Python and cache data inside pyfig's configured cache root. */
|
|
74
|
+
/** Keep uv data private while preferring a compatible system interpreter. */
|
|
105
75
|
export function uvEnvironment(options) {
|
|
106
76
|
return {
|
|
107
77
|
...options.env,
|
|
108
78
|
UV_PYTHON_INSTALL_DIR: path.join(options.cacheDir, 'python'),
|
|
109
79
|
UV_CACHE_DIR: path.join(options.cacheDir, 'uv-cache'),
|
|
80
|
+
UV_PYTHON_PREFERENCE: 'system',
|
|
81
|
+
UV_NO_CONFIG: '1',
|
|
110
82
|
};
|
|
111
83
|
}
|
|
112
84
|
function assertRange(tool, range) {
|
|
@@ -122,14 +94,19 @@ function assertUvVersion(version, range) {
|
|
|
122
94
|
throw new TypeError(`Pinned uv ${version} does not satisfy supported range ${range}.`);
|
|
123
95
|
}
|
|
124
96
|
}
|
|
125
|
-
function
|
|
97
|
+
function assertPythonSpecifier(specifier) {
|
|
98
|
+
if (!isValidPythonSpecifier(specifier)) {
|
|
99
|
+
throw new TypeError(`Invalid requires-python PEP 440 specifier: ${specifier}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function assertManagedPythonRequest(request, requiresPython) {
|
|
126
103
|
if (!request || /[\\/\0\r\n]/u.test(request) || request.includes('..')) {
|
|
127
104
|
throw new TypeError(`Invalid managed Python request: ${request}`);
|
|
128
105
|
}
|
|
129
106
|
if (/^\d+\.\d+(?:\.\d+)?$/u.test(request)) {
|
|
130
107
|
const normalized = request.split('.').length === 2 ? `${request}.0` : request;
|
|
131
|
-
if (!
|
|
132
|
-
throw new TypeError(`Managed Python ${request} cannot satisfy
|
|
108
|
+
if (!pythonVersionSatisfies(normalized, requiresPython)) {
|
|
109
|
+
throw new TypeError(`Managed Python ${request} cannot satisfy requires-python ${requiresPython}.`);
|
|
133
110
|
}
|
|
134
111
|
}
|
|
135
112
|
}
|
|
@@ -150,18 +127,4 @@ function parseBoolean(value, fallback) {
|
|
|
150
127
|
return false;
|
|
151
128
|
throw new TypeError(`Invalid boolean value: ${value}`);
|
|
152
129
|
}
|
|
153
|
-
function environmentFingerprint(env) {
|
|
154
|
-
const entries = Object.entries(env)
|
|
155
|
-
.filter((entry) => entry[1] !== undefined)
|
|
156
|
-
.map(([key, value]) => [
|
|
157
|
-
process.platform === 'win32' ? key.toUpperCase() : key,
|
|
158
|
-
value,
|
|
159
|
-
])
|
|
160
|
-
.sort(([left], [right]) => left.localeCompare(right));
|
|
161
|
-
return createHash('sha256').update(JSON.stringify(entries)).digest('hex');
|
|
162
|
-
}
|
|
163
|
-
function normalizedPath(value) {
|
|
164
|
-
const resolved = path.resolve(value);
|
|
165
|
-
return process.platform === 'win32' ? resolved.toLowerCase() : resolved;
|
|
166
|
-
}
|
|
167
130
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
export { DEFAULT_MANAGED_PYTHON,
|
|
1
|
+
export { DEFAULT_MANAGED_PYTHON, DEFAULT_REQUIRES_PYTHON, DEFAULT_UV_RANGE, DEFAULT_UV_VERSION, } from './config.js';
|
|
2
2
|
export type { PyfigOptions } from './config.js';
|
|
3
3
|
export { createPyfig } from './client.js';
|
|
4
4
|
export type { PyfigClient } from './client.js';
|
|
5
5
|
export { resolveProjectRoot } from './project-root.js';
|
|
6
|
-
export type {
|
|
7
|
-
export { ensureEnvironment, ensureUv,
|
|
8
|
-
export type { PythonEnvironment } from './provision.js';
|
|
9
|
-
export {
|
|
10
|
-
export { clearPyfigCaches } from './state.js';
|
|
6
|
+
export type { PythonEmbeddingInfo, PythonInfo, UvInfo, } from './probes.js';
|
|
7
|
+
export { ensureEnvironment, ensureUv, } from './provision.js';
|
|
8
|
+
export type { PythonEnvironment, RuntimeDependencyOptions } from './provision.js';
|
|
9
|
+
export { uvSpawn, uvSpawnSync, } from './runners.js';
|
|
11
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EACV,mBAAmB,EACnB,UAAU,EACV,MAAM,GACP,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,QAAQ,GACT,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EACL,OAAO,EACP,WAAW,GACZ,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
export { DEFAULT_MANAGED_PYTHON,
|
|
1
|
+
export { DEFAULT_MANAGED_PYTHON, DEFAULT_REQUIRES_PYTHON, DEFAULT_UV_RANGE, DEFAULT_UV_VERSION, } from './config.js';
|
|
2
2
|
export { createPyfig } from './client.js';
|
|
3
3
|
export { resolveProjectRoot } from './project-root.js';
|
|
4
|
-
export { ensureEnvironment, ensureUv,
|
|
5
|
-
export {
|
|
6
|
-
export { clearPyfigCaches } from './state.js';
|
|
4
|
+
export { ensureEnvironment, ensureUv, } from './provision.js';
|
|
5
|
+
export { uvSpawn, uvSpawnSync, } from './runners.js';
|
|
7
6
|
//# 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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAMvD,OAAO,EACL,iBAAiB,EACjB,QAAQ,GACT,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,OAAO,EACP,WAAW,GACZ,MAAM,cAAc,CAAC"}
|
package/dist/package-target.d.ts
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export declare function
|
|
6
|
-
/**
|
|
7
|
-
export declare function
|
|
8
|
-
/** Package installation and removal must use uv so its target-environment lock is authoritative. */
|
|
9
|
-
export declare function assertMutationUsesUv(packageManager: PackageManagerInfo, args: readonly string[]): void;
|
|
10
|
-
export declare function isPackageMutation(args: readonly string[]): boolean;
|
|
11
|
-
export declare function isUvPipCommand(args: readonly string[]): boolean;
|
|
1
|
+
import type { PythonInfo } from './probes.js';
|
|
2
|
+
export declare function uvCommandNeedsEnvironment(args: readonly string[]): boolean;
|
|
3
|
+
/** Pin uv pip and uv run to the environment selected by Pyfig. */
|
|
4
|
+
export declare function targetUvArguments(args: readonly string[], python: PythonInfo): string[];
|
|
5
|
+
export declare function uvCommandEnvironment(env: NodeJS.ProcessEnv, python?: PythonInfo): NodeJS.ProcessEnv;
|
|
6
|
+
/** Remove inherited values that could redirect uv away from an explicit target. */
|
|
7
|
+
export declare function sanitizeUvEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
12
8
|
//# sourceMappingURL=package-target.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-target.d.ts","sourceRoot":"","sources":["../src/package-target.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-target.d.ts","sourceRoot":"","sources":["../src/package-target.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoC9C,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE1E;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,UAAU,GACjB,MAAM,EAAE,CAYV;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,MAAM,CAAC,EAAE,UAAU,GAClB,MAAM,CAAC,UAAU,CAWnB;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAM/E"}
|
package/dist/package-target.js
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
import os from 'node:os';
|
|
2
1
|
import { activateVirtualEnvironment } from './virtual-environment.js';
|
|
3
|
-
const
|
|
2
|
+
const TARGET_OPTIONS = new Set([
|
|
3
|
+
'--active',
|
|
4
4
|
'--config-file',
|
|
5
|
+
'--directory',
|
|
6
|
+
'--isolated',
|
|
5
7
|
'--prefix',
|
|
8
|
+
'--project',
|
|
6
9
|
'--python',
|
|
7
10
|
'--root',
|
|
8
11
|
'--system',
|
|
9
12
|
'--target',
|
|
10
13
|
'--user',
|
|
11
14
|
]);
|
|
12
|
-
const TARGET_CHANGING_SHORT_OPTIONS = new Set(['-p', '-t']);
|
|
13
15
|
const TARGET_ENVIRONMENT_VARIABLES = new Set([
|
|
14
16
|
'CONDA_PREFIX',
|
|
15
|
-
'PIP_CONFIG_FILE',
|
|
16
17
|
'PIP_PREFIX',
|
|
17
18
|
'PIP_PYTHON',
|
|
18
19
|
'PIP_ROOT',
|
|
@@ -21,72 +22,42 @@ const TARGET_ENVIRONMENT_VARIABLES = new Set([
|
|
|
21
22
|
'PYTHONHOME',
|
|
22
23
|
'PYTHONUSERBASE',
|
|
23
24
|
'UV_CONFIG_FILE',
|
|
25
|
+
'UV_PROJECT',
|
|
24
26
|
'UV_PROJECT_ENVIRONMENT',
|
|
25
|
-
'UV_PREFIX',
|
|
26
27
|
'UV_PYTHON',
|
|
28
|
+
'UV_PREFIX',
|
|
27
29
|
'UV_ROOT',
|
|
28
30
|
'UV_SYSTEM_PYTHON',
|
|
29
31
|
'UV_TARGET',
|
|
30
32
|
]);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
for (const argument of args) {
|
|
34
|
-
if (argument === '--')
|
|
35
|
-
break;
|
|
36
|
-
const [name] = argument.split('=', 1);
|
|
37
|
-
if (name && TARGET_CHANGING_OPTIONS.has(name)) {
|
|
38
|
-
throw new Error(`${name} is not allowed because Pyfig package commands are pinned to the repository .venv.`);
|
|
39
|
-
}
|
|
40
|
-
const shortName = argument.slice(0, 2);
|
|
41
|
-
if (TARGET_CHANGING_SHORT_OPTIONS.has(shortName)) {
|
|
42
|
-
throw new Error(`${shortName} is not allowed because Pyfig package commands are pinned to the repository .venv.`);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/** Build a package-manager environment whose target cannot be inherited or configured elsewhere. */
|
|
47
|
-
export function packageManagerEnvironment(env, packageManager) {
|
|
48
|
-
const active = sanitizedTargetEnvironment(env);
|
|
49
|
-
const activated = activateVirtualEnvironment(active, packageManager.virtualEnvironment, packageManager.pythonExecutable);
|
|
50
|
-
return packageManager.kind === 'uv'
|
|
51
|
-
? {
|
|
52
|
-
...activated,
|
|
53
|
-
UV_NO_CONFIG: '1',
|
|
54
|
-
UV_PYTHON: packageManager.pythonExecutable,
|
|
55
|
-
}
|
|
56
|
-
: {
|
|
57
|
-
...activated,
|
|
58
|
-
PIP_CONFIG_FILE: os.devNull,
|
|
59
|
-
PIP_REQUIRE_VIRTUALENV: '1',
|
|
60
|
-
PYTHONNOUSERSITE: '1',
|
|
61
|
-
};
|
|
33
|
+
export function uvCommandNeedsEnvironment(args) {
|
|
34
|
+
return args[0] === 'pip' || args[0] === 'run';
|
|
62
35
|
}
|
|
63
|
-
/**
|
|
64
|
-
export function
|
|
36
|
+
/** Pin uv pip and uv run to the environment selected by Pyfig. */
|
|
37
|
+
export function targetUvArguments(args, python) {
|
|
65
38
|
if (!python.virtualEnvironment) {
|
|
66
|
-
throw new Error('uv
|
|
39
|
+
throw new Error('Targeted uv commands require a virtual environment.');
|
|
40
|
+
}
|
|
41
|
+
assertNoTargetOverride(args);
|
|
42
|
+
if (args[0] === 'run') {
|
|
43
|
+
return ['run', '--no-project', '--python', python.executable, ...args.slice(1)];
|
|
44
|
+
}
|
|
45
|
+
if (args[0] === 'pip' && args[1]) {
|
|
46
|
+
return ['pip', args[1], '--python', python.executable, ...args.slice(2)];
|
|
67
47
|
}
|
|
48
|
+
return [...args];
|
|
49
|
+
}
|
|
50
|
+
export function uvCommandEnvironment(env, python) {
|
|
51
|
+
const sanitized = sanitizeUvEnvironment(env);
|
|
52
|
+
if (!python?.virtualEnvironment)
|
|
53
|
+
return sanitized;
|
|
68
54
|
return {
|
|
69
|
-
...activateVirtualEnvironment(
|
|
70
|
-
UV_NO_CONFIG: '1',
|
|
55
|
+
...activateVirtualEnvironment(sanitized, python.virtualEnvironment, python.executable),
|
|
71
56
|
UV_PYTHON: python.executable,
|
|
72
57
|
};
|
|
73
58
|
}
|
|
74
|
-
/**
|
|
75
|
-
export function
|
|
76
|
-
if (packageManager.kind === 'pip' && isPackageMutation(args)) {
|
|
77
|
-
throw new Error('Package mutation requires uv so the repository environment is locked across processes. ' +
|
|
78
|
-
'Enable uv installation or use a read-only pip command.');
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
export function isPackageMutation(args) {
|
|
82
|
-
return args.some((argument) => argument === 'install' || argument === 'sync' || argument === 'uninstall');
|
|
83
|
-
}
|
|
84
|
-
export function isUvPipCommand(args) {
|
|
85
|
-
const separator = args.indexOf('--');
|
|
86
|
-
const commandArguments = separator === -1 ? args : args.slice(0, separator);
|
|
87
|
-
return commandArguments.includes('pip');
|
|
88
|
-
}
|
|
89
|
-
function sanitizedTargetEnvironment(env) {
|
|
59
|
+
/** Remove inherited values that could redirect uv away from an explicit target. */
|
|
60
|
+
export function sanitizeUvEnvironment(env) {
|
|
90
61
|
const sanitized = { ...env };
|
|
91
62
|
for (const key of Object.keys(sanitized)) {
|
|
92
63
|
if (TARGET_ENVIRONMENT_VARIABLES.has(key.toUpperCase()))
|
|
@@ -94,4 +65,17 @@ function sanitizedTargetEnvironment(env) {
|
|
|
94
65
|
}
|
|
95
66
|
return sanitized;
|
|
96
67
|
}
|
|
68
|
+
function assertNoTargetOverride(args) {
|
|
69
|
+
for (const argument of args.slice(1)) {
|
|
70
|
+
if (argument === '--')
|
|
71
|
+
return;
|
|
72
|
+
const [name] = argument.split('=', 1);
|
|
73
|
+
if (name && TARGET_OPTIONS.has(name)) {
|
|
74
|
+
throw new Error(`${name} cannot override the environment selected by Pyfig.`);
|
|
75
|
+
}
|
|
76
|
+
if (argument === '-p' || argument.startsWith('-p=') || /^-p[^-]/u.test(argument)) {
|
|
77
|
+
throw new Error('-p cannot override the environment selected by Pyfig.');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
97
81
|
//# sourceMappingURL=package-target.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-target.js","sourceRoot":"","sources":["../src/package-target.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-target.js","sourceRoot":"","sources":["../src/package-target.ts"],"names":[],"mappings":"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"}
|
package/dist/probes.d.ts
CHANGED
|
@@ -25,30 +25,12 @@ export interface PythonEmbeddingInfo {
|
|
|
25
25
|
libraryName: string;
|
|
26
26
|
libraryKind: 'import' | 'shared' | 'static';
|
|
27
27
|
}
|
|
28
|
-
export interface PackageManagerInfo {
|
|
29
|
-
kind: 'pip' | 'uv';
|
|
30
|
-
executable: string;
|
|
31
|
-
prefixArgs: string[];
|
|
32
|
-
version: string;
|
|
33
|
-
pythonExecutable: string;
|
|
34
|
-
virtualEnvironment: string;
|
|
35
|
-
}
|
|
36
28
|
export interface UvInfo {
|
|
37
29
|
executable: string;
|
|
38
30
|
version: string;
|
|
39
31
|
}
|
|
40
|
-
export declare function
|
|
41
|
-
export declare function pythonSatisfiesRequirements(python: PythonInfo, options: Pick<ResolvedPyfigOptions, 'pythonRange' | 'requireEmbedding' | 'requireGil'>): boolean;
|
|
32
|
+
export declare function pythonSatisfiesPolicy(python: PythonInfo, options: Pick<ResolvedPyfigOptions, 'requiresPython' | 'requireEmbedding' | 'requireGil'>): boolean;
|
|
42
33
|
export declare function probePython(candidate: CommandSpec, options: ResolvedPyfigOptions): Promise<PythonInfo | null>;
|
|
43
|
-
export declare function findPip(python: PythonInfo, options: ResolvedPyfigOptions): Promise<PackageManagerInfo | null>;
|
|
44
|
-
export interface PipVersionDetails {
|
|
45
|
-
version: string;
|
|
46
|
-
location: string;
|
|
47
|
-
pythonMajor: number;
|
|
48
|
-
pythonMinor: number;
|
|
49
|
-
}
|
|
50
|
-
export declare function parsePipVersionOutput(output: string): PipVersionDetails | null;
|
|
51
|
-
export declare function pipBelongsToPython(pip: PipVersionDetails, python: PythonInfo): boolean;
|
|
52
34
|
export declare function findUv(options: ResolvedPyfigOptions): Promise<UvInfo | null>;
|
|
53
35
|
export declare function probeUv(executable: string, options: ResolvedPyfigOptions): UvInfo | null;
|
|
54
36
|
//# sourceMappingURL=probes.d.ts.map
|
package/dist/probes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../src/probes.ts"],"names":[],"mappings":"
|
|
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;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,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AA+ED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,YAAY,CAAC,GACxF,OAAO,CAQT;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAe5B;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"}
|