@gpuix/native 0.1.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.
Binary file
Binary file
Binary file
Binary file
package/index.d.ts ADDED
@@ -0,0 +1,320 @@
1
+ /* auto-generated by NAPI-RS */
2
+ /* eslint-disable */
3
+ /** The main GPUI renderer exposed to Node.js. */
4
+ export declare class GpuixRenderer {
5
+ constructor(eventCallback?: (((err: Error | null, arg: EventPayload) => any)) | undefined | null)
6
+ /** Initialize the GPUI application with a non-blocking NodePlatform. */
7
+ init(options?: WindowOptions | undefined | null): void
8
+ createElement(id: number, elementType: string): void
9
+ /**
10
+ * Destroy an element and all descendants. Returns array of destroyed IDs
11
+ * so JS can clean up event handlers for the entire subtree.
12
+ */
13
+ destroyElement(id: number): Array<number>
14
+ appendChild(parentId: number, childId: number): void
15
+ removeChild(parentId: number, childId: number): void
16
+ insertBefore(parentId: number, childId: number, beforeId: number): void
17
+ setStyle(id: number, styleJson: string): void
18
+ setText(id: number, content: string): void
19
+ setEventListener(id: number, eventType: string, hasHandler: boolean): void
20
+ /** Set the root element (called from appendChildToContainer). */
21
+ setRoot(id: number): void
22
+ /**
23
+ * Set a custom prop on an element (for non-div/text elements like input, editor, diff).
24
+ * Key is the prop name, value is JSON-encoded.
25
+ */
26
+ setCustomProp(id: number, key: string, valueJson: string): void
27
+ /** Get a custom prop value from an element. Returns JSON string or null. */
28
+ getCustomProp(id: number, key: string): string | null
29
+ /** Signal that a batch of mutations is complete. Triggers re-render. */
30
+ commitMutations(): void
31
+ /**
32
+ * Apply a batch of mutations in a single FFI call.
33
+ *
34
+ * Accepts a JSON array of mutation tuples. Each tuple is an array where
35
+ * the first element is the operation name (string) and remaining elements
36
+ * are the arguments:
37
+ *
38
+ * ["createElement", id, "type"]
39
+ * ["destroyElement", id]
40
+ * ["appendChild", parentId, childId]
41
+ * ["removeChild", parentId, childId]
42
+ * ["insertBefore", parentId, childId, beforeId]
43
+ * ["setStyle", id, "{styleJson}"]
44
+ * ["setText", id, "content"]
45
+ * ["setEventListener", id, "eventType", true|false]
46
+ * ["setRoot", id]
47
+ * ["setCustomProp", id, "key", "{valueJson}"]
48
+ *
49
+ * Returns accumulated destroyed IDs from all destroyElement ops.
50
+ * Acquires the tree mutex ONCE for the entire batch.
51
+ */
52
+ applyBatch(json: string): Array<number>
53
+ tick(): void
54
+ isInitialized(): boolean
55
+ getWindowSize(): WindowSize
56
+ setWindowTitle(title: string): void
57
+ focusElement(elementId: number): void
58
+ blur(): void
59
+ /**
60
+ * Set the scroll offset of a scrollable element.
61
+ * x and y are negative pixel values (scroll down = more negative y).
62
+ */
63
+ scrollTo(elementId: number, x: number, y: number): void
64
+ /** Scroll a child into view by its index in the children list. */
65
+ scrollToItem(elementId: number, index: number): void
66
+ /**
67
+ * Get the current scroll offset of a scrollable element.
68
+ * Returns [x, y] or null if the element has no scroll handle.
69
+ */
70
+ getScrollOffset(elementId: number): Array<number> | null
71
+ }
72
+
73
+ /**
74
+ * GPU-backed GPUI test renderer. Uses VisualTestAppContext (real Metal
75
+ * rendering on macOS) with TestDispatcher for deterministic scheduling.
76
+ * Same GpuixView and rendering pipeline as production.
77
+ *
78
+ * Usage from JS:
79
+ * const r = new TestGpuixRenderer()
80
+ * r.createElement(1, "div")
81
+ * r.setRoot(1)
82
+ * r.commitMutations()
83
+ * r.flush() // triggers GpuixView::render() via Metal
84
+ * r.simulateClick(50, 50) // dispatches through GPUI hit testing
85
+ * const events = r.drainEvents()
86
+ * r.captureScreenshot("/tmp/test.png") // saves rendered UI as PNG
87
+ */
88
+ export declare class TestGpuixRenderer {
89
+ constructor()
90
+ createElement(id: number, elementType: string): void
91
+ /**
92
+ * Destroy an element and all descendants. Returns destroyed IDs
93
+ * so JS can clean up event handlers.
94
+ */
95
+ destroyElement(id: number): Array<number>
96
+ appendChild(parentId: number, childId: number): void
97
+ removeChild(parentId: number, childId: number): void
98
+ insertBefore(parentId: number, childId: number, beforeId: number): void
99
+ setStyle(id: number, styleJson: string): void
100
+ setText(id: number, content: string): void
101
+ setEventListener(id: number, eventType: string, hasHandler: boolean): void
102
+ /** Set the root element (called from appendChildToContainer). */
103
+ setRoot(id: number): void
104
+ /** Set a custom prop on an element (for non-div/text elements like input, editor, diff). */
105
+ setCustomProp(id: number, key: string, valueJson: string): void
106
+ /** Get a custom prop value from an element. */
107
+ getCustomProp(id: number, key: string): string | null
108
+ /**
109
+ * Signal that a batch of mutations is complete.
110
+ * In tests, this is a no-op — flush() handles the actual re-render.
111
+ */
112
+ commitMutations(): void
113
+ /**
114
+ * Apply a batch of mutations in a single FFI call.
115
+ * Same format as GpuixRenderer::apply_batch (string op names).
116
+ * Returns accumulated destroyed IDs from all destroyElement ops.
117
+ */
118
+ applyBatch(json: string): Array<number>
119
+ /**
120
+ * Notify the view entity and run GPUI until parked.
121
+ * This triggers GpuixView::render() → build_element() → GPUI layout.
122
+ * Must be called after mutations and before simulating events (GPUI's
123
+ * hit testing requires elements to be laid out).
124
+ */
125
+ flush(): void
126
+ /**
127
+ * Simulate a click at the given window coordinates.
128
+ * Dispatches MouseDown + MouseUp through GPUI's input pipeline,
129
+ * which triggers the same event handlers as production.
130
+ * IMPORTANT: Call flush() before this — hit testing requires laid-out elements.
131
+ */
132
+ simulateClick(x: number, y: number): void
133
+ /**
134
+ * Simulate key strokes through GPUI's input pipeline.
135
+ * Format: space-separated keys, e.g. "a", "enter", "cmd-shift-p".
136
+ * The focused element receives keyDown/keyUp events.
137
+ */
138
+ simulateKeystrokes(keystrokes: string): void
139
+ /**
140
+ * Simulate a single key down event through GPUI's input pipeline.
141
+ * Format: modifier-key string, e.g. "a", "enter", "cmd-s".
142
+ * Unlike simulate_keystrokes, this dispatches ONLY a KeyDownEvent —
143
+ * no automatic KeyUpEvent follows. Use with simulate_key_up for
144
+ * fine-grained key event testing.
145
+ */
146
+ simulateKeyDown(keystroke: string, isHeld?: boolean | undefined | null): void
147
+ /**
148
+ * Simulate a single key up event through GPUI's input pipeline.
149
+ * Format: modifier-key string, e.g. "a", "enter", "cmd-s".
150
+ * Pairs with simulate_key_down for fine-grained key event testing.
151
+ */
152
+ simulateKeyUp(keystroke: string): void
153
+ /**
154
+ * Simulate a mouse move to the given coordinates.
155
+ * pressed_button: optional mouse button held during move (0=left, 1=middle, 2=right).
156
+ * Used to simulate drag events.
157
+ */
158
+ simulateMouseMove(x: number, y: number, pressedButton?: number | undefined | null): void
159
+ /**
160
+ * Focus an element by its numeric ID.
161
+ * The element must have a FocusHandle (created by sync_focus_handles when
162
+ * the element has keyDown, keyUp, focus, or blur listeners).
163
+ * Call flush() before this so the element tree and focus handles exist.
164
+ */
165
+ focusElement(id: number): void
166
+ /**
167
+ * Simulate a mouse down event at the given window coordinates.
168
+ * Button: 0=left, 1=middle, 2=right. Defaults to left (0).
169
+ */
170
+ simulateMouseDown(x: number, y: number, button?: number | undefined | null): void
171
+ /**
172
+ * Simulate a mouse up event at the given window coordinates.
173
+ * Button: 0=left, 1=middle, 2=right. Defaults to left (0).
174
+ */
175
+ simulateMouseUp(x: number, y: number, button?: number | undefined | null): void
176
+ /**
177
+ * Simulate a scroll wheel event at the given position.
178
+ * delta_x and delta_y are in pixels (negative = scroll up/left).
179
+ */
180
+ simulateScrollWheel(x: number, y: number, deltaX: number, deltaY: number): void
181
+ /**
182
+ * Set the scroll offset of a scrollable element.
183
+ * x and y are negative pixel values (scroll down = more negative y).
184
+ * Call flush() after to apply the offset and re-render.
185
+ */
186
+ scrollTo(elementId: number, x: number, y: number): void
187
+ /**
188
+ * Scroll a child into view by its index in the children list.
189
+ * Call flush() after to apply and re-render.
190
+ */
191
+ scrollToItem(elementId: number, index: number): void
192
+ /**
193
+ * Get the current scroll offset of a scrollable element.
194
+ * Returns [x, y] or null if the element has no scroll handle.
195
+ */
196
+ getScrollOffset(elementId: number): Array<number> | null
197
+ /**
198
+ * Capture a screenshot of the current rendered state and save as PNG.
199
+ * macOS only — requires Metal GPU rendering via VisualTestAppContext.
200
+ */
201
+ captureScreenshot(path: string): void
202
+ /**
203
+ * Return and clear all collected events since the last drain.
204
+ * Events are collected synchronously — no event loop queuing.
205
+ */
206
+ drainEvents(): Array<EventPayload>
207
+ /** Get all text content in the tree (depth-first order). */
208
+ getAllText(): Array<string>
209
+ /** Find element IDs matching the given type (e.g. "div", "text"). */
210
+ findByType(elementType: string): Array<number>
211
+ /** Check if an element has a specific event listener. */
212
+ hasEventListener(id: number, eventType: string): boolean
213
+ /** Get the text content of an element. */
214
+ getText(id: number): string | null
215
+ /** Get the full tree as JSON for snapshot testing. */
216
+ getTreeJson(): string
217
+ /** Get the root element ID, or null if no root is set. */
218
+ getRootId(): number | null
219
+ }
220
+
221
+ export interface EventModifiers {
222
+ shift: boolean
223
+ ctrl: boolean
224
+ alt: boolean
225
+ cmd: boolean
226
+ }
227
+
228
+ /** Event payload sent back to JS when a user interacts with an element. */
229
+ export interface EventPayload {
230
+ /** Numeric element ID (matches the ID assigned in JS via createElement). */
231
+ elementId: number
232
+ /**
233
+ * Event type string — matches the key used in EVENT_PROPS on the JS side.
234
+ * e.g. "click", "mouseDown", "mouseEnter", "keyDown", "scroll", etc.
235
+ */
236
+ eventType: string
237
+ /** Mouse X position in window coordinates (pixels). */
238
+ x?: number
239
+ /** Mouse Y position in window coordinates (pixels). */
240
+ y?: number
241
+ /**
242
+ * Which mouse button: 0=left, 1=middle, 2=right.
243
+ * Populated for: mouseDown, mouseUp, click, mouseDownOutside, contextMenu.
244
+ */
245
+ button?: number
246
+ /**
247
+ * Number of consecutive clicks (1=single, 2=double, 3=triple).
248
+ * Populated for: mouseDown, mouseUp, click.
249
+ */
250
+ clickCount?: number
251
+ /**
252
+ * Whether this is a right-click (convenience for click events).
253
+ * true when button==2 or ClickEvent::is_right_click().
254
+ */
255
+ isRightClick?: boolean
256
+ /**
257
+ * Which mouse button is currently held during a mouseMove.
258
+ * Same encoding as `button`: 0=left, 1=middle, 2=right.
259
+ * Populated for: mouseMove.
260
+ */
261
+ pressedButton?: number
262
+ /**
263
+ * Key name, e.g. "a", "enter", "escape", "down", "left", "f1".
264
+ * Populated for: keyDown, keyUp.
265
+ */
266
+ key?: string
267
+ /**
268
+ * The character produced by the key press (e.g. "ß" for option-s).
269
+ * May differ from `key` when modifiers are active.
270
+ * Populated for: keyDown, keyUp.
271
+ */
272
+ keyChar?: string
273
+ /**
274
+ * Whether this is a key-repeat event (key held down).
275
+ * Populated for: keyDown.
276
+ */
277
+ isHeld?: boolean
278
+ /**
279
+ * Scroll delta on the X axis (pixels or lines, see `precise`).
280
+ * Populated for: scroll.
281
+ */
282
+ deltaX?: number
283
+ /**
284
+ * Scroll delta on the Y axis (pixels or lines, see `precise`).
285
+ * Populated for: scroll.
286
+ */
287
+ deltaY?: number
288
+ /**
289
+ * true = pixel-precise (trackpad), false = line-based (mouse wheel).
290
+ * Populated for: scroll.
291
+ */
292
+ precise?: boolean
293
+ /**
294
+ * Touch phase for scroll: "started", "moved", "ended".
295
+ * Populated for: scroll (trackpad gestures).
296
+ */
297
+ touchPhase?: string
298
+ /**
299
+ * true = mouse entered element, false = mouse left element.
300
+ * Populated for: mouseEnter, mouseLeave.
301
+ */
302
+ hovered?: boolean
303
+ modifiers?: EventModifiers
304
+ }
305
+
306
+ export interface WindowOptions {
307
+ title?: string
308
+ width?: number
309
+ height?: number
310
+ minWidth?: number
311
+ minHeight?: number
312
+ resizable?: boolean
313
+ fullscreen?: boolean
314
+ transparent?: boolean
315
+ }
316
+
317
+ export interface WindowSize {
318
+ width: number
319
+ height: number
320
+ }
package/index.js ADDED
@@ -0,0 +1,580 @@
1
+ // prettier-ignore
2
+ /* eslint-disable */
3
+ // @ts-nocheck
4
+ /* auto-generated by NAPI-RS */
5
+
6
+ const { readFileSync } = require('node: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 (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('./gpuix-native.android-arm64.node')
74
+ } catch (e) {
75
+ loadErrors.push(e)
76
+ }
77
+ try {
78
+ const binding = require('@gpuix/native-android-arm64')
79
+ const bindingPackageVersion = require('@gpuix/native-android-arm64/package.json').version
80
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.android-arm-eabi.node')
90
+ } catch (e) {
91
+ loadErrors.push(e)
92
+ }
93
+ try {
94
+ const binding = require('@gpuix/native-android-arm-eabi')
95
+ const bindingPackageVersion = require('@gpuix/native-android-arm-eabi/package.json').version
96
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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?.variables?.shlib_suffix === 'dll.a' || process.config?.variables?.node_target_type === 'shared_library') {
109
+ try {
110
+ return require('./gpuix-native.win32-x64-gnu.node')
111
+ } catch (e) {
112
+ loadErrors.push(e)
113
+ }
114
+ try {
115
+ const binding = require('@gpuix/native-win32-x64-gnu')
116
+ const bindingPackageVersion = require('@gpuix/native-win32-x64-gnu/package.json').version
117
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.win32-x64-msvc.node')
127
+ } catch (e) {
128
+ loadErrors.push(e)
129
+ }
130
+ try {
131
+ const binding = require('@gpuix/native-win32-x64-msvc')
132
+ const bindingPackageVersion = require('@gpuix/native-win32-x64-msvc/package.json').version
133
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.win32-ia32-msvc.node')
144
+ } catch (e) {
145
+ loadErrors.push(e)
146
+ }
147
+ try {
148
+ const binding = require('@gpuix/native-win32-ia32-msvc')
149
+ const bindingPackageVersion = require('@gpuix/native-win32-ia32-msvc/package.json').version
150
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.win32-arm64-msvc.node')
160
+ } catch (e) {
161
+ loadErrors.push(e)
162
+ }
163
+ try {
164
+ const binding = require('@gpuix/native-win32-arm64-msvc')
165
+ const bindingPackageVersion = require('@gpuix/native-win32-arm64-msvc/package.json').version
166
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.darwin-universal.node')
179
+ } catch (e) {
180
+ loadErrors.push(e)
181
+ }
182
+ try {
183
+ const binding = require('@gpuix/native-darwin-universal')
184
+ const bindingPackageVersion = require('@gpuix/native-darwin-universal/package.json').version
185
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.darwin-x64.node')
195
+ } catch (e) {
196
+ loadErrors.push(e)
197
+ }
198
+ try {
199
+ const binding = require('@gpuix/native-darwin-x64')
200
+ const bindingPackageVersion = require('@gpuix/native-darwin-x64/package.json').version
201
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.darwin-arm64.node')
211
+ } catch (e) {
212
+ loadErrors.push(e)
213
+ }
214
+ try {
215
+ const binding = require('@gpuix/native-darwin-arm64')
216
+ const bindingPackageVersion = require('@gpuix/native-darwin-arm64/package.json').version
217
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.freebsd-x64.node')
231
+ } catch (e) {
232
+ loadErrors.push(e)
233
+ }
234
+ try {
235
+ const binding = require('@gpuix/native-freebsd-x64')
236
+ const bindingPackageVersion = require('@gpuix/native-freebsd-x64/package.json').version
237
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.freebsd-arm64.node')
247
+ } catch (e) {
248
+ loadErrors.push(e)
249
+ }
250
+ try {
251
+ const binding = require('@gpuix/native-freebsd-arm64')
252
+ const bindingPackageVersion = require('@gpuix/native-freebsd-arm64/package.json').version
253
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-x64-musl.node')
268
+ } catch (e) {
269
+ loadErrors.push(e)
270
+ }
271
+ try {
272
+ const binding = require('@gpuix/native-linux-x64-musl')
273
+ const bindingPackageVersion = require('@gpuix/native-linux-x64-musl/package.json').version
274
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-x64-gnu.node')
284
+ } catch (e) {
285
+ loadErrors.push(e)
286
+ }
287
+ try {
288
+ const binding = require('@gpuix/native-linux-x64-gnu')
289
+ const bindingPackageVersion = require('@gpuix/native-linux-x64-gnu/package.json').version
290
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-arm64-musl.node')
302
+ } catch (e) {
303
+ loadErrors.push(e)
304
+ }
305
+ try {
306
+ const binding = require('@gpuix/native-linux-arm64-musl')
307
+ const bindingPackageVersion = require('@gpuix/native-linux-arm64-musl/package.json').version
308
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-arm64-gnu.node')
318
+ } catch (e) {
319
+ loadErrors.push(e)
320
+ }
321
+ try {
322
+ const binding = require('@gpuix/native-linux-arm64-gnu')
323
+ const bindingPackageVersion = require('@gpuix/native-linux-arm64-gnu/package.json').version
324
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-arm-musleabihf.node')
336
+ } catch (e) {
337
+ loadErrors.push(e)
338
+ }
339
+ try {
340
+ const binding = require('@gpuix/native-linux-arm-musleabihf')
341
+ const bindingPackageVersion = require('@gpuix/native-linux-arm-musleabihf/package.json').version
342
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-arm-gnueabihf.node')
352
+ } catch (e) {
353
+ loadErrors.push(e)
354
+ }
355
+ try {
356
+ const binding = require('@gpuix/native-linux-arm-gnueabihf')
357
+ const bindingPackageVersion = require('@gpuix/native-linux-arm-gnueabihf/package.json').version
358
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-loong64-musl.node')
370
+ } catch (e) {
371
+ loadErrors.push(e)
372
+ }
373
+ try {
374
+ const binding = require('@gpuix/native-linux-loong64-musl')
375
+ const bindingPackageVersion = require('@gpuix/native-linux-loong64-musl/package.json').version
376
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-loong64-gnu.node')
386
+ } catch (e) {
387
+ loadErrors.push(e)
388
+ }
389
+ try {
390
+ const binding = require('@gpuix/native-linux-loong64-gnu')
391
+ const bindingPackageVersion = require('@gpuix/native-linux-loong64-gnu/package.json').version
392
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-riscv64-musl.node')
404
+ } catch (e) {
405
+ loadErrors.push(e)
406
+ }
407
+ try {
408
+ const binding = require('@gpuix/native-linux-riscv64-musl')
409
+ const bindingPackageVersion = require('@gpuix/native-linux-riscv64-musl/package.json').version
410
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-riscv64-gnu.node')
420
+ } catch (e) {
421
+ loadErrors.push(e)
422
+ }
423
+ try {
424
+ const binding = require('@gpuix/native-linux-riscv64-gnu')
425
+ const bindingPackageVersion = require('@gpuix/native-linux-riscv64-gnu/package.json').version
426
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-ppc64-gnu.node')
437
+ } catch (e) {
438
+ loadErrors.push(e)
439
+ }
440
+ try {
441
+ const binding = require('@gpuix/native-linux-ppc64-gnu')
442
+ const bindingPackageVersion = require('@gpuix/native-linux-ppc64-gnu/package.json').version
443
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.linux-s390x-gnu.node')
453
+ } catch (e) {
454
+ loadErrors.push(e)
455
+ }
456
+ try {
457
+ const binding = require('@gpuix/native-linux-s390x-gnu')
458
+ const bindingPackageVersion = require('@gpuix/native-linux-s390x-gnu/package.json').version
459
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.openharmony-arm64.node')
473
+ } catch (e) {
474
+ loadErrors.push(e)
475
+ }
476
+ try {
477
+ const binding = require('@gpuix/native-openharmony-arm64')
478
+ const bindingPackageVersion = require('@gpuix/native-openharmony-arm64/package.json').version
479
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.openharmony-x64.node')
489
+ } catch (e) {
490
+ loadErrors.push(e)
491
+ }
492
+ try {
493
+ const binding = require('@gpuix/native-openharmony-x64')
494
+ const bindingPackageVersion = require('@gpuix/native-openharmony-x64/package.json').version
495
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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('./gpuix-native.openharmony-arm.node')
505
+ } catch (e) {
506
+ loadErrors.push(e)
507
+ }
508
+ try {
509
+ const binding = require('@gpuix/native-openharmony-arm')
510
+ const bindingPackageVersion = require('@gpuix/native-openharmony-arm/package.json').version
511
+ if (bindingPackageVersion !== '0.1.0' && 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.1.0 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
+ if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
529
+ let wasiBinding = null
530
+ let wasiBindingError = null
531
+ try {
532
+ wasiBinding = require('./gpuix-native.wasi.cjs')
533
+ nativeBinding = wasiBinding
534
+ } catch (err) {
535
+ if (process.env.NAPI_RS_FORCE_WASI) {
536
+ wasiBindingError = err
537
+ }
538
+ }
539
+ if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
540
+ try {
541
+ wasiBinding = require('@gpuix/native-wasm32-wasi')
542
+ nativeBinding = wasiBinding
543
+ } catch (err) {
544
+ if (process.env.NAPI_RS_FORCE_WASI) {
545
+ if (!wasiBindingError) {
546
+ wasiBindingError = err
547
+ } else {
548
+ wasiBindingError.cause = err
549
+ }
550
+ loadErrors.push(err)
551
+ }
552
+ }
553
+ }
554
+ if (process.env.NAPI_RS_FORCE_WASI === 'error' && !wasiBinding) {
555
+ const error = new Error('WASI binding not found and NAPI_RS_FORCE_WASI is set to error')
556
+ error.cause = wasiBindingError
557
+ throw error
558
+ }
559
+ }
560
+
561
+ if (!nativeBinding) {
562
+ if (loadErrors.length > 0) {
563
+ throw new Error(
564
+ `Cannot find native binding. ` +
565
+ `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` +
566
+ 'Please try `npm i` again after removing both package-lock.json and node_modules directory.',
567
+ {
568
+ cause: loadErrors.reduce((err, cur) => {
569
+ cur.cause = err
570
+ return cur
571
+ }),
572
+ },
573
+ )
574
+ }
575
+ throw new Error(`Failed to load native binding`)
576
+ }
577
+
578
+ module.exports = nativeBinding
579
+ module.exports.GpuixRenderer = nativeBinding.GpuixRenderer
580
+ module.exports.TestGpuixRenderer = nativeBinding.TestGpuixRenderer
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@gpuix/native",
3
+ "version": "0.1.0",
4
+ "main": "index.js",
5
+ "types": "index.d.ts",
6
+ "napi": {
7
+ "binaryName": "gpuix-native",
8
+ "targets": [
9
+ "aarch64-apple-darwin",
10
+ "x86_64-apple-darwin",
11
+ "x86_64-unknown-linux-gnu",
12
+ "aarch64-unknown-linux-gnu",
13
+ "x86_64-pc-windows-msvc",
14
+ "aarch64-pc-windows-msvc"
15
+ ]
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/remorses/gpuix"
20
+ },
21
+ "publishConfig": {
22
+ "registry": "https://registry.npmjs.org/",
23
+ "access": "public"
24
+ },
25
+ "scripts": {
26
+ "artifacts": "napi artifacts",
27
+ "build": "napi build --platform --release --features test-support",
28
+ "build:release": "napi build --platform --release",
29
+ "build:debug": "napi build --platform --features test-support",
30
+ "prepublishOnly": "napi pre-publish -t npm",
31
+ "universal": "napi universal",
32
+ "version": "napi version"
33
+ },
34
+ "devDependencies": {
35
+ "@napi-rs/cli": "^3.1.3"
36
+ },
37
+ "files": [
38
+ "index.js",
39
+ "index.d.ts",
40
+ "*.node"
41
+ ],
42
+ "optionalDependencies": {
43
+ "@gpuix/native-darwin-arm64": "0.1.0",
44
+ "@gpuix/native-darwin-x64": "0.1.0",
45
+ "@gpuix/native-linux-x64-gnu": "0.1.0",
46
+ "@gpuix/native-linux-arm64-gnu": "0.1.0",
47
+ "@gpuix/native-win32-x64-msvc": "0.1.0",
48
+ "@gpuix/native-win32-arm64-msvc": "0.1.0"
49
+ }
50
+ }