nodepyx 1.0.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 +22 -0
- package/README.md +399 -0
- package/binding.gyp +73 -0
- package/dist/core/PyCallable.d.ts +65 -0
- package/dist/core/PyCallable.d.ts.map +1 -0
- package/dist/core/PyCallable.js +109 -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 +228 -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 +55 -0
- package/dist/core/PyModule.d.ts.map +1 -0
- package/dist/core/PyModule.js +172 -0
- package/dist/core/PyModule.js.map +1 -0
- package/dist/core/PyProxy.d.ts +65 -0
- package/dist/core/PyProxy.d.ts.map +1 -0
- package/dist/core/PyProxy.js +483 -0
- package/dist/core/PyProxy.js.map +1 -0
- package/dist/core/PyRuntime.d.ts +105 -0
- package/dist/core/PyRuntime.d.ts.map +1 -0
- package/dist/core/PyRuntime.js +438 -0
- package/dist/core/PyRuntime.js.map +1 -0
- package/dist/env/CondaManager.d.ts +118 -0
- package/dist/env/CondaManager.d.ts.map +1 -0
- package/dist/env/CondaManager.js +401 -0
- package/dist/env/CondaManager.js.map +1 -0
- package/dist/env/PackageInstaller.d.ts +233 -0
- package/dist/env/PackageInstaller.d.ts.map +1 -0
- package/dist/env/PackageInstaller.js +609 -0
- package/dist/env/PackageInstaller.js.map +1 -0
- package/dist/env/PythonDetector.d.ts +103 -0
- package/dist/env/PythonDetector.d.ts.map +1 -0
- package/dist/env/PythonDetector.js +381 -0
- package/dist/env/PythonDetector.js.map +1 -0
- package/dist/env/VenvManager.d.ts +117 -0
- package/dist/env/VenvManager.d.ts.map +1 -0
- package/dist/env/VenvManager.js +331 -0
- package/dist/env/VenvManager.js.map +1 -0
- package/dist/index.d.ts +169 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +393 -0
- package/dist/index.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/PythonTypeMapper.d.ts +87 -0
- package/dist/types/PythonTypeMapper.d.ts.map +1 -0
- package/dist/types/PythonTypeMapper.js +449 -0
- package/dist/types/PythonTypeMapper.js.map +1 -0
- package/dist/types/StubCache.d.ts +109 -0
- package/dist/types/StubCache.d.ts.map +1 -0
- package/dist/types/StubCache.js +333 -0
- package/dist/types/StubCache.js.map +1 -0
- package/dist/types/TypeGenerator.d.ts +139 -0
- package/dist/types/TypeGenerator.d.ts.map +1 -0
- package/dist/types/TypeGenerator.js +372 -0
- package/dist/types/TypeGenerator.js.map +1 -0
- package/dist/types/addon.d.ts +114 -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 +175 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +35 -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/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 +44 -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 +177 -0
- package/python/error_handler.py +433 -0
- package/python/nodepyx_runtime.py +575 -0
- package/python/serializer.py +379 -0
- package/python/type_inspector.py +288 -0
- package/scripts/build-native.js +68 -0
- package/scripts/download-prebuilds.js +99 -0
- package/scripts/generate-stubs.js +405 -0
- package/scripts/install.js +260 -0
- package/src/core/PyCallable.ts +137 -0
- package/src/core/PyContext.ts +296 -0
- package/src/core/PyIterator.ts +294 -0
- package/src/core/PyModule.ts +194 -0
- package/src/core/PyProxy.ts +605 -0
- package/src/core/PyRuntime.ts +504 -0
- package/src/env/CondaManager.ts +451 -0
- package/src/env/PackageInstaller.ts +738 -0
- package/src/env/PythonDetector.ts +414 -0
- package/src/env/VenvManager.ts +396 -0
- package/src/index.ts +425 -0
- package/src/native/gil_guard.cpp +26 -0
- package/src/native/gil_guard.h +175 -0
- package/src/native/nodepyx_addon.cpp +886 -0
- package/src/native/python_bridge.cpp +790 -0
- package/src/native/python_bridge.h +257 -0
- package/src/native/thread_pool.cpp +336 -0
- package/src/native/thread_pool.h +175 -0
- package/src/native/type_converter.cpp +901 -0
- package/src/native/type_converter.h +272 -0
- package/src/nextjs/PyProvider.tsx +123 -0
- package/src/nextjs/index.ts +21 -0
- package/src/nextjs/usePython.ts +106 -0
- package/src/nextjs/withnodepyx.ts +88 -0
- package/src/plugins/Plugin.interface.ts +51 -0
- package/src/plugins/PluginManager.ts +155 -0
- package/src/plugins/builtin/NumpyPlugin.ts +36 -0
- package/src/plugins/builtin/PandasPlugin.ts +49 -0
- package/src/plugins/builtin/TorchPlugin.ts +56 -0
- package/src/plugins/index.ts +7 -0
- package/src/serialization/DataFrameBridge.ts +398 -0
- package/src/serialization/MsgPackSerializer.ts +220 -0
- package/src/serialization/NumpyBridge.ts +332 -0
- package/src/serialization/Serializer.ts +320 -0
- package/src/types/PythonTypeMapper.ts +495 -0
- package/src/types/StubCache.ts +340 -0
- package/src/types/TypeGenerator.ts +491 -0
- package/src/types/addon.ts +170 -0
- package/src/types/config.ts +226 -0
- package/src/types/index.ts +55 -0
- package/src/types/python.ts +309 -0
- package/src/types/stubs/numpy.d.ts +441 -0
- package/src/types/stubs/pandas.d.ts +575 -0
- package/src/types/stubs/sklearn.d.ts +728 -0
- package/src/types/stubs/torch.d.ts +694 -0
- package/src/utils/ErrorTranslator.ts +220 -0
- package/src/utils/Logger.ts +119 -0
- package/src/utils/MemoryMonitor.ts +175 -0
|
@@ -0,0 +1,609 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* nodepyx — PackageInstaller
|
|
4
|
+
*
|
|
5
|
+
* Standalone pip-based package installer that works both inside and outside
|
|
6
|
+
* virtualenv/conda contexts. It is the single place where all pip interaction
|
|
7
|
+
* is concentrated so that VenvManager, CondaManager, and the public nodepyx API
|
|
8
|
+
* all delegate here instead of shelling out to pip themselves.
|
|
9
|
+
*
|
|
10
|
+
* Responsibilities
|
|
11
|
+
* ──────────────────────────────────────────────────────────────────────────────
|
|
12
|
+
* • Resolve the "import name" from the "install name" (e.g. scikit-learn → sklearn)
|
|
13
|
+
* • Check whether a package is already importable before trying to install it
|
|
14
|
+
* • Run pip with the correct flags (--quiet, --no-warn-script-location, etc.)
|
|
15
|
+
* • Support per-package version constraints ("numpy>=1.24,<2")
|
|
16
|
+
* • Support extras ("uvicorn[standard]")
|
|
17
|
+
* • Support index overrides (corporate PyPI mirrors, --extra-index-url)
|
|
18
|
+
* • Upgrade existing installations when requested
|
|
19
|
+
* • Emit structured progress events via EventEmitter
|
|
20
|
+
* • Retry transient network failures up to N times with back-off
|
|
21
|
+
* • Parse pip's JSON output (--report) for installed metadata when available
|
|
22
|
+
* • Return full InstallResult objects describing what happened
|
|
23
|
+
*
|
|
24
|
+
* Usage
|
|
25
|
+
* ──────────────────────────────────────────────────────────────────────────────
|
|
26
|
+
* const installer = new PackageInstaller({ pythonExecutable: '/usr/bin/python3' });
|
|
27
|
+
*
|
|
28
|
+
* const result = await installer.install(['pandas', 'numpy>=1.24', 'torch']);
|
|
29
|
+
* console.log(result.installed); // ['pandas==2.2.2', 'numpy==1.26.4', ...]
|
|
30
|
+
*
|
|
31
|
+
* installer.on('progress', (ev) => console.log(ev.package, ev.status));
|
|
32
|
+
*/
|
|
33
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
34
|
+
if (k2 === undefined) k2 = k;
|
|
35
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
36
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
37
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
38
|
+
}
|
|
39
|
+
Object.defineProperty(o, k2, desc);
|
|
40
|
+
}) : (function(o, m, k, k2) {
|
|
41
|
+
if (k2 === undefined) k2 = k;
|
|
42
|
+
o[k2] = m[k];
|
|
43
|
+
}));
|
|
44
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
45
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
46
|
+
}) : function(o, v) {
|
|
47
|
+
o["default"] = v;
|
|
48
|
+
});
|
|
49
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
50
|
+
var ownKeys = function(o) {
|
|
51
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
52
|
+
var ar = [];
|
|
53
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
54
|
+
return ar;
|
|
55
|
+
};
|
|
56
|
+
return ownKeys(o);
|
|
57
|
+
};
|
|
58
|
+
return function (mod) {
|
|
59
|
+
if (mod && mod.__esModule) return mod;
|
|
60
|
+
var result = {};
|
|
61
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
62
|
+
__setModuleDefault(result, mod);
|
|
63
|
+
return result;
|
|
64
|
+
};
|
|
65
|
+
})();
|
|
66
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
67
|
+
exports.INSTALL_TO_IMPORT = exports.PackageInstaller = void 0;
|
|
68
|
+
exports.createSystemInstaller = createSystemInstaller;
|
|
69
|
+
exports.createVenvInstaller = createVenvInstaller;
|
|
70
|
+
exports.resolveImportName = resolveImportName;
|
|
71
|
+
exports.extractPackageName = extractPackageName;
|
|
72
|
+
const events_1 = require("events");
|
|
73
|
+
const child_process_1 = require("child_process");
|
|
74
|
+
const fs = __importStar(require("fs"));
|
|
75
|
+
const path = __importStar(require("path"));
|
|
76
|
+
const Logger_1 = require("../utils/Logger");
|
|
77
|
+
const logger = new Logger_1.Logger('PackageInstaller');
|
|
78
|
+
// ─── Import-name alias table ──────────────────────────────────────────────────
|
|
79
|
+
// Maps pip install name → Python import name.
|
|
80
|
+
// Only entries that differ from the install name need to be listed here.
|
|
81
|
+
const INSTALL_TO_IMPORT = {
|
|
82
|
+
'scikit-learn': 'sklearn',
|
|
83
|
+
'scikit_learn': 'sklearn',
|
|
84
|
+
'Pillow': 'PIL',
|
|
85
|
+
'pillow': 'PIL',
|
|
86
|
+
'opencv-python': 'cv2',
|
|
87
|
+
'opencv-python-headless': 'cv2',
|
|
88
|
+
'opencv_python': 'cv2',
|
|
89
|
+
'beautifulsoup4': 'bs4',
|
|
90
|
+
'beautifulsoup': 'bs4',
|
|
91
|
+
'pyyaml': 'yaml',
|
|
92
|
+
'PyYAML': 'yaml',
|
|
93
|
+
'python-dateutil': 'dateutil',
|
|
94
|
+
'python_dateutil': 'dateutil',
|
|
95
|
+
'typing-extensions': 'typing_extensions',
|
|
96
|
+
'typing_extensions': 'typing_extensions',
|
|
97
|
+
'pyzmq': 'zmq',
|
|
98
|
+
'Pyzmq': 'zmq',
|
|
99
|
+
'protobuf': 'google.protobuf',
|
|
100
|
+
'grpcio': 'grpc',
|
|
101
|
+
'psutil': 'psutil',
|
|
102
|
+
'python-dotenv': 'dotenv',
|
|
103
|
+
'python_dotenv': 'dotenv',
|
|
104
|
+
'Werkzeug': 'werkzeug',
|
|
105
|
+
'Flask': 'flask',
|
|
106
|
+
'Django': 'django',
|
|
107
|
+
'Jinja2': 'jinja2',
|
|
108
|
+
'SQLAlchemy': 'sqlalchemy',
|
|
109
|
+
'alembic': 'alembic',
|
|
110
|
+
'aiohttp': 'aiohttp',
|
|
111
|
+
'httpx': 'httpx',
|
|
112
|
+
'fastapi': 'fastapi',
|
|
113
|
+
'starlette': 'starlette',
|
|
114
|
+
'uvicorn': 'uvicorn',
|
|
115
|
+
'gunicorn': 'gunicorn',
|
|
116
|
+
'celery': 'celery',
|
|
117
|
+
'redis': 'redis',
|
|
118
|
+
'pymongo': 'pymongo',
|
|
119
|
+
'motor': 'motor',
|
|
120
|
+
'aiomysql': 'aiomysql',
|
|
121
|
+
'asyncpg': 'asyncpg',
|
|
122
|
+
'psycopg2': 'psycopg2',
|
|
123
|
+
'psycopg2-binary': 'psycopg2',
|
|
124
|
+
'psycopg2_binary': 'psycopg2',
|
|
125
|
+
'boto3': 'boto3',
|
|
126
|
+
'botocore': 'botocore',
|
|
127
|
+
'google-cloud-storage': 'google.cloud.storage',
|
|
128
|
+
'google-auth': 'google.auth',
|
|
129
|
+
'azure-storage-blob': 'azure.storage.blob',
|
|
130
|
+
'minio': 'minio',
|
|
131
|
+
'transformers': 'transformers',
|
|
132
|
+
'datasets': 'datasets',
|
|
133
|
+
'tokenizers': 'tokenizers',
|
|
134
|
+
'diffusers': 'diffusers',
|
|
135
|
+
'accelerate': 'accelerate',
|
|
136
|
+
'peft': 'peft',
|
|
137
|
+
'trl': 'trl',
|
|
138
|
+
'sentence-transformers': 'sentence_transformers',
|
|
139
|
+
'sentence_transformers': 'sentence_transformers',
|
|
140
|
+
'faiss-cpu': 'faiss',
|
|
141
|
+
'faiss-gpu': 'faiss',
|
|
142
|
+
'annoy': 'annoy',
|
|
143
|
+
'chromadb': 'chromadb',
|
|
144
|
+
'pinecone-client': 'pinecone',
|
|
145
|
+
'weaviate-client': 'weaviate',
|
|
146
|
+
'langchain': 'langchain',
|
|
147
|
+
'openai': 'openai',
|
|
148
|
+
'anthropic': 'anthropic',
|
|
149
|
+
'tiktoken': 'tiktoken',
|
|
150
|
+
'matplotlib': 'matplotlib',
|
|
151
|
+
'seaborn': 'seaborn',
|
|
152
|
+
'plotly': 'plotly',
|
|
153
|
+
'bokeh': 'bokeh',
|
|
154
|
+
'altair': 'altair',
|
|
155
|
+
'scipy': 'scipy',
|
|
156
|
+
'statsmodels': 'statsmodels',
|
|
157
|
+
'lightgbm': 'lightgbm',
|
|
158
|
+
'xgboost': 'xgboost',
|
|
159
|
+
'catboost': 'catboost',
|
|
160
|
+
'shap': 'shap',
|
|
161
|
+
'lime': 'lime',
|
|
162
|
+
'sympy': 'sympy',
|
|
163
|
+
'networkx': 'networkx',
|
|
164
|
+
'pyarrow': 'pyarrow',
|
|
165
|
+
'pyarrow[flight]': 'pyarrow',
|
|
166
|
+
'polars': 'polars',
|
|
167
|
+
'dask': 'dask',
|
|
168
|
+
'ray': 'ray',
|
|
169
|
+
'pydantic': 'pydantic',
|
|
170
|
+
'pydantic-settings': 'pydantic_settings',
|
|
171
|
+
'attrs': 'attr',
|
|
172
|
+
'cattrs': 'cattr',
|
|
173
|
+
'click': 'click',
|
|
174
|
+
'typer': 'typer',
|
|
175
|
+
'rich': 'rich',
|
|
176
|
+
'tqdm': 'tqdm',
|
|
177
|
+
'loguru': 'loguru',
|
|
178
|
+
'structlog': 'structlog',
|
|
179
|
+
'pendulum': 'pendulum',
|
|
180
|
+
'arrow': 'arrow',
|
|
181
|
+
'humanize': 'humanize',
|
|
182
|
+
'tabulate': 'tabulate',
|
|
183
|
+
'prettytable': 'prettytable',
|
|
184
|
+
'orjson': 'orjson',
|
|
185
|
+
'ujson': 'ujson',
|
|
186
|
+
'msgpack': 'msgpack',
|
|
187
|
+
'lz4': 'lz4',
|
|
188
|
+
'zstandard': 'zstd',
|
|
189
|
+
'cryptography': 'cryptography',
|
|
190
|
+
'paramiko': 'paramiko',
|
|
191
|
+
'fabric': 'fabric',
|
|
192
|
+
'invoke': 'invoke',
|
|
193
|
+
'pytest': 'pytest',
|
|
194
|
+
'hypothesis': 'hypothesis',
|
|
195
|
+
'mock': 'unittest.mock',
|
|
196
|
+
'freezegun': 'freezegun',
|
|
197
|
+
'factory-boy': 'factory',
|
|
198
|
+
'Faker': 'faker',
|
|
199
|
+
};
|
|
200
|
+
exports.INSTALL_TO_IMPORT = INSTALL_TO_IMPORT;
|
|
201
|
+
// ─── Helpers ───────────────────────────────────────────────────────────────────
|
|
202
|
+
/**
|
|
203
|
+
* Extract the bare package name from a spec string.
|
|
204
|
+
* "numpy>=1.24,<2" → "numpy"
|
|
205
|
+
* "torch==2.3.0+cu121" → "torch"
|
|
206
|
+
* "uvicorn[standard]" → "uvicorn"
|
|
207
|
+
*/
|
|
208
|
+
function extractPackageName(spec) {
|
|
209
|
+
// Remove VCS prefixes (git+https://...)
|
|
210
|
+
if (spec.startsWith('git+') || spec.startsWith('hg+') || spec.startsWith('svn+')) {
|
|
211
|
+
const eggIndex = spec.indexOf('#egg=');
|
|
212
|
+
if (eggIndex !== -1) {
|
|
213
|
+
return spec.slice(eggIndex + 5).split('&')[0].trim();
|
|
214
|
+
}
|
|
215
|
+
return spec;
|
|
216
|
+
}
|
|
217
|
+
// Remove extras [...], then split on version specifiers
|
|
218
|
+
return spec.replace(/\[.*?\]/g, '').split(/[><=!~;]/)[0].trim();
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Determine the Python import name for a given install spec.
|
|
222
|
+
*/
|
|
223
|
+
function resolveImportName(spec, override) {
|
|
224
|
+
if (override) {
|
|
225
|
+
return override;
|
|
226
|
+
}
|
|
227
|
+
const bare = extractPackageName(spec);
|
|
228
|
+
return INSTALL_TO_IMPORT[bare] ?? bare.replace(/-/g, '_');
|
|
229
|
+
}
|
|
230
|
+
/** Escape a string for safe inclusion in a Python one-liner. */
|
|
231
|
+
function escapePy(s) {
|
|
232
|
+
return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
233
|
+
}
|
|
234
|
+
/** Sleep helper. */
|
|
235
|
+
function sleep(ms) {
|
|
236
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
237
|
+
}
|
|
238
|
+
// ─── PackageInstaller ──────────────────────────────────────────────────────────
|
|
239
|
+
class PackageInstaller extends events_1.EventEmitter {
|
|
240
|
+
_python;
|
|
241
|
+
_opts;
|
|
242
|
+
constructor(options) {
|
|
243
|
+
super();
|
|
244
|
+
this._python = options.pythonExecutable;
|
|
245
|
+
this._opts = {
|
|
246
|
+
pythonExecutable: options.pythonExecutable,
|
|
247
|
+
indexUrl: options.indexUrl ?? '',
|
|
248
|
+
extraIndexUrls: options.extraIndexUrls ?? [],
|
|
249
|
+
trustedHosts: options.trustedHosts ?? [],
|
|
250
|
+
maxRetries: options.maxRetries ?? 3,
|
|
251
|
+
retryDelayMs: options.retryDelayMs ?? 1000,
|
|
252
|
+
cwd: options.cwd ?? process.cwd(),
|
|
253
|
+
env: options.env ?? {},
|
|
254
|
+
timeoutMs: options.timeoutMs ?? 300_000,
|
|
255
|
+
quiet: options.quiet !== false,
|
|
256
|
+
upgrade: options.upgrade ?? false,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
// ── Public API ──────────────────────────────────────────────────────────────
|
|
260
|
+
/**
|
|
261
|
+
* Install one or more packages.
|
|
262
|
+
*
|
|
263
|
+
* @param packages - Array of pip spec strings or PackageSpec objects.
|
|
264
|
+
* @returns InstallResult describing what happened to each package.
|
|
265
|
+
*/
|
|
266
|
+
async install(packages) {
|
|
267
|
+
const specs = packages.map((p) => typeof p === 'string' ? { spec: p } : p);
|
|
268
|
+
const result = {
|
|
269
|
+
installed: [],
|
|
270
|
+
alreadyInstalled: [],
|
|
271
|
+
failed: [],
|
|
272
|
+
success: false,
|
|
273
|
+
output: '',
|
|
274
|
+
};
|
|
275
|
+
const toInstall = [];
|
|
276
|
+
// ── 1. Pre-flight: check which are already importable ──────────────────
|
|
277
|
+
for (const spec of specs) {
|
|
278
|
+
const importName = resolveImportName(spec.spec, spec.importName);
|
|
279
|
+
if (!spec.forceReinstall && !this._opts.upgrade && this._isImportable(importName)) {
|
|
280
|
+
logger.debug(`Already importable: ${importName} (${spec.spec})`);
|
|
281
|
+
result.alreadyInstalled.push(spec.spec);
|
|
282
|
+
this._emit('already_installed', spec.spec);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
toInstall.push(spec);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (toInstall.length === 0) {
|
|
289
|
+
result.success = true;
|
|
290
|
+
return result;
|
|
291
|
+
}
|
|
292
|
+
// ── 2. Install in a single pip invocation where possible ──────────────
|
|
293
|
+
// Group specs that do not need individual treatment
|
|
294
|
+
const batchSpecs = toInstall.filter((s) => !s.preRelease);
|
|
295
|
+
const prerelSpecs = toInstall.filter((s) => s.preRelease);
|
|
296
|
+
const outputs = [];
|
|
297
|
+
if (batchSpecs.length > 0) {
|
|
298
|
+
const { out, perPackageResults } = await this._pipInstall(batchSpecs, false);
|
|
299
|
+
outputs.push(out);
|
|
300
|
+
this._mergeResults(result, perPackageResults);
|
|
301
|
+
}
|
|
302
|
+
if (prerelSpecs.length > 0) {
|
|
303
|
+
const { out, perPackageResults } = await this._pipInstall(prerelSpecs, true);
|
|
304
|
+
outputs.push(out);
|
|
305
|
+
this._mergeResults(result, perPackageResults);
|
|
306
|
+
}
|
|
307
|
+
result.output = outputs.join('\n');
|
|
308
|
+
result.success = result.failed.length === 0;
|
|
309
|
+
return result;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Install a single package and return the installed version string.
|
|
313
|
+
* Throws on failure.
|
|
314
|
+
*/
|
|
315
|
+
async installOne(spec, options) {
|
|
316
|
+
const result = await this.install([{ spec, ...options }]);
|
|
317
|
+
if (!result.success) {
|
|
318
|
+
const err = result.failed[0];
|
|
319
|
+
throw new Error(`Failed to install ${spec}: ${err?.error ?? 'unknown error'}`);
|
|
320
|
+
}
|
|
321
|
+
return this.getVersion(extractPackageName(spec)) ?? spec;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Upgrade a package to the latest version.
|
|
325
|
+
*/
|
|
326
|
+
async upgrade(spec) {
|
|
327
|
+
return this.installOne(spec, { forceReinstall: false });
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Uninstall one or more packages.
|
|
331
|
+
*/
|
|
332
|
+
async uninstall(packages) {
|
|
333
|
+
if (packages.length === 0) {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const args = ['-m', 'pip', 'uninstall', '-y', ...packages];
|
|
337
|
+
logger.info(`Uninstalling: ${packages.join(', ')}`);
|
|
338
|
+
const result = (0, child_process_1.spawnSync)(this._python, args, {
|
|
339
|
+
encoding: 'utf8',
|
|
340
|
+
cwd: this._opts.cwd,
|
|
341
|
+
env: { ...process.env, ...this._opts.env },
|
|
342
|
+
});
|
|
343
|
+
if (result.status !== 0) {
|
|
344
|
+
throw new Error(`pip uninstall failed:\n${result.stderr}`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Check whether a package is currently importable by Python.
|
|
349
|
+
*/
|
|
350
|
+
isImportable(importName) {
|
|
351
|
+
return this._isImportable(importName);
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Check whether a package (by install name) is installed and return
|
|
355
|
+
* its version string, or null if not installed.
|
|
356
|
+
*/
|
|
357
|
+
getVersion(packageName) {
|
|
358
|
+
const args = ['-m', 'pip', 'show', '--quiet', packageName];
|
|
359
|
+
const r = (0, child_process_1.spawnSync)(this._python, args, {
|
|
360
|
+
encoding: 'utf8',
|
|
361
|
+
env: { ...process.env, ...this._opts.env },
|
|
362
|
+
});
|
|
363
|
+
if (r.status !== 0 || !r.stdout) {
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
const match = r.stdout.match(/^Version:\s*(.+)$/m);
|
|
367
|
+
return match ? match[1].trim() : null;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Return full metadata for an installed package.
|
|
371
|
+
*/
|
|
372
|
+
getMetadata(packageName) {
|
|
373
|
+
const args = ['-m', 'pip', 'show', packageName];
|
|
374
|
+
const r = (0, child_process_1.spawnSync)(this._python, args, {
|
|
375
|
+
encoding: 'utf8',
|
|
376
|
+
env: { ...process.env, ...this._opts.env },
|
|
377
|
+
});
|
|
378
|
+
if (r.status !== 0 || !r.stdout) {
|
|
379
|
+
return null;
|
|
380
|
+
}
|
|
381
|
+
return this._parsePipShow(r.stdout);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* List all packages installed in the current Python environment.
|
|
385
|
+
*/
|
|
386
|
+
listInstalled() {
|
|
387
|
+
const args = ['-m', 'pip', 'list', '--format=json'];
|
|
388
|
+
const r = (0, child_process_1.spawnSync)(this._python, args, {
|
|
389
|
+
encoding: 'utf8',
|
|
390
|
+
env: { ...process.env, ...this._opts.env },
|
|
391
|
+
});
|
|
392
|
+
if (r.status !== 0 || !r.stdout) {
|
|
393
|
+
return [];
|
|
394
|
+
}
|
|
395
|
+
try {
|
|
396
|
+
return JSON.parse(r.stdout);
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
return [];
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Check which packages from the given list are missing.
|
|
404
|
+
*
|
|
405
|
+
* @param packages - Array of pip spec strings.
|
|
406
|
+
* @returns Array of spec strings that are NOT currently importable.
|
|
407
|
+
*/
|
|
408
|
+
getMissing(packages) {
|
|
409
|
+
return packages.filter((spec) => {
|
|
410
|
+
const importName = resolveImportName(spec);
|
|
411
|
+
return !this._isImportable(importName);
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Ensure pip itself is up-to-date.
|
|
416
|
+
*/
|
|
417
|
+
async upgradePip() {
|
|
418
|
+
logger.info('Upgrading pip...');
|
|
419
|
+
const args = ['-m', 'pip', 'install', '--upgrade', 'pip'];
|
|
420
|
+
const r = (0, child_process_1.spawnSync)(this._python, args, {
|
|
421
|
+
encoding: 'utf8',
|
|
422
|
+
cwd: this._opts.cwd,
|
|
423
|
+
env: { ...process.env, ...this._opts.env },
|
|
424
|
+
});
|
|
425
|
+
if (r.status !== 0) {
|
|
426
|
+
logger.warn(`pip self-upgrade failed (non-fatal):\n${r.stderr}`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
// ── Private helpers ────────────────────────────────────────────────────────
|
|
430
|
+
/**
|
|
431
|
+
* Run `python -c "import X"` to test importability.
|
|
432
|
+
* This is faster than `pip show` for the common case.
|
|
433
|
+
*/
|
|
434
|
+
_isImportable(importName) {
|
|
435
|
+
// Handle dotted names like "google.protobuf"
|
|
436
|
+
const topLevel = importName.split('.')[0];
|
|
437
|
+
const code = `import ${escapePy(topLevel)}`;
|
|
438
|
+
const r = (0, child_process_1.spawnSync)(this._python, ['-c', code], {
|
|
439
|
+
encoding: 'utf8',
|
|
440
|
+
env: { ...process.env, ...this._opts.env },
|
|
441
|
+
});
|
|
442
|
+
return r.status === 0;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Build pip install argument list.
|
|
446
|
+
*/
|
|
447
|
+
_buildPipArgs(specs, preRelease) {
|
|
448
|
+
const args = ['-m', 'pip', 'install'];
|
|
449
|
+
if (this._opts.quiet) {
|
|
450
|
+
args.push('--quiet');
|
|
451
|
+
}
|
|
452
|
+
if (this._opts.upgrade) {
|
|
453
|
+
args.push('--upgrade');
|
|
454
|
+
}
|
|
455
|
+
if (preRelease) {
|
|
456
|
+
args.push('--pre');
|
|
457
|
+
}
|
|
458
|
+
args.push('--no-warn-script-location');
|
|
459
|
+
args.push('--disable-pip-version-check');
|
|
460
|
+
if (this._opts.indexUrl) {
|
|
461
|
+
args.push('--index-url', this._opts.indexUrl);
|
|
462
|
+
}
|
|
463
|
+
for (const url of this._opts.extraIndexUrls) {
|
|
464
|
+
args.push('--extra-index-url', url);
|
|
465
|
+
}
|
|
466
|
+
for (const host of this._opts.trustedHosts) {
|
|
467
|
+
args.push('--trusted-host', host);
|
|
468
|
+
}
|
|
469
|
+
for (const s of specs) {
|
|
470
|
+
if (s.forceReinstall) {
|
|
471
|
+
args.push('--force-reinstall');
|
|
472
|
+
}
|
|
473
|
+
args.push(s.spec);
|
|
474
|
+
}
|
|
475
|
+
return args;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Execute pip install with retry logic.
|
|
479
|
+
*/
|
|
480
|
+
async _pipInstall(specs, preRelease) {
|
|
481
|
+
const args = this._buildPipArgs(specs, preRelease);
|
|
482
|
+
const specList = specs.map((s) => s.spec).join(', ');
|
|
483
|
+
logger.info(`pip install: ${specList}`);
|
|
484
|
+
specs.forEach((s) => this._emit('installing', s.spec));
|
|
485
|
+
let lastError = '';
|
|
486
|
+
let lastOut = '';
|
|
487
|
+
for (let attempt = 1; attempt <= this._opts.maxRetries; attempt++) {
|
|
488
|
+
const { exitCode, stdout } = await this._runPip(args);
|
|
489
|
+
lastOut = stdout;
|
|
490
|
+
if (exitCode === 0) {
|
|
491
|
+
// Success — resolve versions
|
|
492
|
+
const results = specs.map((s) => {
|
|
493
|
+
const name = extractPackageName(s.spec);
|
|
494
|
+
const version = this.getVersion(name) ?? undefined;
|
|
495
|
+
this._emit('installed', s.spec, version);
|
|
496
|
+
return { spec: s.spec, status: 'installed', version };
|
|
497
|
+
});
|
|
498
|
+
return { out: stdout, perPackageResults: results };
|
|
499
|
+
}
|
|
500
|
+
lastError = stdout;
|
|
501
|
+
const isNetworkError = /connection error|timed out|network/i.test(stdout);
|
|
502
|
+
if (!isNetworkError || attempt === this._opts.maxRetries) {
|
|
503
|
+
break;
|
|
504
|
+
}
|
|
505
|
+
const delay = this._opts.retryDelayMs * 2 ** (attempt - 1);
|
|
506
|
+
logger.warn(`pip attempt ${attempt} failed (network). Retrying in ${delay}ms…`);
|
|
507
|
+
await sleep(delay);
|
|
508
|
+
}
|
|
509
|
+
// Failure path — try each spec individually to isolate the bad one
|
|
510
|
+
const results = [];
|
|
511
|
+
if (specs.length > 1) {
|
|
512
|
+
logger.warn('Batch install failed — falling back to per-package install');
|
|
513
|
+
for (const s of specs) {
|
|
514
|
+
const single = await this._pipInstall([s], preRelease);
|
|
515
|
+
results.push(...single.perPackageResults);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
const s = specs[0];
|
|
520
|
+
logger.error(`Failed to install ${s.spec}: ${lastError.slice(0, 200)}`);
|
|
521
|
+
this._emit('failed', s.spec, undefined, lastError);
|
|
522
|
+
results.push({ spec: s.spec, status: 'failed', error: lastError });
|
|
523
|
+
}
|
|
524
|
+
return { out: lastOut, perPackageResults: results };
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Spawn pip and collect output.
|
|
528
|
+
*/
|
|
529
|
+
_runPip(args) {
|
|
530
|
+
return new Promise((resolve) => {
|
|
531
|
+
const proc = (0, child_process_1.spawn)(this._python, args, {
|
|
532
|
+
cwd: this._opts.cwd,
|
|
533
|
+
env: { ...process.env, ...this._opts.env },
|
|
534
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
535
|
+
});
|
|
536
|
+
let stdout = '';
|
|
537
|
+
proc.stdout.on('data', (d) => { stdout += d.toString(); });
|
|
538
|
+
proc.stderr.on('data', (d) => { stdout += d.toString(); });
|
|
539
|
+
const timer = setTimeout(() => {
|
|
540
|
+
proc.kill('SIGKILL');
|
|
541
|
+
stdout += '\n[TIMEOUT]';
|
|
542
|
+
}, this._opts.timeoutMs);
|
|
543
|
+
proc.on('close', (code) => {
|
|
544
|
+
clearTimeout(timer);
|
|
545
|
+
resolve({ exitCode: code ?? 1, stdout });
|
|
546
|
+
});
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
/** Merge per-package results into the aggregate InstallResult. */
|
|
550
|
+
_mergeResults(result, perPackage) {
|
|
551
|
+
for (const r of perPackage) {
|
|
552
|
+
if (r.status === 'installed' || r.status === 'upgraded') {
|
|
553
|
+
result.installed.push(r.version ? `${r.spec}==${r.version}` : r.spec);
|
|
554
|
+
}
|
|
555
|
+
else if (r.status === 'already_installed') {
|
|
556
|
+
result.alreadyInstalled.push(r.spec);
|
|
557
|
+
}
|
|
558
|
+
else if (r.status === 'failed') {
|
|
559
|
+
result.failed.push({ spec: r.spec, error: r.error ?? 'unknown' });
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
/** Emit a typed progress event. */
|
|
564
|
+
_emit(status, pkg, version, error) {
|
|
565
|
+
const ev = { package: pkg, status, version, error };
|
|
566
|
+
this.emit('progress', ev);
|
|
567
|
+
}
|
|
568
|
+
/** Parse `pip show` output into PackageMetadata. */
|
|
569
|
+
_parsePipShow(raw) {
|
|
570
|
+
const get = (field) => {
|
|
571
|
+
const m = raw.match(new RegExp(`^${field}:\\s*(.*)$`, 'm'));
|
|
572
|
+
return m ? m[1].trim() : '';
|
|
573
|
+
};
|
|
574
|
+
const getList = (field) => {
|
|
575
|
+
const val = get(field);
|
|
576
|
+
return val ? val.split(/,\s*/).filter(Boolean) : [];
|
|
577
|
+
};
|
|
578
|
+
return {
|
|
579
|
+
name: get('Name'),
|
|
580
|
+
version: get('Version'),
|
|
581
|
+
location: get('Location'),
|
|
582
|
+
summary: get('Summary'),
|
|
583
|
+
requires: getList('Requires'),
|
|
584
|
+
requiredBy: getList('Required-by'),
|
|
585
|
+
};
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
exports.PackageInstaller = PackageInstaller;
|
|
589
|
+
// ─── Factory helpers ────────────────────────────────────────────────────────────
|
|
590
|
+
/**
|
|
591
|
+
* Create a PackageInstaller for the system Python (or the python3 in PATH).
|
|
592
|
+
*/
|
|
593
|
+
function createSystemInstaller(options) {
|
|
594
|
+
const python = process.env['nodepyx_PYTHON'] ?? 'python3';
|
|
595
|
+
return new PackageInstaller({ pythonExecutable: python, ...options });
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Create a PackageInstaller tied to a specific virtualenv directory.
|
|
599
|
+
*/
|
|
600
|
+
function createVenvInstaller(venvDir, options) {
|
|
601
|
+
const bin = process.platform === 'win32'
|
|
602
|
+
? path.join(venvDir, 'Scripts', 'python.exe')
|
|
603
|
+
: path.join(venvDir, 'bin', 'python');
|
|
604
|
+
if (!fs.existsSync(bin)) {
|
|
605
|
+
throw new Error(`Virtualenv python not found at: ${bin}`);
|
|
606
|
+
}
|
|
607
|
+
return new PackageInstaller({ pythonExecutable: bin, ...options });
|
|
608
|
+
}
|
|
609
|
+
//# sourceMappingURL=PackageInstaller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PackageInstaller.js","sourceRoot":"","sources":["../../src/env/PackageInstaller.ts"],"names":[],"mappings":"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"}
|