@nine-lab/nine-mu 0.1.293 β†’ 0.1.295

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.293",
3
+ "version": "0.1.295",
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": "^0.1.243",
27
+ "@nine-lab/nine-ux": "^0.1.244",
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")}";` : "";
@@ -54,13 +54,13 @@ export class NineDiffPopup extends HTMLElement {
54
54
  }
55
55
 
56
56
  /**
57
- * πŸ’‘ [100% 데이터 기반 동적 νƒ­/에디터 λΉŒλ“œ μ—”μ§„]
57
+ * πŸ’‘ [μ›ν”„λ ˆμž„ ν†΅μ§œ 일괄 동적 λΉŒλ“œ μ—”μ§„]
58
58
  */
59
59
  async data(fileList) {
60
60
  if (!Array.isArray(fileList) || fileList.length === 0) return this;
61
61
  this.#fileList = fileList;
62
62
 
63
- // 1. 🧼 μƒˆλ‘œμš΄ 바인딩 μ„Έμ…˜ μ‹œμž‘ μ „ Light DOM μžμ‹ λ…Έλ“œ μ „λŸ‰ μ²­μ†Œ (이전 μž”μƒ 제거)
63
+ // 1. 🧼 이전 μ‹€ν–‰ μ„Έμ…˜ 흔적 κΉ¨λ—ν•˜κ²Œ 포맷
64
64
  if (this.#tabContainer && typeof this.#tabContainer.clearTabs === 'function') {
65
65
  this.#tabContainer.clearTabs();
66
66
  }
@@ -73,40 +73,45 @@ export class NineDiffPopup extends HTMLElement {
73
73
  return 'javascript';
74
74
  };
75
75
 
76
- // 2. ⚑ λ“€μ–΄μ˜¨ 데이터 κ°―μˆ˜μ™€ λ ˆμ΄μ–΄ λͺ…세에 맞좰 <nine-tab-page> ꡬ쑰λ₯Ό μ‘°λ¦½ν•˜μ—¬ λ°€μ–΄ λ„£μŠ΅λ‹ˆλ‹€.
76
+ // 2. ⚑ [핡심 ꡐ정]: appendChild둜 ν•˜λ‚˜μ”© λ°€μ–΄λ„£μ§€ μ•Šκ³ , ν†΅μ§œ λ§ˆν¬μ—… λ¬Έμžμ—΄λ‘œ μ‘°λ¦½ν•©λ‹ˆλ‹€.
77
+ let totalTabHtml = "";
78
+
77
79
  fileList.forEach((file) => {
78
80
  const { layer, full_path } = file;
79
81
  const fileName = full_path.split('/').pop() || "Unknown";
80
82
  const captionName = `${layer.toUpperCase()} (${fileName})`;
81
83
 
82
- // πŸ’‘ 정석 μ»΄ν¬λ„ŒνŠΈ κ·œκ²©μ— λ§žμΆ”μ–΄ νƒœκ·Έ ν…œν”Œλ¦Ώ 슀트링 ν˜•νƒœλ‘œ κ°€κ³΅ν•˜μ—¬ push
83
- const targetHtmlContent = `<nine-diff class="${layer}"></nine-diff>`;
84
-
85
- if (this.#tabContainer && typeof this.#tabContainer.addTabPage === 'function') {
86
- this.#tabContainer.addTabPage(captionName, targetHtmlContent);
87
- }
84
+ totalTabHtml += `
85
+ <nine-tab-page caption="${captionName}">
86
+ <nine-diff class="${layer}"></nine-diff>
87
+ </nine-tab-page>
88
+ `;
88
89
  });
89
90
 
90
- // 3. ⏰ [결정적 타이밍 νŠœλ‹]: nine-tab λ‚΄λΆ€μ—μ„œ refresh() 연산이 λλ‚˜
91
- // 에디터 단말 μž₯μΉ˜λ“€μ΄ μ„€λ„μš° 돔 μ•ˆμ°©μ„ μ™„λ²½ν•˜κ²Œ λλ§ˆμΉ˜λ„λ‘ 더블 ν”„λ ˆμž„ λ§ˆμ§„(requestAnimationFrame) 확보
91
+ // 3. πŸš€ 단 ν•œ 번의 μ—°μ‚°μœΌλ‘œ Light DOM νŠΈλ¦¬μ— μ™„μ „ μŠ› μ£Όμž…!
92
+ this.#tabContainer.innerHTML = totalTabHtml;
93
+
94
+ // 4. βš™οΈ μ£Όμž…μ΄ λλ‚¬μœΌλ―€λ‘œ nine-tab의 μ˜€λ¦¬μ§€λ„ 기동 μ΄ˆκΈ°ν™” 둜직(#init)을 κ°•μ œλ‘œ λ‹€μ‹œ κΉ¨μ›λ‹ˆλ‹€.
95
+ if (this.#tabContainer && typeof this.#tabContainer.connectedCallback === 'function') {
96
+ this.#tabContainer.connectedCallback();
97
+ }
98
+
99
+ // 5. ⏰ λΈŒλΌμš°μ €κ°€ 일괄 μƒμ„±λœ ν•˜μœ„ μ—λ””ν„°λ“€μ˜ ꡬ쑰 해석을 μ™„λ²½νžˆ 마칠 수 μžˆλ„λ‘ 더블 ν”„λ ˆμž„ λ§ˆμ§„ μŠ€μΌ€μ€„λ§
92
100
  requestAnimationFrame(() => {
93
101
  requestAnimationFrame(() => {
94
102
  fileList.forEach((file) => {
95
103
  const { layer, full_path, asis_source, source } = file;
96
104
 
97
- // nine-tab의 shadowRoot λ‚΄λΆ€ κ΄€μ œλ₯Ό 톡해 μ•ˆμ •μ μœΌλ‘œ λΆ„ν•  이사 μ™„λ£Œλœ 에디터 μΈμŠ€ν„΄μŠ€ μ •λ°€ 좔적
105
+ // 이제 정상적인 ν†΅λ‘œ(nine-tab의 shadowRoot λ‚΄λΆ€)둜 μ•ˆμ „ν•˜κ²Œ 이사 κ°„ 에디터 νƒ€κ²ŸνŒ… 좔적
98
106
  const diff = this.#tabContainer.shadowRoot.querySelector(`nine-diff.${layer}`);
99
107
 
100
108
  if (diff && typeof diff.initialize === 'function') {
101
109
  const lang = detectLanguage(full_path);
102
- // 에디터 핡심 λͺ¨λ“ˆ(CodeMirror) 기동 μ‹œκ·Έλ„ 전솑
103
110
  diff.initialize(asis_source || "", source || "", lang);
104
- } else {
105
- trace.error(`❌ 동적 에디터 탐색 μœ μ‹€: nine-diff.${layer}`);
106
111
  }
107
112
  });
108
113
 
109
- // 4. λͺ¨λ“  데이터 λ‘œλ“œκ°€ μ—λŸ¬ 없이 μ™„μ „νžˆ νƒ‘μž¬λœ 것을 ν™•μ •ν•˜κ³  포컀싱 앑츄에이터 μ΅œμ’… 가동!
114
+ // μ†ŒμŠ€ 바인딩이 μ™„λ²½νžˆ λλ‚œ μ΅œμ’… μ‹œμ μ— 포컀싱 앑츄에이터 가동 (첫 번째 동적 νƒ­ 클릭 κ°•μ œ 트리거)
110
115
  if (this.#tabContainer && typeof this.#tabContainer.initialize === 'function') {
111
116
  this.#tabContainer.initialize();
112
117
  }
@@ -117,15 +122,13 @@ export class NineDiffPopup extends HTMLElement {
117
122
  }
118
123
 
119
124
  /**
120
- * πŸ’‘ [일괄 물리 파일 μ €μž₯]
125
+ * πŸ’‘ [일괄 물리 μ €μž₯]
121
126
  */
122
127
  async #handleConfirmAll() {
123
128
  const payloadList = [];
124
129
 
125
130
  for (const file of this.#fileList) {
126
131
  const { layer, full_path, asis_source } = file;
127
-
128
- // 일괄 μˆ˜μ§‘ μ‹œμ μ—λ„ μ•ˆμ „ν•˜κ²Œ nine-tab의 shadowRootλ₯Ό κ΄€ν†΅ν•˜μ—¬ μ΅œμ’… 버퍼 μŠ€μΊ”
129
132
  const diff = this.#tabContainer.shadowRoot.querySelector(`nine-diff.${layer}`);
130
133
  const currentContent = diff ? diff.getContents() : asis_source;
131
134