Merge branch 'develop'

This commit is contained in:
HeuJung
2026-07-03 10:03:19 +09:00
15 changed files with 28 additions and 32 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
## [7.0.1] - 2026-07-02
## [7.0.1] - 2026-07-03
### Changed
@@ -606,7 +606,7 @@ iteration 내부에서 상태를 관리하는 컴포넌트(Input, Select, TagInp
- id가 없으면 동적으로 행 추가/삭제 시 이전 인스턴스의 내부 상태가 새 인스턴스에 표시될 수 있음
- 특히 내부 상태를 관리하는 컴포넌트(TagInput, Select, Input 등)에서 중요
> **iteration id 표현식 보간** (engine-v1.52.4+): 노드의 최상위 `id` 필드에 쓴 표현식(`id: "item_{{$idx}}"`, `id: "row_{{item.id}}"` 등)은 일반 렌더 경로(DynamicRenderer)에서 iteration 컨텍스트로 보간되어 행마다 고유 DOM id 가 된다. `index_var`(예 `"index_var": "$idx"`) 또는 `item_var` 의 필드를 활용한다. 정적 id 를 iteration 안에 그대로 두면 모든 행이 같은 HTML id 를 갖게 되어 W3C id 유일성을 위반하므로(렌더 누락까지 유발), 반복 항목 노드와 그 자식의 id 는 반드시 동적화한다. 내부 식별(slot 등록·React key)에는 원본 id 가 쓰이므로 보간은 DOM 출력에만 적용된다.
> **iteration id 표현식 보간** (engine-v1.50.0+): 노드의 최상위 `id` 필드에 쓴 표현식(`id: "item_{{$idx}}"`, `id: "row_{{item.id}}"` 등)은 일반 렌더 경로(DynamicRenderer)에서 iteration 컨텍스트로 보간되어 행마다 고유 DOM id 가 된다. `index_var`(예 `"index_var": "$idx"`) 또는 `item_var` 의 필드를 활용한다. 정적 id 를 iteration 안에 그대로 두면 모든 행이 같은 HTML id 를 갖게 되어 W3C id 유일성을 위반하므로(렌더 누락까지 유발), 반복 항목 노드와 그 자식의 id 는 반드시 동적화한다. 내부 식별(slot 등록·React key)에는 원본 id 가 쓰이므로 보간은 DOM 출력에만 적용된다.
---
+1 -1
View File
@@ -4,7 +4,7 @@
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
## [1.0.1] - 2026-07-02
## [1.0.1] - 2026-07-03
### Added
@@ -1,5 +1,5 @@
/**
* loadDevToolsBundle 테스트 — DevTools lazy 번들 로더 (engine-v1.52.0)
* loadDevToolsBundle 테스트 — DevTools lazy 번들 로더 (engine-v1.51.0)
*
* DevTools 디버그 전용 모듈(패널/진단엔진/서버커넥터/스타일추적기)은 별도 번들
* (devtools.min.js)로 분리되어 디버그 모드에서만 <script> 주입으로 로드된다. 본 테스트는
+1 -1
View File
@@ -1,7 +1,7 @@
/**
* devtools-entry.ts — DevTools lazy 번들 진입점
*
* @since engine-v1.52.0
* @since engine-v1.51.0
*
* 개발자 진단도구(DevTools)는 디버그 모드(`G7Config.debug` / 환경설정)를 켰을 때만 쓰인다.
* 그럼에도 메인 코어 번들(`template-engine.min.js`)에 정적 포함되면 모든 사용자가 받고도
@@ -1,6 +1,6 @@
/**
* G7DevToolsCore 런타임 shim — DevTools lazy 번들 전용 (vite.config.devtools.js alias 대상)
* @since engine-v1.52.0
* @since engine-v1.51.0
*
* DevTools 추적 코어는 디버그 무관 항상 필요해 메인 번들에 남는다. 디버그 lazy 번들
* (DevToolsPanel 등)은 이 shim 으로 메인 번들의 단일 인스턴스를 빌려 쓴다(싱글톤 동일성).
@@ -66,7 +66,7 @@ export class IdentityGuardInterceptor {
* 일반 본인인증 실패(본인확인 자체 실패/취소)는 이 플래그를 set 하지 않으므로
* generic 가드 토스트가 그대로 유지된다 — provider 무지식의 범용 신호다.
*
* @since engine-v1.52.2
* @since engine-v1.50.0
*/
private static domainNoticeShown = false;
@@ -97,7 +97,7 @@ export class IdentityGuardInterceptor {
* 안내한 직후 호출한다. 코어 toast 핸들러가 동일 사이클의 generic IDV 가드 토스트를 1회 skip 한다.
* 호출 시점은 항상 코어가 원 428 을 onError 로 흘려보내기 직전(resolveIdentityChallenge 통보 전)이어야 한다.
*
* @since engine-v1.52.2
* @since engine-v1.50.0
*/
static markDomainNoticeShown(): void {
this.domainNoticeShown = true;
@@ -110,7 +110,7 @@ export class IdentityGuardInterceptor {
* true 면 그 토스트를 skip 하고, 플래그는 소비되어 다음 토스트부터는 정상 표출된다.
*
* @returns 직전 challenge 가 도메인 안내를 표출했으면 true (그리고 플래그 해제)
* @since engine-v1.52.2
* @since engine-v1.50.0
*/
static consumeDomainNoticeShown(): boolean {
const shown = this.domainNoticeShown;
+8 -12
View File
@@ -5,18 +5,7 @@
>
> 형식: [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)
## [engine-v1.52.0] - 2026-07-02
### Changed
#### DevTools 번들 분리 (디버그 전용 코드 초기 로드 제거)
- 개발자 진단도구(DevTools)의 디버그 전용 무거운 모듈(패널 UI/진단엔진/서버커넥터/스타일추적기)을 메인 코어 번들에서 분리해 별도 `devtools.min.js` 로 빌드한다. `initDevToolsAPI()` 가 디버그 모드(`isEnabled()`)일 때만 런타임 `<script>` 주입으로 로드한다. 디버그 꺼진 일반 사용자는 이 코드를 받지 않는다. 편집기 분리(engine-v1.51.0)와 합쳐 초기 접속 gzip payload 458KB → 221KB (약 52% 감소).
- `G7CoreGlobals.ts` — `DiagnosticEngine`/`ServerConnector`/`StyleTracker`/`DevToolsPanel` 정적 import 제거. `initDevToolsAPI()` 는 디버그 OFF 시 최소 API 만 노출(번들 미로드), ON 시 `loadDevToolsBundle()`(신규)로 `window.G7Core.__devtools` 를 지연 로드한 뒤 진단/서버덤프/패널을 활성화. `G7DevToolsCore`(추적 코어, 디버그 무관 항상 필요)는 메인 번들에 상주하며 `G7Core.__runtime` 으로 공유.
- `devtools-entry.ts` + `vite.config.devtools.js`(신규) — DevTools 번들 엔트리/빌드. React external → `window.React` 단일 인스턴스, `G7DevToolsCore` 는 shim(`devtools/__runtime-shims/`)으로 메인 번들과 공유(재번들 0바이트, 싱글톤 동일성).
- `core:build` — 엔진 + 편집기 + DevTools 3개 번들 순차 빌드. `--watch` 는 3개 `vite build --watch` 병렬.
## [engine-v1.51.0] - 2026-07-02
## [engine-v1.51.0] - 2026-07-03
### Changed
@@ -29,6 +18,13 @@
- `core:build`(`BuildCoreCommand.php`) — 엔진 번들 + 편집기 번들을 순차 빌드. `--watch` 는 양 번들을 `vite build --watch` 로 병렬 감시.
- 기존 편집기 확장점 stub/큐 핸드셰이크(`initLayoutEditorStub` → `exposeLayoutEditorGlobals`, engine-v1.50.0)가 번들 경계를 넘어 그대로 동작(편집기 로드 시 큐 flush).
#### DevTools 번들 분리 (디버그 전용 코드 초기 로드 제거)
- 개발자 진단도구(DevTools)의 디버그 전용 무거운 모듈(패널 UI/진단엔진/서버커넥터/스타일추적기)을 메인 코어 번들에서 분리해 별도 `devtools.min.js` 로 빌드한다. `initDevToolsAPI()` 가 디버그 모드(`isEnabled()`)일 때만 런타임 `<script>` 주입으로 로드한다. 디버그 꺼진 일반 사용자는 이 코드를 받지 않는다. 레이아웃 편집기 분리와 합쳐 초기 접속 gzip payload 458KB → 221KB (약 52% 감소).
- `G7CoreGlobals.ts` — `DiagnosticEngine`/`ServerConnector`/`StyleTracker`/`DevToolsPanel` 정적 import 제거. `initDevToolsAPI()` 는 디버그 OFF 시 최소 API 만 노출(번들 미로드), ON 시 `loadDevToolsBundle()`(신규)로 `window.G7Core.__devtools` 를 지연 로드한 뒤 진단/서버덤프/패널을 활성화. `G7DevToolsCore`(추적 코어, 디버그 무관 항상 필요)는 메인 번들에 상주하며 `G7Core.__runtime` 으로 공유.
- `devtools-entry.ts` + `vite.config.devtools.js`(신규) — DevTools 번들 엔트리/빌드. React external → `window.React` 단일 인스턴스, `G7DevToolsCore` 는 shim(`devtools/__runtime-shims/`)으로 메인 번들과 공유(재번들 0바이트, 싱글톤 동일성).
- `core:build` — 엔진 + 편집기 + DevTools 3개 번들 순차 빌드. `--watch` 는 3개 `vite build --watch` 병렬.
## [engine-v1.50.0] - 2026-06-29
### Added
@@ -2455,7 +2455,7 @@ const DynamicRenderer: React.FC<DynamicRendererProps> = memo(
}, [resolvedProps]);
/**
* DOM id 표현식 해석 (engine-v1.52.4)
* DOM id 표현식 해석 (engine-v1.50.0)
*
* 노드의 최상위 `id` 필드는 props 가 아니므로 props 바인딩 경로를 타지 않는다.
* iteration 내부에서 `id: "item_{{$idx}}"` 처럼 표현식을 쓰면 각 row 마다
@@ -32,7 +32,7 @@ import { WebSocketManager } from '../websocket/WebSocketManager';
import { G7DevToolsCore } from '../devtools/G7DevToolsCore';
// DiagnosticEngine/ServerConnector/StyleTracker/DevToolsPanel 은 정적 import 하지 않는다 —
// 디버그 전용 무거운 모듈은 별도 lazy 번들(devtools.min.js)로 분리되어 initDevToolsAPI() 가
// isEnabled() 참일 때만 런타임 <script> 주입으로 로드한다. @since engine-v1.52.0
// isEnabled() 참일 때만 런타임 <script> 주입으로 로드한다. @since engine-v1.51.0
import type { DiagnosticCategory } from '../devtools/types';
import {
renderItemChildren,
@@ -804,7 +804,7 @@ function initCoreRuntimeExports(G7Core: any): void {
// 인증/로거
AuthManager,
createLogger,
// DevTools 추적 코어 (디버그 lazy 번들이 패널/진단엔진에서 공유) @since engine-v1.52.0
// DevTools 추적 코어 (디버그 lazy 번들이 패널/진단엔진에서 공유) @since engine-v1.51.0
G7DevToolsCore,
};
@@ -3750,7 +3750,7 @@ export function initDevToolsInterface(): void {
*/
/**
* DevTools 디버그 전용 모듈(패널 UI/진단엔진/서버커넥터/스타일추적기)의 lazy 번들 타입.
* @since engine-v1.52.0
* @since engine-v1.51.0
*/
interface DevToolsBundle {
DiagnosticEngine: any;
@@ -3764,7 +3764,7 @@ let devToolsBundleLoadPromise: Promise<DevToolsBundle> | null = null;
/**
* DevTools lazy 번들(devtools.min.js)을 로드하고 디버그 전용 모듈 4종을 반환한다.
*
* @since engine-v1.52.0
* @since engine-v1.51.0
*
* 디버그 모드에서만 호출된다. 이미 로드됨(멱등)/진행 중(in-flight 병합)/미로드(1회 주입)
* 를 구분한다.
@@ -3858,7 +3858,7 @@ export function initDevToolsAPI(): void {
/**
* 디버그 모드에서 DevTools lazy 번들을 로드하고 전체 API 를 활성화한다.
*
* @since engine-v1.52.0
* @since engine-v1.51.0
*
* @param G7Core - window.G7Core 전역 객체
* @param devToolsCore - G7DevToolsCore 싱글톤 인스턴스
@@ -5,7 +5,7 @@
* 안에서 `id: "item_{{$idx}}"` 처럼 표현식을 쓰면 각 row 마다 고유 DOM id 가 되어야 하지만,
* 보간 없이 출력되면 같은 리터럴이 row 마다 반복되어 W3C HTML id 중복을 유발한다.
*
* engine-v1.52.4 수정: DOM 출력 지점이 effectiveComponentDef.id 를 iteration 컨텍스트로
* engine-v1.50.0 수정: DOM 출력 지점이 effectiveComponentDef.id 를 iteration 컨텍스트로
* 보간한 resolvedComponentId 를 쓴다. slot 등록·React key 등 내부 식별은 원본 id 유지(격리).
*/
@@ -234,7 +234,7 @@ describe('IdentityGuardInterceptor', () => {
});
/**
* 도메인 안내 표출 신호 (engine-v1.52.0) — 부가 목적(성인인증 등) 실패 시 provider 가
* 도메인 안내 표출 신호 (engine-v1.50.0) — 부가 목적(성인인증 등) 실패 시 provider 가
* 고유 안내를 표출했음을 표시하면, 코어 toast 핸들러가 동일 사이클의 generic IDV 가드
* 토스트("본인 확인이 필요합니다") 1건을 skip 한다. 일반 본인인증 실패는 무영향.
*/
@@ -1,5 +1,5 @@
/**
* DevTools — 번들 분리 (lazy/debug 로드) 검증. (engine-v1.52.0)
* DevTools — 번들 분리 (lazy/debug 로드) 검증. (engine-v1.51.0)
*
* 개발자 진단도구(DevTools)는 디버그 모드에서만 쓰이므로 코어 번들에서 분리해 별도
* devtools.min.js 로 빌드하고, `initDevToolsAPI()` 가 `isEnabled()` 참일 때만 런타임
@@ -6,7 +6,7 @@
* reconciliation 이 행을 합쳐 렌더 누락. 슬롯에 주입된 컴포넌트(헤더 통화 셀렉터)도 데스크톱/
* 모바일 SlotContainer 양쪽 마운트 시 정적 root id 중복.
*
* 수정(engine-v1.52.4):
* 수정(engine-v1.50.0):
* - DynamicRenderer 가 id 표현식을 iteration 컨텍스트로 보간(resolvedComponentId).
* - SlotContainer 가 주입 컴포넌트 root id 를 컨테이너 id 로 스코프.
* - 대시보드 반복 목록·게시판/이커머스 위젯 id 동적화.
+1 -1
View File
@@ -3,7 +3,7 @@ import react from '@vitejs/plugin-react';
import path from 'path';
/**
* DevTools lazy 번들 빌드 설정 (engine-v1.52.0)
* DevTools lazy 번들 빌드 설정 (engine-v1.51.0)
*
* 개발자 진단도구(패널 UI/진단엔진/서버커넥터/스타일추적기)는 디버그 모드에서만 쓰이므로
* 메인 코어 번들에서 분리해 별도 `devtools.min.js` 로 빌드한다. `initDevToolsAPI()` 가