@foldkit/vite-plugin 0.3.2 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,MAAM,EAAkC,MAAM,MAAM,CAAA;AAGlE,6CAA6C;AAC7C,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAC,CAAA;AAqBF,eAAO,MAAM,OAAO,GAAI,UAAS,oBAAyB,KAAG,MAO5D,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,MAAM,EAAkC,MAAM,MAAM,CAAA;AAGlE,6CAA6C;AAC7C,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAC,CAAA;AA4fF,eAAO,MAAM,OAAO,GAAI,UAAS,oBAAyB,KAAG,MAgC5D,CAAA"}
package/dist/index.js CHANGED
@@ -1,49 +1,209 @@
1
- import { Array, Effect, Either, HashMap, HashSet, Match, Option, Ref, Schema as S, pipe, } from 'effect';
1
+ import { Array, Console, Data, Effect, Exit, Fiber, HashMap, HashSet, Match as M, Option, Queue, Ref, Schema as S, Stream, pipe, } from 'effect';
2
2
  import { EventFrame, RequestFrame, ResponseFrame, ResponseRuntimes, } from 'foldkit/devtools-protocol';
3
+ import { PreserveModelMessage, RequestModelMessage, RestoreModelMessage, } from 'foldkit/hmr-protocol';
3
4
  import { WebSocketServer } from 'ws';
4
- let preservedModel = undefined;
5
- let isHmrReload = false;
6
- const connectedRuntimesRef = Ref.unsafeMake(HashMap.empty());
7
- const mcpClientsRef = Ref.unsafeMake(HashSet.empty());
8
- const clientConnectionsRef = Ref.unsafeMake(HashMap.empty());
9
- const trackedClientsRef = Ref.unsafeMake(HashSet.empty());
10
- let viteServer = null;
11
- let mcpWebSocketServer = null;
12
- export const foldkit = (options = {}) => {
13
- return {
14
- name: 'foldkit-hmr',
15
- apply: 'serve',
16
- configureServer: server => configureServer(server, options),
17
- handleHotUpdate,
5
+ // NOTE: Vite's dep optimizer scans the consumer's source for `effect`
6
+ // imports and pre-bundles only those exports into a single `effect.js`
7
+ // blob. It does not follow imports through workspace/node_modules
8
+ // packages, so any `effect` namespace foldkit's compiled dist references
9
+ // that the consumer does not mention by name is missing from the blob
10
+ // and crashes at runtime in dev. The list below covers every top-level
11
+ // namespace foldkit imports from bare `'effect'`. Over-inclusion is
12
+ // harmless; under-inclusion is the bug. Kept in sync with foldkit's
13
+ // source by `scripts/check-effect-prebundle.ts` (runs in `pnpm check`).
14
+ const FORCE_INCLUDED_EFFECT_NAMESPACES = [
15
+ 'effect/Array',
16
+ 'effect/Cause',
17
+ 'effect/Clock',
18
+ 'effect/Context',
19
+ 'effect/Data',
20
+ 'effect/DateTime',
21
+ 'effect/Duration',
22
+ 'effect/Effect',
23
+ 'effect/Equal',
24
+ 'effect/Equivalence',
25
+ 'effect/Exit',
26
+ 'effect/Fiber',
27
+ 'effect/Function',
28
+ 'effect/Hash',
29
+ 'effect/HashMap',
30
+ 'effect/HashSet',
31
+ 'effect/Layer',
32
+ 'effect/Match',
33
+ 'effect/Number',
34
+ 'effect/Option',
35
+ 'effect/Order',
36
+ 'effect/Predicate',
37
+ 'effect/PubSub',
38
+ 'effect/Queue',
39
+ 'effect/Record',
40
+ 'effect/Ref',
41
+ 'effect/Result',
42
+ 'effect/Scheduler',
43
+ 'effect/Schema',
44
+ 'effect/SchemaIssue',
45
+ 'effect/SchemaTransformation',
46
+ 'effect/Stream',
47
+ 'effect/String',
48
+ 'effect/Struct',
49
+ 'effect/SubscriptionRef',
50
+ 'effect/Types',
51
+ ];
52
+ const Event = Data.taggedEnum();
53
+ const makeState = Effect.gen(function* () {
54
+ const preservedModels = yield* Ref.make(HashMap.empty());
55
+ const connectedRuntimes = yield* Ref.make(HashMap.empty());
56
+ const mcpClients = yield* Ref.make(HashSet.empty());
57
+ const clientConnections = yield* Ref.make(HashMap.empty());
58
+ const trackedClients = yield* Ref.make(HashSet.empty());
59
+ const state = {
60
+ preservedModels,
61
+ connectedRuntimes,
62
+ mcpClients,
63
+ clientConnections,
64
+ trackedClients,
18
65
  };
19
- };
20
- const configureServer = (server, options) => {
21
- viteServer = server;
22
- server.ws.on('foldkit:preserve-model', model => {
23
- preservedModel = model;
66
+ return state;
67
+ });
68
+ const encodeResponseFrameJson = S.encodeUnknownSync(S.fromJsonString(ResponseFrame));
69
+ // HANDLERS
70
+ const handlePreserveModelReceived = (state, payload) => Exit.match(S.decodeUnknownExit(PreserveModelMessage)(payload), {
71
+ onFailure: error => Console.warn('[foldkit:hmr] failed to decode preserve-model payload', error),
72
+ onSuccess: ({ id, model, isHmrReload }) => Ref.update(state.preservedModels, current => {
73
+ const existingFlag = Option.exists(HashMap.get(current, id), ({ isHmrReload }) => isHmrReload);
74
+ const entry = {
75
+ model,
76
+ isHmrReload: isHmrReload === true || existingFlag,
77
+ };
78
+ return HashMap.set(current, id, entry);
79
+ }),
80
+ });
81
+ const handleRequestModelReceived = (server, state, payload) => Exit.match(S.decodeUnknownExit(RequestModelMessage)(payload), {
82
+ onFailure: error => Console.warn('[foldkit:hmr] failed to decode request-model payload', error),
83
+ onSuccess: ({ id }) => Effect.gen(function* () {
84
+ const current = yield* Ref.get(state.preservedModels);
85
+ const sendRestore = (model) => Effect.sync(() => server.ws.send('foldkit:restore-model', S.encodeUnknownSync(RestoreModelMessage)(RestoreModelMessage.make({ id, model }))));
86
+ yield* Option.match(HashMap.get(current, id), {
87
+ onNone: () => sendRestore(undefined),
88
+ onSome: entry => {
89
+ if (entry.isHmrReload) {
90
+ const served = { ...entry, isHmrReload: false };
91
+ return Ref.update(state.preservedModels, HashMap.set(id, served)).pipe(Effect.flatMap(() => sendRestore(entry.model)));
92
+ }
93
+ return Ref.update(state.preservedModels, HashMap.remove(id)).pipe(Effect.flatMap(() => sendRestore(undefined)));
94
+ },
95
+ });
96
+ }),
97
+ });
98
+ const handleHotUpdateFired = (state) => Ref.update(state.preservedModels, current => HashMap.map(current, entry => ({ ...entry, isHmrReload: true })));
99
+ const handleBrowserEventFrameReceived = (state, data, client) => Exit.match(S.decodeUnknownExit(EventFrame)(data), {
100
+ onFailure: error => Console.warn('[foldkit:devTools] failed to decode browser event frame', error),
101
+ onSuccess: frame => M.value(frame.event).pipe(M.tagsExhaustive({
102
+ EventConnected: event => handleConnectedEvent(state, event, client),
103
+ EventDisconnected: event => handleDisconnectedEvent(state, event),
104
+ })),
105
+ });
106
+ const handleConnectedEvent = (state, event, client) => Effect.gen(function* () {
107
+ yield* Ref.update(state.connectedRuntimes, HashMap.set(event.runtime.connectionId, event.runtime));
108
+ yield* Ref.update(state.clientConnections, currentMap => {
109
+ const existing = HashMap.get(currentMap, client).pipe(Option.getOrElse(() => HashSet.empty()));
110
+ return HashMap.set(currentMap, client, HashSet.add(existing, event.runtime.connectionId));
24
111
  });
25
- server.ws.on('foldkit:request-model', () => {
26
- server.ws.send('foldkit:restore-model', isHmrReload ? preservedModel : undefined);
27
- if (!isHmrReload) {
28
- preservedModel = undefined;
29
- }
30
- isHmrReload = false;
112
+ yield* Console.log(`[foldkit:devTools] runtime connected: ${event.runtime.connectionId} (${event.runtime.title})`);
113
+ });
114
+ const handleDisconnectedEvent = (state, event) => Effect.gen(function* () {
115
+ yield* Ref.update(state.connectedRuntimes, HashMap.remove(event.connectionId));
116
+ yield* Console.log(`[foldkit:devTools] runtime disconnected: ${event.connectionId}`);
117
+ });
118
+ const pruneRuntime = (state, connectionId) => Effect.gen(function* () {
119
+ yield* Ref.update(state.connectedRuntimes, HashMap.remove(connectionId));
120
+ yield* Console.log(`[foldkit:devTools] runtime pruned (socket close): ${connectionId}`);
121
+ });
122
+ const pruneRuntimesForClient = (state, connectionIds) => Effect.forEach(Array.fromIterable(connectionIds), connectionId => pruneRuntime(state, connectionId), { discard: true });
123
+ const handleViteClientClosed = (state, client) => Effect.gen(function* () {
124
+ const connections = yield* Ref.get(state.clientConnections);
125
+ yield* Option.match(HashMap.get(connections, client), {
126
+ onNone: () => Effect.void,
127
+ onSome: connectionIds => pruneRuntimesForClient(state, connectionIds),
31
128
  });
32
- server.ws.on('foldkit:devTools:event', (data, client) => {
33
- ensureClientTracked(client);
34
- handleBrowserEventFrame(data, client);
129
+ yield* Ref.update(state.clientConnections, HashMap.remove(client));
130
+ yield* Ref.update(state.trackedClients, HashSet.remove(client));
131
+ });
132
+ const handleBrowserResponseFrameReceived = (state, data) => Exit.match(S.decodeUnknownExit(ResponseFrame)(data), {
133
+ onFailure: error => Console.warn('[foldkit:devTools] failed to decode browser response frame', error),
134
+ onSuccess: frame => broadcastResponseToMcpClients(state, frame),
135
+ });
136
+ const broadcastResponseToMcpClients = (state, frame) => Effect.gen(function* () {
137
+ const clients = yield* Ref.get(state.mcpClients);
138
+ const payload = encodeResponseFrameJson(frame);
139
+ yield* Effect.sync(() => {
140
+ for (const client of clients) {
141
+ if (client.readyState === client.OPEN) {
142
+ client.send(payload);
143
+ }
144
+ }
35
145
  });
36
- server.ws.on('foldkit:devTools:response', (data) => {
37
- handleBrowserResponseFrame(data);
146
+ });
147
+ const handleMcpClientConnected = (state, client) => Effect.gen(function* () {
148
+ yield* Ref.update(state.mcpClients, HashSet.add(client));
149
+ const total = HashSet.size(yield* Ref.get(state.mcpClients));
150
+ yield* Console.log(`[foldkit:devTools] MCP client connected (${total} total)`);
151
+ });
152
+ const handleMcpClientDisconnected = (state, client) => Effect.gen(function* () {
153
+ yield* Ref.update(state.mcpClients, HashSet.remove(client));
154
+ const remaining = HashSet.size(yield* Ref.get(state.mcpClients));
155
+ yield* Console.log(`[foldkit:devTools] MCP client disconnected (${remaining} remaining)`);
156
+ });
157
+ const handleMcpRequestReceived = (server, state, client, raw) => Exit.match(S.decodeUnknownExit(S.fromJsonString(RequestFrame))(raw), {
158
+ onFailure: error => Console.warn('[foldkit:devTools] failed to decode MCP request frame', error),
159
+ onSuccess: frame => M.value(frame.request).pipe(M.tag('RequestListRuntimes', () => replyListRuntimes(state, client, frame.id)), M.orElse(() => forwardRequestToBrowsers(server, frame))),
160
+ });
161
+ const replyListRuntimes = (state, client, requestId) => Effect.gen(function* () {
162
+ const runtimes = pipe(yield* Ref.get(state.connectedRuntimes), HashMap.values, Array.fromIterable);
163
+ const responseFrame = {
164
+ id: requestId,
165
+ response: ResponseRuntimes({ runtimes }),
166
+ };
167
+ yield* Effect.sync(() => {
168
+ if (client.readyState === client.OPEN) {
169
+ client.send(encodeResponseFrameJson(responseFrame));
170
+ }
38
171
  });
39
- if (options.devToolsMcpPort !== undefined) {
40
- startMcpWebSocketServer(options.devToolsMcpPort);
41
- server.httpServer?.on('close', stopMcpWebSocketServer);
172
+ });
173
+ const forwardRequestToBrowsers = (server, frame) => Effect.sync(() => server.ws.send('foldkit:devTools:request', S.encodeUnknownSync(RequestFrame)(frame)));
174
+ // EVENT DISPATCH
175
+ const dispatchEvent = (server, state, event) => M.value(event).pipe(M.tagsExhaustive({
176
+ PreserveModelReceived: ({ payload }) => handlePreserveModelReceived(state, payload),
177
+ RequestModelReceived: ({ payload }) => handleRequestModelReceived(server, state, payload),
178
+ BrowserEventFrameReceived: ({ data, client }) => handleBrowserEventFrameReceived(state, data, client),
179
+ BrowserResponseFrameReceived: ({ data }) => handleBrowserResponseFrameReceived(state, data),
180
+ ViteClientClosed: ({ client }) => handleViteClientClosed(state, client),
181
+ HotUpdateFired: () => handleHotUpdateFired(state),
182
+ McpClientConnected: ({ client }) => handleMcpClientConnected(state, client),
183
+ McpClientDisconnected: ({ client }) => handleMcpClientDisconnected(state, client),
184
+ McpRequestReceived: ({ client, raw }) => handleMcpRequestReceived(server, state, client, raw),
185
+ }));
186
+ // VITE WS BRIDGE
187
+ const ensureClientTracked = (state, client, enqueue) => Effect.gen(function* () {
188
+ const tracked = yield* Ref.get(state.trackedClients);
189
+ if (HashSet.has(tracked, client)) {
190
+ return;
42
191
  }
43
- };
44
- const startMcpWebSocketServer = (port) => {
192
+ yield* Ref.update(state.trackedClients, HashSet.add(client));
193
+ yield* Effect.sync(() => client.socket.on('close', () => enqueue(Event.ViteClientClosed({ client }))));
194
+ });
195
+ const registerViteWsHandlers = (server, state, enqueue) => Effect.sync(() => {
196
+ server.ws.on('foldkit:preserve-model', payload => enqueue(Event.PreserveModelReceived({ payload })));
197
+ server.ws.on('foldkit:request-model', payload => enqueue(Event.RequestModelReceived({ payload })));
198
+ server.ws.on('foldkit:devTools:event', (data, client) => {
199
+ Effect.runFork(ensureClientTracked(state, client, enqueue));
200
+ enqueue(Event.BrowserEventFrameReceived({ data, client }));
201
+ });
202
+ server.ws.on('foldkit:devTools:response', (data) => enqueue(Event.BrowserResponseFrameReceived({ data })));
203
+ });
204
+ // MCP RELAY
205
+ const startMcpRelay = (port, enqueue) => Effect.acquireRelease(Effect.sync(() => {
45
206
  const wss = new WebSocketServer({ port });
46
- mcpWebSocketServer = wss;
47
207
  wss.on('error', error => {
48
208
  if ('code' in error && error.code === 'EADDRINUSE') {
49
209
  console.error(`\n[foldkit:devTools] Port ${port} is already in use, so the DevTools MCP relay could not start.\n` +
@@ -54,20 +214,11 @@ const startMcpWebSocketServer = (port) => {
54
214
  else {
55
215
  console.error(`[foldkit:devTools] MCP relay failed to start on port ${port}; continuing without the relay`, error);
56
216
  }
57
- mcpWebSocketServer = null;
58
217
  });
59
218
  wss.on('connection', client => {
60
- Effect.runSync(Ref.update(mcpClientsRef, HashSet.add(client)));
61
- const total = HashSet.size(Effect.runSync(Ref.get(mcpClientsRef)));
62
- console.log(`[foldkit:devTools] MCP client connected (${total} total)`);
63
- client.on('message', raw => {
64
- handleMcpMessage(client, raw.toString());
65
- });
66
- client.on('close', () => {
67
- Effect.runSync(Ref.update(mcpClientsRef, HashSet.remove(client)));
68
- const remaining = HashSet.size(Effect.runSync(Ref.get(mcpClientsRef)));
69
- console.log(`[foldkit:devTools] MCP client disconnected (${remaining} remaining)`);
70
- });
219
+ enqueue(Event.McpClientConnected({ client }));
220
+ client.on('message', raw => enqueue(Event.McpRequestReceived({ client, raw: raw.toString() })));
221
+ client.on('close', () => enqueue(Event.McpClientDisconnected({ client })));
71
222
  client.on('error', error => {
72
223
  console.error('[foldkit:devTools] MCP client error', error);
73
224
  });
@@ -75,110 +226,47 @@ const startMcpWebSocketServer = (port) => {
75
226
  wss.on('listening', () => {
76
227
  console.log(`[foldkit:devTools] MCP relay listening on ws://localhost:${port}`);
77
228
  });
78
- };
79
- const stopMcpWebSocketServer = () => {
80
- const clients = Effect.runSync(Ref.get(mcpClientsRef));
81
- HashSet.forEach(clients, client => {
82
- client.close();
83
- });
84
- Effect.runSync(Ref.set(mcpClientsRef, HashSet.empty()));
85
- mcpWebSocketServer?.close();
86
- mcpWebSocketServer = null;
229
+ return wss;
230
+ }), wss => Effect.sync(() => {
231
+ wss.close();
87
232
  console.log('[foldkit:devTools] MCP relay stopped');
88
- };
89
- const handleBrowserEventFrame = (data, client) => {
90
- const decoded = S.decodeUnknownEither(EventFrame)(data);
91
- Either.match(decoded, {
92
- onLeft: error => {
93
- console.warn('[foldkit:devTools] failed to decode browser event frame', error);
94
- },
95
- onRight: frame => Match.value(frame.event).pipe(Match.tagsExhaustive({
96
- EventConnected: event => handleConnectedEvent(event, client),
97
- EventDisconnected: handleDisconnectedEvent,
98
- })),
99
- });
100
- };
101
- const ensureClientTracked = (client) => {
102
- const tracked = Effect.runSync(Ref.get(trackedClientsRef));
103
- if (HashSet.has(tracked, client)) {
104
- return;
233
+ }));
234
+ // PROGRAM
235
+ const main = (server, events, options) => Effect.gen(function* () {
236
+ const state = yield* makeState;
237
+ const enqueue = (event) => {
238
+ Queue.offerUnsafe(events, event);
239
+ };
240
+ yield* registerViteWsHandlers(server, state, enqueue);
241
+ if (options.devToolsMcpPort !== undefined) {
242
+ yield* startMcpRelay(options.devToolsMcpPort, enqueue);
105
243
  }
106
- Effect.runSync(Ref.update(trackedClientsRef, HashSet.add(client)));
107
- client.socket.on('close', () => handleClientClose(client));
108
- };
109
- const handleClientClose = (client) => {
110
- pipe(Effect.runSync(Ref.get(clientConnectionsRef)), HashMap.get(client), Option.match({
111
- onNone: () => { },
112
- onSome: connectionIds => HashSet.forEach(connectionIds, connectionId => {
113
- Effect.runSync(Ref.update(connectedRuntimesRef, HashMap.remove(connectionId)));
114
- console.log(`[foldkit:devTools] runtime pruned (socket close): ${connectionId}`);
244
+ yield* Stream.fromQueue(events).pipe(Stream.runForEach(event => dispatchEvent(server, state, event)));
245
+ });
246
+ // PLUGIN ENTRY
247
+ export const foldkit = (options = {}) => {
248
+ const events = Effect.runSync(Queue.unbounded());
249
+ return {
250
+ name: 'foldkit-hmr',
251
+ apply: 'serve',
252
+ config: () => ({
253
+ optimizeDeps: {
254
+ include: [...FORCE_INCLUDED_EFFECT_NAMESPACES],
255
+ },
115
256
  }),
116
- }));
117
- Effect.runSync(Ref.update(clientConnectionsRef, HashMap.remove(client)));
118
- Effect.runSync(Ref.update(trackedClientsRef, HashSet.remove(client)));
119
- };
120
- const handleBrowserResponseFrame = (data) => {
121
- const decoded = S.decodeUnknownEither(ResponseFrame)(data);
122
- Either.match(decoded, {
123
- onLeft: error => {
124
- console.warn('[foldkit:devTools] failed to decode browser response frame', error);
257
+ configureServer: server => {
258
+ const fiber = Effect.runFork(Effect.scoped(main(server, events, options)));
259
+ server.httpServer?.on('close', () => {
260
+ Effect.runFork(Fiber.interrupt(fiber));
261
+ });
125
262
  },
126
- onRight: forwardResponseToMcpClients,
127
- });
128
- };
129
- const handleConnectedEvent = (event, client) => {
130
- Effect.runSync(Ref.update(connectedRuntimesRef, HashMap.set(event.runtime.connectionId, event.runtime)));
131
- Effect.runSync(Ref.update(clientConnectionsRef, currentMap => {
132
- const existing = pipe(HashMap.get(currentMap, client), Option.getOrElse(() => HashSet.empty()));
133
- return HashMap.set(currentMap, client, HashSet.add(existing, event.runtime.connectionId));
134
- }));
135
- console.log(`[foldkit:devTools] runtime connected: ${event.runtime.connectionId} (${event.runtime.title})`);
136
- };
137
- const handleDisconnectedEvent = (event) => {
138
- Effect.runSync(Ref.update(connectedRuntimesRef, HashMap.remove(event.connectionId)));
139
- console.log(`[foldkit:devTools] runtime disconnected: ${event.connectionId}`);
140
- };
141
- const broadcastToMcpClients = (payload) => {
142
- const clients = Effect.runSync(Ref.get(mcpClientsRef));
143
- HashSet.forEach(clients, client => {
144
- if (client.readyState === client.OPEN) {
145
- client.send(payload);
146
- }
147
- });
148
- };
149
- const forwardResponseToMcpClients = (responseFrame) => {
150
- broadcastToMcpClients(JSON.stringify(responseFrame));
151
- };
152
- const handleMcpMessage = (client, raw) => {
153
- const decoded = S.decodeUnknownEither(S.parseJson(RequestFrame))(raw);
154
- Either.match(decoded, {
155
- onLeft: error => {
156
- console.warn('[foldkit:devTools] failed to decode MCP request frame', error);
263
+ handleHotUpdate: ({ server, modules, }) => {
264
+ if (modules.length === 0) {
265
+ return;
266
+ }
267
+ server.ws.send({ type: 'full-reload' });
268
+ Queue.offerUnsafe(events, Event.HotUpdateFired());
269
+ return [];
157
270
  },
158
- onRight: frame => Match.value(frame.request).pipe(Match.tag('RequestListRuntimes', () => replyListRuntimes(client, frame.id)), Match.orElse(() => forwardRequestToBrowsers(frame))),
159
- });
160
- };
161
- const replyListRuntimes = (client, requestId) => {
162
- const runtimes = pipe(Effect.runSync(Ref.get(connectedRuntimesRef)), HashMap.values, Array.fromIterable);
163
- const responseFrame = {
164
- id: requestId,
165
- response: ResponseRuntimes({ runtimes }),
166
271
  };
167
- if (client.readyState === client.OPEN) {
168
- client.send(JSON.stringify(responseFrame));
169
- }
170
- };
171
- const forwardRequestToBrowsers = (frame) => {
172
- if (viteServer === null) {
173
- return;
174
- }
175
- viteServer.ws.send('foldkit:devTools:request', frame);
176
- };
177
- const handleHotUpdate = ({ server, modules, }) => {
178
- if (modules.length === 0) {
179
- return;
180
- }
181
- isHmrReload = true;
182
- server.ws.send({ type: 'full-reload' });
183
- return [];
184
272
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foldkit/vite-plugin",
3
- "version": "0.3.2",
3
+ "version": "0.4.1",
4
4
  "description": "Vite plugin for Foldkit hot module reloading with state preservation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -16,7 +16,7 @@
16
16
  "dist"
17
17
  ],
18
18
  "peerDependencies": {
19
- "effect": "^3.18.2",
19
+ "effect": "4.0.0-beta.59",
20
20
  "foldkit": "^0",
21
21
  "vite": "^7.0.0"
22
22
  },
@@ -25,10 +25,10 @@
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/ws": "^8.5.13",
28
- "effect": "^3.19.19",
28
+ "effect": "4.0.0-beta.59",
29
29
  "typescript": "^6.0.2",
30
30
  "vite": "^7.3.1",
31
- "foldkit": "0.81.1"
31
+ "foldkit": "0.82.8"
32
32
  },
33
33
  "keywords": [
34
34
  "vite",