pynect 0.2.7 → 0.2.10

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