@nine-lab/nine-mu 0.1.335 → 0.1.337

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nine-lab/nine-mu",
3
- "version": "0.1.335",
3
+ "version": "0.1.337",
4
4
  "description": "AI-Driven Full-Stack Code Fabrication Engine",
5
5
  "type": "module",
6
6
  "main": "./dist/nine-mu.umd.js",
@@ -943,7 +943,7 @@
943
943
  }
944
944
 
945
945
  :host(nine-exception-hook) {
946
- display: block;
946
+ display: flex;
947
947
  width: 100%;
948
948
  height: 100%;
949
949
  color: inherit;
@@ -11,11 +11,10 @@ export class ExceptionHook extends HTMLElement {
11
11
  this.attachShadow({ mode: 'open' });
12
12
  }
13
13
 
14
+ // src/components/exception/ExceptionHook.js 내부 수정
15
+
14
16
  connectedCallback() {
15
- // 기본 스켈레톤 마크업 렌더링
16
17
  this.#renderer();
17
-
18
- // 정적 외부 스타일시트 링크 안전하게 결합
19
18
  this.#injectShadowStylesheet();
20
19
 
21
20
  window.addEventListener('error', this.#handleRuntimeError, true);
@@ -31,6 +30,7 @@ export class ExceptionHook extends HTMLElement {
31
30
  document.removeEventListener('click', this.#handleLocationChange, true);
32
31
  }
33
32
 
33
+
34
34
  #renderer = () => {
35
35
  const customImport = nine.cssPath ? `@import "${nine.cssPath}/nine-mu.css";` : "";
36
36
 
@@ -60,14 +60,32 @@ export class ExceptionHook extends HTMLElement {
60
60
  #handleRuntimeError = (event) => {
61
61
  if (this.#hasError) return;
62
62
 
63
- if (this.contains(event.target) || event.error) {
64
- this.#renderError(event.error?.message || event.message, event.error?.stack);
63
+ // 1. 에러 메시지 추출 (event 객체 자체 또는 event.error에서 타겟팅)
64
+ const errorMessage = event.error?.message || event.message || String(event);
65
+ const errorStack = event.error?.stack || "No stack trace available";
66
+
67
+ // 2. 개발 환경(Vite, Webpack) 및 리액트 특유의 무조건적인 전역 에러 전파 캐치
68
+ // 리액트 에러는 보통 전역 window로 던져지므로, 이 훅이 떠 있는 상태라면 그냥 가차없이 잡아야 합니다.
69
+ if (errorMessage) {
70
+
71
+ // 3. 리액트가 에러 때문에 <slot> 내부 DOM을 통째로 Unmount(파괴)해버리는 것을 방지하기 위해
72
+ // 브라우저 버블링을 즉시 차단하고, 에러 보드를 즉각 그리도록 순서를 가로챕니다.
73
+ this.#renderError(errorMessage, errorStack);
74
+
75
+ // 필요시 브라우저 기본 빨간 에러창(Vite Overlay 등) 억제 원할 때 활성화
76
+ // event.preventDefault();
65
77
  }
66
78
  }
67
79
 
68
80
  #handlePromiseError = (event) => {
69
81
  if (this.#hasError) return;
70
- this.#renderError(event.reason?.message || String(event.reason), event.reason?.stack);
82
+
83
+ // 비동기 훅(useEffect 안의 null.data 같은 Promise 거부) 에러 캐치
84
+ const reason = event.reason;
85
+ const errorMessage = reason?.message || String(reason || "Unhandled Promise Rejection");
86
+ const errorStack = reason?.stack || "No stack trace available";
87
+
88
+ this.#renderError(errorMessage, errorStack);
71
89
  }
72
90
 
73
91
  #handleLocationChange = () => {