@aqarios/luna-model 0.6.4

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/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # LunaModel for JavaScript
2
+
3
+ JavaScript and TypeScript bindings for [LunaModel](https://github.com/aqarios/luna-model), the
4
+ symbolic modeling library for optimization.
5
+
6
+ ## Summary
7
+
8
+ This package brings LunaModel's **`Solution`** type to JavaScript and TypeScript — a
9
+ column-oriented container for solver results — together with a fast binary deserialization
10
+ path and helpers for inspecting feasibility, energies, objective values, and timing.
11
+
12
+ > **Scope.** Today the bindings focus on **reading and working with solutions** that were
13
+ > produced by LunaModel's Python or Rust APIs. Constructing models directly from JavaScript is
14
+ > not supported yet. Support for model building and more of the LunaModel surface will be added
15
+ > in future releases.
16
+
17
+ ## Installation
18
+
19
+ ```sh
20
+ npm install @aqarios/luna-model
21
+ # or
22
+ bun add @aqarios/luna-model
23
+ ```
24
+
25
+ The default package ships a native Node addon with prebuilt binaries for Linux, macOS, and
26
+ Windows on `x86_64` and `aarch64`. A WebAssembly variant,
27
+ `@aqarios/luna-model-wasm32-wasi`, is also available for sandboxed runtimes and the browser,
28
+ where a native addon cannot be loaded.
29
+
30
+ ## Usage
31
+
32
+ ```ts
33
+ import { Solution } from "@aqarios/luna-model";
34
+
35
+ // `bytes` is a Uint8Array or Node.js Buffer produced by LunaModel's Solution
36
+ // serializer (from the Python or Rust API).
37
+ const solution = Solution.deserialize(bytes);
38
+
39
+ console.log(solution.counts); // sample-row occurrence counts, e.g. [2, 3]
40
+ console.log(solution.feasibilityRatio()); // count-weighted feasible ratio, e.g. 0.4
41
+
42
+ // Keep only the feasible samples.
43
+ const feasibleOnly = solution.filterFeasible();
44
+ ```
45
+
46
+ The WebAssembly variant exposes the same surface:
47
+
48
+ ```ts
49
+ import { Solution } from "@aqarios/luna-model-wasm32-wasi";
50
+ ```
51
+
52
+ ## API
53
+
54
+ ### `Solution`
55
+
56
+ | Member | Type | Notes |
57
+ | ----------------------------- | -------------------------------------- | --------------------------------------------------------------------- |
58
+ | `Solution.deserialize(data)` | `(Uint8Array \| Buffer) → Solution` | Decode a serialized LunaModel solution. Throws on invalid bytes. |
59
+ | `solution.counts` | `Array<number>` | Sample-row occurrence counts. |
60
+ | `solution.rawEnergies` | `Array<number> \| null` | Solver-reported energies. |
61
+ | `solution.objValues` | `Array<number> \| null` | Objective values from re-evaluation. |
62
+ | `solution.feasible` | `Array<boolean> \| null` | Per-row feasibility. |
63
+ | `solution.constraints` | `Record<string, Array<boolean>>` | Per-constraint flags. |
64
+ | `solution.variableBounds` | `Record<string, Array<boolean>>` | Per-variable bound flags. |
65
+ | `solution.timing` | `Timing \| null` | Wall-clock and QPU runtime metrics. |
66
+ | `solution.feasibilityRatio()` | `() → number` | Count-weighted feasible ratio. Throws if `feasible` is null. |
67
+ | `solution.filterFeasible()` | `() → Solution` | New solution with only feasible rows. Throws if `feasible` is null. |
68
+
69
+ ### `Timing`
70
+
71
+ | Member | Type | Notes |
72
+ | --------------------- | ---------------- | ---------------------------------------------------------------- |
73
+ | `timing.start` | `number` | Wall-clock start, ms since the Unix epoch (`new Date(start)`). |
74
+ | `timing.end` | `number` | Wall-clock end, ms since the Unix epoch. |
75
+ | `timing.totalSeconds` | `number` | `end − start` in seconds. Throws on inconsistent timestamps. |
76
+ | `timing.qpu` | `number \| null` | QPU usage time in seconds, when reported. |
77
+
78
+ ## Errors
79
+
80
+ Errors surface as standard JavaScript `Error`s with NAPI status codes. Invalid input bytes,
81
+ missing feasibility data, and out-of-range integers raise `InvalidArg`-shaped errors, with the
82
+ underlying LunaModel message preserved.
83
+
84
+ ## Roadmap
85
+
86
+ The bindings are intentionally small for now and will grow over time. Planned additions
87
+ include constructing models from JavaScript and broader coverage of the LunaModel API
88
+ (expressions, constraints, and translation). Follow the
89
+ [main repository](https://github.com/aqarios/luna-model) for progress.
90
+
91
+ ## License
92
+
93
+ Apache-2.0. See [LICENSE](../LICENSE).
package/index.d.ts ADDED
@@ -0,0 +1,158 @@
1
+ /* auto-generated by NAPI-RS */
2
+ /* eslint-disable */
3
+ /**
4
+ * Provides access to solution information including the sample,
5
+ * objective value, feasibility, and constraint satisfaction, counts,
6
+ * raw energy, and comparison capabilities.
7
+ */
8
+ export declare class ResultView {
9
+ /** Get the number of times this result was observed. */
10
+ get counts(): number
11
+ /** Get the objective function value. */
12
+ get objValue(): number | null
13
+ /** Get the raw energy from the solver. */
14
+ get rawEnergy(): number | null
15
+ /** Get constraint satisfaction status. */
16
+ get constraints(): Record<string, boolean> | null
17
+ /** Get variable bound satisfaction status. */
18
+ get variableBounds(): Record<string, boolean> | null
19
+ /** Get feasibility status. */
20
+ get feasible(): boolean | null
21
+ }
22
+ export type JsResultView = ResultView
23
+
24
+ /**
25
+ * Column-oriented solution data for model evaluation or solver results.
26
+ *
27
+ * A solution is independent of the original model and stores all variable data
28
+ * by variable name. JavaScript solutions are created from LunaModel's binary
29
+ * serializer with `Solution.deserialize()`.
30
+ */
31
+ export declare class Solution {
32
+ /**
33
+ * Decode a LunaModel solution from serialized binary bytes.
34
+ *
35
+ * This is the JavaScript alias for Python's `Solution.decode()` /
36
+ * `Solution.deserialize()` path. `data` must contain bytes produced by the
37
+ * existing LunaModel `Solution` serializer.
38
+ */
39
+ static deserialize(data: Uint8Array): Solution
40
+ /**
41
+ * Number of occurrences for each stored sample row.
42
+ *
43
+ * This matches the Python `counts` property.
44
+ */
45
+ get counts(): Array<number>
46
+ /**
47
+ * Objective values as computed by the solver.
48
+ *
49
+ * Returns `null` if the solver did not provide raw energies. This matches
50
+ * the Python `raw_energies` property.
51
+ */
52
+ get rawEnergies(): Array<number> | null
53
+ /**
54
+ * Objective values as computed by the corresponding model.
55
+ *
56
+ * Returns `null` for solutions that have not yet been evaluated. This
57
+ * matches the Python `obj_values` property.
58
+ */
59
+ get objValues(): Array<number> | null
60
+ /**
61
+ * Feasibility flag for each stored sample row.
62
+ *
63
+ * A value is `true` when all constraints and variable bounds are satisfied
64
+ * for that sample. Returns `null` for solutions without feasibility data.
65
+ */
66
+ get feasible(): Array<boolean> | null
67
+ /**
68
+ * Per-constraint feasibility flags keyed by constraint name.
69
+ *
70
+ * Each vector is aligned with the stored sample rows.
71
+ */
72
+ get constraints(): Record<string, Array<boolean>>
73
+ /**
74
+ * Per-variable bound feasibility flags keyed by variable name.
75
+ *
76
+ * Each vector is aligned with the stored sample rows.
77
+ */
78
+ get variableBounds(): Record<string, Array<boolean>>
79
+ /**
80
+ * Runtime metrics carried by this solution.
81
+ *
82
+ * Returns `null` if no timing metadata is available. This corresponds to
83
+ * Python's `runtime` property.
84
+ */
85
+ get timing(): JsTiming | null
86
+ /**
87
+ * Sense carried by this solution.
88
+ *
89
+ * This corresponds to Python's `sense` property.
90
+ */
91
+ get sense(): Sense
92
+ /**
93
+ * Fraction of total sample mass marked as feasible.
94
+ *
95
+ * Computes the count-weighted ratio of feasible samples to all samples.
96
+ * Throws if feasibility data is not available.
97
+ */
98
+ feasibilityRatio(): number
99
+ /**
100
+ * Return a new solution containing only feasible sample rows.
101
+ *
102
+ * Throws if feasibility data is not available. Filtering feasible samples
103
+ * is not possible on a non-evaluated solution.
104
+ */
105
+ filterFeasible(): Solution
106
+ /**
107
+ * Get the best results according to the optimization sense.
108
+ *
109
+ * Returns `ResultView[]` or `null`.
110
+ * List of best results (lowest for MIN, highest for MAX).
111
+ */
112
+ best(): Array<ResultView> | null
113
+ }
114
+ export type JsSolution = Solution
115
+
116
+ /**
117
+ * Runtime timing metadata attached to a solution.
118
+ *
119
+ * JavaScript exposes wall-clock timestamps as milliseconds since the Unix
120
+ * epoch (UTC). Wrap with `new Date(timing.start)` for a `Date` object.
121
+ */
122
+ export declare class Timing {
123
+ /**
124
+ * Wall-clock start time, in milliseconds since the Unix epoch (UTC).
125
+ *
126
+ * This matches Python's `start` property; wrap with `new Date(...)` on
127
+ * the JS side if you want a `Date` object.
128
+ */
129
+ get start(): number
130
+ /**
131
+ * Wall-clock end time, in milliseconds since the Unix epoch (UTC).
132
+ *
133
+ * This matches Python's `end` property; wrap with `new Date(...)` on
134
+ * the JS side if you want a `Date` object.
135
+ */
136
+ get end(): number
137
+ /**
138
+ * Total runtime in seconds.
139
+ *
140
+ * This is computed as the difference between `end` and `start`. Throws if
141
+ * the timing record is inconsistent and the total duration cannot be
142
+ * computed. This matches Python's `total_seconds` property.
143
+ */
144
+ get totalSeconds(): number
145
+ /**
146
+ * QPU usage time reported by the backend.
147
+ *
148
+ * Returns `null` when no QPU timing was provided. This matches Python's
149
+ * `qpu` property.
150
+ */
151
+ get qpu(): number | null
152
+ }
153
+ export type JsTiming = Timing
154
+
155
+ export declare const enum Sense {
156
+ Max = 0,
157
+ Min = 1
158
+ }
package/index.js ADDED
@@ -0,0 +1,597 @@
1
+ // prettier-ignore
2
+ /* eslint-disable */
3
+ // @ts-nocheck
4
+ /* auto-generated by NAPI-RS */
5
+
6
+ const { readFileSync } = require('fs')
7
+ let nativeBinding = null
8
+ const loadErrors = []
9
+
10
+ const isMusl = () => {
11
+ let musl = false
12
+ if (process.platform === 'linux') {
13
+ musl = isMuslFromFilesystem()
14
+ if (musl === null) {
15
+ musl = isMuslFromReport()
16
+ }
17
+ if (musl === null) {
18
+ musl = isMuslFromChildProcess()
19
+ }
20
+ }
21
+ return musl
22
+ }
23
+
24
+ const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-')
25
+
26
+ const isMuslFromFilesystem = () => {
27
+ try {
28
+ return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl')
29
+ } catch {
30
+ return null
31
+ }
32
+ }
33
+
34
+ const isMuslFromReport = () => {
35
+ let report = null
36
+ if (process.report && typeof process.report.getReport === 'function') {
37
+ process.report.excludeNetwork = true
38
+ report = process.report.getReport()
39
+ }
40
+ if (!report) {
41
+ return null
42
+ }
43
+ if (report.header && report.header.glibcVersionRuntime) {
44
+ return false
45
+ }
46
+ if (Array.isArray(report.sharedObjects)) {
47
+ if (report.sharedObjects.some(isFileMusl)) {
48
+ return true
49
+ }
50
+ }
51
+ return false
52
+ }
53
+
54
+ const isMuslFromChildProcess = () => {
55
+ try {
56
+ return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl')
57
+ } catch (e) {
58
+ // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false
59
+ return false
60
+ }
61
+ }
62
+
63
+ function requireNative() {
64
+ if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
65
+ try {
66
+ return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
67
+ } catch (err) {
68
+ loadErrors.push(err)
69
+ }
70
+ } else if (process.platform === 'android') {
71
+ if (process.arch === 'arm64') {
72
+ try {
73
+ return require('./js_lunamodel.android-arm64.node')
74
+ } catch (e) {
75
+ loadErrors.push(e)
76
+ }
77
+ try {
78
+ const binding = require('@aqarios/luna-model-android-arm64')
79
+ const bindingPackageVersion = require('@aqarios/luna-model-android-arm64/package.json').version
80
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
81
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
82
+ }
83
+ return binding
84
+ } catch (e) {
85
+ loadErrors.push(e)
86
+ }
87
+ } else if (process.arch === 'arm') {
88
+ try {
89
+ return require('./js_lunamodel.android-arm-eabi.node')
90
+ } catch (e) {
91
+ loadErrors.push(e)
92
+ }
93
+ try {
94
+ const binding = require('@aqarios/luna-model-android-arm-eabi')
95
+ const bindingPackageVersion = require('@aqarios/luna-model-android-arm-eabi/package.json').version
96
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
97
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
98
+ }
99
+ return binding
100
+ } catch (e) {
101
+ loadErrors.push(e)
102
+ }
103
+ } else {
104
+ loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`))
105
+ }
106
+ } else if (process.platform === 'win32') {
107
+ if (process.arch === 'x64') {
108
+ if ((process.config && process.config.variables && process.config.variables.shlib_suffix === 'dll.a') || (process.config && process.config.variables && process.config.variables.node_target_type === 'shared_library')) {
109
+ try {
110
+ return require('./js_lunamodel.win32-x64-gnu.node')
111
+ } catch (e) {
112
+ loadErrors.push(e)
113
+ }
114
+ try {
115
+ const binding = require('@aqarios/luna-model-win32-x64-gnu')
116
+ const bindingPackageVersion = require('@aqarios/luna-model-win32-x64-gnu/package.json').version
117
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
118
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
119
+ }
120
+ return binding
121
+ } catch (e) {
122
+ loadErrors.push(e)
123
+ }
124
+ } else {
125
+ try {
126
+ return require('./js_lunamodel.win32-x64-msvc.node')
127
+ } catch (e) {
128
+ loadErrors.push(e)
129
+ }
130
+ try {
131
+ const binding = require('@aqarios/luna-model-win32-x64-msvc')
132
+ const bindingPackageVersion = require('@aqarios/luna-model-win32-x64-msvc/package.json').version
133
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
134
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
135
+ }
136
+ return binding
137
+ } catch (e) {
138
+ loadErrors.push(e)
139
+ }
140
+ }
141
+ } else if (process.arch === 'ia32') {
142
+ try {
143
+ return require('./js_lunamodel.win32-ia32-msvc.node')
144
+ } catch (e) {
145
+ loadErrors.push(e)
146
+ }
147
+ try {
148
+ const binding = require('@aqarios/luna-model-win32-ia32-msvc')
149
+ const bindingPackageVersion = require('@aqarios/luna-model-win32-ia32-msvc/package.json').version
150
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
151
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
152
+ }
153
+ return binding
154
+ } catch (e) {
155
+ loadErrors.push(e)
156
+ }
157
+ } else if (process.arch === 'arm64') {
158
+ try {
159
+ return require('./js_lunamodel.win32-arm64-msvc.node')
160
+ } catch (e) {
161
+ loadErrors.push(e)
162
+ }
163
+ try {
164
+ const binding = require('@aqarios/luna-model-win32-arm64-msvc')
165
+ const bindingPackageVersion = require('@aqarios/luna-model-win32-arm64-msvc/package.json').version
166
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
167
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
168
+ }
169
+ return binding
170
+ } catch (e) {
171
+ loadErrors.push(e)
172
+ }
173
+ } else {
174
+ loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`))
175
+ }
176
+ } else if (process.platform === 'darwin') {
177
+ try {
178
+ return require('./js_lunamodel.darwin-universal.node')
179
+ } catch (e) {
180
+ loadErrors.push(e)
181
+ }
182
+ try {
183
+ const binding = require('@aqarios/luna-model-darwin-universal')
184
+ const bindingPackageVersion = require('@aqarios/luna-model-darwin-universal/package.json').version
185
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
186
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
187
+ }
188
+ return binding
189
+ } catch (e) {
190
+ loadErrors.push(e)
191
+ }
192
+ if (process.arch === 'x64') {
193
+ try {
194
+ return require('./js_lunamodel.darwin-x64.node')
195
+ } catch (e) {
196
+ loadErrors.push(e)
197
+ }
198
+ try {
199
+ const binding = require('@aqarios/luna-model-darwin-x64')
200
+ const bindingPackageVersion = require('@aqarios/luna-model-darwin-x64/package.json').version
201
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
202
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
203
+ }
204
+ return binding
205
+ } catch (e) {
206
+ loadErrors.push(e)
207
+ }
208
+ } else if (process.arch === 'arm64') {
209
+ try {
210
+ return require('./js_lunamodel.darwin-arm64.node')
211
+ } catch (e) {
212
+ loadErrors.push(e)
213
+ }
214
+ try {
215
+ const binding = require('@aqarios/luna-model-darwin-arm64')
216
+ const bindingPackageVersion = require('@aqarios/luna-model-darwin-arm64/package.json').version
217
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
218
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
219
+ }
220
+ return binding
221
+ } catch (e) {
222
+ loadErrors.push(e)
223
+ }
224
+ } else {
225
+ loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`))
226
+ }
227
+ } else if (process.platform === 'freebsd') {
228
+ if (process.arch === 'x64') {
229
+ try {
230
+ return require('./js_lunamodel.freebsd-x64.node')
231
+ } catch (e) {
232
+ loadErrors.push(e)
233
+ }
234
+ try {
235
+ const binding = require('@aqarios/luna-model-freebsd-x64')
236
+ const bindingPackageVersion = require('@aqarios/luna-model-freebsd-x64/package.json').version
237
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
238
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
239
+ }
240
+ return binding
241
+ } catch (e) {
242
+ loadErrors.push(e)
243
+ }
244
+ } else if (process.arch === 'arm64') {
245
+ try {
246
+ return require('./js_lunamodel.freebsd-arm64.node')
247
+ } catch (e) {
248
+ loadErrors.push(e)
249
+ }
250
+ try {
251
+ const binding = require('@aqarios/luna-model-freebsd-arm64')
252
+ const bindingPackageVersion = require('@aqarios/luna-model-freebsd-arm64/package.json').version
253
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
254
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
255
+ }
256
+ return binding
257
+ } catch (e) {
258
+ loadErrors.push(e)
259
+ }
260
+ } else {
261
+ loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`))
262
+ }
263
+ } else if (process.platform === 'linux') {
264
+ if (process.arch === 'x64') {
265
+ if (isMusl()) {
266
+ try {
267
+ return require('./js_lunamodel.linux-x64-musl.node')
268
+ } catch (e) {
269
+ loadErrors.push(e)
270
+ }
271
+ try {
272
+ const binding = require('@aqarios/luna-model-linux-x64-musl')
273
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-x64-musl/package.json').version
274
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
275
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
276
+ }
277
+ return binding
278
+ } catch (e) {
279
+ loadErrors.push(e)
280
+ }
281
+ } else {
282
+ try {
283
+ return require('./js_lunamodel.linux-x64-gnu.node')
284
+ } catch (e) {
285
+ loadErrors.push(e)
286
+ }
287
+ try {
288
+ const binding = require('@aqarios/luna-model-linux-x64-gnu')
289
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-x64-gnu/package.json').version
290
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
291
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
292
+ }
293
+ return binding
294
+ } catch (e) {
295
+ loadErrors.push(e)
296
+ }
297
+ }
298
+ } else if (process.arch === 'arm64') {
299
+ if (isMusl()) {
300
+ try {
301
+ return require('./js_lunamodel.linux-arm64-musl.node')
302
+ } catch (e) {
303
+ loadErrors.push(e)
304
+ }
305
+ try {
306
+ const binding = require('@aqarios/luna-model-linux-arm64-musl')
307
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-arm64-musl/package.json').version
308
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
309
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
310
+ }
311
+ return binding
312
+ } catch (e) {
313
+ loadErrors.push(e)
314
+ }
315
+ } else {
316
+ try {
317
+ return require('./js_lunamodel.linux-arm64-gnu.node')
318
+ } catch (e) {
319
+ loadErrors.push(e)
320
+ }
321
+ try {
322
+ const binding = require('@aqarios/luna-model-linux-arm64-gnu')
323
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-arm64-gnu/package.json').version
324
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
325
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
326
+ }
327
+ return binding
328
+ } catch (e) {
329
+ loadErrors.push(e)
330
+ }
331
+ }
332
+ } else if (process.arch === 'arm') {
333
+ if (isMusl()) {
334
+ try {
335
+ return require('./js_lunamodel.linux-arm-musleabihf.node')
336
+ } catch (e) {
337
+ loadErrors.push(e)
338
+ }
339
+ try {
340
+ const binding = require('@aqarios/luna-model-linux-arm-musleabihf')
341
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-arm-musleabihf/package.json').version
342
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
343
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
344
+ }
345
+ return binding
346
+ } catch (e) {
347
+ loadErrors.push(e)
348
+ }
349
+ } else {
350
+ try {
351
+ return require('./js_lunamodel.linux-arm-gnueabihf.node')
352
+ } catch (e) {
353
+ loadErrors.push(e)
354
+ }
355
+ try {
356
+ const binding = require('@aqarios/luna-model-linux-arm-gnueabihf')
357
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-arm-gnueabihf/package.json').version
358
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
359
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
360
+ }
361
+ return binding
362
+ } catch (e) {
363
+ loadErrors.push(e)
364
+ }
365
+ }
366
+ } else if (process.arch === 'loong64') {
367
+ if (isMusl()) {
368
+ try {
369
+ return require('./js_lunamodel.linux-loong64-musl.node')
370
+ } catch (e) {
371
+ loadErrors.push(e)
372
+ }
373
+ try {
374
+ const binding = require('@aqarios/luna-model-linux-loong64-musl')
375
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-loong64-musl/package.json').version
376
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
377
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
378
+ }
379
+ return binding
380
+ } catch (e) {
381
+ loadErrors.push(e)
382
+ }
383
+ } else {
384
+ try {
385
+ return require('./js_lunamodel.linux-loong64-gnu.node')
386
+ } catch (e) {
387
+ loadErrors.push(e)
388
+ }
389
+ try {
390
+ const binding = require('@aqarios/luna-model-linux-loong64-gnu')
391
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-loong64-gnu/package.json').version
392
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
393
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
394
+ }
395
+ return binding
396
+ } catch (e) {
397
+ loadErrors.push(e)
398
+ }
399
+ }
400
+ } else if (process.arch === 'riscv64') {
401
+ if (isMusl()) {
402
+ try {
403
+ return require('./js_lunamodel.linux-riscv64-musl.node')
404
+ } catch (e) {
405
+ loadErrors.push(e)
406
+ }
407
+ try {
408
+ const binding = require('@aqarios/luna-model-linux-riscv64-musl')
409
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-riscv64-musl/package.json').version
410
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
411
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
412
+ }
413
+ return binding
414
+ } catch (e) {
415
+ loadErrors.push(e)
416
+ }
417
+ } else {
418
+ try {
419
+ return require('./js_lunamodel.linux-riscv64-gnu.node')
420
+ } catch (e) {
421
+ loadErrors.push(e)
422
+ }
423
+ try {
424
+ const binding = require('@aqarios/luna-model-linux-riscv64-gnu')
425
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-riscv64-gnu/package.json').version
426
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
427
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
428
+ }
429
+ return binding
430
+ } catch (e) {
431
+ loadErrors.push(e)
432
+ }
433
+ }
434
+ } else if (process.arch === 'ppc64') {
435
+ try {
436
+ return require('./js_lunamodel.linux-ppc64-gnu.node')
437
+ } catch (e) {
438
+ loadErrors.push(e)
439
+ }
440
+ try {
441
+ const binding = require('@aqarios/luna-model-linux-ppc64-gnu')
442
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-ppc64-gnu/package.json').version
443
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
444
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
445
+ }
446
+ return binding
447
+ } catch (e) {
448
+ loadErrors.push(e)
449
+ }
450
+ } else if (process.arch === 's390x') {
451
+ try {
452
+ return require('./js_lunamodel.linux-s390x-gnu.node')
453
+ } catch (e) {
454
+ loadErrors.push(e)
455
+ }
456
+ try {
457
+ const binding = require('@aqarios/luna-model-linux-s390x-gnu')
458
+ const bindingPackageVersion = require('@aqarios/luna-model-linux-s390x-gnu/package.json').version
459
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
460
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
461
+ }
462
+ return binding
463
+ } catch (e) {
464
+ loadErrors.push(e)
465
+ }
466
+ } else {
467
+ loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`))
468
+ }
469
+ } else if (process.platform === 'openharmony') {
470
+ if (process.arch === 'arm64') {
471
+ try {
472
+ return require('./js_lunamodel.openharmony-arm64.node')
473
+ } catch (e) {
474
+ loadErrors.push(e)
475
+ }
476
+ try {
477
+ const binding = require('@aqarios/luna-model-openharmony-arm64')
478
+ const bindingPackageVersion = require('@aqarios/luna-model-openharmony-arm64/package.json').version
479
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
480
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
481
+ }
482
+ return binding
483
+ } catch (e) {
484
+ loadErrors.push(e)
485
+ }
486
+ } else if (process.arch === 'x64') {
487
+ try {
488
+ return require('./js_lunamodel.openharmony-x64.node')
489
+ } catch (e) {
490
+ loadErrors.push(e)
491
+ }
492
+ try {
493
+ const binding = require('@aqarios/luna-model-openharmony-x64')
494
+ const bindingPackageVersion = require('@aqarios/luna-model-openharmony-x64/package.json').version
495
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
496
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
497
+ }
498
+ return binding
499
+ } catch (e) {
500
+ loadErrors.push(e)
501
+ }
502
+ } else if (process.arch === 'arm') {
503
+ try {
504
+ return require('./js_lunamodel.openharmony-arm.node')
505
+ } catch (e) {
506
+ loadErrors.push(e)
507
+ }
508
+ try {
509
+ const binding = require('@aqarios/luna-model-openharmony-arm')
510
+ const bindingPackageVersion = require('@aqarios/luna-model-openharmony-arm/package.json').version
511
+ if (bindingPackageVersion !== '0.6.4-rc.4' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
512
+ throw new Error(`Native binding package version mismatch, expected 0.6.4-rc.4 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
513
+ }
514
+ return binding
515
+ } catch (e) {
516
+ loadErrors.push(e)
517
+ }
518
+ } else {
519
+ loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`))
520
+ }
521
+ } else {
522
+ loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`))
523
+ }
524
+ }
525
+
526
+ nativeBinding = requireNative()
527
+
528
+ // NAPI_RS_FORCE_WASI is a tri-state flag:
529
+ // unset / any other value → native binding preferred, WASI is only a fallback
530
+ // 'true' → force WASI fallback even if native loaded
531
+ // 'error' → force WASI and throw if no WASI binding is found
532
+ // Treating any non-empty string as truthy (the historical behavior) meant
533
+ // NAPI_RS_FORCE_WASI=false, NAPI_RS_FORCE_WASI=0, etc. inadvertently triggered
534
+ // the WASI path, causing ENOENT for packages shipped without a .wasi.cjs file.
535
+ const forceWasi =
536
+ process.env.NAPI_RS_FORCE_WASI === 'true' || process.env.NAPI_RS_FORCE_WASI === 'error'
537
+
538
+ if (!nativeBinding || forceWasi) {
539
+ let wasiBinding = null
540
+ let wasiBindingError = null
541
+ try {
542
+ wasiBinding = require('./js_lunamodel.wasi.cjs')
543
+ nativeBinding = wasiBinding
544
+ } catch (err) {
545
+ if (forceWasi) {
546
+ wasiBindingError = err
547
+ }
548
+ }
549
+ if (!nativeBinding || forceWasi) {
550
+ try {
551
+ wasiBinding = require('@aqarios/luna-model-wasm32-wasi')
552
+ nativeBinding = wasiBinding
553
+ } catch (err) {
554
+ if (forceWasi) {
555
+ if (!wasiBindingError) {
556
+ wasiBindingError = err
557
+ } else {
558
+ wasiBindingError.cause = err
559
+ }
560
+ loadErrors.push(err)
561
+ }
562
+ }
563
+ }
564
+ if (process.env.NAPI_RS_FORCE_WASI === 'error' && !wasiBinding) {
565
+ const error = new Error('WASI binding not found and NAPI_RS_FORCE_WASI is set to error')
566
+ error.cause = wasiBindingError
567
+ throw error
568
+ }
569
+ }
570
+
571
+ if (!nativeBinding) {
572
+ if (loadErrors.length > 0) {
573
+ const error = new Error(
574
+ `Cannot find native binding. ` +
575
+ `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` +
576
+ 'Please try `npm i` again after removing both package-lock.json and node_modules directory.',
577
+ )
578
+ // assign instead of the `new Error(message, { cause })` options form,
579
+ // which Node < 16.9 silently ignores
580
+ error.cause = loadErrors.reduce((err, cur) => {
581
+ cur.cause = err
582
+ return cur
583
+ })
584
+ throw error
585
+ }
586
+ throw new Error(`Failed to load native binding`)
587
+ }
588
+
589
+ module.exports = nativeBinding
590
+ module.exports.ResultView = nativeBinding.ResultView
591
+ module.exports.JsResultView = nativeBinding.JsResultView
592
+ module.exports.Solution = nativeBinding.Solution
593
+ module.exports.JsSolution = nativeBinding.JsSolution
594
+ module.exports.Timing = nativeBinding.Timing
595
+ module.exports.JsTiming = nativeBinding.JsTiming
596
+ module.exports.Sense = nativeBinding.Sense
597
+ module.exports.JsSense = nativeBinding.JsSense
Binary file
Binary file
Binary file
Binary file
Binary file
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@aqarios/luna-model",
3
+ "version": "0.6.4",
4
+ "description": "JavaScript and TypeScript bindings for LunaModel",
5
+ "license": "Apache-2.0",
6
+ "author": "Aqarios GmbH <pypi@aqarios.com>",
7
+ "contributors": [
8
+ "Jonas Blenninger <jonas.blenninger@aqarios.com>",
9
+ "David Bucher <david.bucher@aqarios.com>",
10
+ "Maximilian Janetschek <maximilian.janetschek@aqarios.com>"
11
+ ],
12
+ "publishConfig": {
13
+ "registry": "https://registry.npmjs.org",
14
+ "access": "public",
15
+ "provenance": true
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/aqarios/luna-model.git",
20
+ "directory": "js-lunamodel"
21
+ },
22
+ "main": "index.js",
23
+ "types": "index.d.ts",
24
+ "files": [
25
+ "index.js",
26
+ "index.d.ts",
27
+ "*.node"
28
+ ],
29
+ "scripts": {
30
+ "build": "napi build --release --platform --config-path napi.json",
31
+ "build:debug": "napi build --platform --config-path napi.json",
32
+ "build:wasm": "napi build --target wasm32-wasip1-threads --platform --config-path napi.wasm.json",
33
+ "artifacts": "napi artifacts --config-path napi.json",
34
+ "check": "cargo check -p js-lunamodel",
35
+ "test": "bun run build:debug && bun test",
36
+ "test:js": "bun test",
37
+ "test:coverage": "bun test --coverage",
38
+ "test:rust": "cargo test -p js-lunamodel",
39
+ "test:wasm": "node tests/wasm_node_smoke.cjs",
40
+ "test:all": "bun run check && bun run test:rust && bun run test"
41
+ },
42
+ "devDependencies": {
43
+ "@emnapi/core": "1.11.1",
44
+ "@emnapi/runtime": "1.11.1",
45
+ "@napi-rs/cli": "^3.7.2",
46
+ "@napi-rs/wasm-runtime": "^1.1.5"
47
+ }
48
+ }