pynect 0.0.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +503 -2
- package/SECURITY.md +34 -0
- package/binding.gyp +67 -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 +47 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/config/project.d.ts +113 -0
- package/dist/config/project.d.ts.map +1 -0
- package/dist/config/project.js +344 -0
- package/dist/config/project.js.map +1 -0
- package/dist/core/isolated-worker.d.ts +39 -0
- package/dist/core/isolated-worker.d.ts.map +1 -0
- package/dist/core/isolated-worker.js +178 -0
- package/dist/core/isolated-worker.js.map +1 -0
- package/dist/core/py-callable.d.ts +67 -0
- package/dist/core/py-callable.d.ts.map +1 -0
- package/dist/core/py-callable.js +104 -0
- package/dist/core/py-callable.js.map +1 -0
- package/dist/core/py-context.d.ts +76 -0
- package/dist/core/py-context.d.ts.map +1 -0
- package/dist/core/py-context.js +239 -0
- package/dist/core/py-context.js.map +1 -0
- package/dist/core/py-iterator.d.ts +84 -0
- package/dist/core/py-iterator.d.ts.map +1 -0
- package/dist/core/py-iterator.js +243 -0
- package/dist/core/py-iterator.js.map +1 -0
- package/dist/core/py-module.d.ts +53 -0
- package/dist/core/py-module.d.ts.map +1 -0
- package/dist/core/py-module.js +162 -0
- package/dist/core/py-module.js.map +1 -0
- package/dist/core/py-proxy.d.ts +75 -0
- package/dist/core/py-proxy.d.ts.map +1 -0
- package/dist/core/py-proxy.js +563 -0
- package/dist/core/py-proxy.js.map +1 -0
- package/dist/core/py-runtime.d.ts +113 -0
- package/dist/core/py-runtime.d.ts.map +1 -0
- package/dist/core/py-runtime.js +528 -0
- package/dist/core/py-runtime.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/env/package-installer.d.ts +232 -0
- package/dist/env/package-installer.d.ts.map +1 -0
- package/dist/env/package-installer.js +615 -0
- package/dist/env/package-installer.js.map +1 -0
- package/dist/env/project-environment.d.ts +64 -0
- package/dist/env/project-environment.d.ts.map +1 -0
- package/dist/env/project-environment.js +388 -0
- package/dist/env/project-environment.js.map +1 -0
- package/dist/env/pyfig-adapter.d.ts +38 -0
- package/dist/env/pyfig-adapter.d.ts.map +1 -0
- package/dist/env/pyfig-adapter.js +10 -0
- package/dist/env/pyfig-adapter.js.map +1 -0
- package/dist/env/python-detector.d.ts +48 -0
- package/dist/env/python-detector.d.ts.map +1 -0
- package/dist/env/python-detector.js +182 -0
- package/dist/env/python-detector.js.map +1 -0
- package/dist/env/python-provisioner.d.ts +16 -0
- package/dist/env/python-provisioner.d.ts.map +1 -0
- package/dist/env/python-provisioner.js +42 -0
- package/dist/env/python-provisioner.js.map +1 -0
- package/dist/env/venv-manager.d.ts +56 -0
- package/dist/env/venv-manager.d.ts.map +1 -0
- package/dist/env/venv-manager.js +160 -0
- package/dist/env/venv-manager.js.map +1 -0
- package/dist/index.d.ts +182 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +394 -0
- package/dist/index.js.map +1 -0
- package/dist/native/native-addon-loader.d.ts +13 -0
- package/dist/native/native-addon-loader.d.ts.map +1 -0
- package/dist/native/native-addon-loader.js +171 -0
- package/dist/native/native-addon-loader.js.map +1 -0
- package/dist/plugins/builtin/numpy-plugin.d.ts +17 -0
- package/dist/plugins/builtin/numpy-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/numpy-plugin.js +41 -0
- package/dist/plugins/builtin/numpy-plugin.js.map +1 -0
- package/dist/plugins/builtin/pandas-plugin.d.ts +19 -0
- package/dist/plugins/builtin/pandas-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/pandas-plugin.js +57 -0
- package/dist/plugins/builtin/pandas-plugin.js.map +1 -0
- package/dist/plugins/builtin/torch-plugin.d.ts +23 -0
- package/dist/plugins/builtin/torch-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/torch-plugin.js +50 -0
- package/dist/plugins/builtin/torch-plugin.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/plugins/plugin-manager.d.ts +26 -0
- package/dist/plugins/plugin-manager.d.ts.map +1 -0
- package/dist/plugins/plugin-manager.js +174 -0
- package/dist/plugins/plugin-manager.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/serialization/data-frame-bridge.d.ts +141 -0
- package/dist/serialization/data-frame-bridge.d.ts.map +1 -0
- package/dist/serialization/data-frame-bridge.js +355 -0
- package/dist/serialization/data-frame-bridge.js.map +1 -0
- package/dist/serialization/msg-pack-serializer.d.ts +45 -0
- package/dist/serialization/msg-pack-serializer.d.ts.map +1 -0
- package/dist/serialization/msg-pack-serializer.js +242 -0
- package/dist/serialization/msg-pack-serializer.js.map +1 -0
- package/dist/serialization/numpy-bridge.d.ts +96 -0
- package/dist/serialization/numpy-bridge.d.ts.map +1 -0
- package/dist/serialization/numpy-bridge.js +323 -0
- package/dist/serialization/numpy-bridge.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 +236 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +61 -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/error-translator.d.ts +83 -0
- package/dist/utils/error-translator.d.ts.map +1 -0
- package/dist/utils/error-translator.js +210 -0
- package/dist/utils/error-translator.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/memory-monitor.d.ts +43 -0
- package/dist/utils/memory-monitor.d.ts.map +1 -0
- package/dist/utils/memory-monitor.js +143 -0
- package/dist/utils/memory-monitor.js.map +1 -0
- package/package.json +93 -17
- package/prebuilds/darwin-arm64/pynect-prebuild.json +8 -0
- package/prebuilds/darwin-arm64/pynect_addon.node +0 -0
- package/prebuilds/darwin-x64/pynect-prebuild.json +8 -0
- package/prebuilds/darwin-x64/pynect_addon.node +0 -0
- package/prebuilds/linux-arm64/pynect-prebuild.json +9 -0
- package/prebuilds/linux-arm64/pynect_addon.node +0 -0
- package/prebuilds/linux-x64/pynect-prebuild.json +9 -0
- package/prebuilds/linux-x64/pynect_addon.node +0 -0
- package/prebuilds/win32-arm64/pynect-prebuild.json +8 -0
- package/prebuilds/win32-arm64/pynect_addon.node +0 -0
- package/prebuilds/win32-x64/pynect-prebuild.json +8 -0
- package/prebuilds/win32-x64/pynect_addon.node +0 -0
- 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 +128 -0
- package/scripts/python-provisioner.js +23 -0
- package/scripts/smoke-python-boundary.js +103 -0
- package/src/native/gil_guard.cpp +25 -0
- package/src/native/gil_guard.h +174 -0
- package/src/native/native-addon-loader.ts +218 -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,64 @@
|
|
|
1
|
+
import { type CanonicalPynectPackageManifest, type PynectModuleManifest, type ProjectConfigOverrides, type ResolvedProjectConfig } from '../config/project';
|
|
2
|
+
export interface PynectContribution {
|
|
3
|
+
packageName: string;
|
|
4
|
+
packageVersion: string;
|
|
5
|
+
packageRoot: string;
|
|
6
|
+
manifest: CanonicalPynectPackageManifest;
|
|
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
|
+
virtualEnvironment: string;
|
|
38
|
+
pythonAbi: string;
|
|
39
|
+
platform: NodeJS.Platform;
|
|
40
|
+
architecture: string;
|
|
41
|
+
contributors: Array<{
|
|
42
|
+
name: string;
|
|
43
|
+
version: string;
|
|
44
|
+
}>;
|
|
45
|
+
syncedAt: string;
|
|
46
|
+
}
|
|
47
|
+
export interface SyncProjectOptions extends ProjectConfigOverrides {
|
|
48
|
+
frozen?: boolean;
|
|
49
|
+
offline?: boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface SyncProjectResult {
|
|
52
|
+
plan: PynectProjectPlan;
|
|
53
|
+
state: PynectEnvironmentState;
|
|
54
|
+
lockfile: string;
|
|
55
|
+
}
|
|
56
|
+
export declare function createProjectPlan(overrides?: ProjectConfigOverrides): PynectProjectPlan;
|
|
57
|
+
export declare function discoverPynectContributions(projectRoot: string): PynectContribution[];
|
|
58
|
+
export declare function syncProject(options?: SyncProjectOptions): Promise<SyncProjectResult>;
|
|
59
|
+
export declare function validateProjectEnvironment(plan: PynectProjectPlan): PynectEnvironmentState;
|
|
60
|
+
export declare function requiresProjectSync(plan: PynectProjectPlan): boolean;
|
|
61
|
+
export declare function moduleDispatcherIncludes(plan: PynectProjectPlan): string[];
|
|
62
|
+
export declare function resolveExposedModule(id: string, projectRoot?: string): ExposedModule | undefined;
|
|
63
|
+
export declare function renderUvProject(plan: PynectProjectPlan): string;
|
|
64
|
+
//# sourceMappingURL=project-environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-environment.d.ts","sourceRoot":"","sources":["../../src/env/project-environment.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,8BAA8B,EACnC,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,8BAA8B,CAAC;IACzC,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,kBAAkB,EAAE,MAAM,CAAC;IAC3B,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,CAoEnB;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;AAuED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,iBAAiB,GAAG,sBAAsB,CA2B1F;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,CAwB/D"}
|
|
@@ -0,0 +1,388 @@
|
|
|
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 pyfig_adapter_1 = require("./pyfig-adapter");
|
|
20
|
+
const locking_1 = require("../utils/locking");
|
|
21
|
+
const PYPROJECT_FILE = 'pyproject.toml';
|
|
22
|
+
const UV_LOCK_FILE = 'uv.lock';
|
|
23
|
+
const MODULES_FILE = 'modules.json';
|
|
24
|
+
const STATE_FILE = '.pynect-state.json';
|
|
25
|
+
function createProjectPlan(overrides = {}) {
|
|
26
|
+
let config = (0, project_1.resolveProjectConfig)(overrides);
|
|
27
|
+
const contributions = discoverPynectContributions(config.projectRoot);
|
|
28
|
+
const manifestFor = (contribution) => contribution.root ? config.packageManifest : contribution.manifest;
|
|
29
|
+
const requirements = contributions.flatMap(contribution => (manifestFor(contribution).project.dependencies ?? []).map(requirement => ({
|
|
30
|
+
requirement,
|
|
31
|
+
packageName: contribution.packageName,
|
|
32
|
+
})));
|
|
33
|
+
const modules = {};
|
|
34
|
+
for (const contribution of contributions) {
|
|
35
|
+
for (const [alias, module] of Object.entries(manifestFor(contribution).tool.pynect.modules ?? {})) {
|
|
36
|
+
const id = `${contribution.packageName}:${alias}`;
|
|
37
|
+
if (modules[id])
|
|
38
|
+
throw new Error(`Duplicate Pynect module id: ${id}`);
|
|
39
|
+
modules[id] = { ...module, id, packageName: contribution.packageName };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const requirementOverrides = [
|
|
43
|
+
...(config.packageManifest.tool.uv['override-dependencies'] ?? []),
|
|
44
|
+
].sort();
|
|
45
|
+
const pythonConstraints = [
|
|
46
|
+
{ range: config.requiresPython, packageName: '<application>' },
|
|
47
|
+
...contributions
|
|
48
|
+
.filter(contribution => !contribution.root && contribution.manifest.project['requires-python'])
|
|
49
|
+
.map(contribution => ({
|
|
50
|
+
range: contribution.manifest.project['requires-python'],
|
|
51
|
+
packageName: contribution.packageName,
|
|
52
|
+
})),
|
|
53
|
+
];
|
|
54
|
+
const { pythonRange, pythonRequirement } = combinePythonRequirements(pythonConstraints);
|
|
55
|
+
if (!config.managedPythonExplicit && !pythonVersionSatisfies(config.managedPython, pythonRange)) {
|
|
56
|
+
config = { ...config, managedPython: managedPythonForRange(pythonRange) };
|
|
57
|
+
}
|
|
58
|
+
const manifestHash = sha256(stableJson({
|
|
59
|
+
schemaVersion: 1,
|
|
60
|
+
project: {
|
|
61
|
+
name: config.packageManifest.project.name,
|
|
62
|
+
version: config.packageManifest.project.version,
|
|
63
|
+
},
|
|
64
|
+
pythonRange,
|
|
65
|
+
pythonRequirement,
|
|
66
|
+
requirements: [...requirements].sort(compareRequirements),
|
|
67
|
+
overrides: requirementOverrides,
|
|
68
|
+
modules,
|
|
69
|
+
}));
|
|
70
|
+
const generatedDirectory = config.generatedDirectory;
|
|
71
|
+
return {
|
|
72
|
+
config,
|
|
73
|
+
contributions,
|
|
74
|
+
requirements,
|
|
75
|
+
overrides: requirementOverrides,
|
|
76
|
+
modules,
|
|
77
|
+
pythonRange,
|
|
78
|
+
pythonRequirement,
|
|
79
|
+
manifestHash,
|
|
80
|
+
generatedDirectory,
|
|
81
|
+
pyprojectFile: path_1.default.join(generatedDirectory, PYPROJECT_FILE),
|
|
82
|
+
generatedLockfile: path_1.default.join(generatedDirectory, UV_LOCK_FILE),
|
|
83
|
+
modulesFile: path_1.default.join(generatedDirectory, MODULES_FILE),
|
|
84
|
+
stateFile: path_1.default.join(generatedDirectory, STATE_FILE),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function discoverPynectContributions(projectRoot) {
|
|
88
|
+
const rootPackage = readPackage(path_1.default.join(projectRoot, 'package.json'));
|
|
89
|
+
const queue = [
|
|
90
|
+
{ directory: projectRoot, packageJson: rootPackage, root: true },
|
|
91
|
+
];
|
|
92
|
+
const visited = new Set();
|
|
93
|
+
const contributions = [];
|
|
94
|
+
while (queue.length > 0) {
|
|
95
|
+
const current = queue.shift();
|
|
96
|
+
const realDirectory = fs_1.default.realpathSync.native(current.directory);
|
|
97
|
+
if (visited.has(realDirectory))
|
|
98
|
+
continue;
|
|
99
|
+
visited.add(realDirectory);
|
|
100
|
+
if (current.root || current.packageJson.pynect !== undefined) {
|
|
101
|
+
const packagePath = path_1.default.join(current.directory, 'package.json');
|
|
102
|
+
const manifest = (0, project_1.validatePackageManifest)(current.packageJson.pynect ?? {}, packagePath);
|
|
103
|
+
if (!current.root)
|
|
104
|
+
assertTransitiveManifest(manifest, current.packageJson.name, packagePath);
|
|
105
|
+
contributions.push({
|
|
106
|
+
packageName: current.packageJson.name,
|
|
107
|
+
packageVersion: current.packageJson.version,
|
|
108
|
+
packageRoot: current.directory,
|
|
109
|
+
manifest,
|
|
110
|
+
root: current.root,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const dependencyNames = Object.keys({
|
|
114
|
+
...current.packageJson.dependencies,
|
|
115
|
+
...current.packageJson.optionalDependencies,
|
|
116
|
+
...(current.root ? current.packageJson.devDependencies : {}),
|
|
117
|
+
}).sort();
|
|
118
|
+
for (const dependencyName of dependencyNames) {
|
|
119
|
+
const directory = (0, project_1.resolveInstalledPackageDirectory)(current.directory, dependencyName);
|
|
120
|
+
if (!directory)
|
|
121
|
+
continue;
|
|
122
|
+
queue.push({
|
|
123
|
+
directory,
|
|
124
|
+
packageJson: readPackage(path_1.default.join(directory, 'package.json')),
|
|
125
|
+
root: false,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return contributions.sort((left, right) => left.packageName.localeCompare(right.packageName) ||
|
|
130
|
+
left.packageRoot.localeCompare(right.packageRoot));
|
|
131
|
+
}
|
|
132
|
+
async function syncProject(options = {}) {
|
|
133
|
+
const plan = createProjectPlan(options);
|
|
134
|
+
fs_1.default.mkdirSync(plan.generatedDirectory, { recursive: true });
|
|
135
|
+
const locked = await (0, locking_1.withPynectLock)({ projectRoot: plan.config.projectRoot }, async () => syncProjectUnlocked(plan, options), undefined, {
|
|
136
|
+
key: `pynect-sync:${normalizedPath(plan.config.projectRoot)}`,
|
|
137
|
+
name: 'Pynect project sync',
|
|
138
|
+
namespace: 'pynect',
|
|
139
|
+
});
|
|
140
|
+
if (locked.context.state !== 'executed' || !locked.value) {
|
|
141
|
+
throw new Error(`Loqkit did not execute project synchronization: ${locked.context.state}.`);
|
|
142
|
+
}
|
|
143
|
+
return locked.value;
|
|
144
|
+
}
|
|
145
|
+
async function syncProjectUnlocked(plan, options) {
|
|
146
|
+
writeGeneratedProject(plan);
|
|
147
|
+
if (options.frozen)
|
|
148
|
+
stageFrozenLock(plan);
|
|
149
|
+
const client = (0, pyfig_adapter_1.createPynectPyfig)({
|
|
150
|
+
projectRoot: plan.config.projectRoot,
|
|
151
|
+
pythonPath: plan.config.python,
|
|
152
|
+
pythonRange: plan.pythonRange,
|
|
153
|
+
managedPython: plan.config.managedPython,
|
|
154
|
+
uvVersion: plan.config.uvVersion,
|
|
155
|
+
autoInstallPython: plan.config.installPython,
|
|
156
|
+
autoInstallUv: plan.config.installUv,
|
|
157
|
+
autoCreateVirtualEnvironment: plan.config.createVirtualEnvironment,
|
|
158
|
+
env: plan.config.env,
|
|
159
|
+
});
|
|
160
|
+
const environment = await client.prepare();
|
|
161
|
+
if (!environment.python.virtualEnvironment) {
|
|
162
|
+
throw new Error('Pyfig did not select a virtual environment for Pynect synchronization.');
|
|
163
|
+
}
|
|
164
|
+
const syncArgs = [
|
|
165
|
+
'sync',
|
|
166
|
+
'--project',
|
|
167
|
+
plan.generatedDirectory,
|
|
168
|
+
'--no-dev',
|
|
169
|
+
'--active',
|
|
170
|
+
];
|
|
171
|
+
if (options.frozen)
|
|
172
|
+
syncArgs.push('--locked');
|
|
173
|
+
if (options.offline)
|
|
174
|
+
syncArgs.push('--offline');
|
|
175
|
+
const synced = await runChild(await client.uv(syncArgs, {
|
|
176
|
+
cwd: plan.config.projectRoot,
|
|
177
|
+
env: {
|
|
178
|
+
...plan.config.env,
|
|
179
|
+
VIRTUAL_ENV: environment.python.virtualEnvironment,
|
|
180
|
+
},
|
|
181
|
+
}));
|
|
182
|
+
if (synced.code !== 0) {
|
|
183
|
+
throw resolutionError(plan, synced.output);
|
|
184
|
+
}
|
|
185
|
+
if (!options.frozen)
|
|
186
|
+
atomicWrite(plan.config.lockfile, fs_1.default.readFileSync(plan.generatedLockfile, 'utf8'));
|
|
187
|
+
const lockHash = sha256(fs_1.default.readFileSync(plan.config.lockfile));
|
|
188
|
+
const python = environment.python;
|
|
189
|
+
const state = {
|
|
190
|
+
schemaVersion: 1,
|
|
191
|
+
manifestHash: plan.manifestHash,
|
|
192
|
+
lockHash,
|
|
193
|
+
pythonVersion: python.version,
|
|
194
|
+
pythonExecutable: python.executable,
|
|
195
|
+
virtualEnvironment: environment.python.virtualEnvironment,
|
|
196
|
+
pythonAbi: `${python.implementation}-${python.version}-${python.architecture}-${python.pointerBits}`,
|
|
197
|
+
platform: process.platform,
|
|
198
|
+
architecture: process.arch,
|
|
199
|
+
contributors: plan.contributions.map(contribution => ({
|
|
200
|
+
name: contribution.packageName,
|
|
201
|
+
version: contribution.packageVersion,
|
|
202
|
+
})),
|
|
203
|
+
syncedAt: new Date().toISOString(),
|
|
204
|
+
};
|
|
205
|
+
atomicWrite(plan.stateFile, `${JSON.stringify(state, null, 2)}\n`);
|
|
206
|
+
return { plan, state, lockfile: plan.config.lockfile };
|
|
207
|
+
}
|
|
208
|
+
function validateProjectEnvironment(plan) {
|
|
209
|
+
if (!fs_1.default.existsSync(plan.config.lockfile)) {
|
|
210
|
+
throw staleEnvironmentError(plan, `lockfile is missing at ${plan.config.lockfile}`);
|
|
211
|
+
}
|
|
212
|
+
if (!fs_1.default.existsSync(plan.stateFile)) {
|
|
213
|
+
throw staleEnvironmentError(plan, `environment state is missing at ${plan.stateFile}`);
|
|
214
|
+
}
|
|
215
|
+
let state;
|
|
216
|
+
try {
|
|
217
|
+
state = JSON.parse(fs_1.default.readFileSync(plan.stateFile, 'utf8'));
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
throw staleEnvironmentError(plan, `environment state is invalid: ${error.message}`);
|
|
221
|
+
}
|
|
222
|
+
const lockHash = sha256(fs_1.default.readFileSync(plan.config.lockfile));
|
|
223
|
+
if (state.schemaVersion !== 1 || state.manifestHash !== plan.manifestHash) {
|
|
224
|
+
throw staleEnvironmentError(plan, 'package manifests changed since the last sync');
|
|
225
|
+
}
|
|
226
|
+
if (state.lockHash !== lockHash) {
|
|
227
|
+
throw staleEnvironmentError(plan, 'lockfile changed since the last sync');
|
|
228
|
+
}
|
|
229
|
+
if (state.platform !== process.platform || state.architecture !== process.arch) {
|
|
230
|
+
throw staleEnvironmentError(plan, 'environment was synchronized for another platform');
|
|
231
|
+
}
|
|
232
|
+
if (!state.virtualEnvironment || !fs_1.default.existsSync(state.pythonExecutable)) {
|
|
233
|
+
throw staleEnvironmentError(plan, 'recorded Python environment is missing');
|
|
234
|
+
}
|
|
235
|
+
return state;
|
|
236
|
+
}
|
|
237
|
+
function requiresProjectSync(plan) {
|
|
238
|
+
return plan.requirements.length > 0 || plan.contributions.some(contribution => !contribution.root);
|
|
239
|
+
}
|
|
240
|
+
function moduleDispatcherIncludes(plan) {
|
|
241
|
+
return [...new Set(Object.values(plan.modules).flatMap(module => {
|
|
242
|
+
const patterns = module.include?.length ? module.include : ['*'];
|
|
243
|
+
return patterns.map(pattern => pattern === module.import || pattern.startsWith(`${module.import}.`)
|
|
244
|
+
? pattern
|
|
245
|
+
: `${module.import}.${pattern}`);
|
|
246
|
+
}))].sort();
|
|
247
|
+
}
|
|
248
|
+
function resolveExposedModule(id, projectRoot) {
|
|
249
|
+
const plan = createProjectPlan({ projectRoot });
|
|
250
|
+
return plan.modules[id];
|
|
251
|
+
}
|
|
252
|
+
function writeGeneratedProject(plan) {
|
|
253
|
+
atomicWrite(plan.pyprojectFile, renderUvProject(plan));
|
|
254
|
+
atomicWrite(plan.modulesFile, `${JSON.stringify(plan.modules, null, 2)}\n`);
|
|
255
|
+
}
|
|
256
|
+
function renderUvProject(plan) {
|
|
257
|
+
const requirements = [...new Set(plan.requirements.map(item => item.requirement))].sort();
|
|
258
|
+
const project = plan.config.packageManifest.project;
|
|
259
|
+
const lines = [
|
|
260
|
+
'# Generated by Pynect. Configure package.json#pynect or the Pynect API, not this file.',
|
|
261
|
+
'[project]',
|
|
262
|
+
`name = ${JSON.stringify(project.name ?? 'pynect-environment')}`,
|
|
263
|
+
`version = ${JSON.stringify(project.version ?? '0.0.0')}`,
|
|
264
|
+
`requires-python = ${JSON.stringify(plan.pythonRequirement)}`,
|
|
265
|
+
'dependencies = [',
|
|
266
|
+
...requirements.map(requirement => ` ${JSON.stringify(requirement)},`),
|
|
267
|
+
']',
|
|
268
|
+
'',
|
|
269
|
+
'[tool.uv]',
|
|
270
|
+
'package = false',
|
|
271
|
+
];
|
|
272
|
+
if (plan.overrides.length > 0) {
|
|
273
|
+
lines.push('override-dependencies = [', ...plan.overrides.map(requirement => ` ${JSON.stringify(requirement)},`), ']');
|
|
274
|
+
}
|
|
275
|
+
return `${lines.join('\n')}\n`;
|
|
276
|
+
}
|
|
277
|
+
function stageFrozenLock(plan) {
|
|
278
|
+
if (!fs_1.default.existsSync(plan.config.lockfile)) {
|
|
279
|
+
throw new Error(`Frozen sync requires an existing lockfile at ${plan.config.lockfile}.`);
|
|
280
|
+
}
|
|
281
|
+
atomicWrite(plan.generatedLockfile, fs_1.default.readFileSync(plan.config.lockfile, 'utf8'));
|
|
282
|
+
}
|
|
283
|
+
function resolutionError(plan, output) {
|
|
284
|
+
const origins = plan.requirements
|
|
285
|
+
.map(item => ` ${item.packageName} requires ${item.requirement}`)
|
|
286
|
+
.join('\n');
|
|
287
|
+
return new Error(`Unable to resolve Python requirements:${origins ? `\n\n${origins}` : ''}` +
|
|
288
|
+
`\n\nuv reported:\n${output.trim()}`);
|
|
289
|
+
}
|
|
290
|
+
function staleEnvironmentError(plan, detail) {
|
|
291
|
+
return new Error(`Pynect environment is not synchronized: ${detail}. Run "pynect sync" ` +
|
|
292
|
+
`from ${plan.config.projectRoot}.`);
|
|
293
|
+
}
|
|
294
|
+
function assertTransitiveManifest(manifest, packageName, source) {
|
|
295
|
+
const policyKeys = [
|
|
296
|
+
...Object.keys(manifest.tool.pynect)
|
|
297
|
+
.filter(key => key !== 'modules' &&
|
|
298
|
+
manifest.tool.pynect[key] !== undefined)
|
|
299
|
+
.map(key => `tool.pynect.${key}`),
|
|
300
|
+
...Object.keys(manifest.tool.uv)
|
|
301
|
+
.filter(key => key !== 'package' && manifest.tool.uv[key] !== undefined)
|
|
302
|
+
.map(key => `tool.uv.${key}`),
|
|
303
|
+
];
|
|
304
|
+
if (policyKeys.length > 0) {
|
|
305
|
+
throw new TypeError(`${source}: transitive package ${packageName} cannot set application policy: ` +
|
|
306
|
+
policyKeys.join(', '));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function combinePythonRequirements(constraints) {
|
|
310
|
+
const pythonRequirement = constraints
|
|
311
|
+
.map(constraint => constraint.range.trim().replace(/\s+(?=[<>=!~])/g, ','))
|
|
312
|
+
.filter(Boolean)
|
|
313
|
+
.join(',');
|
|
314
|
+
const candidate = pythonRequirement.replace(/,/g, ' ');
|
|
315
|
+
const pythonRange = semver_1.default.validRange(candidate);
|
|
316
|
+
if (!pythonRange || !semver_1.default.minVersion(pythonRange)) {
|
|
317
|
+
throw new Error('Unable to resolve Python version requirements:\n\n' +
|
|
318
|
+
constraints.map(item => ` ${item.packageName} requires Python ${item.range}`).join('\n'));
|
|
319
|
+
}
|
|
320
|
+
return { pythonRange, pythonRequirement };
|
|
321
|
+
}
|
|
322
|
+
function pythonVersionSatisfies(version, range) {
|
|
323
|
+
const normalized = semver_1.default.coerce(version)?.version;
|
|
324
|
+
return normalized !== undefined && semver_1.default.satisfies(normalized, range);
|
|
325
|
+
}
|
|
326
|
+
function managedPythonForRange(range) {
|
|
327
|
+
const minimum = semver_1.default.minVersion(range);
|
|
328
|
+
if (!minimum)
|
|
329
|
+
throw new TypeError(`Python range has no installable version: ${range}`);
|
|
330
|
+
return `${minimum.major}.${minimum.minor}`;
|
|
331
|
+
}
|
|
332
|
+
function readPackage(packagePath) {
|
|
333
|
+
let value;
|
|
334
|
+
try {
|
|
335
|
+
value = JSON.parse(fs_1.default.readFileSync(packagePath, 'utf8'));
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
throw new Error(`Unable to read ${packagePath}: ${error.message}`);
|
|
339
|
+
}
|
|
340
|
+
if (!isRecord(value))
|
|
341
|
+
throw new TypeError(`${packagePath} must contain an object.`);
|
|
342
|
+
return {
|
|
343
|
+
...value,
|
|
344
|
+
name: typeof value['name'] === 'string' ? value['name'] : path_1.default.basename(path_1.default.dirname(packagePath)),
|
|
345
|
+
version: typeof value['version'] === 'string' ? value['version'] : '0.0.0',
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
async function runChild(child) {
|
|
349
|
+
return new Promise((resolve, reject) => {
|
|
350
|
+
let output = '';
|
|
351
|
+
child.stdout?.on('data', chunk => { output += String(chunk); });
|
|
352
|
+
child.stderr?.on('data', chunk => { output += String(chunk); });
|
|
353
|
+
child.on('error', reject);
|
|
354
|
+
child.on('close', code => resolve({ code: code ?? 1, output }));
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
function atomicWrite(destination, contents) {
|
|
358
|
+
fs_1.default.mkdirSync(path_1.default.dirname(destination), { recursive: true });
|
|
359
|
+
const temporary = `${destination}.${process.pid}.${Date.now()}.tmp`;
|
|
360
|
+
fs_1.default.writeFileSync(temporary, contents, 'utf8');
|
|
361
|
+
fs_1.default.renameSync(temporary, destination);
|
|
362
|
+
}
|
|
363
|
+
function sha256(value) {
|
|
364
|
+
return (0, crypto_1.createHash)('sha256').update(value).digest('hex');
|
|
365
|
+
}
|
|
366
|
+
function stableJson(value) {
|
|
367
|
+
if (Array.isArray(value))
|
|
368
|
+
return `[${value.map(stableJson).join(',')}]`;
|
|
369
|
+
if (isRecord(value)) {
|
|
370
|
+
return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${stableJson(value[key])}`).join(',')}}`;
|
|
371
|
+
}
|
|
372
|
+
return JSON.stringify(value);
|
|
373
|
+
}
|
|
374
|
+
function compareRequirements(left, right) {
|
|
375
|
+
return left.requirement.localeCompare(right.requirement) ||
|
|
376
|
+
left.packageName.localeCompare(right.packageName);
|
|
377
|
+
}
|
|
378
|
+
function pathsEqual(left, right) {
|
|
379
|
+
return normalizedPath(left) === normalizedPath(right);
|
|
380
|
+
}
|
|
381
|
+
function normalizedPath(value) {
|
|
382
|
+
const resolved = path_1.default.resolve(value);
|
|
383
|
+
return process.platform === 'win32' ? resolved.toLowerCase() : resolved;
|
|
384
|
+
}
|
|
385
|
+
function isRecord(value) {
|
|
386
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=project-environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-environment.js","sourceRoot":"","sources":["../../src/env/project-environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { PyfigClient, PythonEmbeddingInfo, PythonEnvironment, PythonInfo } from 'pyfig';
|
|
2
|
+
import type { ChildProcess, SpawnOptions, SpawnSyncOptions, SpawnSyncReturns } from 'child_process';
|
|
3
|
+
/** Python selected by Pynect after its embedding requirements have been checked. */
|
|
4
|
+
export type SelectedPython = PythonInfo & {
|
|
5
|
+
embedding: PythonEmbeddingInfo;
|
|
6
|
+
};
|
|
7
|
+
type PynectPythonEnvironment = Omit<PythonEnvironment, 'python'> & {
|
|
8
|
+
python: SelectedPython;
|
|
9
|
+
};
|
|
10
|
+
export interface PynectPythonOptions {
|
|
11
|
+
autoInstallPython?: boolean;
|
|
12
|
+
autoInstallUv?: boolean;
|
|
13
|
+
autoCreateVirtualEnvironment?: boolean;
|
|
14
|
+
managedPython?: string;
|
|
15
|
+
pythonPath?: string;
|
|
16
|
+
pythonRange?: string;
|
|
17
|
+
projectRoot?: string;
|
|
18
|
+
uvVersion?: string;
|
|
19
|
+
env?: Record<string, string>;
|
|
20
|
+
}
|
|
21
|
+
export type PynectPyfigClient = PyfigClient & {
|
|
22
|
+
python(args?: readonly string[], options?: SpawnOptions): Promise<ChildProcess>;
|
|
23
|
+
pythonSync(args?: readonly string[], options?: SpawnSyncOptions): SpawnSyncReturns<string | Buffer>;
|
|
24
|
+
pip(args?: readonly string[], options?: SpawnOptions): Promise<ChildProcess>;
|
|
25
|
+
pipSync(args?: readonly string[], options?: SpawnSyncOptions): SpawnSyncReturns<string | Buffer>;
|
|
26
|
+
};
|
|
27
|
+
export declare const createPynectPyfig: (options?: PynectPythonOptions) => PynectPyfigClient;
|
|
28
|
+
export declare const ensurePynectEnvironment: (options?: PynectPythonOptions) => Promise<{
|
|
29
|
+
client: PynectPyfigClient;
|
|
30
|
+
environment: PynectPythonEnvironment;
|
|
31
|
+
}>;
|
|
32
|
+
export declare const ensurePynectPython: (options?: PynectPythonOptions) => Promise<{
|
|
33
|
+
client: PynectPyfigClient;
|
|
34
|
+
python: SelectedPython;
|
|
35
|
+
}>;
|
|
36
|
+
export declare const pynectProjectRoot: (explicit?: string) => string;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=pyfig-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pyfig-adapter.d.ts","sourceRoot":"","sources":["../../src/env/pyfig-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACX,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAEvB,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,GAAG;IAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAChF,UAAU,CACR,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE,gBAAgB,GACzB,gBAAgB,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7E,OAAO,CACL,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE,gBAAgB,GACzB,gBAAgB,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CACtC,CAAC;AAkBF,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=pyfig-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pyfig-adapter.js","sourceRoot":"","sources":["../../src/env/pyfig-adapter.ts"],"names":[],"mappings":";;;AA0DA,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
|
+
/** Application root that owns the Pyfig environment. 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=python-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-detector.d.ts","sourceRoot":"","sources":["../../src/env/python-detector.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,qFAAqF;IACrF,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"}
|