pynect 0.0.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/LICENSE +1 -1
- package/README.md +476 -2
- package/SECURITY.md +34 -0
- package/binding.gyp +60 -0
- package/dist/cli/codegen.d.ts +3 -0
- package/dist/cli/codegen.d.ts.map +1 -0
- package/dist/cli/codegen.js +543 -0
- package/dist/cli/codegen.js.map +1 -0
- package/dist/cli/sync.d.ts +3 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +48 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/config/project.d.ts +57 -0
- package/dist/config/project.d.ts.map +1 -0
- package/dist/config/project.js +176 -0
- package/dist/config/project.js.map +1 -0
- package/dist/core/IsolatedWorker.d.ts +39 -0
- package/dist/core/IsolatedWorker.d.ts.map +1 -0
- package/dist/core/IsolatedWorker.js +178 -0
- package/dist/core/IsolatedWorker.js.map +1 -0
- package/dist/core/PyCallable.d.ts +67 -0
- package/dist/core/PyCallable.d.ts.map +1 -0
- package/dist/core/PyCallable.js +104 -0
- package/dist/core/PyCallable.js.map +1 -0
- package/dist/core/PyContext.d.ts +76 -0
- package/dist/core/PyContext.d.ts.map +1 -0
- package/dist/core/PyContext.js +239 -0
- package/dist/core/PyContext.js.map +1 -0
- package/dist/core/PyIterator.d.ts +84 -0
- package/dist/core/PyIterator.d.ts.map +1 -0
- package/dist/core/PyIterator.js +243 -0
- package/dist/core/PyIterator.js.map +1 -0
- package/dist/core/PyModule.d.ts +53 -0
- package/dist/core/PyModule.d.ts.map +1 -0
- package/dist/core/PyModule.js +162 -0
- package/dist/core/PyModule.js.map +1 -0
- package/dist/core/PyProxy.d.ts +75 -0
- package/dist/core/PyProxy.d.ts.map +1 -0
- package/dist/core/PyProxy.js +563 -0
- package/dist/core/PyProxy.js.map +1 -0
- package/dist/core/PyRuntime.d.ts +112 -0
- package/dist/core/PyRuntime.d.ts.map +1 -0
- package/dist/core/PyRuntime.js +546 -0
- package/dist/core/PyRuntime.js.map +1 -0
- package/dist/env/PackageInstaller.d.ts +232 -0
- package/dist/env/PackageInstaller.d.ts.map +1 -0
- package/dist/env/PackageInstaller.js +628 -0
- package/dist/env/PackageInstaller.js.map +1 -0
- package/dist/env/ProjectEnvironment.d.ts +63 -0
- package/dist/env/ProjectEnvironment.d.ts.map +1 -0
- package/dist/env/ProjectEnvironment.js +379 -0
- package/dist/env/ProjectEnvironment.js.map +1 -0
- package/dist/env/PyfigAdapter.d.ts +32 -0
- package/dist/env/PyfigAdapter.d.ts.map +1 -0
- package/dist/env/PyfigAdapter.js +10 -0
- package/dist/env/PyfigAdapter.js.map +1 -0
- package/dist/env/PythonDetector.d.ts +48 -0
- package/dist/env/PythonDetector.d.ts.map +1 -0
- package/dist/env/PythonDetector.js +182 -0
- package/dist/env/PythonDetector.js.map +1 -0
- package/dist/env/PythonProvisioner.d.ts +16 -0
- package/dist/env/PythonProvisioner.d.ts.map +1 -0
- package/dist/env/PythonProvisioner.js +42 -0
- package/dist/env/PythonProvisioner.js.map +1 -0
- package/dist/env/VenvManager.d.ts +55 -0
- package/dist/env/VenvManager.d.ts.map +1 -0
- package/dist/env/VenvManager.js +153 -0
- package/dist/env/VenvManager.js.map +1 -0
- package/dist/env/executables.d.ts +3 -0
- package/dist/env/executables.d.ts.map +1 -0
- package/dist/env/executables.js +14 -0
- package/dist/env/executables.js.map +1 -0
- package/dist/index.d.ts +182 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +393 -0
- package/dist/index.js.map +1 -0
- package/dist/native/NativeAddonLoader.d.ts +11 -0
- package/dist/native/NativeAddonLoader.d.ts.map +1 -0
- package/dist/native/NativeAddonLoader.js +75 -0
- package/dist/native/NativeAddonLoader.js.map +1 -0
- package/dist/plugins/Plugin.interface.d.ts +41 -0
- package/dist/plugins/Plugin.interface.d.ts.map +1 -0
- package/dist/plugins/Plugin.interface.js +12 -0
- package/dist/plugins/Plugin.interface.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +26 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -0
- package/dist/plugins/PluginManager.js +174 -0
- package/dist/plugins/PluginManager.js.map +1 -0
- package/dist/plugins/builtin/NumpyPlugin.d.ts +17 -0
- package/dist/plugins/builtin/NumpyPlugin.d.ts.map +1 -0
- package/dist/plugins/builtin/NumpyPlugin.js +41 -0
- package/dist/plugins/builtin/NumpyPlugin.js.map +1 -0
- package/dist/plugins/builtin/PandasPlugin.d.ts +19 -0
- package/dist/plugins/builtin/PandasPlugin.d.ts.map +1 -0
- package/dist/plugins/builtin/PandasPlugin.js +57 -0
- package/dist/plugins/builtin/PandasPlugin.js.map +1 -0
- package/dist/plugins/builtin/TorchPlugin.d.ts +23 -0
- package/dist/plugins/builtin/TorchPlugin.d.ts.map +1 -0
- package/dist/plugins/builtin/TorchPlugin.js +50 -0
- package/dist/plugins/builtin/TorchPlugin.js.map +1 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +12 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/serialization/DataFrameBridge.d.ts +141 -0
- package/dist/serialization/DataFrameBridge.d.ts.map +1 -0
- package/dist/serialization/DataFrameBridge.js +355 -0
- package/dist/serialization/DataFrameBridge.js.map +1 -0
- package/dist/serialization/MsgPackSerializer.d.ts +45 -0
- package/dist/serialization/MsgPackSerializer.d.ts.map +1 -0
- package/dist/serialization/MsgPackSerializer.js +242 -0
- package/dist/serialization/MsgPackSerializer.js.map +1 -0
- package/dist/serialization/NumpyBridge.d.ts +96 -0
- package/dist/serialization/NumpyBridge.d.ts.map +1 -0
- package/dist/serialization/NumpyBridge.js +323 -0
- package/dist/serialization/NumpyBridge.js.map +1 -0
- package/dist/serialization/Serializer.d.ts +78 -0
- package/dist/serialization/Serializer.d.ts.map +1 -0
- package/dist/serialization/Serializer.js +281 -0
- package/dist/serialization/Serializer.js.map +1 -0
- package/dist/types/addon.d.ts +131 -0
- package/dist/types/addon.d.ts.map +1 -0
- package/dist/types/addon.js +32 -0
- package/dist/types/addon.js.map +1 -0
- package/dist/types/config.d.ts +233 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +60 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/python.d.ts +235 -0
- package/dist/types/python.d.ts.map +1 -0
- package/dist/types/python.js +7 -0
- package/dist/types/python.js.map +1 -0
- package/dist/utils/ErrorTranslator.d.ts +83 -0
- package/dist/utils/ErrorTranslator.d.ts.map +1 -0
- package/dist/utils/ErrorTranslator.js +210 -0
- package/dist/utils/ErrorTranslator.js.map +1 -0
- package/dist/utils/Locking.d.ts +3 -0
- package/dist/utils/Locking.d.ts.map +1 -0
- package/dist/utils/Locking.js +10 -0
- package/dist/utils/Locking.js.map +1 -0
- package/dist/utils/Logger.d.ts +27 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +115 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/MemoryMonitor.d.ts +43 -0
- package/dist/utils/MemoryMonitor.d.ts.map +1 -0
- package/dist/utils/MemoryMonitor.js +143 -0
- package/dist/utils/MemoryMonitor.js.map +1 -0
- package/package.json +92 -17
- package/python/ast_inspector.py +248 -0
- package/python/error_handler.py +432 -0
- package/python/isolated_worker.py +94 -0
- package/python/pynect_dispatcher.py +382 -0
- package/python/pynect_runtime.py +574 -0
- package/python/serializer.py +373 -0
- package/python/type_inspector.py +315 -0
- package/scripts/build-native.js +50 -0
- package/scripts/cli.js +21 -0
- package/scripts/ensure-native.js +85 -0
- package/scripts/postinstall.js +40 -0
- package/scripts/pyfig.js +113 -0
- package/scripts/python-provisioner.js +23 -0
- package/scripts/smoke-python-boundary.js +103 -0
- package/src/native/NativeAddonLoader.ts +98 -0
- package/src/native/gil_guard.cpp +25 -0
- package/src/native/gil_guard.h +174 -0
- package/src/native/pynect_addon.cpp +942 -0
- package/src/native/python_bridge.cpp +904 -0
- package/src/native/python_bridge.h +263 -0
- package/src/native/thread_pool.cpp +375 -0
- package/src/native/thread_pool.h +185 -0
- package/src/native/type_converter.cpp +906 -0
- package/src/native/type_converter.h +271 -0
- package/index.d.ts +0 -3
- package/index.js +0 -3
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type PynectModuleManifest, type PynectPackageManifest, type ProjectConfigOverrides, type ResolvedProjectConfig } from '../config/project';
|
|
2
|
+
export interface PynectContribution {
|
|
3
|
+
packageName: string;
|
|
4
|
+
packageVersion: string;
|
|
5
|
+
packageRoot: string;
|
|
6
|
+
manifest: PynectPackageManifest;
|
|
7
|
+
root: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ExposedModule extends PynectModuleManifest {
|
|
10
|
+
id: string;
|
|
11
|
+
packageName: string;
|
|
12
|
+
}
|
|
13
|
+
export interface PynectProjectPlan {
|
|
14
|
+
config: ResolvedProjectConfig;
|
|
15
|
+
contributions: PynectContribution[];
|
|
16
|
+
requirements: Array<{
|
|
17
|
+
requirement: string;
|
|
18
|
+
packageName: string;
|
|
19
|
+
}>;
|
|
20
|
+
overrides: string[];
|
|
21
|
+
modules: Record<string, ExposedModule>;
|
|
22
|
+
pythonRange: string;
|
|
23
|
+
pythonRequirement: string;
|
|
24
|
+
manifestHash: string;
|
|
25
|
+
generatedDirectory: string;
|
|
26
|
+
pyprojectFile: string;
|
|
27
|
+
generatedLockfile: string;
|
|
28
|
+
modulesFile: string;
|
|
29
|
+
stateFile: string;
|
|
30
|
+
}
|
|
31
|
+
export interface PynectEnvironmentState {
|
|
32
|
+
schemaVersion: 1;
|
|
33
|
+
manifestHash: string;
|
|
34
|
+
lockHash: string;
|
|
35
|
+
pythonVersion: string;
|
|
36
|
+
pythonExecutable: string;
|
|
37
|
+
pythonAbi: string;
|
|
38
|
+
platform: NodeJS.Platform;
|
|
39
|
+
architecture: string;
|
|
40
|
+
contributors: Array<{
|
|
41
|
+
name: string;
|
|
42
|
+
version: string;
|
|
43
|
+
}>;
|
|
44
|
+
syncedAt: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SyncProjectOptions extends ProjectConfigOverrides {
|
|
47
|
+
frozen?: boolean;
|
|
48
|
+
offline?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface SyncProjectResult {
|
|
51
|
+
plan: PynectProjectPlan;
|
|
52
|
+
state: PynectEnvironmentState;
|
|
53
|
+
lockfile: string;
|
|
54
|
+
}
|
|
55
|
+
export declare function createProjectPlan(overrides?: ProjectConfigOverrides): PynectProjectPlan;
|
|
56
|
+
export declare function discoverPynectContributions(projectRoot: string): PynectContribution[];
|
|
57
|
+
export declare function syncProject(options?: SyncProjectOptions): Promise<SyncProjectResult>;
|
|
58
|
+
export declare function validateProjectEnvironment(plan: PynectProjectPlan): PynectEnvironmentState;
|
|
59
|
+
export declare function requiresProjectSync(plan: PynectProjectPlan): boolean;
|
|
60
|
+
export declare function moduleDispatcherIncludes(plan: PynectProjectPlan): string[];
|
|
61
|
+
export declare function resolveExposedModule(id: string, projectRoot?: string): ExposedModule | undefined;
|
|
62
|
+
export declare function renderUvProject(plan: PynectProjectPlan): string;
|
|
63
|
+
//# sourceMappingURL=ProjectEnvironment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectEnvironment.d.ts","sourceRoot":"","sources":["../../src/env/ProjectEnvironment.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAW3B,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAc,SAAQ,oBAAoB;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,YAAY,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,CAAC,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,sBAAsB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,sBAA2B,GACrC,iBAAiB,CA2DnB;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,EAAE,CA+CrF;AAED,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiB9F;AA6DD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,iBAAiB,GAAG,sBAAsB,CAiC1F;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAEpE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAS1E;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa,GAAG,SAAS,CAG3B;AAOD,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAuB/D"}
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createProjectPlan = createProjectPlan;
|
|
7
|
+
exports.discoverPynectContributions = discoverPynectContributions;
|
|
8
|
+
exports.syncProject = syncProject;
|
|
9
|
+
exports.validateProjectEnvironment = validateProjectEnvironment;
|
|
10
|
+
exports.requiresProjectSync = requiresProjectSync;
|
|
11
|
+
exports.moduleDispatcherIncludes = moduleDispatcherIncludes;
|
|
12
|
+
exports.resolveExposedModule = resolveExposedModule;
|
|
13
|
+
exports.renderUvProject = renderUvProject;
|
|
14
|
+
const crypto_1 = require("crypto");
|
|
15
|
+
const fs_1 = __importDefault(require("fs"));
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const semver_1 = __importDefault(require("semver"));
|
|
18
|
+
const project_1 = require("../config/project");
|
|
19
|
+
const PyfigAdapter_1 = require("./PyfigAdapter");
|
|
20
|
+
const Locking_1 = require("../utils/Locking");
|
|
21
|
+
const GENERATED_DIRECTORY = '.pynect';
|
|
22
|
+
const PYPROJECT_FILE = 'pyproject.toml';
|
|
23
|
+
const UV_LOCK_FILE = 'uv.lock';
|
|
24
|
+
const MODULES_FILE = 'modules.json';
|
|
25
|
+
const STATE_FILE = '.pynect-state.json';
|
|
26
|
+
const TRANSITIVE_KEYS = new Set(['schemaVersion', 'requiresPython', 'requirements', 'modules']);
|
|
27
|
+
function createProjectPlan(overrides = {}) {
|
|
28
|
+
let config = (0, project_1.resolveProjectConfig)(overrides);
|
|
29
|
+
const contributions = discoverPynectContributions(config.projectRoot);
|
|
30
|
+
const requirements = contributions.flatMap(contribution => (contribution.manifest.requirements ?? []).map(requirement => ({
|
|
31
|
+
requirement,
|
|
32
|
+
packageName: contribution.packageName,
|
|
33
|
+
})));
|
|
34
|
+
const modules = {};
|
|
35
|
+
for (const contribution of contributions) {
|
|
36
|
+
for (const [alias, module] of Object.entries(contribution.manifest.modules ?? {})) {
|
|
37
|
+
const id = `${contribution.packageName}:${alias}`;
|
|
38
|
+
if (modules[id])
|
|
39
|
+
throw new Error(`Duplicate Pynect module id: ${id}`);
|
|
40
|
+
modules[id] = { ...module, id, packageName: contribution.packageName };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const requirementOverrides = Object.entries(config.packageManifest.overrides ?? {})
|
|
44
|
+
.map(([distribution, constraint]) => `${distribution}${constraint}`)
|
|
45
|
+
.sort();
|
|
46
|
+
const pythonConstraints = [
|
|
47
|
+
{ range: config.requiresPython, packageName: '<application>' },
|
|
48
|
+
...contributions
|
|
49
|
+
.filter(contribution => !contribution.root && contribution.manifest.requiresPython)
|
|
50
|
+
.map(contribution => ({
|
|
51
|
+
range: contribution.manifest.requiresPython,
|
|
52
|
+
packageName: contribution.packageName,
|
|
53
|
+
})),
|
|
54
|
+
];
|
|
55
|
+
const { pythonRange, pythonRequirement } = combinePythonRequirements(pythonConstraints);
|
|
56
|
+
if (!config.managedPythonExplicit && !pythonVersionSatisfies(config.managedPython, pythonRange)) {
|
|
57
|
+
config = { ...config, managedPython: managedPythonForRange(pythonRange) };
|
|
58
|
+
}
|
|
59
|
+
const manifestHash = sha256(stableJson({
|
|
60
|
+
schemaVersion: 1,
|
|
61
|
+
pythonRange,
|
|
62
|
+
pythonRequirement,
|
|
63
|
+
requirements: [...requirements].sort(compareRequirements),
|
|
64
|
+
overrides: requirementOverrides,
|
|
65
|
+
modules,
|
|
66
|
+
}));
|
|
67
|
+
const generatedDirectory = path_1.default.join(config.projectRoot, GENERATED_DIRECTORY);
|
|
68
|
+
return {
|
|
69
|
+
config,
|
|
70
|
+
contributions,
|
|
71
|
+
requirements,
|
|
72
|
+
overrides: requirementOverrides,
|
|
73
|
+
modules,
|
|
74
|
+
pythonRange,
|
|
75
|
+
pythonRequirement,
|
|
76
|
+
manifestHash,
|
|
77
|
+
generatedDirectory,
|
|
78
|
+
pyprojectFile: path_1.default.join(generatedDirectory, PYPROJECT_FILE),
|
|
79
|
+
generatedLockfile: path_1.default.join(generatedDirectory, UV_LOCK_FILE),
|
|
80
|
+
modulesFile: path_1.default.join(generatedDirectory, MODULES_FILE),
|
|
81
|
+
stateFile: path_1.default.join(config.projectRoot, '.venv', STATE_FILE),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function discoverPynectContributions(projectRoot) {
|
|
85
|
+
const rootPackage = readPackage(path_1.default.join(projectRoot, 'package.json'));
|
|
86
|
+
const queue = [
|
|
87
|
+
{ directory: projectRoot, packageJson: rootPackage, root: true },
|
|
88
|
+
];
|
|
89
|
+
const visited = new Set();
|
|
90
|
+
const contributions = [];
|
|
91
|
+
while (queue.length > 0) {
|
|
92
|
+
const current = queue.shift();
|
|
93
|
+
const realDirectory = fs_1.default.realpathSync.native(current.directory);
|
|
94
|
+
if (visited.has(realDirectory))
|
|
95
|
+
continue;
|
|
96
|
+
visited.add(realDirectory);
|
|
97
|
+
if (current.packageJson.pynect !== undefined) {
|
|
98
|
+
const packagePath = path_1.default.join(current.directory, 'package.json');
|
|
99
|
+
const manifest = (0, project_1.validatePackageManifest)(current.packageJson.pynect, packagePath);
|
|
100
|
+
if (!current.root)
|
|
101
|
+
assertTransitiveManifest(manifest, current.packageJson.name, packagePath);
|
|
102
|
+
contributions.push({
|
|
103
|
+
packageName: current.packageJson.name,
|
|
104
|
+
packageVersion: current.packageJson.version,
|
|
105
|
+
packageRoot: current.directory,
|
|
106
|
+
manifest,
|
|
107
|
+
root: current.root,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
const dependencyNames = Object.keys({
|
|
111
|
+
...current.packageJson.dependencies,
|
|
112
|
+
...current.packageJson.optionalDependencies,
|
|
113
|
+
...(current.root ? current.packageJson.devDependencies : {}),
|
|
114
|
+
}).sort();
|
|
115
|
+
for (const dependencyName of dependencyNames) {
|
|
116
|
+
const directory = resolveInstalledPackage(current.directory, dependencyName);
|
|
117
|
+
if (!directory)
|
|
118
|
+
continue;
|
|
119
|
+
queue.push({
|
|
120
|
+
directory,
|
|
121
|
+
packageJson: readPackage(path_1.default.join(directory, 'package.json')),
|
|
122
|
+
root: false,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return contributions.sort((left, right) => left.packageName.localeCompare(right.packageName) ||
|
|
127
|
+
left.packageRoot.localeCompare(right.packageRoot));
|
|
128
|
+
}
|
|
129
|
+
async function syncProject(options = {}) {
|
|
130
|
+
const plan = createProjectPlan(options);
|
|
131
|
+
fs_1.default.mkdirSync(plan.generatedDirectory, { recursive: true });
|
|
132
|
+
const locked = await (0, Locking_1.withPynectLock)({ projectRoot: plan.config.projectRoot }, async () => syncProjectUnlocked(plan, options), undefined, {
|
|
133
|
+
key: `pynect-sync:${normalizedPath(plan.config.projectRoot)}`,
|
|
134
|
+
name: 'Pynect project sync',
|
|
135
|
+
namespace: 'pynect',
|
|
136
|
+
});
|
|
137
|
+
if (locked.context.state !== 'executed' || !locked.value) {
|
|
138
|
+
throw new Error(`Loqkit did not execute project synchronization: ${locked.context.state}.`);
|
|
139
|
+
}
|
|
140
|
+
return locked.value;
|
|
141
|
+
}
|
|
142
|
+
async function syncProjectUnlocked(plan, options) {
|
|
143
|
+
writeGeneratedProject(plan);
|
|
144
|
+
if (options.frozen)
|
|
145
|
+
stageFrozenLock(plan);
|
|
146
|
+
const client = (0, PyfigAdapter_1.createPynectPyfig)({
|
|
147
|
+
projectRoot: plan.config.projectRoot,
|
|
148
|
+
pythonPath: plan.config.python,
|
|
149
|
+
pythonRange: plan.pythonRange,
|
|
150
|
+
managedPython: plan.config.managedPython,
|
|
151
|
+
uvVersion: plan.config.uvVersion,
|
|
152
|
+
autoInstallPython: plan.config.installPython,
|
|
153
|
+
autoInstallUv: plan.config.installUv,
|
|
154
|
+
autoCreateVirtualEnvironment: plan.config.createVirtualEnvironment,
|
|
155
|
+
env: plan.config.env,
|
|
156
|
+
});
|
|
157
|
+
const environment = await client.prepare();
|
|
158
|
+
const syncArgs = ['sync', '--project', plan.generatedDirectory, '--no-dev'];
|
|
159
|
+
if (options.frozen)
|
|
160
|
+
syncArgs.push('--locked');
|
|
161
|
+
if (options.offline)
|
|
162
|
+
syncArgs.push('--offline');
|
|
163
|
+
const synced = await runChild(await client.uv(syncArgs, {
|
|
164
|
+
cwd: plan.config.projectRoot,
|
|
165
|
+
env: {
|
|
166
|
+
...plan.config.env,
|
|
167
|
+
UV_PROJECT_ENVIRONMENT: path_1.default.join(plan.config.projectRoot, '.venv'),
|
|
168
|
+
},
|
|
169
|
+
}));
|
|
170
|
+
if (synced.code !== 0) {
|
|
171
|
+
throw resolutionError(plan, synced.output);
|
|
172
|
+
}
|
|
173
|
+
if (!options.frozen)
|
|
174
|
+
atomicWrite(plan.config.lockfile, fs_1.default.readFileSync(plan.generatedLockfile, 'utf8'));
|
|
175
|
+
const lockHash = sha256(fs_1.default.readFileSync(plan.config.lockfile));
|
|
176
|
+
const python = environment.python;
|
|
177
|
+
const state = {
|
|
178
|
+
schemaVersion: 1,
|
|
179
|
+
manifestHash: plan.manifestHash,
|
|
180
|
+
lockHash,
|
|
181
|
+
pythonVersion: python.version,
|
|
182
|
+
pythonExecutable: python.executable,
|
|
183
|
+
pythonAbi: `${python.implementation}-${python.version}-${python.architecture}-${python.pointerBits}`,
|
|
184
|
+
platform: process.platform,
|
|
185
|
+
architecture: process.arch,
|
|
186
|
+
contributors: plan.contributions.map(contribution => ({
|
|
187
|
+
name: contribution.packageName,
|
|
188
|
+
version: contribution.packageVersion,
|
|
189
|
+
})),
|
|
190
|
+
syncedAt: new Date().toISOString(),
|
|
191
|
+
};
|
|
192
|
+
atomicWrite(plan.stateFile, `${JSON.stringify(state, null, 2)}\n`);
|
|
193
|
+
return { plan, state, lockfile: plan.config.lockfile };
|
|
194
|
+
}
|
|
195
|
+
function validateProjectEnvironment(plan) {
|
|
196
|
+
if (!fs_1.default.existsSync(plan.config.lockfile)) {
|
|
197
|
+
throw staleEnvironmentError(plan, `lockfile is missing at ${plan.config.lockfile}`);
|
|
198
|
+
}
|
|
199
|
+
if (!fs_1.default.existsSync(plan.stateFile)) {
|
|
200
|
+
throw staleEnvironmentError(plan, `environment state is missing at ${plan.stateFile}`);
|
|
201
|
+
}
|
|
202
|
+
let state;
|
|
203
|
+
try {
|
|
204
|
+
state = JSON.parse(fs_1.default.readFileSync(plan.stateFile, 'utf8'));
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
throw staleEnvironmentError(plan, `environment state is invalid: ${error.message}`);
|
|
208
|
+
}
|
|
209
|
+
const lockHash = sha256(fs_1.default.readFileSync(plan.config.lockfile));
|
|
210
|
+
if (state.schemaVersion !== 1 || state.manifestHash !== plan.manifestHash) {
|
|
211
|
+
throw staleEnvironmentError(plan, 'package manifests changed since the last sync');
|
|
212
|
+
}
|
|
213
|
+
if (state.lockHash !== lockHash) {
|
|
214
|
+
throw staleEnvironmentError(plan, 'lockfile changed since the last sync');
|
|
215
|
+
}
|
|
216
|
+
if (state.platform !== process.platform || state.architecture !== process.arch) {
|
|
217
|
+
throw staleEnvironmentError(plan, 'environment was synchronized for another platform');
|
|
218
|
+
}
|
|
219
|
+
const expectedPython = path_1.default.join(plan.config.projectRoot, '.venv', process.platform === 'win32' ? 'Scripts' : 'bin', process.platform === 'win32' ? 'python.exe' : 'python');
|
|
220
|
+
if (!fs_1.default.existsSync(state.pythonExecutable) || !pathsEqual(state.pythonExecutable, expectedPython)) {
|
|
221
|
+
throw staleEnvironmentError(plan, 'recorded Python executable is missing or outside the root .venv');
|
|
222
|
+
}
|
|
223
|
+
return state;
|
|
224
|
+
}
|
|
225
|
+
function requiresProjectSync(plan) {
|
|
226
|
+
return plan.requirements.length > 0 || plan.contributions.some(contribution => !contribution.root);
|
|
227
|
+
}
|
|
228
|
+
function moduleDispatcherIncludes(plan) {
|
|
229
|
+
return [...new Set(Object.values(plan.modules).flatMap(module => {
|
|
230
|
+
const patterns = module.include?.length ? module.include : ['*'];
|
|
231
|
+
return patterns.map(pattern => pattern === module.import || pattern.startsWith(`${module.import}.`)
|
|
232
|
+
? pattern
|
|
233
|
+
: `${module.import}.${pattern}`);
|
|
234
|
+
}))].sort();
|
|
235
|
+
}
|
|
236
|
+
function resolveExposedModule(id, projectRoot) {
|
|
237
|
+
const plan = createProjectPlan({ projectRoot });
|
|
238
|
+
return plan.modules[id];
|
|
239
|
+
}
|
|
240
|
+
function writeGeneratedProject(plan) {
|
|
241
|
+
atomicWrite(plan.pyprojectFile, renderUvProject(plan));
|
|
242
|
+
atomicWrite(plan.modulesFile, `${JSON.stringify(plan.modules, null, 2)}\n`);
|
|
243
|
+
}
|
|
244
|
+
function renderUvProject(plan) {
|
|
245
|
+
const requirements = [...new Set(plan.requirements.map(item => item.requirement))].sort();
|
|
246
|
+
const lines = [
|
|
247
|
+
'# Generated by Pynect. Declare dependencies in package.json, not here.',
|
|
248
|
+
'[project]',
|
|
249
|
+
'name = "pynect-environment"',
|
|
250
|
+
'version = "0.0.0"',
|
|
251
|
+
`requires-python = ${JSON.stringify(plan.pythonRequirement)}`,
|
|
252
|
+
'dependencies = [',
|
|
253
|
+
...requirements.map(requirement => ` ${JSON.stringify(requirement)},`),
|
|
254
|
+
']',
|
|
255
|
+
'',
|
|
256
|
+
'[tool.uv]',
|
|
257
|
+
'package = false',
|
|
258
|
+
];
|
|
259
|
+
if (plan.overrides.length > 0) {
|
|
260
|
+
lines.push('override-dependencies = [', ...plan.overrides.map(requirement => ` ${JSON.stringify(requirement)},`), ']');
|
|
261
|
+
}
|
|
262
|
+
return `${lines.join('\n')}\n`;
|
|
263
|
+
}
|
|
264
|
+
function stageFrozenLock(plan) {
|
|
265
|
+
if (!fs_1.default.existsSync(plan.config.lockfile)) {
|
|
266
|
+
throw new Error(`Frozen sync requires an existing lockfile at ${plan.config.lockfile}.`);
|
|
267
|
+
}
|
|
268
|
+
atomicWrite(plan.generatedLockfile, fs_1.default.readFileSync(plan.config.lockfile, 'utf8'));
|
|
269
|
+
}
|
|
270
|
+
function resolutionError(plan, output) {
|
|
271
|
+
const origins = plan.requirements
|
|
272
|
+
.map(item => ` ${item.packageName} requires ${item.requirement}`)
|
|
273
|
+
.join('\n');
|
|
274
|
+
return new Error(`Unable to resolve Python requirements:${origins ? `\n\n${origins}` : ''}` +
|
|
275
|
+
`\n\nuv reported:\n${output.trim()}`);
|
|
276
|
+
}
|
|
277
|
+
function staleEnvironmentError(plan, detail) {
|
|
278
|
+
return new Error(`Pynect environment is not synchronized: ${detail}. Run "pynect sync" ` +
|
|
279
|
+
`from ${plan.config.projectRoot}.`);
|
|
280
|
+
}
|
|
281
|
+
function assertTransitiveManifest(manifest, packageName, source) {
|
|
282
|
+
const policyKeys = Object.keys(manifest).filter(key => !TRANSITIVE_KEYS.has(key));
|
|
283
|
+
if (policyKeys.length > 0) {
|
|
284
|
+
throw new TypeError(`${source}: transitive package ${packageName} cannot set application policy: ` +
|
|
285
|
+
policyKeys.join(', '));
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function combinePythonRequirements(constraints) {
|
|
289
|
+
const pythonRequirement = constraints
|
|
290
|
+
.map(constraint => constraint.range.trim().replace(/\s+(?=[<>=!~])/g, ','))
|
|
291
|
+
.filter(Boolean)
|
|
292
|
+
.join(',');
|
|
293
|
+
const candidate = pythonRequirement.replace(/,/g, ' ');
|
|
294
|
+
const pythonRange = semver_1.default.validRange(candidate);
|
|
295
|
+
if (!pythonRange || !semver_1.default.minVersion(pythonRange)) {
|
|
296
|
+
throw new Error('Unable to resolve Python version requirements:\n\n' +
|
|
297
|
+
constraints.map(item => ` ${item.packageName} requires Python ${item.range}`).join('\n'));
|
|
298
|
+
}
|
|
299
|
+
return { pythonRange, pythonRequirement };
|
|
300
|
+
}
|
|
301
|
+
function pythonVersionSatisfies(version, range) {
|
|
302
|
+
const normalized = semver_1.default.coerce(version)?.version;
|
|
303
|
+
return normalized !== undefined && semver_1.default.satisfies(normalized, range);
|
|
304
|
+
}
|
|
305
|
+
function managedPythonForRange(range) {
|
|
306
|
+
const minimum = semver_1.default.minVersion(range);
|
|
307
|
+
if (!minimum)
|
|
308
|
+
throw new TypeError(`Python range has no installable version: ${range}`);
|
|
309
|
+
return `${minimum.major}.${minimum.minor}`;
|
|
310
|
+
}
|
|
311
|
+
function readPackage(packagePath) {
|
|
312
|
+
let value;
|
|
313
|
+
try {
|
|
314
|
+
value = JSON.parse(fs_1.default.readFileSync(packagePath, 'utf8'));
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
throw new Error(`Unable to read ${packagePath}: ${error.message}`);
|
|
318
|
+
}
|
|
319
|
+
if (!isRecord(value))
|
|
320
|
+
throw new TypeError(`${packagePath} must contain an object.`);
|
|
321
|
+
return {
|
|
322
|
+
...value,
|
|
323
|
+
name: typeof value['name'] === 'string' ? value['name'] : path_1.default.basename(path_1.default.dirname(packagePath)),
|
|
324
|
+
version: typeof value['version'] === 'string' ? value['version'] : '0.0.0',
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
function resolveInstalledPackage(fromDirectory, packageName) {
|
|
328
|
+
let current = path_1.default.resolve(fromDirectory);
|
|
329
|
+
while (true) {
|
|
330
|
+
const candidate = path_1.default.join(current, 'node_modules', ...packageName.split('/'));
|
|
331
|
+
if (fs_1.default.existsSync(path_1.default.join(candidate, 'package.json')))
|
|
332
|
+
return candidate;
|
|
333
|
+
const parent = path_1.default.dirname(current);
|
|
334
|
+
if (parent === current)
|
|
335
|
+
return undefined;
|
|
336
|
+
current = parent;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
async function runChild(child) {
|
|
340
|
+
return new Promise((resolve, reject) => {
|
|
341
|
+
let output = '';
|
|
342
|
+
child.stdout?.on('data', chunk => { output += String(chunk); });
|
|
343
|
+
child.stderr?.on('data', chunk => { output += String(chunk); });
|
|
344
|
+
child.on('error', reject);
|
|
345
|
+
child.on('close', code => resolve({ code: code ?? 1, output }));
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
function atomicWrite(destination, contents) {
|
|
349
|
+
fs_1.default.mkdirSync(path_1.default.dirname(destination), { recursive: true });
|
|
350
|
+
const temporary = `${destination}.${process.pid}.${Date.now()}.tmp`;
|
|
351
|
+
fs_1.default.writeFileSync(temporary, contents, 'utf8');
|
|
352
|
+
fs_1.default.renameSync(temporary, destination);
|
|
353
|
+
}
|
|
354
|
+
function sha256(value) {
|
|
355
|
+
return (0, crypto_1.createHash)('sha256').update(value).digest('hex');
|
|
356
|
+
}
|
|
357
|
+
function stableJson(value) {
|
|
358
|
+
if (Array.isArray(value))
|
|
359
|
+
return `[${value.map(stableJson).join(',')}]`;
|
|
360
|
+
if (isRecord(value)) {
|
|
361
|
+
return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${stableJson(value[key])}`).join(',')}}`;
|
|
362
|
+
}
|
|
363
|
+
return JSON.stringify(value);
|
|
364
|
+
}
|
|
365
|
+
function compareRequirements(left, right) {
|
|
366
|
+
return left.requirement.localeCompare(right.requirement) ||
|
|
367
|
+
left.packageName.localeCompare(right.packageName);
|
|
368
|
+
}
|
|
369
|
+
function pathsEqual(left, right) {
|
|
370
|
+
return normalizedPath(left) === normalizedPath(right);
|
|
371
|
+
}
|
|
372
|
+
function normalizedPath(value) {
|
|
373
|
+
const resolved = path_1.default.resolve(value);
|
|
374
|
+
return process.platform === 'win32' ? resolved.toLowerCase() : resolved;
|
|
375
|
+
}
|
|
376
|
+
function isRecord(value) {
|
|
377
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=ProjectEnvironment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectEnvironment.js","sourceRoot":"","sources":["../../src/env/ProjectEnvironment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { PyfigClient, PythonEmbeddingInfo, PythonEnvironment, PythonInfo } from 'pyfig';
|
|
2
|
+
/** Python selected by Pynect after its embedding requirements have been checked. */
|
|
3
|
+
export type SelectedPython = PythonInfo & {
|
|
4
|
+
embedding: PythonEmbeddingInfo;
|
|
5
|
+
};
|
|
6
|
+
type PynectPythonEnvironment = Omit<PythonEnvironment, 'python'> & {
|
|
7
|
+
python: SelectedPython;
|
|
8
|
+
};
|
|
9
|
+
export interface PynectPythonOptions {
|
|
10
|
+
autoInstallPython?: boolean;
|
|
11
|
+
autoInstallUv?: boolean;
|
|
12
|
+
autoCreateVirtualEnvironment?: boolean;
|
|
13
|
+
managedPython?: string;
|
|
14
|
+
pythonPath?: string;
|
|
15
|
+
pythonRange?: string;
|
|
16
|
+
projectRoot?: string;
|
|
17
|
+
uvVersion?: string;
|
|
18
|
+
env?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
export type PynectPyfigClient = PyfigClient;
|
|
21
|
+
export declare const createPynectPyfig: (options?: PynectPythonOptions) => PynectPyfigClient;
|
|
22
|
+
export declare const ensurePynectEnvironment: (options?: PynectPythonOptions) => Promise<{
|
|
23
|
+
client: PynectPyfigClient;
|
|
24
|
+
environment: PynectPythonEnvironment;
|
|
25
|
+
}>;
|
|
26
|
+
export declare const ensurePynectPython: (options?: PynectPythonOptions) => Promise<{
|
|
27
|
+
client: PynectPyfigClient;
|
|
28
|
+
python: SelectedPython;
|
|
29
|
+
}>;
|
|
30
|
+
export declare const pynectProjectRoot: (explicit?: string) => string;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=PyfigAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PyfigAdapter.d.ts","sourceRoot":"","sources":["../../src/env/PyfigAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACX,MAAM,OAAO,CAAC;AAEf,oFAAoF;AACpF,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG;IAAE,SAAS,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAE7E,KAAK,uBAAuB,GAAG,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG;IACjE,MAAM,EAAE,cAAc,CAAC;CACxB,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC;AAkB5C,eAAO,MAAM,iBAAiB,aAfA,mBAAmB,KAAG,iBAeM,CAAC;AAC3D,eAAO,MAAM,uBAAuB,aAfA,mBAAmB,KAAG,OAAO,CAAC;IAC9D,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,EAAE,uBAAuB,CAAC;CACtC,CAYmE,CAAC;AACvE,eAAO,MAAM,kBAAkB,aAZA,mBAAmB,KAAG,OAAO,CAAC;IACzD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,cAAc,CAAC;CACxB,CASyD,CAAC;AAC7D,eAAO,MAAM,iBAAiB,cATL,MAAM,KAAG,MASkB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pynectProjectRoot = exports.ensurePynectPython = exports.ensurePynectEnvironment = exports.createPynectPyfig = void 0;
|
|
4
|
+
// This CommonJS adapter is also used by install/build scripts before TypeScript is compiled.
|
|
5
|
+
const adapter = require('../../scripts/pyfig');
|
|
6
|
+
exports.createPynectPyfig = adapter.createPynectPyfig;
|
|
7
|
+
exports.ensurePynectEnvironment = adapter.ensurePynectEnvironment;
|
|
8
|
+
exports.ensurePynectPython = adapter.ensurePynectPython;
|
|
9
|
+
exports.pynectProjectRoot = adapter.projectRoot;
|
|
10
|
+
//# sourceMappingURL=PyfigAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PyfigAdapter.js","sourceRoot":"","sources":["../../src/env/PyfigAdapter.ts"],"names":[],"mappings":";;;AAyCA,6FAA6F;AAC7F,MAAM,OAAO,GAAG,OAAO,CAAC,qBAAqB,CAAkB,CAAC;AAEnD,QAAA,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;AAC9C,QAAA,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC;AAC1D,QAAA,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;AAChD,QAAA,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compatibility facade for callers that previously enumerated host Python
|
|
3
|
+
* installations. Pynect now exposes only its Pyfig-selected repository venv.
|
|
4
|
+
*/
|
|
5
|
+
export interface PythonInfo {
|
|
6
|
+
executable: string;
|
|
7
|
+
version: string;
|
|
8
|
+
major: number;
|
|
9
|
+
minor: number;
|
|
10
|
+
patch: number;
|
|
11
|
+
prefix: string;
|
|
12
|
+
isVirtualenv: boolean;
|
|
13
|
+
platform: string;
|
|
14
|
+
arch: string;
|
|
15
|
+
}
|
|
16
|
+
export interface DetectorOptions {
|
|
17
|
+
/** Minimum Python version required. Default: [3, 10]. */
|
|
18
|
+
minVersion?: [number, number];
|
|
19
|
+
/** Base interpreter to check before Pyfig's managed fallback. */
|
|
20
|
+
pythonPath?: string;
|
|
21
|
+
/** Timeout for synchronous compatibility probes. Default: 10000. */
|
|
22
|
+
timeout?: number;
|
|
23
|
+
/** Require an already prepared explicit root environment without fallback. */
|
|
24
|
+
explicitOnly?: boolean;
|
|
25
|
+
/** Modules that must be importable from the repository venv. */
|
|
26
|
+
requiredModules?: string[];
|
|
27
|
+
/** Repository root that owns `.venv`. Defaults to Pyfig discovery. */
|
|
28
|
+
projectRoot?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare class PythonDetector {
|
|
31
|
+
private readonly options;
|
|
32
|
+
constructor(options?: DetectorOptions);
|
|
33
|
+
detect(): Promise<PythonInfo>;
|
|
34
|
+
/** Probe through Pyfig; never executes the supplied interpreter directly. */
|
|
35
|
+
probe(executablePath: string): PythonInfo | null;
|
|
36
|
+
isCompatible(info: PythonInfo): boolean;
|
|
37
|
+
checkModules(executable: string, modules: string[]): string[];
|
|
38
|
+
/** The fixed-root policy intentionally exposes one selected interpreter. */
|
|
39
|
+
listAll(): Promise<PythonInfo[]>;
|
|
40
|
+
private selectionOptions;
|
|
41
|
+
}
|
|
42
|
+
export declare class PythonNotFoundError extends Error {
|
|
43
|
+
constructor(message: string);
|
|
44
|
+
}
|
|
45
|
+
export declare class PythonVersionError extends Error {
|
|
46
|
+
constructor(found: string, required: string);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=PythonDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PythonDetector.d.ts","sourceRoot":"","sources":["../../src/env/PythonDetector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,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;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAkBD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAEtB;gBAEU,OAAO,GAAE,eAAoB;IAWnC,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;IAwBnC,6EAA6E;IAC7E,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IA6BhD,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;IAKvC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAqB7D,4EAA4E;IACtE,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAItC,OAAO,CAAC,gBAAgB;CAWzB;AAwDD,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAI5C"}
|