ziex 0.0.1-dev.6 → 0.0.1-dev.7
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/index.js +31 -1
- package/package.json +1 -1
- package/react/index.js +21 -1
- package/wasm/index.js +219 -1
package/index.js
CHANGED
|
@@ -1 +1,31 @@
|
|
|
1
|
-
|
|
1
|
+
// src/index.ts
|
|
2
|
+
var zx = {
|
|
3
|
+
name: "zx",
|
|
4
|
+
version: "0.0.1-dev.270",
|
|
5
|
+
description: "ZX is a framework for building web applications with Zig.",
|
|
6
|
+
repository: "https://github.com/nurulhudaapon/zx",
|
|
7
|
+
fingerprint: 14616285862371232000,
|
|
8
|
+
minimum_zig_version: "0.15.2",
|
|
9
|
+
dependencies: {
|
|
10
|
+
httpz: {
|
|
11
|
+
url: "git+https://github.com/nurulhudaapon/httpz.git#7268154f43f5827bf78668e8e79a00f2ebe4db13",
|
|
12
|
+
hash: "httpz-0.0.0-PNVzrBgtBwCVkSJyophIX6WHwDR0r8XhBGQr96Kk-1El"
|
|
13
|
+
},
|
|
14
|
+
zli: {
|
|
15
|
+
url: "git+https://github.com/nurulhudaapon/cliz.git#aff3b54879e7514afaf8c87f1abe22121b8992d4",
|
|
16
|
+
hash: "zli-4.3.0-LeUjpu_fAABOSVASSCW2fFh8SFVNHrxQGDXGPNzcSE_i"
|
|
17
|
+
},
|
|
18
|
+
zig_js: {
|
|
19
|
+
url: "git+https://github.com/nurulhudaapon/jsz.git#04db83c617da1956ac5adc1cb9ba1e434c1cb6fd",
|
|
20
|
+
hash: "zig_js-0.0.0-rjCAV-6GAADxFug7rDmPH-uM_XcnJ5NmuAMJCAscMjhi"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
paths: [
|
|
24
|
+
"build.zig",
|
|
25
|
+
"build.zig.zon",
|
|
26
|
+
"src"
|
|
27
|
+
]
|
|
28
|
+
};
|
|
29
|
+
export {
|
|
30
|
+
zx
|
|
31
|
+
};
|
package/package.json
CHANGED
package/react/index.js
CHANGED
|
@@ -1 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
// src/react/dom.ts
|
|
2
|
+
async function prepareComponent(component) {
|
|
3
|
+
const domNode = document.getElementById(component.id);
|
|
4
|
+
if (!domNode)
|
|
5
|
+
throw new Error(`Root element ${component.id} not found`, { cause: component });
|
|
6
|
+
const props = JSON.parse(domNode.getAttribute("data-props") || "{}");
|
|
7
|
+
const htmlChildren = domNode.getAttribute("data-children") ?? undefined;
|
|
8
|
+
if (htmlChildren) {
|
|
9
|
+
props.dangerouslySetInnerHTML = { __html: htmlChildren };
|
|
10
|
+
}
|
|
11
|
+
const Component = await component.import();
|
|
12
|
+
return { domNode, props, Component };
|
|
13
|
+
}
|
|
14
|
+
function filterComponents(components) {
|
|
15
|
+
const currentPath = window.location.pathname;
|
|
16
|
+
return components.filter((component) => component.route === currentPath || !component.route);
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
prepareComponent,
|
|
20
|
+
filterComponents
|
|
21
|
+
};
|
package/wasm/index.js
CHANGED
|
@@ -1 +1,219 @@
|
|
|
1
|
-
|
|
1
|
+
// node_modules/jsz/js/src/zigjs.ts
|
|
2
|
+
var NAN_PREFIX = 2146959360;
|
|
3
|
+
var predefined = {
|
|
4
|
+
nan: 0,
|
|
5
|
+
null: 1,
|
|
6
|
+
true: 2,
|
|
7
|
+
false: 3,
|
|
8
|
+
undefined: 4,
|
|
9
|
+
globalThis: 5,
|
|
10
|
+
runtime: 6
|
|
11
|
+
};
|
|
12
|
+
var PREDEFINED_ID_MAX = 6;
|
|
13
|
+
var encoder = new TextEncoder;
|
|
14
|
+
var decoder = new TextDecoder("utf-8");
|
|
15
|
+
|
|
16
|
+
class ZigJS {
|
|
17
|
+
memory;
|
|
18
|
+
values = [NaN, null, true, false, undefined, globalThis, this];
|
|
19
|
+
idPool = [];
|
|
20
|
+
importObject() {
|
|
21
|
+
return {
|
|
22
|
+
"zig-js": {
|
|
23
|
+
valueGet: this.valueGet.bind(this),
|
|
24
|
+
valueSet: this.valueSet.bind(this),
|
|
25
|
+
valueDeinit: this.valueDeinit.bind(this),
|
|
26
|
+
valueObjectCreate: this.valueObjectCreate.bind(this),
|
|
27
|
+
valueStringCreate: this.valueStringCreate.bind(this),
|
|
28
|
+
valueStringLen: this.valueStringLen.bind(this),
|
|
29
|
+
valueStringCopy: this.valueStringCopy.bind(this),
|
|
30
|
+
valueNew: this.valueNew.bind(this),
|
|
31
|
+
funcApply: this.funcApply.bind(this)
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
valueGet(out, id, ptr, len) {
|
|
36
|
+
const val = this.loadValue(id);
|
|
37
|
+
const str = this.loadString(ptr, len);
|
|
38
|
+
const result = Reflect.get(val, str);
|
|
39
|
+
this.storeValue(out, result);
|
|
40
|
+
}
|
|
41
|
+
valueSet(id, ptr, len, refAddr) {
|
|
42
|
+
const obj = this.loadValue(id);
|
|
43
|
+
const str = this.loadString(ptr, len);
|
|
44
|
+
const val = this.loadRef(refAddr);
|
|
45
|
+
Reflect.set(obj, str, val);
|
|
46
|
+
}
|
|
47
|
+
valueDeinit(id) {
|
|
48
|
+
if (id > PREDEFINED_ID_MAX) {
|
|
49
|
+
this.values[id] = null;
|
|
50
|
+
this.idPool.push(id);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
valueObjectCreate(out) {
|
|
54
|
+
this.storeValue(out, new Object);
|
|
55
|
+
}
|
|
56
|
+
valueStringCreate(out, ptr, len) {
|
|
57
|
+
const str = this.loadString(ptr, len);
|
|
58
|
+
this.storeValue(out, str);
|
|
59
|
+
}
|
|
60
|
+
valueStringLen(id) {
|
|
61
|
+
const val = this.loadValue(id);
|
|
62
|
+
const buf = encoder.encode(val);
|
|
63
|
+
return buf.byteLength;
|
|
64
|
+
}
|
|
65
|
+
valueStringCopy(id, ptr, max) {
|
|
66
|
+
if (this.memory == null)
|
|
67
|
+
return;
|
|
68
|
+
const val = this.loadValue(id);
|
|
69
|
+
const bytes = encoder.encode(val);
|
|
70
|
+
if (bytes.byteLength > max)
|
|
71
|
+
return;
|
|
72
|
+
new Uint8Array(this.memory.buffer, ptr, bytes.length).set(bytes);
|
|
73
|
+
}
|
|
74
|
+
valueNew(out, id, argsAddr, argsLen) {
|
|
75
|
+
const fn = this.loadValue(id);
|
|
76
|
+
const args = [];
|
|
77
|
+
for (let i = 0;i < argsLen; i++) {
|
|
78
|
+
args.push(this.loadRef(argsAddr + i * 8));
|
|
79
|
+
}
|
|
80
|
+
const result = Reflect.construct(fn, args);
|
|
81
|
+
this.storeValue(out, result);
|
|
82
|
+
}
|
|
83
|
+
funcApply(out, id, thisRefAddr, argsAddr, argsLen) {
|
|
84
|
+
const fn = this.loadValue(id);
|
|
85
|
+
const thisVal = this.loadRef(thisRefAddr);
|
|
86
|
+
const args = [];
|
|
87
|
+
for (let i = 0;i < argsLen; i++) {
|
|
88
|
+
args.push(this.loadRef(argsAddr + i * 8));
|
|
89
|
+
}
|
|
90
|
+
const result = Reflect.apply(fn, thisVal, args);
|
|
91
|
+
this.storeValue(out, result);
|
|
92
|
+
}
|
|
93
|
+
loadValue(id) {
|
|
94
|
+
return this.values[id];
|
|
95
|
+
}
|
|
96
|
+
deleteValue(id) {
|
|
97
|
+
const val = this.values[id];
|
|
98
|
+
this.valueDeinit(id);
|
|
99
|
+
return val;
|
|
100
|
+
}
|
|
101
|
+
loadRef(refAddr) {
|
|
102
|
+
if (this.memory == null)
|
|
103
|
+
return;
|
|
104
|
+
const view = new DataView(this.memory.buffer);
|
|
105
|
+
const floatVal = view.getFloat64(refAddr, true);
|
|
106
|
+
if (!isNaN(floatVal))
|
|
107
|
+
return floatVal;
|
|
108
|
+
const id = this.loadRefId(refAddr);
|
|
109
|
+
return this.values[id];
|
|
110
|
+
}
|
|
111
|
+
loadRefId(refAddr) {
|
|
112
|
+
if (this.memory == null)
|
|
113
|
+
return 0;
|
|
114
|
+
return new DataView(this.memory.buffer).getUint32(refAddr, true);
|
|
115
|
+
}
|
|
116
|
+
storeValue(out, val) {
|
|
117
|
+
if (this.memory == null)
|
|
118
|
+
return;
|
|
119
|
+
const view = new DataView(this.memory.buffer);
|
|
120
|
+
if (typeof val === "number") {
|
|
121
|
+
if (isNaN(val)) {
|
|
122
|
+
view.setUint32(out, predefined.nan, true);
|
|
123
|
+
view.setUint32(out + 4, NAN_PREFIX, true);
|
|
124
|
+
} else {
|
|
125
|
+
view.setFloat64(out, val, true);
|
|
126
|
+
}
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (val === null) {
|
|
130
|
+
view.setUint32(out, predefined.null, true);
|
|
131
|
+
view.setUint32(out + 4, NAN_PREFIX, true);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (val === undefined) {
|
|
135
|
+
view.setUint32(out, predefined.undefined, true);
|
|
136
|
+
view.setUint32(out + 4, NAN_PREFIX, true);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
let id = this.idPool.pop();
|
|
140
|
+
if (id === undefined) {
|
|
141
|
+
id = this.values.length;
|
|
142
|
+
}
|
|
143
|
+
this.values[id] = val;
|
|
144
|
+
let typeId = 0;
|
|
145
|
+
switch (typeof val) {
|
|
146
|
+
case "object":
|
|
147
|
+
typeId = 1;
|
|
148
|
+
break;
|
|
149
|
+
case "string":
|
|
150
|
+
typeId = 2;
|
|
151
|
+
break;
|
|
152
|
+
case "symbol":
|
|
153
|
+
typeId = 3;
|
|
154
|
+
break;
|
|
155
|
+
case "function":
|
|
156
|
+
typeId = 4;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
view.setUint32(out, Number(id), true);
|
|
160
|
+
view.setUint32(out + 4, NAN_PREFIX | typeId, true);
|
|
161
|
+
}
|
|
162
|
+
loadString(ptr, len) {
|
|
163
|
+
if (this.memory == null)
|
|
164
|
+
return "";
|
|
165
|
+
const arr = new Uint8ClampedArray(this.memory.buffer, ptr, Number(len));
|
|
166
|
+
const data = arr.slice();
|
|
167
|
+
return decoder.decode(data);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// src/wasm/index.ts
|
|
171
|
+
var DEFAULT_URL = "/assets/main.wasm";
|
|
172
|
+
var MAX_EVENTS = 100;
|
|
173
|
+
var jsz = new ZigJS;
|
|
174
|
+
var importObject = {
|
|
175
|
+
module: {},
|
|
176
|
+
env: {},
|
|
177
|
+
...jsz.importObject()
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
class ZXInstance {
|
|
181
|
+
exports;
|
|
182
|
+
events;
|
|
183
|
+
actions;
|
|
184
|
+
constructor({ exports, events = [] }) {
|
|
185
|
+
this.exports = exports;
|
|
186
|
+
this.events = events;
|
|
187
|
+
this.actions = {};
|
|
188
|
+
Object.entries(exports).forEach(([name, func]) => {
|
|
189
|
+
if (typeof func !== "function")
|
|
190
|
+
return;
|
|
191
|
+
this.actions[name] = this.#actionWrapper.bind(this, name);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
addEvent(event) {
|
|
195
|
+
if (this.events.length >= MAX_EVENTS)
|
|
196
|
+
this.events.length = 0;
|
|
197
|
+
const idx = this.events.push(event);
|
|
198
|
+
return idx - 1;
|
|
199
|
+
}
|
|
200
|
+
#actionWrapper(name, ...args) {
|
|
201
|
+
const func = this.exports[name];
|
|
202
|
+
if (typeof func !== "function")
|
|
203
|
+
throw new Error(`Action ${name} is not a function`);
|
|
204
|
+
const eventId = this.addEvent(args[0]);
|
|
205
|
+
return func(eventId);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async function init(options = {}) {
|
|
209
|
+
const url = options?.url ?? DEFAULT_URL;
|
|
210
|
+
const { instance } = await WebAssembly.instantiateStreaming(fetch(url), importObject);
|
|
211
|
+
jsz.memory = instance.exports.memory;
|
|
212
|
+
window._zx = new ZXInstance({ exports: instance.exports });
|
|
213
|
+
const main = instance.exports.mainClient;
|
|
214
|
+
if (typeof main === "function")
|
|
215
|
+
main();
|
|
216
|
+
}
|
|
217
|
+
export {
|
|
218
|
+
init
|
|
219
|
+
};
|