@nine-lab/nine-mu 0.1.286 β†’ 0.1.288

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.286",
3
+ "version": "0.1.288",
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,18 +95,17 @@ export class NineDiffPopup extends HTMLElement {
95
95
  }
96
96
 
97
97
  /**
98
- * πŸ’‘ [100% 동적 λΉŒλ”© μ‹œμŠ€ν…œ]
99
- * λ“€μ–΄μ˜¨ 데이터 κ°œμˆ˜μ— μ •ν™•νžˆ λ§žμΆ”μ–΄ λŸ°νƒ€μž„μ— νƒ­ νŽ˜μ΄μ§€μ™€ 에디터λ₯Ό μΌλŒ€μΌ λ§€ν•‘μœΌλ‘œ 직접 μ‘°λ¦½ν•©λ‹ˆλ‹€.
100
- * @param {Array} fileList - [{ layer: "MyBatis", full_path: "...", asis_source: "...", source: "..." }]
98
+ * πŸ’‘ [정석 데이터 μœ„μž„ 연동 μ—”μ§„]
101
99
  */
102
100
  async data(fileList) {
103
101
  if (!Array.isArray(fileList) || fileList.length === 0) return this;
104
102
  this.#fileList = fileList;
105
103
 
106
- // 1. 🧼 이전 μ‹€ν–‰ 흔적이 μžˆλ‹€λ©΄ 동적 컨텐츠 λ‚΄λΆ€λ₯Ό μ™„μ „νžˆ μ²­μ†Œ (인덱슀 리셋)
107
- this.#tabContainer.innerHTML = "";
104
+ // 1. 🧼 κΈ°μ‘΄ 동적 버퍼 μ™„μ „ 리셋
105
+ if (this.#tabContainer && typeof this.#tabContainer.clearTabs === 'function') {
106
+ this.#tabContainer.clearTabs();
107
+ }
108
108
 
109
- // ν™•μž₯자 기반 주석/μ–Έμ–΄ μœ μΆ” 헬퍼
110
109
  const detectLanguage = (path) => {
111
110
  const lower = (path || "").toLowerCase();
112
111
  if (lower.endsWith('.xml')) return 'xml';
@@ -115,49 +114,40 @@ export class NineDiffPopup extends HTMLElement {
115
114
  return 'javascript';
116
115
  };
117
116
 
118
- // 2. ⚑ μˆ˜μ‹ λœ 파일 갯수만큼 루프λ₯Ό 돌며 ν•„μš”ν•œ μš”μ†Œλ§Œ μ •ν™•νžˆ DOM 생성(Injection)
117
+ // 2. ⚑ λ°±μ—”λ“œ 쑰립 데이터λ₯Ό μˆœνšŒν•˜λ©° νƒ­ μŠ€μΌ€ν΄λ”© λΉŒλ“œ
119
118
  fileList.forEach((file) => {
120
119
  const { layer, full_path } = file;
121
- const lang = detectLanguage(full_path);
122
120
  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);
128
-
129
- // B. 높이 μœ μ‹€ λ°©μ–΄μš© 래퍼 생성
130
- const diffWrapper = document.createElement('div');
131
- diffWrapper.className = 'diff-wrapper';
121
+ const captionName = `${layer.toUpperCase()} (${fileName})`;
132
122
 
133
- // C. <nine-diff> 에디터 μž₯치 동적 생성 및 맀칭용 λ ˆμ΄μ–΄ 클래슀 μ£Όμž…
134
- const diffView = document.createElement('nine-diff');
135
- diffView.className = layer; // 예: class="MyBatis" λ˜λŠ” class="JavaScript"
123
+ // πŸ’‘ νƒ­ 내뢀에 μ£Όμž…λ  에디터 λΌˆλŒ€ λ§ˆν¬μ—… μ€€λΉ„
124
+ const targetHtmlContent = `
125
+ <div class="diff-wrapper">
126
+ <nine-diff class="${layer}"></nine-diff>
127
+ </div>
128
+ `;
136
129
 
137
- // D. ν•˜μœ„ 트리 계측 κ²°ν•© 및 μ‹€μ œ νƒ­ μ»¨ν…Œμ΄λ„ˆ λ ˆμ΄μ•„μ›ƒμ— μ•ˆμ°©
138
- diffWrapper.appendChild(diffView);
139
- tabPage.appendChild(diffWrapper);
140
- this.#tabContainer.appendChild(tabPage);
130
+ if (this.#tabContainer && typeof this.#tabContainer.addTabPage === 'function') {
131
+ this.#tabContainer.addTabPage(captionName, targetHtmlContent);
132
+ }
141
133
  });
142
134
 
143
- // 3. ⏰ λΈŒλΌμš°μ €κ°€ λ™μ μœΌλ‘œ μΆ”κ°€λœ νƒœκ·Έλ“€μ„ μ™„λ²½ν•˜κ²Œ λ Œλ”νŠΈλ¦¬μ— λ§ˆμš΄νŠΈν•  수 μžˆλ„λ‘ 비동기 μ—¬μœ  λ§ˆμ§„ 확보
135
+ // 3. ⏰ [핡심 μˆ˜μ •]: 마운트 μ™„λ£Œ ν›„, nine-tab의 Shadow DOM λ‚΄λΆ€λ‘œ κΉŠμˆ™μ΄ νŒŒκ³ λ“€μ–΄ 에디터λ₯Ό μ…€λ ‰νŒ…ν•©λ‹ˆλ‹€.
144
136
  setTimeout(() => {
145
137
  fileList.forEach((file) => {
146
- const { layer, asis_source, source } = file;
147
- const diff = this.shadowRoot.querySelector(`nine-diff.${layer}`);
138
+ const { layer, full_path, asis_source, source } = file;
139
+
140
+ // 🎯 λ³€κ²½ 포인트: λ Œλ”λ§ 결과물은 nine-tab μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€ μ„€λ„μš° 루트 μ•ˆμ— μ•ˆμ°©ν•΄ μžˆμŠ΅λ‹ˆλ‹€!
141
+ const diff = this.#tabContainer.shadowRoot.querySelector(`nine-diff.${layer}`);
148
142
 
149
143
  if (diff) {
150
- const lang = detectLanguage(file.full_path);
151
- // ν™•λ³΄λœ μ‹€μ œ 에디터 버퍼 μž₯μΉ˜μ— μ†ŒμŠ€μ½”λ“œ κ°•μ œ 바인딩 μ΄ˆκΈ°ν™”
144
+ const lang = detectLanguage(full_path);
152
145
  diff.initialize(asis_source || "", source || "", lang);
146
+ } else {
147
+ trace.error(`❌ 에디터 탐색 μ‹€νŒ¨: nine-diff.${layer}`);
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
+ }, 150); // 돔 νŠΈλž˜ν‚Ή μ•ˆμ •μ„±μ„ μœ„ν•΄ λ§ˆμ§„ 확보
161
151
 
162
152
  return this;
163
153
  }
@@ -170,9 +160,9 @@ export class NineDiffPopup extends HTMLElement {
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의 shadowRootλ₯Ό κ²½μœ ν•˜μ—¬ μ΅œμ’… μˆ˜μ •λ³Έ μ†ŒμŠ€λ₯Ό μΊ‘μ²˜ν•©λ‹ˆλ‹€.
165
+ const diff = this.#tabContainer.shadowRoot.querySelector(`nine-diff.${layer}`);
176
166
  const currentContent = diff ? diff.getContents() : asis_source;
177
167
 
178
168
  payloadList.push({
@@ -185,7 +175,6 @@ export class NineDiffPopup extends HTMLElement {
185
175
 
186
176
  try {
187
177
  await api.post(`/nine-mu/source/generateJsonFileBatch`, { fileList: payloadList });
188
-
189
178
  await nine.alert("μš”μ²­ν•˜μ‹  λͺ¨λ“  파일의 μ†ŒμŠ€ λ³€κ²½ 사항이 μ„±κ³΅μ μœΌλ‘œ λ°˜μ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.");
190
179
  this.#dialog.close();
191
180
  } catch (error) {