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.
Files changed (184) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +399 -0
  3. package/binding.gyp +73 -0
  4. package/dist/core/PyCallable.d.ts +65 -0
  5. package/dist/core/PyCallable.d.ts.map +1 -0
  6. package/dist/core/PyCallable.js +109 -0
  7. package/dist/core/PyCallable.js.map +1 -0
  8. package/dist/core/PyContext.d.ts +76 -0
  9. package/dist/core/PyContext.d.ts.map +1 -0
  10. package/dist/core/PyContext.js +228 -0
  11. package/dist/core/PyContext.js.map +1 -0
  12. package/dist/core/PyIterator.d.ts +84 -0
  13. package/dist/core/PyIterator.d.ts.map +1 -0
  14. package/dist/core/PyIterator.js +243 -0
  15. package/dist/core/PyIterator.js.map +1 -0
  16. package/dist/core/PyModule.d.ts +55 -0
  17. package/dist/core/PyModule.d.ts.map +1 -0
  18. package/dist/core/PyModule.js +172 -0
  19. package/dist/core/PyModule.js.map +1 -0
  20. package/dist/core/PyProxy.d.ts +65 -0
  21. package/dist/core/PyProxy.d.ts.map +1 -0
  22. package/dist/core/PyProxy.js +483 -0
  23. package/dist/core/PyProxy.js.map +1 -0
  24. package/dist/core/PyRuntime.d.ts +105 -0
  25. package/dist/core/PyRuntime.d.ts.map +1 -0
  26. package/dist/core/PyRuntime.js +438 -0
  27. package/dist/core/PyRuntime.js.map +1 -0
  28. package/dist/env/CondaManager.d.ts +118 -0
  29. package/dist/env/CondaManager.d.ts.map +1 -0
  30. package/dist/env/CondaManager.js +401 -0
  31. package/dist/env/CondaManager.js.map +1 -0
  32. package/dist/env/PackageInstaller.d.ts +233 -0
  33. package/dist/env/PackageInstaller.d.ts.map +1 -0
  34. package/dist/env/PackageInstaller.js +609 -0
  35. package/dist/env/PackageInstaller.js.map +1 -0
  36. package/dist/env/PythonDetector.d.ts +103 -0
  37. package/dist/env/PythonDetector.d.ts.map +1 -0
  38. package/dist/env/PythonDetector.js +381 -0
  39. package/dist/env/PythonDetector.js.map +1 -0
  40. package/dist/env/VenvManager.d.ts +117 -0
  41. package/dist/env/VenvManager.d.ts.map +1 -0
  42. package/dist/env/VenvManager.js +331 -0
  43. package/dist/env/VenvManager.js.map +1 -0
  44. package/dist/index.d.ts +169 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +393 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/plugins/Plugin.interface.d.ts +41 -0
  49. package/dist/plugins/Plugin.interface.d.ts.map +1 -0
  50. package/dist/plugins/Plugin.interface.js +12 -0
  51. package/dist/plugins/Plugin.interface.js.map +1 -0
  52. package/dist/plugins/PluginManager.d.ts +26 -0
  53. package/dist/plugins/PluginManager.d.ts.map +1 -0
  54. package/dist/plugins/PluginManager.js +174 -0
  55. package/dist/plugins/PluginManager.js.map +1 -0
  56. package/dist/plugins/builtin/NumpyPlugin.d.ts +17 -0
  57. package/dist/plugins/builtin/NumpyPlugin.d.ts.map +1 -0
  58. package/dist/plugins/builtin/NumpyPlugin.js +41 -0
  59. package/dist/plugins/builtin/NumpyPlugin.js.map +1 -0
  60. package/dist/plugins/builtin/PandasPlugin.d.ts +19 -0
  61. package/dist/plugins/builtin/PandasPlugin.d.ts.map +1 -0
  62. package/dist/plugins/builtin/PandasPlugin.js +57 -0
  63. package/dist/plugins/builtin/PandasPlugin.js.map +1 -0
  64. package/dist/plugins/builtin/TorchPlugin.d.ts +23 -0
  65. package/dist/plugins/builtin/TorchPlugin.d.ts.map +1 -0
  66. package/dist/plugins/builtin/TorchPlugin.js +50 -0
  67. package/dist/plugins/builtin/TorchPlugin.js.map +1 -0
  68. package/dist/plugins/index.d.ts +7 -0
  69. package/dist/plugins/index.d.ts.map +1 -0
  70. package/dist/plugins/index.js +12 -0
  71. package/dist/plugins/index.js.map +1 -0
  72. package/dist/serialization/DataFrameBridge.d.ts +141 -0
  73. package/dist/serialization/DataFrameBridge.d.ts.map +1 -0
  74. package/dist/serialization/DataFrameBridge.js +355 -0
  75. package/dist/serialization/DataFrameBridge.js.map +1 -0
  76. package/dist/serialization/MsgPackSerializer.d.ts +45 -0
  77. package/dist/serialization/MsgPackSerializer.d.ts.map +1 -0
  78. package/dist/serialization/MsgPackSerializer.js +242 -0
  79. package/dist/serialization/MsgPackSerializer.js.map +1 -0
  80. package/dist/serialization/NumpyBridge.d.ts +96 -0
  81. package/dist/serialization/NumpyBridge.d.ts.map +1 -0
  82. package/dist/serialization/NumpyBridge.js +323 -0
  83. package/dist/serialization/NumpyBridge.js.map +1 -0
  84. package/dist/serialization/Serializer.d.ts +78 -0
  85. package/dist/serialization/Serializer.d.ts.map +1 -0
  86. package/dist/serialization/Serializer.js +281 -0
  87. package/dist/serialization/Serializer.js.map +1 -0
  88. package/dist/types/PythonTypeMapper.d.ts +87 -0
  89. package/dist/types/PythonTypeMapper.d.ts.map +1 -0
  90. package/dist/types/PythonTypeMapper.js +449 -0
  91. package/dist/types/PythonTypeMapper.js.map +1 -0
  92. package/dist/types/StubCache.d.ts +109 -0
  93. package/dist/types/StubCache.d.ts.map +1 -0
  94. package/dist/types/StubCache.js +333 -0
  95. package/dist/types/StubCache.js.map +1 -0
  96. package/dist/types/TypeGenerator.d.ts +139 -0
  97. package/dist/types/TypeGenerator.d.ts.map +1 -0
  98. package/dist/types/TypeGenerator.js +372 -0
  99. package/dist/types/TypeGenerator.js.map +1 -0
  100. package/dist/types/addon.d.ts +114 -0
  101. package/dist/types/addon.d.ts.map +1 -0
  102. package/dist/types/addon.js +32 -0
  103. package/dist/types/addon.js.map +1 -0
  104. package/dist/types/config.d.ts +175 -0
  105. package/dist/types/config.d.ts.map +1 -0
  106. package/dist/types/config.js +35 -0
  107. package/dist/types/config.js.map +1 -0
  108. package/dist/types/index.d.ts +10 -0
  109. package/dist/types/index.d.ts.map +1 -0
  110. package/dist/types/index.js +12 -0
  111. package/dist/types/index.js.map +1 -0
  112. package/dist/types/python.d.ts +235 -0
  113. package/dist/types/python.d.ts.map +1 -0
  114. package/dist/types/python.js +7 -0
  115. package/dist/types/python.js.map +1 -0
  116. package/dist/utils/ErrorTranslator.d.ts +83 -0
  117. package/dist/utils/ErrorTranslator.d.ts.map +1 -0
  118. package/dist/utils/ErrorTranslator.js +210 -0
  119. package/dist/utils/ErrorTranslator.js.map +1 -0
  120. package/dist/utils/Logger.d.ts +27 -0
  121. package/dist/utils/Logger.d.ts.map +1 -0
  122. package/dist/utils/Logger.js +115 -0
  123. package/dist/utils/Logger.js.map +1 -0
  124. package/dist/utils/MemoryMonitor.d.ts +44 -0
  125. package/dist/utils/MemoryMonitor.d.ts.map +1 -0
  126. package/dist/utils/MemoryMonitor.js +143 -0
  127. package/dist/utils/MemoryMonitor.js.map +1 -0
  128. package/package.json +177 -0
  129. package/python/error_handler.py +433 -0
  130. package/python/nodepyx_runtime.py +575 -0
  131. package/python/serializer.py +379 -0
  132. package/python/type_inspector.py +288 -0
  133. package/scripts/build-native.js +68 -0
  134. package/scripts/download-prebuilds.js +99 -0
  135. package/scripts/generate-stubs.js +405 -0
  136. package/scripts/install.js +260 -0
  137. package/src/core/PyCallable.ts +137 -0
  138. package/src/core/PyContext.ts +296 -0
  139. package/src/core/PyIterator.ts +294 -0
  140. package/src/core/PyModule.ts +194 -0
  141. package/src/core/PyProxy.ts +605 -0
  142. package/src/core/PyRuntime.ts +504 -0
  143. package/src/env/CondaManager.ts +451 -0
  144. package/src/env/PackageInstaller.ts +738 -0
  145. package/src/env/PythonDetector.ts +414 -0
  146. package/src/env/VenvManager.ts +396 -0
  147. package/src/index.ts +425 -0
  148. package/src/native/gil_guard.cpp +26 -0
  149. package/src/native/gil_guard.h +175 -0
  150. package/src/native/nodepyx_addon.cpp +886 -0
  151. package/src/native/python_bridge.cpp +790 -0
  152. package/src/native/python_bridge.h +257 -0
  153. package/src/native/thread_pool.cpp +336 -0
  154. package/src/native/thread_pool.h +175 -0
  155. package/src/native/type_converter.cpp +901 -0
  156. package/src/native/type_converter.h +272 -0
  157. package/src/nextjs/PyProvider.tsx +123 -0
  158. package/src/nextjs/index.ts +21 -0
  159. package/src/nextjs/usePython.ts +106 -0
  160. package/src/nextjs/withnodepyx.ts +88 -0
  161. package/src/plugins/Plugin.interface.ts +51 -0
  162. package/src/plugins/PluginManager.ts +155 -0
  163. package/src/plugins/builtin/NumpyPlugin.ts +36 -0
  164. package/src/plugins/builtin/PandasPlugin.ts +49 -0
  165. package/src/plugins/builtin/TorchPlugin.ts +56 -0
  166. package/src/plugins/index.ts +7 -0
  167. package/src/serialization/DataFrameBridge.ts +398 -0
  168. package/src/serialization/MsgPackSerializer.ts +220 -0
  169. package/src/serialization/NumpyBridge.ts +332 -0
  170. package/src/serialization/Serializer.ts +320 -0
  171. package/src/types/PythonTypeMapper.ts +495 -0
  172. package/src/types/StubCache.ts +340 -0
  173. package/src/types/TypeGenerator.ts +491 -0
  174. package/src/types/addon.ts +170 -0
  175. package/src/types/config.ts +226 -0
  176. package/src/types/index.ts +55 -0
  177. package/src/types/python.ts +309 -0
  178. package/src/types/stubs/numpy.d.ts +441 -0
  179. package/src/types/stubs/pandas.d.ts +575 -0
  180. package/src/types/stubs/sklearn.d.ts +728 -0
  181. package/src/types/stubs/torch.d.ts +694 -0
  182. package/src/utils/ErrorTranslator.ts +220 -0
  183. package/src/utils/Logger.ts +119 -0
  184. package/src/utils/MemoryMonitor.ts +175 -0
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ /**
3
+ * nodepyx — Serializer
4
+ * Central coordinator for Python ↔ JavaScript data conversion.
5
+ * Routes to specialized bridges (MsgPack, NumPy, DataFrame) based on format.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.Serializer = void 0;
9
+ const NumpyBridge_1 = require("./NumpyBridge");
10
+ const DataFrameBridge_1 = require("./DataFrameBridge");
11
+ const MsgPackSerializer_1 = require("./MsgPackSerializer");
12
+ const Logger_1 = require("../utils/Logger");
13
+ const logger = new Logger_1.Logger('Serializer');
14
+ /**
15
+ * Serializer — converts between Python wire format and JavaScript values.
16
+ *
17
+ * This is a singleton accessed via `Serializer.getInstance()`.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const serializer = Serializer.getInstance();
22
+ *
23
+ * // JavaScript → Python wire format
24
+ * const sv = await serializer.serialize([1, 2, 3, 4, 5]);
25
+ *
26
+ * // Python wire format → JavaScript
27
+ * const jsValue = await serializer.deserialize(sv);
28
+ * ```
29
+ */
30
+ class Serializer {
31
+ static _instance = null;
32
+ _options;
33
+ _numpyBridge;
34
+ _dataframeBridge;
35
+ _msgpackSerializer;
36
+ constructor(options = {}) {
37
+ this._options = {
38
+ useSharedArrayBuffer: options.useSharedArrayBuffer ?? false,
39
+ maxJsonSize: options.maxJsonSize ?? 65536, // 64KB
40
+ wrapPythonRefs: options.wrapPythonRefs ?? true,
41
+ };
42
+ this._numpyBridge = new NumpyBridge_1.NumpyBridge({ useSharedArrayBuffer: this._options.useSharedArrayBuffer });
43
+ this._dataframeBridge = new DataFrameBridge_1.DataFrameBridge();
44
+ this._msgpackSerializer = new MsgPackSerializer_1.MsgPackSerializer();
45
+ }
46
+ static getInstance(options) {
47
+ if (!Serializer._instance) {
48
+ Serializer._instance = new Serializer(options);
49
+ }
50
+ return Serializer._instance;
51
+ }
52
+ static resetInstance() {
53
+ Serializer._instance = null;
54
+ }
55
+ // ─── Python Wire Format → JavaScript ───────────────────────────────────────
56
+ /**
57
+ * Deserialize a Python wire format value to JavaScript.
58
+ *
59
+ * Format routing:
60
+ * - JSON (0) → JSON.parse
61
+ * - MsgPack (1) → MessagePack decode
62
+ * - NumPy array (2) → TypedArray
63
+ * - DataFrame (3) → DataFrameResult
64
+ * - Series (4) → SeriesResult
65
+ * - PyRef (6) → PyProxy (via addon)
66
+ * - Bytes (7) → Uint8Array
67
+ * - None (8) → null
68
+ */
69
+ async deserialize(sv) {
70
+ const format = sv.format;
71
+ switch (format) {
72
+ case 0: // JSON
73
+ return this._deserializeJson(sv);
74
+ case 1: // MSGPACK
75
+ return this._deserializeMsgPack(sv);
76
+ case 2: // NUMPY_ARRAY
77
+ return this._numpyBridge.deserialize(sv);
78
+ case 3: // PANDAS_DATAFRAME
79
+ return this._dataframeBridge.deserializeDataFrame(sv);
80
+ case 4: // PANDAS_SERIES
81
+ return this._dataframeBridge.deserializeSeries(sv);
82
+ case 6: // PYTHON_REF
83
+ return this._deserializePythonRef(sv);
84
+ case 7: // BYTES
85
+ return this._deserializeBytes(sv);
86
+ case 8: // NONE
87
+ return null;
88
+ default:
89
+ logger.warn(`Unknown serialization format: ${format}`);
90
+ return null;
91
+ }
92
+ }
93
+ /**
94
+ * Deserialize synchronously (for non-async contexts).
95
+ * Limited: only works for simple types.
96
+ */
97
+ deserializeSync(sv) {
98
+ const format = sv.format;
99
+ switch (format) {
100
+ case 0: // JSON
101
+ return this._deserializeJson(sv);
102
+ case 7: // BYTES
103
+ return sv.data instanceof Uint8Array ? sv.data : null;
104
+ case 8: // NONE
105
+ return null;
106
+ default:
107
+ // For binary formats, return null in sync mode
108
+ return null;
109
+ }
110
+ }
111
+ // ─── JavaScript → Python Wire Format ───────────────────────────────────────
112
+ /**
113
+ * Serialize a JavaScript value to Python wire format.
114
+ * Chooses the most efficient encoding automatically.
115
+ */
116
+ async serialize(value) {
117
+ return this._serializeValue(value);
118
+ }
119
+ /**
120
+ * Serialize synchronously (for non-async contexts).
121
+ */
122
+ serializeSync(value) {
123
+ return this._serializeValueSync(value);
124
+ }
125
+ // ─── Private Deserialization ───────────────────────────────────────────────
126
+ _deserializeJson(sv) {
127
+ const data = sv.data;
128
+ if (data === null || data === undefined) {
129
+ return null;
130
+ }
131
+ const jsonStr = typeof data === 'string' ? data : new TextDecoder().decode(data);
132
+ if (!jsonStr || jsonStr === 'null') {
133
+ return null;
134
+ }
135
+ if (jsonStr === 'true') {
136
+ return true;
137
+ }
138
+ if (jsonStr === 'false') {
139
+ return false;
140
+ }
141
+ try {
142
+ return JSON.parse(jsonStr);
143
+ }
144
+ catch {
145
+ // If JSON parse fails, return the raw string
146
+ return jsonStr;
147
+ }
148
+ }
149
+ _deserializeMsgPack(sv) {
150
+ const data = sv.data;
151
+ if (!data || !(data instanceof Uint8Array)) {
152
+ return null;
153
+ }
154
+ try {
155
+ return this._msgpackSerializer.decode(data);
156
+ }
157
+ catch (err) {
158
+ logger.warn('MsgPack deserialization failed', err);
159
+ return null;
160
+ }
161
+ }
162
+ _deserializePythonRef(sv) {
163
+ // PyRef deserialization is handled by PyProxy._deserializeAddonResult
164
+ // which has access to the addon. Here we return the raw ref.
165
+ const objectId = sv.metadata?.objectId;
166
+ if (objectId) {
167
+ return { __pyref__: objectId };
168
+ }
169
+ return null;
170
+ }
171
+ _deserializeBytes(sv) {
172
+ const data = sv.data;
173
+ if (!data) {
174
+ return null;
175
+ }
176
+ if (data instanceof Uint8Array) {
177
+ return data;
178
+ }
179
+ if (typeof data === 'string') {
180
+ return new TextEncoder().encode(data);
181
+ }
182
+ return null;
183
+ }
184
+ // ─── Private Serialization ─────────────────────────────────────────────────
185
+ async _serializeValue(value) {
186
+ return this._serializeValueSync(value);
187
+ }
188
+ _serializeValueSync(value) {
189
+ // null / undefined
190
+ if (value === null || value === undefined) {
191
+ return { format: 0, data: 'null', metadata: {} };
192
+ }
193
+ // Boolean
194
+ if (typeof value === 'boolean') {
195
+ return { format: 0, data: String(value), metadata: {} };
196
+ }
197
+ // Number
198
+ if (typeof value === 'number') {
199
+ if (Number.isNaN(value)) {
200
+ return { format: 0, data: 'null', metadata: {} };
201
+ }
202
+ return { format: 0, data: String(value), metadata: {} };
203
+ }
204
+ // BigInt
205
+ if (typeof value === 'bigint') {
206
+ return { format: 0, data: `"${value.toString()}"`, metadata: {} };
207
+ }
208
+ // String
209
+ if (typeof value === 'string') {
210
+ return { format: 0, data: JSON.stringify(value), metadata: {} };
211
+ }
212
+ // TypedArrays → NumPy format
213
+ if (value instanceof Float32Array) {
214
+ return this._numpyBridge.serializeTypedArray(value, 'float32');
215
+ }
216
+ if (value instanceof Float64Array) {
217
+ return this._numpyBridge.serializeTypedArray(value, 'float64');
218
+ }
219
+ if (value instanceof Int8Array) {
220
+ return this._numpyBridge.serializeTypedArray(value, 'int8');
221
+ }
222
+ if (value instanceof Int16Array) {
223
+ return this._numpyBridge.serializeTypedArray(value, 'int16');
224
+ }
225
+ if (value instanceof Int32Array) {
226
+ return this._numpyBridge.serializeTypedArray(value, 'int32');
227
+ }
228
+ if (value instanceof BigInt64Array) {
229
+ return this._numpyBridge.serializeTypedArray(value, 'int64');
230
+ }
231
+ if (value instanceof Uint8Array) {
232
+ return this._numpyBridge.serializeTypedArray(value, 'uint8');
233
+ }
234
+ if (value instanceof Uint16Array) {
235
+ return this._numpyBridge.serializeTypedArray(value, 'uint16');
236
+ }
237
+ if (value instanceof Uint32Array) {
238
+ return this._numpyBridge.serializeTypedArray(value, 'uint32');
239
+ }
240
+ if (value instanceof BigUint64Array) {
241
+ return this._numpyBridge.serializeTypedArray(value, 'uint64');
242
+ }
243
+ // Raw ArrayBuffer
244
+ if (value instanceof ArrayBuffer) {
245
+ return { format: 7, data: new Uint8Array(value), metadata: {} };
246
+ }
247
+ // Array — use MsgPack for large, JSON for small
248
+ if (Array.isArray(value)) {
249
+ try {
250
+ const json = JSON.stringify(value);
251
+ if (json.length <= this._options.maxJsonSize) {
252
+ return { format: 0, data: json, metadata: { length: value.length } };
253
+ }
254
+ // Large array → MessagePack
255
+ const packed = this._msgpackSerializer.encode(value);
256
+ return { format: 1, data: packed, metadata: { length: value.length } };
257
+ }
258
+ catch {
259
+ return { format: 8, data: null, metadata: {} };
260
+ }
261
+ }
262
+ // Plain object — JSON or MsgPack
263
+ if (typeof value === 'object') {
264
+ try {
265
+ const json = JSON.stringify(value);
266
+ if (json.length <= this._options.maxJsonSize) {
267
+ return { format: 0, data: json, metadata: {} };
268
+ }
269
+ const packed = this._msgpackSerializer.encode(value);
270
+ return { format: 1, data: packed, metadata: {} };
271
+ }
272
+ catch {
273
+ return { format: 8, data: null, metadata: {} };
274
+ }
275
+ }
276
+ // Fallback
277
+ return { format: 8, data: null, metadata: {} };
278
+ }
279
+ }
280
+ exports.Serializer = Serializer;
281
+ //# sourceMappingURL=Serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Serializer.js","sourceRoot":"","sources":["../../src/serialization/Serializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * nodepyx — PythonTypeMapper
3
+ * Maps Python type annotation strings → TypeScript type strings.
4
+ *
5
+ * Handles:
6
+ * - Python built-in types (str, int, float, bool, …)
7
+ * - typing module generics (List[X], Dict[K,V], Optional[X], Union[A,B], …)
8
+ * - numpy / pandas / torch special types
9
+ * - Forward references (strings in quotes)
10
+ * - PEP 604 union syntax (X | Y)
11
+ */
12
+ export type TsType = string;
13
+ /**
14
+ * Mapping entry — maps a Python canonical name to a TS type.
15
+ */
16
+ export interface TypeMapEntry {
17
+ /** TypeScript type string */
18
+ tsType: TsType;
19
+ /** Whether this type needs an import statement */
20
+ needsImport?: boolean;
21
+ /** The import path (e.g. './DataFrameBridge') */
22
+ importFrom?: string;
23
+ }
24
+ /** Context passed to mapType for resolving generic parameters */
25
+ export interface TypeMapContext {
26
+ /** Known class names from the current module */
27
+ knownClasses?: Set<string>;
28
+ /** Module name being inspected */
29
+ moduleName?: string;
30
+ /** Whether to emit strict types (never use `unknown`) */
31
+ strict?: boolean;
32
+ }
33
+ /**
34
+ * Map a Python type annotation string to a TypeScript type string.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * mapType('List[int]') // → 'Array<number>'
39
+ * mapType('Dict[str, float]') // → 'Record<string, number>'
40
+ * mapType('Optional[DataFrame]') // → 'DataFrameResult | null'
41
+ * mapType('Union[str, int, None]') // → 'string | number | null'
42
+ * mapType('Tuple[int, str, bool]') // → '[number, string, boolean]'
43
+ * ```
44
+ */
45
+ export declare function mapType(pythonType: string, ctx?: TypeMapContext): TsType;
46
+ /**
47
+ * Map a Python return type annotation.
48
+ * Automatically wraps the result in `Promise<>` since all Python calls
49
+ * are asynchronous from the JavaScript side.
50
+ *
51
+ * Generator / Iterator returns are mapped to `AsyncGenerator`.
52
+ * None → Promise<void>
53
+ */
54
+ export declare function mapReturnType(pythonReturnType: string, ctx?: TypeMapContext): TsType;
55
+ /**
56
+ * Convert a Python default value representation to a TypeScript literal.
57
+ */
58
+ export declare function mapDefaultValue(pythonDefault: string): string;
59
+ /**
60
+ * Split generic parameters at the top level (respects nested brackets).
61
+ * e.g. "str, Dict[str, int], bool" → ["str", "Dict[str, int]", "bool"]
62
+ */
63
+ export declare function splitGenericParams(params: string): string[];
64
+ /**
65
+ * Stateful type mapper that accumulates required imports
66
+ * and knows which class names belong to the current module.
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * const mapper = new PythonTypeMapper({ moduleName: 'sklearn.linear_model' });
71
+ * mapper.registerClass('LinearRegression');
72
+ *
73
+ * mapper.map('LinearRegression') // → 'LinearRegression' (local class ref)
74
+ * mapper.map('DataFrame') // → 'DataFrameResult'
75
+ * ```
76
+ */
77
+ export declare class PythonTypeMapper {
78
+ private readonly _ctx;
79
+ private readonly _imports;
80
+ constructor(ctx?: TypeMapContext);
81
+ registerClass(name: string): void;
82
+ map(pyType: string): TsType;
83
+ mapReturn(pyType: string): TsType;
84
+ addImport(symbol: string, from: string): void;
85
+ generateImportBlock(): string;
86
+ }
87
+ //# sourceMappingURL=PythonTypeMapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PythonTypeMapper.d.ts","sourceRoot":"","sources":["../../src/types/PythonTypeMapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAoOD;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CACrB,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,cAAmB,GACvB,MAAM,CA0CR;AAID;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,gBAAgB,EAAE,MAAM,EACxB,GAAG,GAAE,cAAmB,GACvB,MAAM,CAwBR;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAS7D;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAyB3D;AA2BD;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;gBAE/C,GAAG,GAAE,cAAmB;IAOpC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIjC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAa3B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIjC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAO7C,mBAAmB,IAAI,MAAM;CAO9B"}