rastack 0.0.43 → 0.0.44
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/CHANGELOG.md +7 -0
- package/admin/AdminApp.tsx +308 -0
- package/admin/adapters.ts +247 -0
- package/admin/index.tsx +88 -0
- package/admin/useAdmin.ts +299 -0
- package/dist/admin.js +81 -0
- package/dist/dev/harness.d.ts +53 -0
- package/dist/dev/harness.js +151 -0
- package/dist/rastack-dev.d.ts +18 -0
- package/dist/rastack-dev.js +197 -0
- package/dist/rastack-wasm-build.d.ts +9 -4
- package/dist/rastack-wasm-build.js +44 -33
- package/dist/rastack.d.ts +1 -2
- package/dist/rastack.js +7 -10
- package/dist/wasm/package.json +4 -0
- package/dist/wasm/rastack_wasm.d.ts +100 -0
- package/dist/wasm/rastack_wasm.js +745 -0
- package/dist/wasm/rastack_wasm_bg.wasm +0 -0
- package/dist/wasm/rastack_wasm_bg.wasm.d.ts +28 -0
- package/package.json +6 -2
- package/scripts/build-admin.js +48 -0
- package/scripts/copy-wasm.js +35 -0
- package/src/dev/harness.ts +130 -0
- package/src/rastack-dev.ts +197 -0
- package/src/rastack-wasm-build.ts +52 -41
- package/src/rastack.ts +7 -10
- package/test/dev.spec.ts +277 -0
- package/wasm/package.json +4 -0
- package/wasm/rastack_wasm.d.ts +100 -0
- package/wasm/rastack_wasm.js +745 -0
- package/wasm/rastack_wasm_bg.wasm +0 -0
- package/wasm/rastack_wasm_bg.wasm.d.ts +28 -0
package/test/dev.spec.ts
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEV_DEFAULTS,
|
|
3
|
+
WASM_ENTRY,
|
|
4
|
+
contentType,
|
|
5
|
+
parseDevArgs,
|
|
6
|
+
renderShell,
|
|
7
|
+
wasmBundleCandidates,
|
|
8
|
+
} from "../src/dev/harness";
|
|
9
|
+
import {
|
|
10
|
+
buildWriteBody,
|
|
11
|
+
changelistHeaders,
|
|
12
|
+
coerceFormValue,
|
|
13
|
+
errorDetail,
|
|
14
|
+
fieldControlType,
|
|
15
|
+
findResource,
|
|
16
|
+
formFields,
|
|
17
|
+
initialFormValues,
|
|
18
|
+
listPath,
|
|
19
|
+
detailPath,
|
|
20
|
+
optionLabel,
|
|
21
|
+
optionsFromRows,
|
|
22
|
+
pageCount,
|
|
23
|
+
parseManifest,
|
|
24
|
+
readListEnvelope,
|
|
25
|
+
PAGE_SIZE,
|
|
26
|
+
type AdminResource,
|
|
27
|
+
} from "../admin/adapters";
|
|
28
|
+
|
|
29
|
+
// -- harness core -----------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
describe("rastack dev — arg parsing", () => {
|
|
32
|
+
it("defaults resources/out/warehouse/port and opens the browser", () => {
|
|
33
|
+
expect(parseDevArgs([])).toEqual(DEV_DEFAULTS);
|
|
34
|
+
expect(DEV_DEFAULTS.port).toBe(4321);
|
|
35
|
+
expect(DEV_DEFAULTS.warehouseDir).toBe("data/warehouse");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("reads --port, --warehouse, --out, --no-open and a positional dir", () => {
|
|
39
|
+
const args = parseDevArgs([
|
|
40
|
+
"app/resources",
|
|
41
|
+
"--port",
|
|
42
|
+
"5000",
|
|
43
|
+
"--warehouse",
|
|
44
|
+
"data/wh",
|
|
45
|
+
"--out",
|
|
46
|
+
"build",
|
|
47
|
+
"--no-open",
|
|
48
|
+
]);
|
|
49
|
+
expect(args).toEqual({
|
|
50
|
+
resourcesDir: "app/resources",
|
|
51
|
+
outDir: "build",
|
|
52
|
+
warehouseDir: "data/wh",
|
|
53
|
+
port: 5000,
|
|
54
|
+
open: false,
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("ignores a non-numeric --port (keeps the default)", () => {
|
|
59
|
+
expect(parseDevArgs(["--port", "abc"]).port).toBe(4321);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe("rastack dev — content types", () => {
|
|
64
|
+
it("maps wasm to application/wasm (required for streaming instantiation)", () => {
|
|
65
|
+
expect(contentType("/wasm/rastack_wasm_bg.wasm")).toBe("application/wasm");
|
|
66
|
+
});
|
|
67
|
+
it("maps the common asset types", () => {
|
|
68
|
+
expect(contentType("/dev/admin.js")).toBe("text/javascript; charset=utf-8");
|
|
69
|
+
expect(contentType("/schema.rastack.json")).toBe(
|
|
70
|
+
"application/json; charset=utf-8",
|
|
71
|
+
);
|
|
72
|
+
expect(contentType("a/version-hint.text")).toBe("text/plain; charset=utf-8");
|
|
73
|
+
expect(contentType("data/v3.parquet")).toBe("application/octet-stream");
|
|
74
|
+
});
|
|
75
|
+
it("falls back to octet-stream for unknown extensions", () => {
|
|
76
|
+
expect(contentType("mystery.bin")).toBe("application/octet-stream");
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe("rastack dev — wasm bundle resolution", () => {
|
|
81
|
+
it("includes the installed dist/wasm and repo tools/wasm locations", () => {
|
|
82
|
+
const dirs = wasmBundleCandidates("/opt/rastack/dist", "/repo");
|
|
83
|
+
expect(dirs).toContain("/opt/rastack/dist/wasm");
|
|
84
|
+
expect(dirs).toContain("/repo/tools/wasm");
|
|
85
|
+
// The entry filename the resolver probes for.
|
|
86
|
+
expect(WASM_ENTRY).toBe("rastack_wasm.js");
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
describe("rastack dev — HTML shell", () => {
|
|
91
|
+
it("mounts #root and loads the bundled admin", () => {
|
|
92
|
+
const html = renderShell();
|
|
93
|
+
expect(html).toContain('<div id="root">');
|
|
94
|
+
expect(html).toContain('<script src="/dev/admin.js">');
|
|
95
|
+
expect(html.startsWith("<!doctype html>")).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// -- admin adapters ---------------------------------------------------------
|
|
100
|
+
|
|
101
|
+
/** The in-repo airline fixtures, in manifest JSON shape. */
|
|
102
|
+
const MANIFEST = {
|
|
103
|
+
version: 1,
|
|
104
|
+
resources: [
|
|
105
|
+
{
|
|
106
|
+
app: "airports",
|
|
107
|
+
model: "airport",
|
|
108
|
+
fields: [
|
|
109
|
+
{ name: "code", type: "string", maxLength: 3, unique: true },
|
|
110
|
+
{ name: "name", type: "string", maxLength: 120 },
|
|
111
|
+
],
|
|
112
|
+
search: ["code", "name"],
|
|
113
|
+
admin: { listDisplay: ["code", "name"] },
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
app: "airports",
|
|
117
|
+
model: "terminal",
|
|
118
|
+
fields: [
|
|
119
|
+
{
|
|
120
|
+
name: "airport",
|
|
121
|
+
type: "fk",
|
|
122
|
+
relation: { app: "airports", model: "airport" },
|
|
123
|
+
},
|
|
124
|
+
{ name: "label", type: "string", maxLength: 20 },
|
|
125
|
+
{ name: "active", type: "bool", null: true },
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
app: "airports",
|
|
130
|
+
model: "secret",
|
|
131
|
+
fields: [{ name: "value", type: "string" }],
|
|
132
|
+
admin: false,
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
describe("admin adapters — manifest parsing", () => {
|
|
138
|
+
const resources = parseManifest(MANIFEST);
|
|
139
|
+
|
|
140
|
+
it("parses resources, fields, search, listDisplay and admin visibility", () => {
|
|
141
|
+
const airport = findResource(resources, "airports", "airport")!;
|
|
142
|
+
expect(airport.key).toBe("airports.airport");
|
|
143
|
+
expect(airport.label).toBe("Airport");
|
|
144
|
+
expect(airport.search).toEqual(["code", "name"]);
|
|
145
|
+
expect(airport.listDisplay).toEqual(["code", "name"]);
|
|
146
|
+
expect(airport.adminEnabled).toBe(true);
|
|
147
|
+
|
|
148
|
+
const secret = findResource(resources, "airports", "secret")!;
|
|
149
|
+
expect(secret.adminEnabled).toBe(false);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it("accepts a JSON string as well as an object", () => {
|
|
153
|
+
expect(parseManifest(JSON.stringify(MANIFEST)).length).toBe(3);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("carries FK relation + nullability on fields", () => {
|
|
157
|
+
const terminal = findResource(resources, "airports", "terminal")!;
|
|
158
|
+
const fk = terminal.fields.find((f) => f.name === "airport")!;
|
|
159
|
+
expect(fk.type).toBe("fk");
|
|
160
|
+
expect(fk.relation).toEqual({ app: "airports", model: "airport" });
|
|
161
|
+
const active = terminal.fields.find((f) => f.name === "active")!;
|
|
162
|
+
expect(active.nullable).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe("admin adapters — changelist", () => {
|
|
167
|
+
const resources = parseManifest(MANIFEST);
|
|
168
|
+
const airport = findResource(resources, "airports", "airport")!;
|
|
169
|
+
const terminal = findResource(resources, "airports", "terminal")!;
|
|
170
|
+
|
|
171
|
+
it("prepends an id column, then listDisplay (else all fields)", () => {
|
|
172
|
+
expect(changelistHeaders(airport).map((h) => h.key)).toEqual([
|
|
173
|
+
"id",
|
|
174
|
+
"code",
|
|
175
|
+
"name",
|
|
176
|
+
]);
|
|
177
|
+
// terminal has no listDisplay → all fields after id
|
|
178
|
+
expect(changelistHeaders(terminal).map((h) => h.key)).toEqual([
|
|
179
|
+
"id",
|
|
180
|
+
"airport",
|
|
181
|
+
"label",
|
|
182
|
+
"active",
|
|
183
|
+
]);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it("uses the admin's fixed page size and correct page count", () => {
|
|
187
|
+
expect(PAGE_SIZE).toBe(25);
|
|
188
|
+
expect(pageCount(0, 25)).toBe(1);
|
|
189
|
+
expect(pageCount(25, 25)).toBe(1);
|
|
190
|
+
expect(pageCount(26, 25)).toBe(2);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it("reads the DRF list envelope defensively", () => {
|
|
194
|
+
expect(readListEnvelope({ count: 2, results: [{ id: 1 }] })).toEqual({
|
|
195
|
+
count: 2,
|
|
196
|
+
results: [{ id: 1 }],
|
|
197
|
+
});
|
|
198
|
+
expect(readListEnvelope(undefined)).toEqual({ count: 0, results: [] });
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it("builds the REST paths the WASM engine answers", () => {
|
|
202
|
+
expect(listPath("airports", "airport")).toBe("/api/airports/v1/airport/");
|
|
203
|
+
expect(detailPath("airports", "airport", 7)).toBe(
|
|
204
|
+
"/api/airports/v1/airport/7/",
|
|
205
|
+
);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
describe("admin adapters — forms", () => {
|
|
210
|
+
const resources = parseManifest(MANIFEST);
|
|
211
|
+
const airport = findResource(resources, "airports", "airport")!;
|
|
212
|
+
const terminal = findResource(resources, "airports", "terminal")!;
|
|
213
|
+
|
|
214
|
+
it("chooses controls from the field datatype (FK → select)", () => {
|
|
215
|
+
const fk = terminal.fields.find((f) => f.name === "airport")!;
|
|
216
|
+
const label = terminal.fields.find((f) => f.name === "label")!;
|
|
217
|
+
const active = terminal.fields.find((f) => f.name === "active")!;
|
|
218
|
+
expect(fieldControlType(fk)).toBe("select");
|
|
219
|
+
expect(fieldControlType(label)).toBe("text");
|
|
220
|
+
expect(fieldControlType(active)).toBe("boolean");
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it("seeds initial values (blank strings, false for booleans)", () => {
|
|
224
|
+
expect(initialFormValues(terminal)).toEqual({
|
|
225
|
+
airport: "",
|
|
226
|
+
label: "",
|
|
227
|
+
active: false,
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
it("coerces values like the Rust admin (numbers/bools parsed, empties omitted)", () => {
|
|
232
|
+
const fk = terminal.fields.find((f) => f.name === "airport")!;
|
|
233
|
+
const active = terminal.fields.find((f) => f.name === "active")!;
|
|
234
|
+
const label = terminal.fields.find((f) => f.name === "label")!;
|
|
235
|
+
expect(coerceFormValue(fk, "12")).toBe(12);
|
|
236
|
+
expect(coerceFormValue(active, "true")).toBe(true);
|
|
237
|
+
expect(coerceFormValue(active, false)).toBe(false);
|
|
238
|
+
expect(coerceFormValue(label, "")).toBeUndefined(); // omitted
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it("builds a write body, omitting empty non-bool fields", () => {
|
|
242
|
+
const body = buildWriteBody(terminal, {
|
|
243
|
+
airport: "3",
|
|
244
|
+
label: "",
|
|
245
|
+
active: true,
|
|
246
|
+
});
|
|
247
|
+
expect(body).toEqual({ airport: 3, active: true });
|
|
248
|
+
expect("label" in body).toBe(false);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it("labels FK options by the first string field, else #id", () => {
|
|
252
|
+
expect(optionLabel({ id: 5, code: "JFK", name: "Kennedy" })).toBe(
|
|
253
|
+
"JFK (#5)",
|
|
254
|
+
);
|
|
255
|
+
expect(optionLabel({ id: 9 })).toBe("#9");
|
|
256
|
+
expect(optionsFromRows([{ id: 1, code: "LAX" }])).toEqual([
|
|
257
|
+
{ label: "LAX (#1)", value: 1 },
|
|
258
|
+
]);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
it("form fields exclude the primary key", () => {
|
|
262
|
+
const withPk: AdminResource = {
|
|
263
|
+
...airport,
|
|
264
|
+
fields: [
|
|
265
|
+
{ name: "id", type: "int", primaryKey: true, nullable: false },
|
|
266
|
+
...airport.fields,
|
|
267
|
+
],
|
|
268
|
+
};
|
|
269
|
+
expect(formFields(withPk).map((f) => f.name)).toEqual(["code", "name"]);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it("extracts a {detail} error message", () => {
|
|
273
|
+
expect(errorDetail({ detail: "nope" })).toBe("nope");
|
|
274
|
+
expect(errorDetail("raw string")).toBe("raw string");
|
|
275
|
+
expect(errorDetail({})).toBe("Request failed");
|
|
276
|
+
});
|
|
277
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The in-browser API engine. Cheap to clone (everything behind `Arc`), which
|
|
6
|
+
* is what lets each async call own its state without borrowing across `await`.
|
|
7
|
+
*/
|
|
8
|
+
export class RastackApi {
|
|
9
|
+
free(): void;
|
|
10
|
+
[Symbol.dispose](): void;
|
|
11
|
+
/**
|
|
12
|
+
* Snapshot the entire warehouse to a blob for persistence (`data/` folder,
|
|
13
|
+
* IndexedDB, or an upload to S3).
|
|
14
|
+
*/
|
|
15
|
+
exportWarehouse(): Promise<any>;
|
|
16
|
+
/**
|
|
17
|
+
* Handle one request. `query` is a `{ [k]: string }` object, `body` any
|
|
18
|
+
* JSON value (or `undefined`). Resolves to `{ status, body }`.
|
|
19
|
+
*/
|
|
20
|
+
handle(method: string, path: string, query: any, body: any): Promise<any>;
|
|
21
|
+
/**
|
|
22
|
+
* Seed the warehouse from a blob previously produced by
|
|
23
|
+
* [`export_warehouse`](Self::export_warehouse) (the `data/` folder or an
|
|
24
|
+
* IndexedDB/OPFS snapshot).
|
|
25
|
+
*/
|
|
26
|
+
importWarehouse(blob: Uint8Array): Promise<any>;
|
|
27
|
+
/**
|
|
28
|
+
* Build an engine from the compiled manifest (`schema.rastack.json`) and an
|
|
29
|
+
* optional OpenAPI document (`openapi.json`, served at `/api/schema/`).
|
|
30
|
+
*/
|
|
31
|
+
constructor(manifest_json: string, openapi_json?: string | null);
|
|
32
|
+
/**
|
|
33
|
+
* Seed one Iceberg file (metadata or data file) at its warehouse key. The
|
|
34
|
+
* provider walks the committed `data/warehouse` Iceberg tree over HTTP and
|
|
35
|
+
* calls this for each file, so the browser reads the *actual* Iceberg files
|
|
36
|
+
* — no bundled blob.
|
|
37
|
+
*/
|
|
38
|
+
seedFile(key: string, bytes: Uint8Array): Promise<any>;
|
|
39
|
+
/**
|
|
40
|
+
* Run subsequent requests as a signed-in identity (the Cognito `sub` and
|
|
41
|
+
* `cognito:groups` claims). Owner fields are stamped from — and row
|
|
42
|
+
* filters and tenant scoping keyed by — this subject, matching the server
|
|
43
|
+
* byte-for-byte. Pass no subject to fall back to the trusted local
|
|
44
|
+
* context.
|
|
45
|
+
*/
|
|
46
|
+
setAuth(subject: string | null | undefined, groups: any): void;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
|
|
50
|
+
|
|
51
|
+
export interface InitOutput {
|
|
52
|
+
readonly memory: WebAssembly.Memory;
|
|
53
|
+
readonly __wbg_rastackapi_free: (a: number, b: number) => void;
|
|
54
|
+
readonly rastackapi_exportWarehouse: (a: number) => any;
|
|
55
|
+
readonly rastackapi_handle: (a: number, b: number, c: number, d: number, e: number, f: any, g: any) => any;
|
|
56
|
+
readonly rastackapi_importWarehouse: (a: number, b: number, c: number) => any;
|
|
57
|
+
readonly rastackapi_new: (a: number, b: number, c: number, d: number) => [number, number, number];
|
|
58
|
+
readonly rastackapi_seedFile: (a: number, b: number, c: number, d: number, e: number) => any;
|
|
59
|
+
readonly rastackapi_setAuth: (a: number, b: number, c: number, d: any) => [number, number];
|
|
60
|
+
readonly rust_zstd_wasm_shim_calloc: (a: number, b: number) => number;
|
|
61
|
+
readonly rust_zstd_wasm_shim_free: (a: number) => void;
|
|
62
|
+
readonly rust_zstd_wasm_shim_malloc: (a: number) => number;
|
|
63
|
+
readonly rust_zstd_wasm_shim_memcmp: (a: number, b: number, c: number) => number;
|
|
64
|
+
readonly rust_zstd_wasm_shim_memcpy: (a: number, b: number, c: number) => number;
|
|
65
|
+
readonly rust_zstd_wasm_shim_memmove: (a: number, b: number, c: number) => number;
|
|
66
|
+
readonly rust_zstd_wasm_shim_memset: (a: number, b: number, c: number) => number;
|
|
67
|
+
readonly rust_zstd_wasm_shim_qsort: (a: number, b: number, c: number, d: number) => void;
|
|
68
|
+
readonly wasm_bindgen_1a7aa9db5392c486___convert__closures_____invoke___wasm_bindgen_1a7aa9db5392c486___JsValue__core_7d5f0a2ba6a62c33___result__Result_____wasm_bindgen_1a7aa9db5392c486___JsError___true_: (a: number, b: number, c: any) => [number, number];
|
|
69
|
+
readonly wasm_bindgen_1a7aa9db5392c486___convert__closures_____invoke___js_sys_191ff9fb2bd47800___Function_fn_wasm_bindgen_1a7aa9db5392c486___JsValue_____wasm_bindgen_1a7aa9db5392c486___sys__Undefined___js_sys_191ff9fb2bd47800___Function_fn_wasm_bindgen_1a7aa9db5392c486___JsValue_____wasm_bindgen_1a7aa9db5392c486___sys__Undefined_______true_: (a: number, b: number, c: any, d: any) => void;
|
|
70
|
+
readonly __wbindgen_malloc: (a: number, b: number) => number;
|
|
71
|
+
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
|
72
|
+
readonly __wbindgen_exn_store: (a: number) => void;
|
|
73
|
+
readonly __externref_table_alloc: () => number;
|
|
74
|
+
readonly __wbindgen_externrefs: WebAssembly.Table;
|
|
75
|
+
readonly __wbindgen_destroy_closure: (a: number, b: number) => void;
|
|
76
|
+
readonly __externref_table_dealloc: (a: number) => void;
|
|
77
|
+
readonly __wbindgen_start: () => void;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export type SyncInitInput = BufferSource | WebAssembly.Module;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Instantiates the given `module`, which can either be bytes or
|
|
84
|
+
* a precompiled `WebAssembly.Module`.
|
|
85
|
+
*
|
|
86
|
+
* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated.
|
|
87
|
+
*
|
|
88
|
+
* @returns {InitOutput}
|
|
89
|
+
*/
|
|
90
|
+
export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* If `module_or_path` is {RequestInfo} or {URL}, makes a request and
|
|
94
|
+
* for everything else, calls `WebAssembly.instantiate` directly.
|
|
95
|
+
*
|
|
96
|
+
* @param {{ module_or_path: InitInput | Promise<InitInput> }} module_or_path - Passing `InitInput` directly is deprecated.
|
|
97
|
+
*
|
|
98
|
+
* @returns {Promise<InitOutput>}
|
|
99
|
+
*/
|
|
100
|
+
export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise<InitInput> } | InitInput | Promise<InitInput>): Promise<InitOutput>;
|