devframe 0.8.1 → 0.9.0-beta.1
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/_shared-CttmCMBi.mjs +70 -0
- package/dist/_shared-DmpWW-HH.d.mts +43 -0
- package/dist/adapters/build.d.mts +1 -1
- package/dist/adapters/build.mjs +6 -5
- package/dist/adapters/cac.d.mts +1 -1
- package/dist/adapters/cac.mjs +157 -1
- package/dist/adapters/dev.d.mts +25 -34
- package/dist/adapters/dev.mjs +2 -1
- package/dist/adapters/embedded.d.mts +1 -1
- package/dist/adapters/initiate.d.mts +223 -0
- package/dist/adapters/initiate.mjs +2 -0
- package/dist/adapters/mcp.d.mts +26 -2
- package/dist/adapters/mcp.mjs +2 -2
- package/dist/cli/main.mjs +2 -2
- package/dist/client/index.d.mts +70 -6
- package/dist/client/index.mjs +743 -408
- package/dist/constants.d.mts +19 -6
- package/dist/constants.mjs +19 -6
- package/dist/{context-CQefP2jR.mjs → context-C33rR7n0.mjs} +1 -1
- package/dist/{context-DFzmxCLa.d.mts → context-CSCwoABx.d.mts} +1 -1
- package/dist/{host-h3-Kz7t5Xab.mjs → context-Du11TLcO.mjs} +5 -255
- package/dist/dev-BEveeA5H.mjs +233 -0
- package/dist/{devframe-qgCKL683.d.mts → devframe-Bdd9YXTy.d.mts} +88 -25
- package/dist/{diagnostics-B5-qHeqD.mjs → diagnostics-DLYH5oD3.mjs} +20 -0
- package/dist/dist-D8jAMwxU.mjs +227 -0
- package/dist/helpers/vite.d.mts +43 -39
- package/dist/helpers/vite.mjs +26 -38
- package/dist/host-agent-CpbAoqBx.mjs +230 -0
- package/dist/host-h3-CzCZwtuV.mjs +26 -0
- package/dist/{fetch-CK0S253E.mjs → http-DLr_cJZ7.mjs} +42 -4
- package/dist/{index-B7RgLw--.d.mts → index-CZRd2K1C.d.mts} +2 -2
- package/dist/{index-Dbw1p5ch.d.mts → index-DSCq4M4q.d.mts} +2 -31
- package/dist/index.d.mts +9 -4
- package/dist/index.mjs +8 -1
- package/dist/{instance-registry-D6fxYu36.mjs → instance-registry-BQqGoDO9.mjs} +9 -2
- package/dist/instance-shell-DBTXTSjN.d.mts +264 -0
- package/dist/instance-shell-KRdee1QF.mjs +485 -0
- package/dist/internal/index.d.mts +150 -0
- package/dist/internal/index.mjs +7 -0
- package/dist/node/auth.d.mts +2 -2
- package/dist/node/hub-internals.d.mts +2 -14
- package/dist/node/hub-internals.mjs +2 -2
- package/dist/node/index.d.mts +3 -267
- package/dist/node/index.mjs +3 -5
- package/dist/recipes/common-rpc-functions.d.mts +3 -3
- package/dist/recipes/interactive-auth.d.mts +3 -3
- package/dist/recipes/interactive-auth.mjs +6 -6
- package/dist/rolldown-runtime-JspESFgx.mjs +35 -0
- package/dist/rpc/dump.d.mts +77 -1
- package/dist/rpc/dump.mjs +1 -1
- package/dist/rpc/index.d.mts +2 -2
- package/dist/rpc/index.mjs +3 -17
- package/dist/rpc/transports/sse-client.d.mts +2 -0
- package/dist/rpc/transports/sse-client.mjs +142 -0
- package/dist/rpc/transports/sse-server.d.mts +61 -0
- package/dist/rpc/transports/sse-server.mjs +209 -0
- package/dist/rpc/transports/ws-bun.d.mts +35 -0
- package/dist/rpc/transports/ws-bun.mjs +31 -0
- package/dist/rpc/transports/ws-client.d.mts +1 -1
- package/dist/rpc/transports/ws-client.mjs +10 -18
- package/dist/rpc/transports/ws-server.d.mts +2 -2
- package/dist/rpc/transports/ws-server.mjs +2 -214
- package/dist/rpc-core-CGctXToO.d.mts +48 -0
- package/dist/rpc-core-CqcJkAu9.mjs +81 -0
- package/dist/{serialization-C8Mnw9hK.mjs → serialization-BHY8M5NQ.mjs} +1 -1
- package/dist/{shared-state-6kHolYZy.mjs → shared-state-fRRbRUtD.mjs} +1 -1
- package/dist/sse-client-BsIK3hMD.d.mts +37 -0
- package/dist/{dump-CgZShDRB.mjs → static-CvjkO8QE.mjs} +2 -265
- package/dist/{storage-Dzoc3NVC.mjs → storage-BcmVEJRc.mjs} +2 -2
- package/dist/types/index.d.mts +3 -3
- package/dist/types/index.mjs +1 -6
- package/dist/utils/events.d.mts +1 -1
- package/dist/utils/launch-editor.mjs +1 -25
- package/dist/utils/open.mjs +1 -1
- package/dist/utils/serve-static.mjs +1 -1
- package/dist/utils/shared-state.d.mts +1 -1
- package/dist/utils/shared-state.mjs +1 -1
- package/dist/utils/simple-schema.d.mts +101 -1
- package/dist/utils/streaming-channel.d.mts +1 -1
- package/dist/validation-BiuDXTKW.mjs +266 -0
- package/dist/wire-codec-9VhIKnyp.mjs +58 -0
- package/dist/{ws-client-B6Tnr0ic.d.mts → ws-client-CdNuATYa.d.mts} +6 -1
- package/dist/ws-server-Bk1hOG3X.mjs +267 -0
- package/dist/{ws-server-J-zkiOyp.d.mts → ws-server-Ces08fjP.d.mts} +102 -13
- package/package.json +10 -9
- package/skills/devframe/SKILL.md +84 -85
- package/dist/_shared-bWRzeSa0.mjs +0 -19
- package/dist/adapters/cli.d.mts +0 -11
- package/dist/adapters/cli.mjs +0 -6
- package/dist/cac-B1LM3zit.mjs +0 -157
- package/dist/dev-BSHFZGZr.mjs +0 -437
- package/dist/http-Dvgxujcu.mjs +0 -38
- package/dist/index-vAX6bYuc.d.mts +0 -78
- package/dist/recipes/open-helpers.d.mts +0 -6
- package/dist/recipes/open-helpers.mjs +0 -6
- package/dist/server-CXaDDUl0.mjs +0 -148
- package/dist/server-E9z4ZWbd.d.mts +0 -132
- package/dist/simple-schema-BDzLeJDk.d.mts +0 -102
- package/dist/utils/promise.d.mts +0 -8
- package/dist/utils/promise.mjs +0 -15
- package/dist/utils/scope.d.mts +0 -11
- package/dist/utils/scope.mjs +0 -15
- package/dist/{open-Deb5xmIT.mjs → open-Dz4V4irZ.mjs} +1 -1
|
@@ -1,13 +1,62 @@
|
|
|
1
1
|
import { v as RpcFunctionDefinitionAny } from "./types-CnJSgRVa.mjs";
|
|
2
|
-
import { Peer } from "crossws";
|
|
3
2
|
import { BirpcGroup, ChannelOptions } from "birpc";
|
|
3
|
+
import { Hooks, Peer } from "crossws";
|
|
4
4
|
import { NodeAdapter } from "crossws/adapters/node";
|
|
5
|
-
import {
|
|
5
|
+
import { Buffer } from "node:buffer";
|
|
6
|
+
import { IncomingMessage, Server } from "node:http";
|
|
6
7
|
import { Server as Server$1, ServerOptions } from "node:https";
|
|
7
|
-
|
|
8
|
+
import { AddressInfo } from "node:net";
|
|
9
|
+
import { Duplex } from "node:stream";
|
|
10
|
+
//#region src/rpc/transports/session.d.ts
|
|
11
|
+
/**
|
|
12
|
+
* Which wire transport produced an RPC connection. Every transport speaks
|
|
13
|
+
* the same birpc channel protocol; the kind only matters to code that needs
|
|
14
|
+
* transport-specific behavior (e.g. reaching the WS escape hatch on
|
|
15
|
+
* {@link DevframeRpcConnection.peer}).
|
|
16
|
+
*/
|
|
17
|
+
type DevframeRpcTransportKind = 'websocket' | 'sse';
|
|
18
|
+
/**
|
|
19
|
+
* Structural view of the connect-time HTTP request behind an RPC connection
|
|
20
|
+
* — the WS upgrade request, or the request opening an SSE stream. Shaped to
|
|
21
|
+
* match both the web `Request` a crossws peer exposes and a plain
|
|
22
|
+
* `node:http` request wrapper, so auth hooks can read the bearer-token
|
|
23
|
+
* query param and the `Origin` header without caring which transport (or
|
|
24
|
+
* runtime) produced the connection.
|
|
25
|
+
*/
|
|
26
|
+
interface DevframeRpcConnectionRequest {
|
|
27
|
+
/** Request URL (may be path-only, e.g. `/__ws?devframe_auth_token=…`). */
|
|
28
|
+
url?: string;
|
|
29
|
+
/** Header lookup, `Headers`-style. */
|
|
30
|
+
headers?: {
|
|
31
|
+
get: (name: string) => string | null | undefined;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A live RPC connection, independent of the transport that carries it. One
|
|
36
|
+
* exists per connected client; transport bindings construct it alongside the
|
|
37
|
+
* session meta and hand both to the connect/disconnect hooks
|
|
38
|
+
* (`onPeerConnect` / `onPeerDisconnect`, {@link DevframeAuthHandler.onConnect}).
|
|
39
|
+
*/
|
|
40
|
+
interface DevframeRpcConnection {
|
|
41
|
+
/** Session id — the same value as the session meta's `id`. */
|
|
42
|
+
id: number;
|
|
43
|
+
/** The transport carrying this connection. */
|
|
44
|
+
transport: DevframeRpcTransportKind;
|
|
45
|
+
/** The connect-time HTTP request (upgrade request / stream request). */
|
|
46
|
+
request?: DevframeRpcConnectionRequest;
|
|
47
|
+
/** Send a raw wire frame to this client. Prefer the birpc channel. */
|
|
48
|
+
send?: (data: string) => void;
|
|
49
|
+
/** Terminate the connection from the server side. */
|
|
50
|
+
close?: (code?: number, reason?: string) => void;
|
|
51
|
+
/**
|
|
52
|
+
* The crossws peer backing a `websocket` connection — the WS-specific
|
|
53
|
+
* escape hatch (pub/sub, raw socket access). Absent on other transports.
|
|
54
|
+
*/
|
|
55
|
+
peer?: Peer;
|
|
56
|
+
}
|
|
8
57
|
interface DevframeNodeRpcSessionMeta {
|
|
9
58
|
id: number;
|
|
10
|
-
/** The crossws peer backing this session's socket. */
|
|
59
|
+
/** The crossws peer backing this session's socket (WS transport only). */
|
|
11
60
|
peer?: Peer;
|
|
12
61
|
clientAuthToken?: string;
|
|
13
62
|
isTrusted?: boolean;
|
|
@@ -25,6 +74,8 @@ interface DevframeNodeRpcSessionMeta {
|
|
|
25
74
|
*/
|
|
26
75
|
uploadingStreams?: Set<string>;
|
|
27
76
|
}
|
|
77
|
+
//#endregion
|
|
78
|
+
//#region src/rpc/transports/ws-server.d.ts
|
|
28
79
|
interface WsRpcTransportOptions {
|
|
29
80
|
/**
|
|
30
81
|
* Attach to an existing HTTP(S) server, sharing its port. Combine with
|
|
@@ -34,17 +85,28 @@ interface WsRpcTransportOptions {
|
|
|
34
85
|
* this transport detaches the upgrade listener without closing the server.
|
|
35
86
|
*/
|
|
36
87
|
server?: Server | Server$1;
|
|
37
|
-
/**
|
|
88
|
+
/**
|
|
89
|
+
* Port for the standalone WebSocket server. Defaults to `0`, which lets the
|
|
90
|
+
* operating system assign an available port.
|
|
91
|
+
*/
|
|
38
92
|
port?: number;
|
|
39
|
-
/** Host for
|
|
93
|
+
/** Host for the standalone WebSocket server. Defaults to `localhost`. */
|
|
40
94
|
host?: string;
|
|
41
95
|
/**
|
|
42
|
-
* Restrict the WS endpoint to a single upgrade route (e.g. `/
|
|
96
|
+
* Restrict the WS endpoint to a single upgrade route (e.g. `/__ws`). When
|
|
43
97
|
* sharing a `server`, non-matching upgrade requests are left untouched for
|
|
44
98
|
* other listeners to handle, so devframe's socket can sit alongside
|
|
45
99
|
* framework sockets (Vite HMR, etc.).
|
|
46
100
|
*/
|
|
47
101
|
path?: string;
|
|
102
|
+
/**
|
|
103
|
+
* Create the adapter without binding it to anything: no server is created,
|
|
104
|
+
* no port is bound, no `upgrade` listener is installed. The caller drives
|
|
105
|
+
* the socket itself through {@link WsRpcTransport.handleUpgrade} (from its
|
|
106
|
+
* own `upgrade` listener) or {@link WsRpcTransport.attach} (to bind a
|
|
107
|
+
* server later). Takes precedence over `server` / `port` / `https`.
|
|
108
|
+
*/
|
|
109
|
+
unbound?: boolean;
|
|
48
110
|
/**
|
|
49
111
|
* Destroy upgrade requests that don't match `path` instead of leaving them
|
|
50
112
|
* for other listeners. Enable this when devframe owns the shared server
|
|
@@ -72,8 +134,8 @@ interface WsRpcTransportOptions {
|
|
|
72
134
|
* loses dev-time validation for `jsonSerializable: true` declarations.
|
|
73
135
|
*/
|
|
74
136
|
definitions?: ReadonlyMap<string, Pick<RpcFunctionDefinitionAny, 'jsonSerializable'>>;
|
|
75
|
-
onConnected?: (
|
|
76
|
-
onDisconnected?: (
|
|
137
|
+
onConnected?: (connection: DevframeRpcConnection, meta: DevframeNodeRpcSessionMeta) => void;
|
|
138
|
+
onDisconnected?: (connection: DevframeRpcConnection, meta: DevframeNodeRpcSessionMeta) => void;
|
|
77
139
|
/** Override the default per-call serializer. Most callers should leave this unset. */
|
|
78
140
|
serialize?: ChannelOptions['serialize'];
|
|
79
141
|
/** Override the default per-call deserializer. Most callers should leave this unset. */
|
|
@@ -106,6 +168,24 @@ interface WsRpcTransport {
|
|
|
106
168
|
* `peers` and pub/sub. See https://crossws.h3.dev.
|
|
107
169
|
*/
|
|
108
170
|
ws: NodeAdapter;
|
|
171
|
+
/** Resolves when the transport-owned server is listening. */
|
|
172
|
+
ready: Promise<void>;
|
|
173
|
+
/** Returns the bound address, or `null` when the server is not listening. */
|
|
174
|
+
address: () => AddressInfo | string | null;
|
|
175
|
+
/**
|
|
176
|
+
* Complete a `node:http` `upgrade` event on this transport, applying the
|
|
177
|
+
* same `path` filter and origin gate the transport's own listener uses.
|
|
178
|
+
* Wire it into a host server directly — `server.on('upgrade',
|
|
179
|
+
* transport.handleUpgrade)` — or call it from an existing listener.
|
|
180
|
+
*/
|
|
181
|
+
handleUpgrade: (req: IncomingMessage, socket: Duplex, head: Buffer) => void;
|
|
182
|
+
/**
|
|
183
|
+
* Route a server's `upgrade` events to this transport, returning a detach
|
|
184
|
+
* function. Use it to bind an `unbound` transport once the host server
|
|
185
|
+
* exists; {@link WsRpcTransport.close} detaches every server attached this
|
|
186
|
+
* way (without closing them — the caller owns their lifecycle).
|
|
187
|
+
*/
|
|
188
|
+
attach: (server: Server | Server$1) => () => void;
|
|
109
189
|
/** Remove the upgrade listener from a shared `server` (a no-op otherwise). */
|
|
110
190
|
detach: () => void;
|
|
111
191
|
/**
|
|
@@ -124,16 +204,25 @@ declare function isLoopbackHostname(hostname: string): boolean;
|
|
|
124
204
|
* browser — is rejected.
|
|
125
205
|
*/
|
|
126
206
|
declare function isAllowedOrigin(origin: string | undefined, allowedOrigins: readonly string[]): boolean;
|
|
207
|
+
/**
|
|
208
|
+
* The per-peer lifecycle hooks driving a devframe RPC WebSocket, shaped for
|
|
209
|
+
* any [crossws](https://crossws.h3.dev) adapter. {@link attachWsRpcTransport}
|
|
210
|
+
* feeds them to the Node adapter; runtime-specific attachments (e.g. Bun's
|
|
211
|
+
* fetch-upgrade adapter) reuse the same hooks so every transport speaks the
|
|
212
|
+
* identical wire protocol — one birpc channel per peer, per-method
|
|
213
|
+
* `jsonSerializable` dispatch between strict JSON and structured-clone.
|
|
214
|
+
*/
|
|
215
|
+
declare function createWsRpcPeerHooks<ClientFunctions extends object, ServerFunctions extends object>(rpcGroup: BirpcGroup<ClientFunctions, ServerFunctions, false>, options?: Pick<WsRpcTransportOptions, 'onConnected' | 'onDisconnected' | 'definitions' | 'serialize' | 'deserialize'>): Partial<Hooks>;
|
|
127
216
|
/**
|
|
128
217
|
* Attach a WebSocket transport to an existing RPC group, powered by
|
|
129
218
|
* [crossws](https://crossws.h3.dev). Either attach to an existing HTTP(S)
|
|
130
219
|
* `server` (sharing its port, optionally scoped to a `path`), or let this
|
|
131
220
|
* helper create a standalone server from `port` / `host` / `https`.
|
|
132
221
|
*
|
|
133
|
-
* Returns the crossws node adapter
|
|
134
|
-
* listener from a shared `server`)
|
|
135
|
-
* teardown).
|
|
222
|
+
* Returns the crossws node adapter, standalone-server readiness/address
|
|
223
|
+
* accessors, `detach` (remove the upgrade listener from a shared `server`),
|
|
224
|
+
* and `close` (full deterministic teardown).
|
|
136
225
|
*/
|
|
137
226
|
declare function attachWsRpcTransport<ClientFunctions extends object, ServerFunctions extends object>(rpcGroup: BirpcGroup<ClientFunctions, ServerFunctions, false>, options?: WsRpcTransportOptions): WsRpcTransport;
|
|
138
227
|
//#endregion
|
|
139
|
-
export {
|
|
228
|
+
export { attachWsRpcTransport as a, isAllowedOrigin as c, DevframeRpcConnection as d, DevframeRpcConnectionRequest as f, WsRpcTransportOptions as i, isLoopbackHostname as l, WsOriginRegistry as n, createWsOriginRegistry as o, DevframeRpcTransportKind as p, WsRpcTransport as r, createWsRpcPeerHooks as s, CreateWsOriginRegistryOptions as t, DevframeNodeRpcSessionMeta as u };
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devframe",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"description": "Framework for building
|
|
4
|
+
"version": "0.9.0-beta.1",
|
|
5
|
+
"description": "Framework for building one portable devtool integration that runs in any viewer.",
|
|
6
6
|
"author": "Anthony Fu <anthonyfu117@hotmail.com>",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"homepage": "https://github.com/devframes/devframe#readme",
|
|
@@ -22,23 +22,26 @@
|
|
|
22
22
|
".": "./dist/index.mjs",
|
|
23
23
|
"./adapters/build": "./dist/adapters/build.mjs",
|
|
24
24
|
"./adapters/cac": "./dist/adapters/cac.mjs",
|
|
25
|
-
"./adapters/cli": "./dist/adapters/cli.mjs",
|
|
26
25
|
"./adapters/dev": "./dist/adapters/dev.mjs",
|
|
27
26
|
"./adapters/embedded": "./dist/adapters/embedded.mjs",
|
|
28
27
|
"./adapters/mcp": "./dist/adapters/mcp.mjs",
|
|
29
28
|
"./client": "./dist/client/index.mjs",
|
|
30
29
|
"./constants": "./dist/constants.mjs",
|
|
31
30
|
"./helpers/vite": "./dist/helpers/vite.mjs",
|
|
31
|
+
"./initiate": "./dist/adapters/initiate.mjs",
|
|
32
|
+
"./internal": "./dist/internal/index.mjs",
|
|
32
33
|
"./node": "./dist/node/index.mjs",
|
|
33
34
|
"./node/auth": "./dist/node/auth.mjs",
|
|
34
35
|
"./node/hub-internals": "./dist/node/hub-internals.mjs",
|
|
35
36
|
"./recipes/common-rpc-functions": "./dist/recipes/common-rpc-functions.mjs",
|
|
36
37
|
"./recipes/interactive-auth": "./dist/recipes/interactive-auth.mjs",
|
|
37
|
-
"./recipes/open-helpers": "./dist/recipes/open-helpers.mjs",
|
|
38
38
|
"./rpc": "./dist/rpc/index.mjs",
|
|
39
39
|
"./rpc/client": "./dist/rpc/client.mjs",
|
|
40
40
|
"./rpc/dump": "./dist/rpc/dump.mjs",
|
|
41
41
|
"./rpc/server": "./dist/rpc/server.mjs",
|
|
42
|
+
"./rpc/transports/sse-client": "./dist/rpc/transports/sse-client.mjs",
|
|
43
|
+
"./rpc/transports/sse-server": "./dist/rpc/transports/sse-server.mjs",
|
|
44
|
+
"./rpc/transports/ws-bun": "./dist/rpc/transports/ws-bun.mjs",
|
|
42
45
|
"./rpc/transports/ws-client": "./dist/rpc/transports/ws-client.mjs",
|
|
43
46
|
"./rpc/transports/ws-server": "./dist/rpc/transports/ws-server.mjs",
|
|
44
47
|
"./types": "./dist/types/index.mjs",
|
|
@@ -50,9 +53,7 @@
|
|
|
50
53
|
"./utils/launch-editor": "./dist/utils/launch-editor.mjs",
|
|
51
54
|
"./utils/nanoid": "./dist/utils/nanoid.mjs",
|
|
52
55
|
"./utils/open": "./dist/utils/open.mjs",
|
|
53
|
-
"./utils/promise": "./dist/utils/promise.mjs",
|
|
54
56
|
"./utils/simple-schema": "./dist/utils/simple-schema.mjs",
|
|
55
|
-
"./utils/scope": "./dist/utils/scope.mjs",
|
|
56
57
|
"./utils/serve-static": "./dist/utils/serve-static.mjs",
|
|
57
58
|
"./utils/shared-state": "./dist/utils/shared-state.mjs",
|
|
58
59
|
"./utils/streaming-channel": "./dist/utils/streaming-channel.mjs",
|
|
@@ -87,7 +88,7 @@
|
|
|
87
88
|
},
|
|
88
89
|
"dependencies": {
|
|
89
90
|
"@standard-schema/spec": "^1.1.0",
|
|
90
|
-
"birpc": "^4.
|
|
91
|
+
"birpc": "^4.1.0",
|
|
91
92
|
"crossws": "^0.4.10",
|
|
92
93
|
"destr": "^2.0.5",
|
|
93
94
|
"h3": "^2.0.1-rc.26",
|
|
@@ -101,7 +102,7 @@
|
|
|
101
102
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
102
103
|
"cac": "^7.0.0",
|
|
103
104
|
"get-port-please": "^3.2.0",
|
|
104
|
-
"immer": "^11.1.
|
|
105
|
+
"immer": "^11.1.16",
|
|
105
106
|
"launch-editor": "^2.14.1",
|
|
106
107
|
"mlly": "^1.8.2",
|
|
107
108
|
"obug": "^2.1.4",
|
|
@@ -115,7 +116,7 @@
|
|
|
115
116
|
"ua-parser-modern": "^0.1.1",
|
|
116
117
|
"valibot": "^1.4.2",
|
|
117
118
|
"whenexpr": "^0.1.2",
|
|
118
|
-
"ws": "^8.21.
|
|
119
|
+
"ws": "^8.21.3"
|
|
119
120
|
},
|
|
120
121
|
"scripts": {
|
|
121
122
|
"build": "tsdown",
|