@nine-lab/nine-mu 0.1.285 β†’ 0.1.287

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.285",
3
+ "version": "0.1.287",
4
4
  "description": "AI-Driven Full-Stack Code Fabrication Engine",
5
5
  "type": "module",
6
6
  "main": "./dist/nine-mu.umd.js",
@@ -24,7 +24,7 @@
24
24
  "@nine-lab/nine-ai": "*",
25
25
  "@nine-lab/nine-nomenu": "*",
26
26
  "@nine-lab/nine-util": "^0.9.126",
27
- "@nine-lab/nine-ux": "*",
27
+ "@nine-lab/nine-ux": "^0.1.243",
28
28
  "terser": "^5.31.0",
29
29
  "vite": "^6.0.0"
30
30
  },
@@ -19,7 +19,7 @@ export class NineDiffPopup extends HTMLElement {
19
19
  }
20
20
 
21
21
  /**
22
- * πŸ’‘ κΈ°λ³Έ λ‹€μ΄μ–Όλ‘œκ·Έ μ™Έκ³½ ν”„λ ˆμž„λ§Œ μ •μ μœΌλ‘œ μ„ μ–Έ (νƒ­ λ ˆμ΄μ•„μ›ƒμ€ λΉ„μ›Œλ‘ )
22
+ * πŸ’‘ κΈ°λ³Έ λ‹€μ΄μ–Όλ‘œκ·Έ μ™Έκ³½ ν”„λ ˆμž„ 및 μŠ€νƒ€μΌ μŠ€μΌ€ν΄λ”© λ Œλ”λ§
23
23
  */
24
24
  #renderScaffolding() {
25
25
  const customImport = this.getAttribute("css-path") ? `@import "${this.getAttribute("css-path")}";` : "";
@@ -49,9 +49,9 @@ export class NineDiffPopup extends HTMLElement {
49
49
  flex-direction: column;
50
50
  height: 100%;
51
51
  }
52
- /* πŸ’‘ ν•˜μ–—κ²Œ μ•ˆ λ³΄μ΄λŠ” ν˜„μƒμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ 동적 μ‚½μž…λ  에디터 μ˜μ—­μ˜ 높이λ₯Ό ν™•μ‹€νžˆ 보μž₯ */
52
+ /* πŸ’‘ ν•˜μ–—κ²Œ μ•ˆ λ³΄μ΄λŠ” ν˜„μƒμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ 에디터 μ˜μ—­μ˜ 높이λ₯Ό ν™•μ‹€νžˆ 보μž₯ */
53
53
  .diff-wrapper {
54
- height: calc(80vh - 120px);
54
+ height: calc(80vh - 160px);
55
55
  width: 100%;
56
56
  display: block;
57
57
  }
@@ -95,16 +95,17 @@ export class NineDiffPopup extends HTMLElement {
95
95
  }
96
96
 
97
97
  /**
98
- * πŸ’‘ [100% 동적 λΉŒλ”© μ‹œμŠ€ν…œ]
99
- * λ“€μ–΄μ˜¨ 데이터 κ°œμˆ˜μ— μ •ν™•νžˆ λ§žμΆ”μ–΄ λŸ°νƒ€μž„μ— νƒ­ νŽ˜μ΄μ§€μ™€ 에디터λ₯Ό μΌλŒ€μΌ λ§€ν•‘μœΌλ‘œ 직접 μ‘°λ¦½ν•©λ‹ˆλ‹€.
98
+ * πŸ’‘ [정석 데이터 μœ„μž„ 연동 μ—”μ§„]
100
99
  * @param {Array} fileList - [{ layer: "MyBatis", full_path: "...", asis_source: "...", source: "..." }]
101
100
  */
102
101
  async data(fileList) {
103
102
  if (!Array.isArray(fileList) || fileList.length === 0) return this;
104
103
  this.#fileList = fileList;
105
104
 
106
- // 1. 🧼 이전 μ‹€ν–‰ 흔적이 μžˆλ‹€λ©΄ 동적 컨텐츠 λ‚΄λΆ€λ₯Ό μ™„μ „νžˆ μ²­μ†Œ (인덱슀 리셋)
107
- this.#tabContainer.innerHTML = "";
105
+ // 1. 🧼 nine-tab 내뢀에 κ΅¬μΆ•λœ 일괄 μ •ν™” APIλ₯Ό ν˜ΈμΆœν•˜μ—¬ κΈ°μ‘΄ 버퍼 μ™„μ „ 리셋 (React 가상 DOM 좩돌 차단)
106
+ if (this.#tabContainer && typeof this.#tabContainer.clearTabs === 'function') {
107
+ this.#tabContainer.clearTabs();
108
+ }
108
109
 
109
110
  // ν™•μž₯자 기반 주석/μ–Έμ–΄ μœ μΆ” 헬퍼
110
111
  const detectLanguage = (path) => {
@@ -115,64 +116,53 @@ export class NineDiffPopup extends HTMLElement {
115
116
  return 'javascript';
116
117
  };
117
118
 
118
- // 2. ⚑ μˆ˜μ‹ λœ 파일 갯수만큼 루프λ₯Ό 돌며 ν•„μš”ν•œ μš”μ†Œλ§Œ μ •ν™•νžˆ DOM 생성(Injection)
119
+ // 2. ⚑ λ°±μ—”λ“œ 쑰립 μ™„λ£Œ 데이터λ₯Ό μˆœνšŒν•˜λ©° 선언적 μ£Όμž… 기동
119
120
  fileList.forEach((file) => {
120
- const { layer, full_path } = file;
121
- const lang = detectLanguage(full_path);
121
+ const { layer, full_path, asis_source, source } = file;
122
122
  const fileName = full_path.split('/').pop() || "Unknown";
123
- const captionName = `${layer.toUpperCase()} (${fileName})`; // 예: MYBATIS (MemberUsersMapper.xml)
124
-
125
- // A. <nine-tab-page> λŸ°νƒ€μž„ μΈμŠ€ν„΄μ‹±
126
- const tabPage = document.createElement('nine-tab-page');
127
- tabPage.setAttribute('caption', captionName);
123
+ const captionName = `${layer.toUpperCase()} (${fileName})`;
128
124
 
129
- // B. 높이 μœ μ‹€ λ°©μ–΄μš© 래퍼 생성
130
- const diffWrapper = document.createElement('div');
131
- diffWrapper.className = 'diff-wrapper';
132
-
133
- // C. <nine-diff> 에디터 μž₯치 동적 생성 및 맀칭용 λ ˆμ΄μ–΄ 클래슀 μ£Όμž…
134
- const diffView = document.createElement('nine-diff');
135
- diffView.className = layer; // 예: class="MyBatis" λ˜λŠ” class="JavaScript"
125
+ // λ‚΄λΆ€ λž˜νΌμ™€ 에디터 λΌˆλŒ€ λ§ˆν¬μ—… μ€€λΉ„
126
+ const targetHtmlContent = `
127
+ <div class="diff-wrapper">
128
+ <nine-diff class="${layer}"></nine-diff>
129
+ </div>
130
+ `;
136
131
 
137
- // D. ν•˜μœ„ 트리 계측 κ²°ν•© 및 μ‹€μ œ νƒ­ μ»¨ν…Œμ΄λ„ˆ λ ˆμ΄μ•„μ›ƒμ— μ•ˆμ°©
138
- diffWrapper.appendChild(diffView);
139
- tabPage.appendChild(diffWrapper);
140
- this.#tabContainer.appendChild(tabPage);
132
+ // 3. πŸš€ nine-tab ν™•μž₯ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν‘œμ€€ Light DOM νŠΈλ¦¬μ— μ•ˆμ „ν•˜κ²Œ νƒ‘μž¬
133
+ if (this.#tabContainer && typeof this.#tabContainer.addTabPage === 'function') {
134
+ this.#tabContainer.addTabPage(captionName, targetHtmlContent);
135
+ }
141
136
  });
142
137
 
143
- // 3. ⏰ λΈŒλΌμš°μ €κ°€ λ™μ μœΌλ‘œ μΆ”κ°€λœ νƒœκ·Έλ“€μ„ μ™„λ²½ν•˜κ²Œ λ Œλ”νŠΈλ¦¬μ— λ§ˆμš΄νŠΈν•  수 μžˆλ„λ‘ 비동기 μ—¬μœ  λ§ˆμ§„ 확보
138
+ // 4. ⏰ 쑰립 λ¦¬λΉŒλ“œκ°€ λλ‚œ ν›„, μ„€λ„μš° 돔 내에 바인딩 μ™„λ£Œλœ 각 에디터 μž₯μΉ˜λ“€μ— 순수 μ†ŒμŠ€μ½”λ“œ μ£Όμž… μ‹€ν–‰
139
+ // (addTabPage λ‚΄λΆ€μ—μ„œ refresh()와 initialize()κ°€ 돌기 λ•Œλ¬Έμ— λΆ€λ“œλŸ½κ²Œ 돔을 λŒνŒŒν•©λ‹ˆλ‹€)
144
140
  setTimeout(() => {
145
141
  fileList.forEach((file) => {
146
- const { layer, asis_source, source } = file;
147
- const diff = this.shadowRoot.querySelector(`nine-diff.${layer}`);
142
+ const { layer, full_path, asis_source, source } = file;
143
+ const diff = this.shadowRoot.querySelector(`nine-tab`).shadowRoot.querySelector(`nine-diff.${layer}`);
148
144
 
149
145
  if (diff) {
150
- const lang = detectLanguage(file.full_path);
151
- // ν™•λ³΄λœ μ‹€μ œ 에디터 버퍼 μž₯μΉ˜μ— μ†ŒμŠ€μ½”λ“œ κ°•μ œ 바인딩 μ΄ˆκΈ°ν™”
146
+ const lang = detectLanguage(full_path);
152
147
  diff.initialize(asis_source || "", source || "", lang);
153
148
  }
154
149
  });
155
-
156
- // E. 데이터 μ£Όμž…μ΄ λͺ¨λ‘ μ™„λ²½νžˆ λλ‚œ μ‹œμ μ— nine-tab μ»΄ν¬λ„ŒνŠΈμ˜ 가상 λΉŒλ” μ—”μ§„ 트리거!
157
- if (this.#tabContainer && typeof this.#tabContainer.initialize === 'function') {
158
- this.#tabContainer.initialize();
159
- }
160
- }, 150); // 150ms의 λ§ˆμ§„ νƒ€μž„ 적용
150
+ }, 50); // μ•ˆμ „ 마운트λ₯Ό μœ„ν•œ μ΅œμ†Œν•œμ˜ ν‹± λ””λ ˆμ΄μ§• λ§ˆμ§„λ§Œ μœ μ§€
161
151
 
162
152
  return this;
163
153
  }
164
154
 
165
155
  /**
166
- * πŸ’‘ [일괄 물리 μ €μž₯]
156
+ * πŸ’‘ [일괄 물리 파일 λΌμ΄νŒ…]
167
157
  */
168
158
  async #handleConfirmAll() {
169
159
  const payloadList = [];
170
160
 
171
161
  for (const file of this.#fileList) {
172
162
  const { layer, full_path, asis_source } = file;
173
- // 각 λ ˆμ΄μ–΄ 클래슀둜 μ§€μ •ν•΄ λ‘” 동적 에디터λ₯Ό μˆœνšŒν•˜λ©° ν…μŠ€νŠΈ 캑처
174
- const diff = this.shadowRoot.querySelector(`nine-diff.${layer}`);
175
163
 
164
+ // nine-tab의 Shadow DOM 내뢀에 μΊ‘μŠν™”λ˜μ–΄ λ Œλ”λ§λœ 에디터 μΈμŠ€ν„΄μŠ€ νƒ€κ²Ÿ μ…€λ ‰νŒ… 좔적
165
+ const diff = this.shadowRoot.querySelector(`nine-tab`).shadowRoot.querySelector(`nine-diff.${layer}`);
176
166
  const currentContent = diff ? diff.getContents() : asis_source;
177
167
 
178
168
  payloadList.push({