@palbase/web 4.0.0 → 4.0.2
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/dist/_mls-wasm.cjs +32 -0
- package/dist/_mls-wasm.cjs.map +1 -0
- package/dist/_mls-wasm.js +11 -0
- package/dist/_mls-wasm.js.map +1 -0
- package/dist/{analytics-facade-DwOtlXPP.d.cts → analytics-facade-CaluA4bW.d.cts} +26 -1
- package/dist/{analytics-facade-Nk6J9Ncm.d.ts → analytics-facade-Cp3d4QI-.d.ts} +26 -1
- package/dist/{chunk-S7NAY3MW.js → chunk-CFDU23TB.js} +3 -10
- package/dist/chunk-CFDU23TB.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/{chunk-NP4NIY7A.js → chunk-TW6YN354.js} +84 -27
- package/dist/chunk-TW6YN354.js.map +1 -0
- package/dist/gen/cli.cjs +5 -5
- package/dist/gen/cli.cjs.map +1 -1
- package/dist/gen/cli.js +6 -5
- package/dist/gen/cli.js.map +1 -1
- package/dist/index.cjs +91 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -2
- package/dist/internal.cjs +90 -26
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.d.cts +3 -3
- package/dist/internal.d.ts +3 -3
- package/dist/internal.js +3 -2
- package/dist/next/client.cjs +90 -26
- package/dist/next/client.cjs.map +1 -1
- package/dist/next/client.js +3 -2
- package/dist/next/client.js.map +1 -1
- package/dist/next/index.cjs +81 -27
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.d.cts +2 -2
- package/dist/next/index.d.ts +2 -2
- package/dist/next/index.js +3 -2
- package/dist/next/index.js.map +1 -1
- package/dist/{pb-FG_nV7NR.d.ts → pb-DUK5qy81.d.ts} +1 -1
- package/dist/{pb-C9v5dEO6.d.cts → pb-DvV6ftmf.d.cts} +1 -1
- package/dist/react/index.cjs +10 -2
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.js +3 -2
- package/dist/react/index.js.map +1 -1
- package/package.json +10 -3
- package/dist/chunk-NP4NIY7A.js.map +0 -1
- package/dist/chunk-S7NAY3MW.js.map +0 -1
- package/dist/pkg/palbe_mls_bg.wasm +0 -0
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { f as AnalyticsProperties, g as AuthChangeEvent, h as AuthState, i as AuthSuccess, A as AuthUser, j as Call, k as CallChangeCallback, l as CallParticipant, m as CallState, C as Chat, n as ChatBackend, o as ChatDraft, p as ChatKind, b as ChatMember, c as ChatMessage, q as ChatMessageKind, r as ChatRole, s as ChatState, t as CommsPrefs, F as FlagsView, M as MagicLinkResult, u as MentionRange, v as MessageDirection, N as NotifyScope, O as OAuthExchangeResult, w as PalbeAnalytics, x as PalbeAuth, y as PalbeCalls, P as PalbeConfig, z as PalbeFlags, B as PalbeMessaging, D as PalbeOAuthConfig, E as PalbeRealtime, G as PresenceState, H as RealtimeChannel, R as RealtimeConnectionState, I as RealtimeHandler, a as RealtimePayload, J as RealtimeStatus, K as RealtimeStatusSnapshot, L as RealtimeSubscription, Q as ResolvedMention, S as ResolvedReply, T as SentReceipt, U as UnreadView, V as Unsubscribe } from './analytics-facade-
|
|
1
|
+
export { f as AnalyticsProperties, g as AuthChangeEvent, h as AuthState, i as AuthSuccess, A as AuthUser, j as Call, k as CallChangeCallback, l as CallParticipant, m as CallState, C as Chat, n as ChatBackend, o as ChatDraft, p as ChatKind, b as ChatMember, c as ChatMessage, q as ChatMessageKind, r as ChatRole, s as ChatState, t as CommsPrefs, F as FlagsView, M as MagicLinkResult, u as MentionRange, v as MessageDirection, N as NotifyScope, O as OAuthExchangeResult, w as PalbeAnalytics, x as PalbeAuth, y as PalbeCalls, P as PalbeConfig, z as PalbeFlags, B as PalbeMessaging, D as PalbeOAuthConfig, E as PalbeRealtime, G as PresenceState, H as RealtimeChannel, R as RealtimeConnectionState, I as RealtimeHandler, a as RealtimePayload, J as RealtimeStatus, K as RealtimeStatusSnapshot, L as RealtimeSubscription, Q as ResolvedMention, S as ResolvedReply, T as SentReceipt, U as UnreadView, V as Unsubscribe } from './analytics-facade-CaluA4bW.cjs';
|
|
2
2
|
export { B as BackendError, a as BackendErrorKind, F as FieldError, i as isBackendError } from './errors-fDoNdTrJ.cjs';
|
|
3
|
-
export { C as CallOptions, P as PB, U as UploadOptions, a as UploadProgress, p as pb } from './pb-
|
|
3
|
+
export { C as CallOptions, P as PB, U as UploadOptions, a as UploadProgress, p as pb } from './pb-DvV6ftmf.cjs';
|
|
4
4
|
export { P as PersistedSession, S as SessionStorageAdapter, l as localStorageSessionStorage, m as memorySessionStorage } from './storage-BPaeSG8K.cjs';
|
|
5
5
|
export { F as FlagValue } from './pooled-flags-4GtDtsiu.js';
|
|
6
6
|
|
|
@@ -206,6 +206,6 @@ interface MlsGlue {
|
|
|
206
206
|
*/
|
|
207
207
|
declare function initMls(): Promise<MlsGlue>;
|
|
208
208
|
|
|
209
|
-
declare const VERSION = "4.0.
|
|
209
|
+
declare const VERSION = "4.0.2";
|
|
210
210
|
|
|
211
211
|
export { VERSION, initMls };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { f as AnalyticsProperties, g as AuthChangeEvent, h as AuthState, i as AuthSuccess, A as AuthUser, j as Call, k as CallChangeCallback, l as CallParticipant, m as CallState, C as Chat, n as ChatBackend, o as ChatDraft, p as ChatKind, b as ChatMember, c as ChatMessage, q as ChatMessageKind, r as ChatRole, s as ChatState, t as CommsPrefs, F as FlagsView, M as MagicLinkResult, u as MentionRange, v as MessageDirection, N as NotifyScope, O as OAuthExchangeResult, w as PalbeAnalytics, x as PalbeAuth, y as PalbeCalls, P as PalbeConfig, z as PalbeFlags, B as PalbeMessaging, D as PalbeOAuthConfig, E as PalbeRealtime, G as PresenceState, H as RealtimeChannel, R as RealtimeConnectionState, I as RealtimeHandler, a as RealtimePayload, J as RealtimeStatus, K as RealtimeStatusSnapshot, L as RealtimeSubscription, Q as ResolvedMention, S as ResolvedReply, T as SentReceipt, U as UnreadView, V as Unsubscribe } from './analytics-facade-
|
|
1
|
+
export { f as AnalyticsProperties, g as AuthChangeEvent, h as AuthState, i as AuthSuccess, A as AuthUser, j as Call, k as CallChangeCallback, l as CallParticipant, m as CallState, C as Chat, n as ChatBackend, o as ChatDraft, p as ChatKind, b as ChatMember, c as ChatMessage, q as ChatMessageKind, r as ChatRole, s as ChatState, t as CommsPrefs, F as FlagsView, M as MagicLinkResult, u as MentionRange, v as MessageDirection, N as NotifyScope, O as OAuthExchangeResult, w as PalbeAnalytics, x as PalbeAuth, y as PalbeCalls, P as PalbeConfig, z as PalbeFlags, B as PalbeMessaging, D as PalbeOAuthConfig, E as PalbeRealtime, G as PresenceState, H as RealtimeChannel, R as RealtimeConnectionState, I as RealtimeHandler, a as RealtimePayload, J as RealtimeStatus, K as RealtimeStatusSnapshot, L as RealtimeSubscription, Q as ResolvedMention, S as ResolvedReply, T as SentReceipt, U as UnreadView, V as Unsubscribe } from './analytics-facade-Cp3d4QI-.js';
|
|
2
2
|
export { B as BackendError, a as BackendErrorKind, F as FieldError, i as isBackendError } from './errors-fDoNdTrJ.js';
|
|
3
|
-
export { C as CallOptions, P as PB, U as UploadOptions, a as UploadProgress, p as pb } from './pb-
|
|
3
|
+
export { C as CallOptions, P as PB, U as UploadOptions, a as UploadProgress, p as pb } from './pb-DUK5qy81.js';
|
|
4
4
|
export { P as PersistedSession, S as SessionStorageAdapter, l as localStorageSessionStorage, m as memorySessionStorage } from './storage-BPaeSG8K.js';
|
|
5
5
|
export { F as FlagValue } from './pooled-flags-4GtDtsiu.js';
|
|
6
6
|
|
|
@@ -206,6 +206,6 @@ interface MlsGlue {
|
|
|
206
206
|
*/
|
|
207
207
|
declare function initMls(): Promise<MlsGlue>;
|
|
208
208
|
|
|
209
|
-
declare const VERSION = "4.0.
|
|
209
|
+
declare const VERSION = "4.0.2";
|
|
210
210
|
|
|
211
211
|
export { VERSION, initMls };
|
package/dist/index.js
CHANGED
|
@@ -13,8 +13,9 @@ import {
|
|
|
13
13
|
localStorageSessionStorage,
|
|
14
14
|
memorySessionStorage,
|
|
15
15
|
pb
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
} from "./chunk-TW6YN354.js";
|
|
17
|
+
import "./chunk-CFDU23TB.js";
|
|
18
|
+
import "./chunk-PZ5AY32C.js";
|
|
18
19
|
export {
|
|
19
20
|
BackendError,
|
|
20
21
|
PalbeAnalytics,
|
package/dist/internal.cjs
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
29
|
|
|
20
30
|
// src/internal.ts
|
|
@@ -45,7 +55,7 @@ var PalbaseError = class extends Error {
|
|
|
45
55
|
}
|
|
46
56
|
};
|
|
47
57
|
var PALBASE_DEFAULT_HOST = "api.palbase.studio";
|
|
48
|
-
var API_KEY_RE = /^pb_([a-z0-9]
|
|
58
|
+
var API_KEY_RE = /^pb_([a-z0-9]{4,24})_c[A-Za-z0-9]{20}$/;
|
|
49
59
|
function parseEnvironmentRef(apiKey) {
|
|
50
60
|
return API_KEY_RE.exec(apiKey)?.[1] ?? null;
|
|
51
61
|
}
|
|
@@ -422,6 +432,11 @@ var PERF_EXCLUDED_PREFIX = "/v1/analytics/";
|
|
|
422
432
|
function isSelfTraced(path) {
|
|
423
433
|
return path.startsWith(PERF_EXCLUDED_PREFIX);
|
|
424
434
|
}
|
|
435
|
+
function isSessionKilled(status, code) {
|
|
436
|
+
if (status === 401) return code === "session_revoked";
|
|
437
|
+
if (status === 403) return code === "subject_fenced" || code === "subject_erased";
|
|
438
|
+
return false;
|
|
439
|
+
}
|
|
425
440
|
function nowMs() {
|
|
426
441
|
return typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
|
|
427
442
|
}
|
|
@@ -457,7 +472,7 @@ async function palbeRequest(rt, method, path, spec = {}) {
|
|
|
457
472
|
let res;
|
|
458
473
|
try {
|
|
459
474
|
res = await attempt();
|
|
460
|
-
if (res.error?.status === 401 && rt.tokenManager.getRefreshToken() && rt.tokenManager.refreshFunction) {
|
|
475
|
+
if (res.error?.status === 401 && res.error.code !== "session_revoked" && rt.tokenManager.getRefreshToken() && rt.tokenManager.refreshFunction) {
|
|
461
476
|
try {
|
|
462
477
|
await rt.tokenManager.refreshSession();
|
|
463
478
|
} catch (refreshErr) {
|
|
@@ -477,6 +492,9 @@ async function palbeRequest(rt, method, path, spec = {}) {
|
|
|
477
492
|
if (!isAbort(e)) record(asPalbaseError(e)?.status ?? 0);
|
|
478
493
|
throw e;
|
|
479
494
|
}
|
|
495
|
+
if (res.error && isSessionKilled(res.error.status, res.error.code)) {
|
|
496
|
+
rt.auth.reactiveTeardown();
|
|
497
|
+
}
|
|
480
498
|
record(res.error?.status ?? 200);
|
|
481
499
|
return unwrap(res);
|
|
482
500
|
}
|
|
@@ -1411,7 +1429,7 @@ var PalbeAnalytics = class {
|
|
|
1411
1429
|
};
|
|
1412
1430
|
|
|
1413
1431
|
// src/api-key.ts
|
|
1414
|
-
var PUBLISHABLE_API_KEY_RE = /^pb_([a-z0-9]
|
|
1432
|
+
var PUBLISHABLE_API_KEY_RE = /^pb_([a-z0-9]{4,24})_c[A-Za-z0-9]{20}$/;
|
|
1415
1433
|
function environmentRefFromPublishableApiKey(apiKey) {
|
|
1416
1434
|
const match = PUBLISHABLE_API_KEY_RE.exec(apiKey);
|
|
1417
1435
|
return match ? match[1] ?? "" : "";
|
|
@@ -1458,7 +1476,8 @@ var PalbeAuth = class {
|
|
|
1458
1476
|
if (!this.signedInState) return;
|
|
1459
1477
|
this.signedInState = false;
|
|
1460
1478
|
this.cachedUser = null;
|
|
1461
|
-
const reason = this.signingOut ? "userInitiated" : "sessionExpired";
|
|
1479
|
+
const reason = this.nextSignOutReason ?? (this.signingOut ? "userInitiated" : "sessionExpired");
|
|
1480
|
+
this.nextSignOutReason = null;
|
|
1462
1481
|
this.emitState({ status: "signedOut" });
|
|
1463
1482
|
this.emitEvent({ type: "signedOut", reason });
|
|
1464
1483
|
} else if (event === "TOKEN_REFRESHED") {
|
|
@@ -1471,6 +1490,10 @@ var PalbeAuth = class {
|
|
|
1471
1490
|
rt;
|
|
1472
1491
|
cachedUser = null;
|
|
1473
1492
|
signingOut = false;
|
|
1493
|
+
// Explicit signedOut reason pinned for the NEXT session clear (deleteAccount /
|
|
1494
|
+
// reactiveTeardown set it before clearSession; the SIGNED_OUT handler consumes
|
|
1495
|
+
// it exactly once, then resets to null → normal signOut/expiry split resumes).
|
|
1496
|
+
nextSignOutReason = null;
|
|
1474
1497
|
signingIn = false;
|
|
1475
1498
|
// suppresses AuthClient's TOKEN_REFRESHED during re-signIn
|
|
1476
1499
|
signedInState = false;
|
|
@@ -1518,6 +1541,45 @@ var PalbeAuth = class {
|
|
|
1518
1541
|
this.cachedUser = null;
|
|
1519
1542
|
}
|
|
1520
1543
|
}
|
|
1544
|
+
/**
|
|
1545
|
+
* Self-service account erasure ("right to be forgotten"). Calls palauth
|
|
1546
|
+
* `DELETE /auth/user` (session-authed + fresh re-auth): password users pass
|
|
1547
|
+
* `{ password }`; passwordless/OAuth users rely on a freshly stepped-up
|
|
1548
|
+
* session. On 202 the erasure workflow is durably queued AND every session is
|
|
1549
|
+
* already revoked server-side — so we tear down local state (mirroring
|
|
1550
|
+
* `signOut()`'s clear, minus the pointless `/logout`) and emit
|
|
1551
|
+
* `signedOut{reason:'accountDeleted'}`.
|
|
1552
|
+
*
|
|
1553
|
+
* On 401 `reauth_required` / 503 `not_configured` (or `erasure_unavailable`)
|
|
1554
|
+
* the request throws BEFORE the teardown line, so the local session is left
|
|
1555
|
+
* fully intact — the deletion did not happen and the user is still signed in.
|
|
1556
|
+
*/
|
|
1557
|
+
async deleteAccount(params = {}) {
|
|
1558
|
+
const res = await palbeRequest(this.rt, "DELETE", "/auth/user", {
|
|
1559
|
+
body: params.password ? { password: params.password } : {}
|
|
1560
|
+
});
|
|
1561
|
+
this.nextSignOutReason = "accountDeleted";
|
|
1562
|
+
this.rt.tokenManager.clearSession();
|
|
1563
|
+
this.rt.storage.clear();
|
|
1564
|
+
this.cachedUser = null;
|
|
1565
|
+
return { erasureId: res.erasure_id };
|
|
1566
|
+
}
|
|
1567
|
+
/**
|
|
1568
|
+
* @internal — invoked by the transport choke point (`request.ts`), not app code.
|
|
1569
|
+
* Reactive teardown when the server reports the session is gone: a 403
|
|
1570
|
+
* `subject_fenced`/`subject_erased` (subject being erased) or a 401
|
|
1571
|
+
* `session_revoked`. Clears local state and emits
|
|
1572
|
+
* `signedOut{reason:'sessionInvalid'}` exactly once (deduped by
|
|
1573
|
+
* `signedInState`). An ordinary 403 authz denial does NOT reach here —
|
|
1574
|
+
* `request.ts` matches only the exact session-kill codes.
|
|
1575
|
+
*/
|
|
1576
|
+
reactiveTeardown() {
|
|
1577
|
+
if (!this.signedInState) return;
|
|
1578
|
+
this.nextSignOutReason = "sessionInvalid";
|
|
1579
|
+
this.rt.tokenManager.clearSession();
|
|
1580
|
+
this.rt.storage.clear();
|
|
1581
|
+
this.cachedUser = null;
|
|
1582
|
+
}
|
|
1521
1583
|
async getUser() {
|
|
1522
1584
|
const raw = await palbeRequest(this.rt, "GET", "/auth/user");
|
|
1523
1585
|
return mapWireUser(raw);
|
|
@@ -6457,31 +6519,29 @@ function date_now() {
|
|
|
6457
6519
|
}
|
|
6458
6520
|
|
|
6459
6521
|
// src/messaging/wasm/loader.ts
|
|
6460
|
-
var import_meta = {};
|
|
6461
6522
|
var GLUE_MODULE = "./palbe_mls_bg.js";
|
|
6462
6523
|
var SNIPPET_MODULE = "./snippets/mls-rs-core-f99cdecbb456b09c/inline0.js";
|
|
6463
6524
|
var inflight = null;
|
|
6464
6525
|
var ready = null;
|
|
6465
|
-
|
|
6466
|
-
|
|
6467
|
-
|
|
6468
|
-
const fsSpecifier = ["node", "fs/promises"].join(":");
|
|
6469
|
-
const { readFile } = await import(
|
|
6470
|
-
/* webpackIgnore: true */
|
|
6471
|
-
fsSpecifier
|
|
6472
|
-
);
|
|
6473
|
-
const bytes = await readFile(wasmUrl);
|
|
6474
|
-
return WebAssembly.compile(bytes);
|
|
6526
|
+
function decodeBase64(encoded) {
|
|
6527
|
+
if (typeof encoded !== "string" || encoded.length === 0 || typeof globalThis.atob !== "function") {
|
|
6528
|
+
throw new Error("palbe-mls WASM asset is invalid");
|
|
6475
6529
|
}
|
|
6476
|
-
|
|
6477
|
-
|
|
6478
|
-
|
|
6479
|
-
|
|
6480
|
-
|
|
6481
|
-
|
|
6530
|
+
let binary;
|
|
6531
|
+
try {
|
|
6532
|
+
binary = globalThis.atob(encoded);
|
|
6533
|
+
} catch {
|
|
6534
|
+
throw new Error("palbe-mls WASM asset is invalid");
|
|
6535
|
+
}
|
|
6536
|
+
const bytes = new Uint8Array(binary.length);
|
|
6537
|
+
for (let index = 0; index < binary.length; index += 1) {
|
|
6538
|
+
bytes[index] = binary.charCodeAt(index);
|
|
6482
6539
|
}
|
|
6483
|
-
|
|
6484
|
-
|
|
6540
|
+
return bytes.buffer;
|
|
6541
|
+
}
|
|
6542
|
+
async function loadWasmModule() {
|
|
6543
|
+
const asset = await import("#palbase-mls-wasm");
|
|
6544
|
+
return WebAssembly.compile(decodeBase64(asset.default));
|
|
6485
6545
|
}
|
|
6486
6546
|
function buildImports() {
|
|
6487
6547
|
return {
|
|
@@ -6492,7 +6552,7 @@ function buildImports() {
|
|
|
6492
6552
|
function initMls() {
|
|
6493
6553
|
if (ready) return Promise.resolve(ready);
|
|
6494
6554
|
if (inflight) return inflight;
|
|
6495
|
-
|
|
6555
|
+
const attempt = (async () => {
|
|
6496
6556
|
const module2 = await loadWasmModule();
|
|
6497
6557
|
const instance = await WebAssembly.instantiate(module2, buildImports());
|
|
6498
6558
|
const setWasm = __wbg_set_wasm;
|
|
@@ -6511,7 +6571,11 @@ function initMls() {
|
|
|
6511
6571
|
ready = g;
|
|
6512
6572
|
return g;
|
|
6513
6573
|
})();
|
|
6514
|
-
|
|
6574
|
+
inflight = attempt;
|
|
6575
|
+
void attempt.catch(() => {
|
|
6576
|
+
if (inflight === attempt) inflight = null;
|
|
6577
|
+
});
|
|
6578
|
+
return attempt;
|
|
6515
6579
|
}
|
|
6516
6580
|
function requireMls() {
|
|
6517
6581
|
if (!ready) {
|
|
@@ -8964,7 +9028,7 @@ function defaultSessionStorage(key) {
|
|
|
8964
9028
|
}
|
|
8965
9029
|
|
|
8966
9030
|
// src/version.ts
|
|
8967
|
-
var VERSION = "4.0.
|
|
9031
|
+
var VERSION = "4.0.2";
|
|
8968
9032
|
|
|
8969
9033
|
// src/runtime.ts
|
|
8970
9034
|
function buildRuntime(config) {
|