@mandujs/cli 0.18.5 → 0.18.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.
Files changed (2) hide show
  1. package/package.json +2 -2
  2. package/src/commands/dev.ts +69 -37
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mandujs/cli",
3
- "version": "0.18.5",
3
+ "version": "0.18.7",
4
4
  "description": "Agent-Native Fullstack Framework - 에이전트가 코딩해도 아키텍처가 무너지지 않는 개발 OS",
5
5
  "type": "module",
6
6
  "main": "./src/main.ts",
@@ -32,7 +32,7 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@mandujs/core": "^0.18.6",
35
+ "@mandujs/core": "^0.18.18",
36
36
  "@mandujs/ate": "^0.17.0",
37
37
  "cfonts": "^3.3.0"
38
38
  },
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  startServer,
3
3
  startDevBundler,
4
+ buildClientBundles,
4
5
  createHMRServer,
5
6
  needsHydration,
6
7
  loadEnv,
@@ -237,6 +238,40 @@ export async function dev(options: DevOptions = {}): Promise<void> {
237
238
  });
238
239
  }
239
240
 
241
+ if (!hasIslands) {
242
+ // Island 없어도 DevTools 번들은 빌드 (dev 모드에서 _devtools.js 필요)
243
+ await buildClientBundles(manifest, rootDir, { minify: false });
244
+ }
245
+
246
+ // Dev 번들러 콜백 (named 함수로 추출 — 재시작 시 재사용)
247
+ const handleRebuild = (result: { routeId: string; success: boolean; error?: string }) => {
248
+ if (result.success) {
249
+ if (result.routeId === "*") {
250
+ hmrServer?.broadcast({
251
+ type: "reload",
252
+ data: { timestamp: Date.now() },
253
+ });
254
+ } else {
255
+ hmrServer?.broadcast({
256
+ type: "island-update",
257
+ data: { routeId: result.routeId, timestamp: Date.now() },
258
+ });
259
+ }
260
+ } else {
261
+ hmrServer?.broadcast({
262
+ type: "error",
263
+ data: { routeId: result.routeId, message: result.error },
264
+ });
265
+ }
266
+ };
267
+
268
+ const handleBundlerError = (error: Error, routeId?: string) => {
269
+ hmrServer?.broadcast({
270
+ type: "error",
271
+ data: { routeId, message: error.message },
272
+ });
273
+ };
274
+
240
275
  if (hasIslands && hmrEnabled) {
241
276
  // HMR 서버 시작
242
277
  hmrServer = createHMRServer(port);
@@ -246,43 +281,40 @@ export async function dev(options: DevOptions = {}): Promise<void> {
246
281
  rootDir,
247
282
  manifest,
248
283
  watchDirs: devConfig.watchDirs,
249
- onRebuild: (result) => {
250
- if (result.success) {
251
- if (result.routeId === "*") {
252
- hmrServer?.broadcast({
253
- type: "reload",
254
- data: {
255
- timestamp: Date.now(),
256
- },
257
- });
258
- } else {
259
- hmrServer?.broadcast({
260
- type: "island-update",
261
- data: {
262
- routeId: result.routeId,
263
- timestamp: Date.now(),
264
- },
265
- });
266
- }
267
- } else {
268
- hmrServer?.broadcast({
269
- type: "error",
270
- data: {
271
- routeId: result.routeId,
272
- message: result.error,
273
- },
274
- });
275
- }
276
- },
277
- onError: (error, routeId) => {
278
- hmrServer?.broadcast({
279
- type: "error",
280
- data: {
281
- routeId,
282
- message: error.message,
283
- },
284
- });
285
- },
284
+ onRebuild: handleRebuild,
285
+ onError: handleBundlerError,
286
+ });
287
+
288
+ // 재시작 핸들러 등록
289
+ hmrServer.setRestartHandler(async () => {
290
+ // 1. 레지스트리 초기화
291
+ clearDefaultRegistry();
292
+ registeredLayouts.clear();
293
+
294
+ // 2. 라우트 재스캔
295
+ const resolved = await resolveManifest(rootDir, { fsRoutes: config.fsRoutes });
296
+ manifest = resolved.manifest;
297
+
298
+ // 3. 핸들러 재등록 (importFresh)
299
+ await registerHandlers(manifest, true);
300
+
301
+ // 4. Dev 번들러 재시작
302
+ devBundler?.close();
303
+ devBundler = await startDevBundler({
304
+ rootDir,
305
+ manifest,
306
+ watchDirs: devConfig.watchDirs,
307
+ onRebuild: handleRebuild,
308
+ onError: handleBundlerError,
309
+ });
310
+
311
+ // 5. 브라우저 전체 리로드
312
+ hmrServer?.broadcast({
313
+ type: "reload",
314
+ data: { timestamp: Date.now() },
315
+ });
316
+
317
+ console.log("✅ Full restart completed");
286
318
  });
287
319
  }
288
320