@nine-lab/nine-mu 0.1.289 β†’ 0.1.291

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.289",
3
+ "version": "0.1.291",
4
4
  "description": "AI-Driven Full-Stack Code Fabrication Engine",
5
5
  "type": "module",
6
6
  "main": "./dist/nine-mu.umd.js",
@@ -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")}";` : "";
@@ -32,14 +32,16 @@ export class NineDiffPopup extends HTMLElement {
32
32
  </style>
33
33
 
34
34
  <nine-dialog>
35
- <div class="main-layout">
36
- <div class="tab-area">
37
- <nine-tab theme="theme-3"></nine-tab>
38
- </div>
39
- <div class="footer">
40
- <button class="btn btn-cancel">μ·¨μ†Œ</button>
41
- <button class="btn btn-confirm">λͺ¨λ‘ μ €μž₯</button>
42
- </div>
35
+ <nine-tab theme="theme-3">
36
+ <nine-tab-page caption="MYBATIS" id="layer_MyBatis"></nine-tab-page>
37
+ <nine-tab-page caption="SERVICE" id="layer_Service"></nine-tab-page>
38
+ <nine-tab-page caption="CONTROLLER" id="layer_Controller"></nine-tab-page>
39
+ <nine-tab-page caption="JAVASCRIPT" id="layer_JavaScript"></nine-tab-page>
40
+ </nine-tab>
41
+
42
+ <div class="footer">
43
+ <button class="btn btn-cancel">μ·¨μ†Œ</button>
44
+ <button class="btn btn-confirm">λͺ¨λ‘ μ €μž₯</button>
43
45
  </div>
44
46
  </nine-dialog>
45
47
  `;
@@ -57,17 +59,12 @@ export class NineDiffPopup extends HTMLElement {
57
59
  }
58
60
 
59
61
  /**
60
- * πŸ’‘ [정석 데이터 μœ„μž„ 연동 μ—”μ§„]
62
+ * πŸ’‘ [ν‹€ κ³ μ • + 에디터 동적 μΈμŠ€ν„΄μ‹± μ—”μ§„]
61
63
  */
62
64
  async data(fileList) {
63
65
  if (!Array.isArray(fileList) || fileList.length === 0) return this;
64
66
  this.#fileList = fileList;
65
67
 
66
- // 1. 🧼 κΈ°μ‘΄ 동적 버퍼 μ™„μ „ 리셋
67
- if (this.#tabContainer && typeof this.#tabContainer.clearTabs === 'function') {
68
- this.#tabContainer.clearTabs();
69
- }
70
-
71
68
  const detectLanguage = (path) => {
72
69
  const lower = (path || "").toLowerCase();
73
70
  if (lower.endsWith('.xml')) return 'xml';
@@ -76,40 +73,59 @@ export class NineDiffPopup extends HTMLElement {
76
73
  return 'javascript';
77
74
  };
78
75
 
79
- // 2. ⚑ λ°±μ—”λ“œ 쑰립 데이터λ₯Ό μˆœνšŒν•˜λ©° νƒ­ μŠ€μΌ€ν΄λ”© λΉŒλ“œ
80
- fileList.forEach((file) => {
81
- const { layer, full_path } = file;
82
- const fileName = full_path.split('/').pop() || "Unknown";
83
- const captionName = `${layer.toUpperCase()} (${fileName})`;
76
+ // 1. ⏰ nine-tab μ»΄ν¬λ„ŒνŠΈμ˜ μ˜€λ¦¬μ§€λ„ 정적 νŒŒμ‹±(#renderTabs) 연산이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ λ―Έμ„Έν•œ λ§ˆμ§„ 확보
77
+ setTimeout(() => {
78
+ const activeLayers = fileList.map(f => f.layer);
84
79
 
85
- // πŸ’‘ νƒ­ 내뢀에 μ£Όμž…λ  에디터 λΌˆλŒ€ λ§ˆν¬μ—… μ€€λΉ„
86
- const targetHtmlContent = `
87
- <div class="diff-wrapper">
88
- <nine-diff class="${layer}"></nine-diff>
89
- </div>
90
- `;
80
+ // νƒ­ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€ μ„€λ„μš° λ”μœΌλ‘œ 이사 κ°„ μ‹€μ œ νƒ­ νŽ˜μ΄μ§€ λ²„νŠΌκ³Ό 컨텐츠 μ»¨ν…Œμ΄λ„ˆ μ˜μ—­ 확보
81
+ const tabButtons = this.#tabContainer.shadowRoot.querySelectorAll('.tab-button');
91
82
 
92
- if (this.#tabContainer && typeof this.#tabContainer.addTabPage === 'function') {
93
- this.#tabContainer.addTabPage(captionName, targetHtmlContent);
94
- }
95
- });
83
+ // 4λŒ€ κ³ μ • λ ˆμ΄μ–΄ λͺ…μ„Έ μ •μ˜
84
+ const targetLayers = ["MyBatis", "Service", "Controller", "JavaScript"];
96
85
 
97
- // 3. ⏰ [핡심 μˆ˜μ •]: 마운트 μ™„λ£Œ ν›„, nine-tab의 Shadow DOM λ‚΄λΆ€λ‘œ κΉŠμˆ™μ΄ νŒŒκ³ λ“€μ–΄ 에디터λ₯Ό μ…€λ ‰νŒ…ν•©λ‹ˆλ‹€.
98
- setTimeout(() => {
99
- fileList.forEach((file) => {
100
- const { layer, full_path, asis_source, source } = file;
86
+ targetLayers.forEach((layerName, index) => {
87
+ const currentBtn = tabButtons[index];
88
+ // nine-tab λ‚΄λΆ€ μ„€λ„μš° 돔에 μ‘°λ¦½λ˜μ–΄ λŒ€κΈ° 쀑인 μ‹€μ œ νŽ˜μ΄μ§€ λͺΈμ²΄ λ³Έλ¬Έ div
89
+ const pageBody = this.#tabContainer.shadowRoot.getElementById(`content${index}`);
101
90
 
102
- // 🎯 λ³€κ²½ 포인트: λ Œλ”λ§ 결과물은 nine-tab μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€ μ„€λ„μš° 루트 μ•ˆμ— μ•ˆμ°©ν•΄ μžˆμŠ΅λ‹ˆλ‹€!
103
- const diff = this.#tabContainer.shadowRoot.querySelector(`nine-diff.${layer}`);
91
+ if (!pageBody) return;
104
92
 
105
- if (diff) {
106
- const lang = detectLanguage(full_path);
107
- diff.initialize(asis_source || "", source || "", lang);
93
+ // 이번 λ°±μ—”λ“œ μ™„λ£Œ μ‹œκ·Έλ„μ— ν•΄λ‹Ή λ ˆμ΄μ–΄ μˆ˜μ • λͺ…μ„Έκ°€ ν¬ν•¨λ˜μ–΄ μžˆλ‹€λ©΄?
94
+ if (activeLayers.includes(layerName)) {
95
+ const fileData = fileList.find(f => f.layer === layerName);
96
+ const fileName = fileData.full_path.split('/').pop() || "Unknown";
97
+
98
+ // A. 상단 νƒ­ λ²„νŠΌ ν…μŠ€νŠΈλ₯Ό μ‹€μ œ 파일λͺ…μœΌλ‘œ 동적 μ—…λ°μ΄νŠΈ 및 λ…ΈμΆœ
99
+ if (currentBtn) {
100
+ currentBtn.textContent = `${layerName.toUpperCase()} (${fileName})`;
101
+ currentBtn.style.display = "unset";
102
+ }
103
+
104
+ // B. πŸ”₯ [핡심 μˆ˜μ •]: λ‚΄λΆ€ 에디터 슬둯만 λŸ°νƒ€μž„μ— μ‹±μ‹±ν•˜κ²Œ μ™„μ „νžˆ μƒˆλ‘œ κ΅¬μ›Œμ„œ μ£Όμž… (μ§€μ—° 차단)
105
+ pageBody.innerHTML = `<nine-diff class="${layerName}"></nine-diff>`;
106
+
107
+ // C. μƒˆλ‘œ νƒœμ–΄λ‚œ 동적 에디터 단말 μž₯치 μ¦‰μ‹œ μΈν„°νŽ˜μ΄μŠ€ μ΄ˆκΈ°ν™”
108
+ const freshDiff = pageBody.querySelector(`nine-diff.${layerName}`);
109
+ if (freshDiff) {
110
+ const lang = detectLanguage(fileData.full_path);
111
+ freshDiff.initialize(fileData.asis_source || "", fileData.source || "", lang);
112
+ }
108
113
  } else {
109
- trace.error(`❌ 에디터 탐색 μ‹€νŒ¨: nine-diff.${layer}`);
114
+ // 이번 νƒœμŠ€ν¬μ—μ„œ μˆ˜μ •λ˜μ§€ μ•Šμ€ μ œμ™Έ μ˜μ—­μ€ 상단 λ²„νŠΌμ„ hide μ²˜λ¦¬ν•˜μ—¬ κΉ”λ”ν•˜κ²Œ λ§ˆμŠ€ν‚Ή
115
+ if (currentBtn) {
116
+ currentBtn.style.display = "none";
117
+ currentBtn.classList.remove("active");
118
+ }
119
+ pageBody.innerHTML = ""; // 컨텐츠 λ³Έλ¬Έ μ΄ˆκΈ°ν™”
110
120
  }
111
121
  });
112
- }, 150); // 돔 νŠΈλž˜ν‚Ή μ•ˆμ •μ„±μ„ μœ„ν•΄ λ§ˆμ§„ 확보
122
+
123
+ // 2. 동적 에디터 κ°±μ‹  및 λ§ˆμŠ€ν‚Ή μ™„λ£Œ ν›„, 첫 번째 ν™œμ„±ν™”(Visible)된 νƒ­μœΌλ‘œ μžλ™ 클릭 이동
124
+ if (this.#tabContainer && typeof this.#tabContainer.initialize === 'function') {
125
+ this.#tabContainer.initialize();
126
+ }
127
+
128
+ }, 120);
113
129
 
114
130
  return this;
115
131
  }
@@ -123,7 +139,7 @@ export class NineDiffPopup extends HTMLElement {
123
139
  for (const file of this.#fileList) {
124
140
  const { layer, full_path, asis_source } = file;
125
141
 
126
- // 🎯 λ³€κ²½ 포인트: μ €μž₯ μ‹œμ μ—λ„ nine-tab의 shadowRootλ₯Ό κ²½μœ ν•˜μ—¬ μ΅œμ’… μˆ˜μ •λ³Έ μ†ŒμŠ€λ₯Ό μΊ‘μ²˜ν•©λ‹ˆλ‹€.
142
+ // nine-tab λ‚΄λΆ€ μ„€λ„μš° μ˜μ—­ μ•ˆμ—μ„œ 동적 가동 쀑인 에디터 컨텐츠 νƒ€κ²ŸνŒ… 캑처
127
143
  const diff = this.#tabContainer.shadowRoot.querySelector(`nine-diff.${layer}`);
128
144
  const currentContent = diff ? diff.getContents() : asis_source;
129
145