@mandujs/cli 0.18.6 → 0.18.8

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 +79 -37
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mandujs/cli",
3
- "version": "0.18.6",
3
+ "version": "0.18.8",
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.10",
35
+ "@mandujs/core": "^0.18.20",
36
36
  "@mandujs/ate": "^0.17.0",
37
37
  "cfonts": "^3.3.0"
38
38
  },
@@ -243,6 +243,49 @@ export async function dev(options: DevOptions = {}): Promise<void> {
243
243
  await buildClientBundles(manifest, rootDir, { minify: false });
244
244
  }
245
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
+
275
+ // SSR 파일 변경 콜백 (page.tsx, layout.tsx → 서버 핸들러 재등록 + 브라우저 리로드)
276
+ const handleSSRChange = async (filePath: string) => {
277
+ const timestamp = new Date().toLocaleTimeString();
278
+ console.log(`\n🔄 [${timestamp}] SSR 변경 감지 → 핸들러 재등록`);
279
+ clearDefaultRegistry();
280
+ registeredLayouts.clear();
281
+ await registerHandlers(manifest, true);
282
+ hmrServer?.broadcast({
283
+ type: "reload",
284
+ data: { timestamp: Date.now() },
285
+ });
286
+ console.log(` ✅ SSR 갱신 완료 — 브라우저 리로드`);
287
+ };
288
+
246
289
  if (hasIslands && hmrEnabled) {
247
290
  // HMR 서버 시작
248
291
  hmrServer = createHMRServer(port);
@@ -252,43 +295,42 @@ export async function dev(options: DevOptions = {}): Promise<void> {
252
295
  rootDir,
253
296
  manifest,
254
297
  watchDirs: devConfig.watchDirs,
255
- onRebuild: (result) => {
256
- if (result.success) {
257
- if (result.routeId === "*") {
258
- hmrServer?.broadcast({
259
- type: "reload",
260
- data: {
261
- timestamp: Date.now(),
262
- },
263
- });
264
- } else {
265
- hmrServer?.broadcast({
266
- type: "island-update",
267
- data: {
268
- routeId: result.routeId,
269
- timestamp: Date.now(),
270
- },
271
- });
272
- }
273
- } else {
274
- hmrServer?.broadcast({
275
- type: "error",
276
- data: {
277
- routeId: result.routeId,
278
- message: result.error,
279
- },
280
- });
281
- }
282
- },
283
- onError: (error, routeId) => {
284
- hmrServer?.broadcast({
285
- type: "error",
286
- data: {
287
- routeId,
288
- message: error.message,
289
- },
290
- });
291
- },
298
+ onRebuild: handleRebuild,
299
+ onError: handleBundlerError,
300
+ onSSRChange: handleSSRChange,
301
+ });
302
+
303
+ // 재시작 핸들러 등록
304
+ hmrServer.setRestartHandler(async () => {
305
+ // 1. 레지스트리 초기화
306
+ clearDefaultRegistry();
307
+ registeredLayouts.clear();
308
+
309
+ // 2. 라우트 재스캔
310
+ const resolved = await resolveManifest(rootDir, { fsRoutes: config.fsRoutes });
311
+ manifest = resolved.manifest;
312
+
313
+ // 3. 핸들러 재등록 (importFresh)
314
+ await registerHandlers(manifest, true);
315
+
316
+ // 4. Dev 번들러 재시작
317
+ devBundler?.close();
318
+ devBundler = await startDevBundler({
319
+ rootDir,
320
+ manifest,
321
+ watchDirs: devConfig.watchDirs,
322
+ onRebuild: handleRebuild,
323
+ onError: handleBundlerError,
324
+ onSSRChange: handleSSRChange,
325
+ });
326
+
327
+ // 5. 브라우저 전체 리로드
328
+ hmrServer?.broadcast({
329
+ type: "reload",
330
+ data: { timestamp: Date.now() },
331
+ });
332
+
333
+ console.log("✅ Full restart completed");
292
334
  });
293
335
  }
294
336