ziex 0.1.0-dev.1014 → 0.1.0-dev.1068

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 CHANGED
@@ -168,6 +168,13 @@ You can view our current progress and planned features here:
168
168
 
169
169
  **[Check out the Ziex Issue Tracker →](https://github.com/ziex-dev/ziex/issues)**
170
170
 
171
+ ## Versions
172
+ | Zig | Ziex | Branch | Status |
173
+ |-------------|-------------------|-------------------|----------------|
174
+ | `0.16.0` | `0.1.0-dev.1050+` | `main` | Unstable (dev) |
175
+ | `0.15.2` | `0.1.0-dev-1050` | `zig-0.15` | Stable (dev) |
176
+
177
+
171
178
  ## Editor Support
172
179
 
173
180
  * [VSCode](https://marketplace.visualstudio.com/items?itemName=ziex.ziex)/[VSCode Forks](https://open-vsx.org/extension/ziex/ziex) Extension
package/app.d.ts CHANGED
@@ -4,16 +4,16 @@ import type { D1Database } from "./db";
4
4
  import type { WASI } from "./wasi";
5
5
  /**
6
6
  * Anything that can be resolved to a `WebAssembly.Module`:
7
- * - `WebAssembly.Module` already compiled (Cloudflare Workers, wrangler)
8
- * - `ArrayBuffer` / `ArrayBufferView` raw WASM bytes
9
- * - `Response` a fetch() response whose body is the WASM binary
10
- * - `string` an HTTP(S) URL or an absolute file path (Bun)
11
- * - `URL` a URL object
7
+ * - `WebAssembly.Module` - already compiled (Cloudflare Workers, wrangler)
8
+ * - `ArrayBuffer` / `ArrayBufferView` - raw WASM bytes
9
+ * - `Response` - a fetch() response whose body is the WASM binary
10
+ * - `string` - an HTTP(S) URL or an absolute file path (Bun)
11
+ * - `URL` - a URL object
12
12
  */
13
13
  export type WasmInput = WebAssembly.Module | ArrayBuffer | ArrayBufferView | Response | string | URL;
14
14
  /**
15
15
  * Resolve any supported WASM input to a compiled `WebAssembly.Module`.
16
- * The result is NOT cached here cache it at the call site if needed.
16
+ * The result is NOT cached here - cache it at the call site if needed.
17
17
  */
18
18
  export declare function resolveModule(input: WasmInput): Promise<WebAssembly.Module>;
19
19
  /** Keys of `Env` whose value extends {@link KVNamespace}. */
@@ -28,7 +28,7 @@ type DBKey<Env> = {
28
28
  [K in keyof Env]: Env[K] extends D1Database ? K : never;
29
29
  }[keyof Env];
30
30
  type ZiexOptions<Env> = {
31
- /** WASM module accepts any {@link WasmInput}. Resolved and cached on first request. */
31
+ /** WASM module - accepts any {@link WasmInput}. Resolved and cached on first request. */
32
32
  module: WasmInput;
33
33
  /** Optional pre-configured WASI instance. */
34
34
  wasi?: WASI;
@@ -37,8 +37,8 @@ type ZiexOptions<Env> = {
37
37
  /**
38
38
  * KV namespace bindings. Two forms are supported:
39
39
  *
40
- * - **Env key**: a single key from `Env` whose value is a `KVNamespace` used as the `"default"` binding.
41
- * - **Name map**: `{ [bindingName]: envKey }` map namespace names to env keys.
40
+ * - **Env key**: a single key from `Env` whose value is a `KVNamespace` - used as the `"default"` binding.
41
+ * - **Name map**: `{ [bindingName]: envKey }` - map namespace names to env keys.
42
42
  *
43
43
  * @example Single env key (becomes the "default" binding)
44
44
  * ```ts
@@ -69,7 +69,7 @@ type ZiexOptions<Env> = {
69
69
  websocket?: DOKey<Env>;
70
70
  };
71
71
  /**
72
- * Main Ziex application class. Mirrors the Hono API style construct once,
72
+ * Main Ziex application class. Mirrors the Hono API style - construct once,
73
73
  * export as default, and the runtime calls `fetch` for you.
74
74
  *
75
75
  * Works on Cloudflare Workers, Bun, and Vercel Edge out of the box.
package/build.zig.zon CHANGED
@@ -2,6 +2,6 @@
2
2
  .name = .ziex_js,
3
3
  .fingerprint = 0x3428b4e119b455bf,
4
4
  .version = "0.1.0-dev.804",
5
- .minimum_zig_version = "0.15.2",
5
+ .minimum_zig_version = "0.16.0",
6
6
  .paths = .{""},
7
7
  }
@@ -84,6 +84,8 @@ class ZigJS {
84
84
  const bytes = encoder.encode(val);
85
85
  if (bytes.byteLength > max)
86
86
  return;
87
+ if (bytes.length === 0)
88
+ return;
87
89
  new Uint8Array(this.memory.buffer, ptr, bytes.length).set(bytes);
88
90
  }
89
91
  valueNew(out, id, argsAddr, argsLen) {
@@ -1129,69 +1131,48 @@ var TAG_NAMES = [
1129
1131
  "view"
1130
1132
  ];
1131
1133
  var DELEGATED_EVENTS = [
1132
- "click",
1133
- "dblclick",
1134
- "input",
1135
- "change",
1136
- "submit",
1137
- "focus",
1138
- "blur",
1139
- "keydown",
1140
- "keyup",
1141
- "keypress",
1142
- "mouseenter",
1143
- "mouseleave",
1144
- "mousedown",
1145
- "mouseup",
1146
- "mousemove",
1147
- "touchstart",
1148
- "touchend",
1149
- "touchmove",
1150
- "scroll"
1134
+ { domType: "click", eventTypeId: 0 },
1135
+ { domType: "dblclick", eventTypeId: 1 },
1136
+ { domType: "input", eventTypeId: 2 },
1137
+ { domType: "change", eventTypeId: 3 },
1138
+ { domType: "submit", eventTypeId: 4 },
1139
+ { domType: "focusin", eventTypeId: 5 },
1140
+ { domType: "focusout", eventTypeId: 6 },
1141
+ { domType: "keydown", eventTypeId: 7 },
1142
+ { domType: "keyup", eventTypeId: 8 },
1143
+ { domType: "keypress", eventTypeId: 9 },
1144
+ { domType: "mouseenter", eventTypeId: 10 },
1145
+ { domType: "mouseleave", eventTypeId: 11 },
1146
+ { domType: "mousedown", eventTypeId: 12 },
1147
+ { domType: "mouseup", eventTypeId: 13 },
1148
+ { domType: "mousemove", eventTypeId: 14 },
1149
+ { domType: "touchstart", eventTypeId: 15 },
1150
+ { domType: "touchend", eventTypeId: 16 },
1151
+ { domType: "touchmove", eventTypeId: 17 },
1152
+ { domType: "scroll", eventTypeId: 18 }
1151
1153
  ];
1152
- var EVENT_TYPE_MAP = {
1153
- click: 0,
1154
- dblclick: 1,
1155
- input: 2,
1156
- change: 3,
1157
- submit: 4,
1158
- focus: 5,
1159
- blur: 6,
1160
- keydown: 7,
1161
- keyup: 8,
1162
- keypress: 9,
1163
- mouseenter: 10,
1164
- mouseleave: 11,
1165
- mousedown: 12,
1166
- mouseup: 13,
1167
- mousemove: 14,
1168
- touchstart: 15,
1169
- touchend: 16,
1170
- touchmove: 17,
1171
- scroll: 18
1172
- };
1173
1154
  var eventHandlerModes = new Map;
1174
1155
  function initEventDelegation(bridge, rootSelector = "body") {
1175
1156
  const root = document.querySelector(rootSelector);
1176
1157
  if (!root)
1177
1158
  return () => {};
1178
1159
  const removers = [];
1179
- for (const eventType of DELEGATED_EVENTS) {
1160
+ for (const delegatedEvent of DELEGATED_EVENTS) {
1180
1161
  const listener = (event) => {
1181
1162
  let target = event.target;
1182
1163
  while (target && target !== document.body) {
1183
1164
  const zxRef = target.__zx_ref;
1184
1165
  if (zxRef !== undefined) {
1185
- bridge.eventbridge(BigInt(zxRef), EVENT_TYPE_MAP[eventType] ?? 0, event);
1166
+ bridge.eventbridge(BigInt(zxRef), delegatedEvent.eventTypeId, event);
1186
1167
  if (event.cancelBubble)
1187
1168
  break;
1188
1169
  }
1189
1170
  target = target.parentElement;
1190
1171
  }
1191
1172
  };
1192
- const options = { passive: eventType.startsWith("touch") || eventType === "scroll" };
1193
- root.addEventListener(eventType, listener, options);
1194
- removers.push(() => root.removeEventListener(eventType, listener, options));
1173
+ const options = { passive: delegatedEvent.domType.startsWith("touch") || delegatedEvent.domType === "scroll" };
1174
+ root.addEventListener(delegatedEvent.domType, listener, options);
1175
+ removers.push(() => root.removeEventListener(delegatedEvent.domType, listener, options));
1195
1176
  }
1196
1177
  return () => {
1197
1178
  for (const remove of removers)
@@ -1707,6 +1688,61 @@ function createWasiImports({
1707
1688
  dv.setBigUint64(filestat_ptr + 56, 0n, true);
1708
1689
  return 0;
1709
1690
  },
1691
+ fd_filestat_set_size(_fd, _size) {
1692
+ return 76;
1693
+ },
1694
+ fd_filestat_set_times(_fd, _atim, _mtim, _fst_flags) {
1695
+ return 76;
1696
+ },
1697
+ fd_fdstat_set_flags(_fd, _flags) {
1698
+ return 0;
1699
+ },
1700
+ fd_fdstat_set_rights(_fd, _rights_base, _rights_inheriting) {
1701
+ return 0;
1702
+ },
1703
+ fd_sync(_fd) {
1704
+ return 0;
1705
+ },
1706
+ fd_datasync(_fd) {
1707
+ return 0;
1708
+ },
1709
+ fd_advise(_fd, _offset, _len, _advice) {
1710
+ return 0;
1711
+ },
1712
+ fd_allocate(_fd, _offset, _len) {
1713
+ return 76;
1714
+ },
1715
+ fd_tell(_fd, offset_ptr) {
1716
+ v().setBigUint64(offset_ptr, 0n, true);
1717
+ return 0;
1718
+ },
1719
+ fd_renumber(_from, _to) {
1720
+ return 0;
1721
+ },
1722
+ path_filestat_set_times(_fd, _flags, _path, _path_len, _atim, _mtim, _fst_flags) {
1723
+ return 76;
1724
+ },
1725
+ path_link(_old_fd, _old_flags, _old_path, _old_path_len, _new_fd, _new_path, _new_path_len) {
1726
+ return 76;
1727
+ },
1728
+ path_symlink(_old_path, _old_path_len, _fd, _new_path, _new_path_len) {
1729
+ return 76;
1730
+ },
1731
+ proc_raise(_sig) {
1732
+ return 0;
1733
+ },
1734
+ sock_recv(_fd, _ri_data, _ri_data_len, _ri_flags, ro_datalen_ptr, ro_flags_ptr) {
1735
+ v().setUint32(ro_datalen_ptr, 0, true);
1736
+ v().setUint32(ro_flags_ptr, 0, true);
1737
+ return 76;
1738
+ },
1739
+ sock_send(_fd, _si_data, _si_data_len, _si_flags, so_datalen_ptr) {
1740
+ v().setUint32(so_datalen_ptr, 0, true);
1741
+ return 76;
1742
+ },
1743
+ sock_shutdown(_fd, _how) {
1744
+ return 76;
1745
+ },
1710
1746
  fd_seek(_fd, _offset, _whence, newoffset_ptr) {
1711
1747
  v().setBigInt64(newoffset_ptr, 0n, true);
1712
1748
  return 0;
@@ -1721,6 +1757,10 @@ function createWasiImports({
1721
1757
  v().setBigUint64(time_ptr, BigInt(Date.now()) * 1000000n, true);
1722
1758
  return 0;
1723
1759
  },
1760
+ clock_res_get(_id, res_ptr) {
1761
+ v().setBigUint64(res_ptr, 1000000n, true);
1762
+ return 0;
1763
+ },
1724
1764
  random_get(buf_ptr, buf_len) {
1725
1765
  crypto.getRandomValues(new Uint8Array(wasmMemory.buffer, buf_ptr, buf_len));
1726
1766
  return 0;
package/index.js CHANGED
@@ -570,6 +570,61 @@ function createWasiImports({
570
570
  dv.setBigUint64(filestat_ptr + 56, 0n, true);
571
571
  return 0;
572
572
  },
573
+ fd_filestat_set_size(_fd, _size) {
574
+ return 76;
575
+ },
576
+ fd_filestat_set_times(_fd, _atim, _mtim, _fst_flags) {
577
+ return 76;
578
+ },
579
+ fd_fdstat_set_flags(_fd, _flags) {
580
+ return 0;
581
+ },
582
+ fd_fdstat_set_rights(_fd, _rights_base, _rights_inheriting) {
583
+ return 0;
584
+ },
585
+ fd_sync(_fd) {
586
+ return 0;
587
+ },
588
+ fd_datasync(_fd) {
589
+ return 0;
590
+ },
591
+ fd_advise(_fd, _offset, _len, _advice) {
592
+ return 0;
593
+ },
594
+ fd_allocate(_fd, _offset, _len) {
595
+ return 76;
596
+ },
597
+ fd_tell(_fd, offset_ptr) {
598
+ v().setBigUint64(offset_ptr, 0n, true);
599
+ return 0;
600
+ },
601
+ fd_renumber(_from, _to) {
602
+ return 0;
603
+ },
604
+ path_filestat_set_times(_fd, _flags, _path, _path_len, _atim, _mtim, _fst_flags) {
605
+ return 76;
606
+ },
607
+ path_link(_old_fd, _old_flags, _old_path, _old_path_len, _new_fd, _new_path, _new_path_len) {
608
+ return 76;
609
+ },
610
+ path_symlink(_old_path, _old_path_len, _fd, _new_path, _new_path_len) {
611
+ return 76;
612
+ },
613
+ proc_raise(_sig) {
614
+ return 0;
615
+ },
616
+ sock_recv(_fd, _ri_data, _ri_data_len, _ri_flags, ro_datalen_ptr, ro_flags_ptr) {
617
+ v().setUint32(ro_datalen_ptr, 0, true);
618
+ v().setUint32(ro_flags_ptr, 0, true);
619
+ return 76;
620
+ },
621
+ sock_send(_fd, _si_data, _si_data_len, _si_flags, so_datalen_ptr) {
622
+ v().setUint32(so_datalen_ptr, 0, true);
623
+ return 76;
624
+ },
625
+ sock_shutdown(_fd, _how) {
626
+ return 76;
627
+ },
573
628
  fd_seek(_fd, _offset, _whence, newoffset_ptr) {
574
629
  v().setBigInt64(newoffset_ptr, 0n, true);
575
630
  return 0;
@@ -584,6 +639,10 @@ function createWasiImports({
584
639
  v().setBigUint64(time_ptr, BigInt(Date.now()) * 1000000n, true);
585
640
  return 0;
586
641
  },
642
+ clock_res_get(_id, res_ptr) {
643
+ v().setBigUint64(res_ptr, 1000000n, true);
644
+ return 0;
645
+ },
587
646
  random_get(buf_ptr, buf_len) {
588
647
  crypto.getRandomValues(new Uint8Array(wasmMemory.buffer, buf_ptr, buf_len));
589
648
  return 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ziex",
3
- "version": "0.1.0-dev.1014",
3
+ "version": "0.1.0-dev.1068",
4
4
  "description": "ZX is a framework for building web applications with Zig.",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -37,7 +37,7 @@
37
37
  "license": "MIT",
38
38
  "scripts": {},
39
39
  "dependencies": {
40
- "@ziex/cli": "0.1.0-dev.1014"
40
+ "@ziex/cli": "0.1.0-dev.1068"
41
41
  },
42
42
  "peerDependenciesMeta": {
43
43
  "react": {
package/runtime.d.ts CHANGED
@@ -58,9 +58,9 @@ export declare function run({ request, env, ctx, module, kv: kvBindings, db: dbB
58
58
  waitUntil(promise: Promise<unknown>): void;
59
59
  };
60
60
  module: WebAssembly.Module;
61
- /** KV namespace bindings `{ default: env.KV, otherName: env.OTHER_KV }` */
61
+ /** KV namespace bindings - `{ default: env.KV, otherName: env.OTHER_KV }` */
62
62
  kv?: Record<string, KVNamespace>;
63
- /** D1 bindings `{ default: env.DB, analytics: env.ANALYTICS_DB }` */
63
+ /** D1 bindings - `{ default: env.DB, analytics: env.ANALYTICS_DB }` */
64
64
  db?: Record<string, D1Database>;
65
65
  imports?: (mem: () => WebAssembly.Memory) => Record<string, Record<string, unknown>>;
66
66
  wasi?: WASI;
package/vercel/index.d.ts CHANGED
@@ -20,7 +20,7 @@ type FetchApp = {
20
20
  * Wrap a Ziex app as a Vercel Edge Function handler.
21
21
  *
22
22
  * Returns a standard `(req: Request) => Promise<Response>` function.
23
- * Vercel's edge runtime calls it directly just export it as default.
23
+ * Vercel's edge runtime calls it directly - just export it as default.
24
24
  */
25
25
  export declare function handle(app: FetchApp): (req: Request) => Promise<Response>;
26
26
  export {};
package/wasi.d.ts CHANGED
@@ -37,10 +37,28 @@ export declare function createWasiImports({ request, stdinData, onStdout, }: {
37
37
  fd_pread(_fd: number, _iovs: number, _iovs_len: number, _offset: bigint, nread_ptr: number): number;
38
38
  fd_pwrite(_fd: number, _iovs: number, _iovs_len: number, _offset: bigint, nwritten_ptr: number): number;
39
39
  fd_filestat_get(_fd: number, filestat_ptr: number): number;
40
+ fd_filestat_set_size(_fd: number, _size: bigint): number;
41
+ fd_filestat_set_times(_fd: number, _atim: bigint, _mtim: bigint, _fst_flags: number): number;
42
+ fd_fdstat_set_flags(_fd: number, _flags: number): number;
43
+ fd_fdstat_set_rights(_fd: number, _rights_base: bigint, _rights_inheriting: bigint): number;
44
+ fd_sync(_fd: number): number;
45
+ fd_datasync(_fd: number): number;
46
+ fd_advise(_fd: number, _offset: bigint, _len: bigint, _advice: number): number;
47
+ fd_allocate(_fd: number, _offset: bigint, _len: bigint): number;
48
+ fd_tell(_fd: number, offset_ptr: number): number;
49
+ fd_renumber(_from: number, _to: number): number;
50
+ path_filestat_set_times(_fd: number, _flags: number, _path: number, _path_len: number, _atim: bigint, _mtim: bigint, _fst_flags: number): number;
51
+ path_link(_old_fd: number, _old_flags: number, _old_path: number, _old_path_len: number, _new_fd: number, _new_path: number, _new_path_len: number): number;
52
+ path_symlink(_old_path: number, _old_path_len: number, _fd: number, _new_path: number, _new_path_len: number): number;
53
+ proc_raise(_sig: number): number;
54
+ sock_recv(_fd: number, _ri_data: number, _ri_data_len: number, _ri_flags: number, ro_datalen_ptr: number, ro_flags_ptr: number): number;
55
+ sock_send(_fd: number, _si_data: number, _si_data_len: number, _si_flags: number, so_datalen_ptr: number): number;
56
+ sock_shutdown(_fd: number, _how: number): number;
40
57
  fd_seek(_fd: number, _offset: bigint, _whence: number, newoffset_ptr: number): number;
41
58
  proc_exit(code: number): never;
42
59
  sched_yield(): number;
43
60
  clock_time_get(_id: number, _precision: bigint, time_ptr: number): number;
61
+ clock_res_get(_id: number, res_ptr: number): number;
44
62
  random_get(buf_ptr: number, buf_len: number): number;
45
63
  path_open(_fd: number, _dirflags: number, _path: number, _path_len: number, _oflags: number, _rights_base: bigint, _rights_inheriting: bigint, _fdflags: number, opened_fd_ptr: number): number;
46
64
  path_create_directory(_fd: number, _path: number, _path_len: number): number;
package/wasm/core.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ZigJS } from "../../../../vendor/jsz/js/src";
2
2
  /**
3
- * Core WASM bridge environment-agnostic (browser + edge).
3
+ * Core WASM bridge - environment-agnostic (browser + edge).
4
4
  * Contains no references to browser globals (document, window, WebSocket, HTMLFormElement).
5
5
  */
6
6
  export declare const CallbackType: {
@@ -24,7 +24,7 @@ export type WsOnCloseHandler = (wsId: bigint, code: number, reasonPtr: number, r
24
24
  export declare const jsz: ZigJS;
25
25
  /** Store a value using jsz.storeValue and get the 64-bit reference. */
26
26
  export declare function storeValueGetRef(val: any): bigint;
27
- /** Shared encoder/decoder avoids allocating new instances on every call. */
27
+ /** Shared encoder/decoder - avoids allocating new instances on every call. */
28
28
  export declare const textDecoder: TextDecoder;
29
29
  export declare const textEncoder: TextEncoder;
30
30
  export declare function getMemoryView(): Uint8Array;
@@ -35,7 +35,7 @@ export declare function writeBytes(ptr: number, data: Uint8Array): void;
35
35
  export declare function wrapPromisingExport<F extends (...args: any[]) => any>(fn: F | undefined): F | undefined;
36
36
  export declare function invokeWasmExport<F extends (...args: any[]) => any>(fn: F | undefined, ...args: Parameters<F>): void;
37
37
  /**
38
- * Core ZX Bridge works in both browser and edge runtimes.
38
+ * Core ZX Bridge - works in both browser and edge runtimes.
39
39
  * Contains fetch, timers, and logging. No DOM or browser-WebSocket references.
40
40
  *
41
41
  * Extend this class in browser environments to add DOM and WebSocket support.
package/wasm/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export type { CallbackTypeValue } from "./core";
3
3
  import { ZxBridgeCore } from "./core";
4
4
  import { type KVNamespace } from "../kv";
5
5
  /**
6
- * Browser ZX Bridge extends ZxBridgeCore with DOM, WebSocket, and form-action support.
6
+ * Browser ZX Bridge - extends ZxBridgeCore with DOM, WebSocket, and form-action support.
7
7
  * Import this from environments that have access to browser globals.
8
8
  * For edge runtimes, import ZxBridgeCore from ./core instead.
9
9
  */
package/wasm/index.js CHANGED
@@ -84,6 +84,8 @@ class ZigJS {
84
84
  const bytes = encoder.encode(val);
85
85
  if (bytes.byteLength > max)
86
86
  return;
87
+ if (bytes.length === 0)
88
+ return;
87
89
  new Uint8Array(this.memory.buffer, ptr, bytes.length).set(bytes);
88
90
  }
89
91
  valueNew(out, id, argsAddr, argsLen) {
@@ -1129,69 +1131,48 @@ var TAG_NAMES = [
1129
1131
  "view"
1130
1132
  ];
1131
1133
  var DELEGATED_EVENTS = [
1132
- "click",
1133
- "dblclick",
1134
- "input",
1135
- "change",
1136
- "submit",
1137
- "focus",
1138
- "blur",
1139
- "keydown",
1140
- "keyup",
1141
- "keypress",
1142
- "mouseenter",
1143
- "mouseleave",
1144
- "mousedown",
1145
- "mouseup",
1146
- "mousemove",
1147
- "touchstart",
1148
- "touchend",
1149
- "touchmove",
1150
- "scroll"
1134
+ { domType: "click", eventTypeId: 0 },
1135
+ { domType: "dblclick", eventTypeId: 1 },
1136
+ { domType: "input", eventTypeId: 2 },
1137
+ { domType: "change", eventTypeId: 3 },
1138
+ { domType: "submit", eventTypeId: 4 },
1139
+ { domType: "focusin", eventTypeId: 5 },
1140
+ { domType: "focusout", eventTypeId: 6 },
1141
+ { domType: "keydown", eventTypeId: 7 },
1142
+ { domType: "keyup", eventTypeId: 8 },
1143
+ { domType: "keypress", eventTypeId: 9 },
1144
+ { domType: "mouseenter", eventTypeId: 10 },
1145
+ { domType: "mouseleave", eventTypeId: 11 },
1146
+ { domType: "mousedown", eventTypeId: 12 },
1147
+ { domType: "mouseup", eventTypeId: 13 },
1148
+ { domType: "mousemove", eventTypeId: 14 },
1149
+ { domType: "touchstart", eventTypeId: 15 },
1150
+ { domType: "touchend", eventTypeId: 16 },
1151
+ { domType: "touchmove", eventTypeId: 17 },
1152
+ { domType: "scroll", eventTypeId: 18 }
1151
1153
  ];
1152
- var EVENT_TYPE_MAP = {
1153
- click: 0,
1154
- dblclick: 1,
1155
- input: 2,
1156
- change: 3,
1157
- submit: 4,
1158
- focus: 5,
1159
- blur: 6,
1160
- keydown: 7,
1161
- keyup: 8,
1162
- keypress: 9,
1163
- mouseenter: 10,
1164
- mouseleave: 11,
1165
- mousedown: 12,
1166
- mouseup: 13,
1167
- mousemove: 14,
1168
- touchstart: 15,
1169
- touchend: 16,
1170
- touchmove: 17,
1171
- scroll: 18
1172
- };
1173
1154
  var eventHandlerModes = new Map;
1174
1155
  function initEventDelegation(bridge, rootSelector = "body") {
1175
1156
  const root = document.querySelector(rootSelector);
1176
1157
  if (!root)
1177
1158
  return () => {};
1178
1159
  const removers = [];
1179
- for (const eventType of DELEGATED_EVENTS) {
1160
+ for (const delegatedEvent of DELEGATED_EVENTS) {
1180
1161
  const listener = (event) => {
1181
1162
  let target = event.target;
1182
1163
  while (target && target !== document.body) {
1183
1164
  const zxRef = target.__zx_ref;
1184
1165
  if (zxRef !== undefined) {
1185
- bridge.eventbridge(BigInt(zxRef), EVENT_TYPE_MAP[eventType] ?? 0, event);
1166
+ bridge.eventbridge(BigInt(zxRef), delegatedEvent.eventTypeId, event);
1186
1167
  if (event.cancelBubble)
1187
1168
  break;
1188
1169
  }
1189
1170
  target = target.parentElement;
1190
1171
  }
1191
1172
  };
1192
- const options = { passive: eventType.startsWith("touch") || eventType === "scroll" };
1193
- root.addEventListener(eventType, listener, options);
1194
- removers.push(() => root.removeEventListener(eventType, listener, options));
1173
+ const options = { passive: delegatedEvent.domType.startsWith("touch") || delegatedEvent.domType === "scroll" };
1174
+ root.addEventListener(delegatedEvent.domType, listener, options);
1175
+ removers.push(() => root.removeEventListener(delegatedEvent.domType, listener, options));
1195
1176
  }
1196
1177
  return () => {
1197
1178
  for (const remove of removers)
package/wasm/init.js CHANGED
@@ -69,6 +69,8 @@ class ZigJS {
69
69
  const bytes = encoder.encode(val);
70
70
  if (bytes.byteLength > max)
71
71
  return;
72
+ if (bytes.length === 0)
73
+ return;
72
74
  new Uint8Array(this.memory.buffer, ptr, bytes.length).set(bytes);
73
75
  }
74
76
  valueNew(out, id, argsAddr, argsLen) {
@@ -1091,69 +1093,48 @@ var TAG_NAMES = [
1091
1093
  "view"
1092
1094
  ];
1093
1095
  var DELEGATED_EVENTS = [
1094
- "click",
1095
- "dblclick",
1096
- "input",
1097
- "change",
1098
- "submit",
1099
- "focus",
1100
- "blur",
1101
- "keydown",
1102
- "keyup",
1103
- "keypress",
1104
- "mouseenter",
1105
- "mouseleave",
1106
- "mousedown",
1107
- "mouseup",
1108
- "mousemove",
1109
- "touchstart",
1110
- "touchend",
1111
- "touchmove",
1112
- "scroll"
1096
+ { domType: "click", eventTypeId: 0 },
1097
+ { domType: "dblclick", eventTypeId: 1 },
1098
+ { domType: "input", eventTypeId: 2 },
1099
+ { domType: "change", eventTypeId: 3 },
1100
+ { domType: "submit", eventTypeId: 4 },
1101
+ { domType: "focusin", eventTypeId: 5 },
1102
+ { domType: "focusout", eventTypeId: 6 },
1103
+ { domType: "keydown", eventTypeId: 7 },
1104
+ { domType: "keyup", eventTypeId: 8 },
1105
+ { domType: "keypress", eventTypeId: 9 },
1106
+ { domType: "mouseenter", eventTypeId: 10 },
1107
+ { domType: "mouseleave", eventTypeId: 11 },
1108
+ { domType: "mousedown", eventTypeId: 12 },
1109
+ { domType: "mouseup", eventTypeId: 13 },
1110
+ { domType: "mousemove", eventTypeId: 14 },
1111
+ { domType: "touchstart", eventTypeId: 15 },
1112
+ { domType: "touchend", eventTypeId: 16 },
1113
+ { domType: "touchmove", eventTypeId: 17 },
1114
+ { domType: "scroll", eventTypeId: 18 }
1113
1115
  ];
1114
- var EVENT_TYPE_MAP = {
1115
- click: 0,
1116
- dblclick: 1,
1117
- input: 2,
1118
- change: 3,
1119
- submit: 4,
1120
- focus: 5,
1121
- blur: 6,
1122
- keydown: 7,
1123
- keyup: 8,
1124
- keypress: 9,
1125
- mouseenter: 10,
1126
- mouseleave: 11,
1127
- mousedown: 12,
1128
- mouseup: 13,
1129
- mousemove: 14,
1130
- touchstart: 15,
1131
- touchend: 16,
1132
- touchmove: 17,
1133
- scroll: 18
1134
- };
1135
1116
  var eventHandlerModes = new Map;
1136
1117
  function initEventDelegation(bridge, rootSelector = "body") {
1137
1118
  const root = document.querySelector(rootSelector);
1138
1119
  if (!root)
1139
1120
  return () => {};
1140
1121
  const removers = [];
1141
- for (const eventType of DELEGATED_EVENTS) {
1122
+ for (const delegatedEvent of DELEGATED_EVENTS) {
1142
1123
  const listener = (event) => {
1143
1124
  let target = event.target;
1144
1125
  while (target && target !== document.body) {
1145
1126
  const zxRef = target.__zx_ref;
1146
1127
  if (zxRef !== undefined) {
1147
- bridge.eventbridge(BigInt(zxRef), EVENT_TYPE_MAP[eventType] ?? 0, event);
1128
+ bridge.eventbridge(BigInt(zxRef), delegatedEvent.eventTypeId, event);
1148
1129
  if (event.cancelBubble)
1149
1130
  break;
1150
1131
  }
1151
1132
  target = target.parentElement;
1152
1133
  }
1153
1134
  };
1154
- const options = { passive: eventType.startsWith("touch") || eventType === "scroll" };
1155
- root.addEventListener(eventType, listener, options);
1156
- removers.push(() => root.removeEventListener(eventType, listener, options));
1135
+ const options = { passive: delegatedEvent.domType.startsWith("touch") || delegatedEvent.domType === "scroll" };
1136
+ root.addEventListener(delegatedEvent.domType, listener, options);
1137
+ removers.push(() => root.removeEventListener(delegatedEvent.domType, listener, options));
1157
1138
  }
1158
1139
  return () => {
1159
1140
  for (const remove of removers)
package/wasm/wasi.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  /**
2
- * WASI/edge WASM bridge zero dependencies on ZigJS (jsz) or browser globals.
2
+ * WASI/edge WASM bridge - zero dependencies on ZigJS (jsz) or browser globals.
3
3
  *
4
4
  * Import this (and only this) from edge/server runtimes. It provides the
5
5
  * minimal __zx import namespace needed by server-side WASM: log, fetch, and
6
- * timers. The jsz importObject is intentionally omitted the server binary
6
+ * timers. The jsz importObject is intentionally omitted - the server binary
7
7
  * does not use jsz value-passing.
8
8
  */
9
9
  export declare class ZxWasiBridge {
@@ -18,7 +18,7 @@ export declare class ZxWasiBridge {
18
18
  * Create the WASI import object for WASM instantiation.
19
19
  *
20
20
  * Returns only the `__zx` namespace (log, fetch, timers).
21
- * Does NOT include jsz.importObject() the server binary does not use jsz.
21
+ * Does NOT include jsz.importObject() - the server binary does not use jsz.
22
22
  */
23
23
  static createImportObject(bridgeRef: {
24
24
  current: ZxWasiBridge | null;