7.0.1 릴리즈 산출물 날짜를 2026-07-03 으로 조정하고, 엔진 CHANGELOG 의 engine-v1.52.0(DevTools 번들 분리) 과 engine-v1.51.0 (레이아웃 편집기 번들 분리) 을 단일 engine-v1.51.0 섹션으로 병합. 병합에 따라 DevTools 관련 코드 @since 를 v1.51.0 으로 정정하고, 그 과정에서 발견한 CHANGELOG 부재 유령 버전(v1.52.0/v1.52.2/ v1.52.4) 을 CHANGELOG 정본(engine-v1.50.0) 에 맞춰 정정. 주석/CHANGELOG 문자열 정정만으로 런타임 로직 변경 없음.
65 lines
2.8 KiB
TypeScript
65 lines
2.8 KiB
TypeScript
/**
|
|
* DevTools — 번들 분리 (lazy/debug 로드) 검증. (engine-v1.51.0)
|
|
*
|
|
* 개발자 진단도구(DevTools)는 디버그 모드에서만 쓰이므로 코어 번들에서 분리해 별도
|
|
* devtools.min.js 로 빌드하고, `initDevToolsAPI()` 가 `isEnabled()` 참일 때만 런타임
|
|
* <script> 주입으로 로드한다. 디버그 판정 = `G7Config.debug`(app.debug) 또는 서버 환경설정
|
|
* `settings.advanced.debug_mode` 중 하나라도 참.
|
|
*
|
|
* 검증:
|
|
* - 디버그 상태에 따라 devtools.min.js 로드 여부가 갈린다:
|
|
* · 디버그 OFF → 요청 없음 (초기 접속 payload 에서 DevTools 611KB 소스 제거)
|
|
* · 디버그 ON → 번들 로드 + 패널(#g7-devtools-root) 마운트. React 사본이 둘이면
|
|
* 패널 마운트가 크래시하므로, 마운트 성공이 곧 shim 공유(G7DevToolsCore) + 단일 React 증명.
|
|
*
|
|
* 라이브 서버의 디버그 상태를 강제 전환하지 않고, 실제 상태를 감지해 해당 불변식만 단언한다.
|
|
*
|
|
* @scenario devtools_bundle_split_lazy
|
|
* @effects devtools_bundle_lazy_by_debug_state
|
|
*/
|
|
import { test, expect } from '../../fixtures/auth';
|
|
|
|
type PwPage = import('@playwright/test').Page;
|
|
|
|
const DEVTOOLS_BUNDLE_RE = /devtools\.min\.js/;
|
|
|
|
function collectDevToolsRequests(page: PwPage): string[] {
|
|
const hits: string[] = [];
|
|
page.on('request', (req) => {
|
|
if (DEVTOOLS_BUNDLE_RE.test(req.url())) {
|
|
hits.push(req.url());
|
|
}
|
|
});
|
|
return hits;
|
|
}
|
|
|
|
test.describe('DevTools — 번들 분리 (lazy/debug 로드)', () => {
|
|
test('디버그 상태에 따라 devtools.min.js 로드/미로드가 갈린다', async ({ page }) => {
|
|
const devtoolsRequests = collectDevToolsRequests(page);
|
|
|
|
await page.goto('/');
|
|
await page.waitForLoadState('networkidle', { timeout: 30_000 });
|
|
|
|
// 페이지의 실제 디버그 활성 여부 감지
|
|
const debugEnabled = await page.evaluate(() => {
|
|
try {
|
|
return Boolean((window as any).G7DevTools?.isEnabled?.());
|
|
} catch {
|
|
return false;
|
|
}
|
|
});
|
|
|
|
if (debugEnabled) {
|
|
// 디버그 ON — lazy 번들 로드 + 패널 마운트(단일 React/shim 공유 증명)
|
|
expect(devtoolsRequests.length, '디버그 ON 인데 DevTools 번들 미로드').toBeGreaterThan(0);
|
|
expect(devtoolsRequests[0]).toMatch(DEVTOOLS_BUNDLE_RE);
|
|
// 패널 컨테이너가 DOM 에 마운트됐는지 확인(attached — 접힘 상태라 visible 아님).
|
|
// 마운트 성공 = React 사본 단일 + G7DevToolsCore shim 공유 정상의 증명.
|
|
await page.waitForSelector('#g7-devtools-root', { state: 'attached', timeout: 15_000 });
|
|
} else {
|
|
// 디버그 OFF — 초기 payload 에서 DevTools 번들 제거(회귀 방지 핵심)
|
|
expect(devtoolsRequests, '디버그 OFF 인데 DevTools 번들이 로드됨(회귀)').toEqual([]);
|
|
}
|
|
});
|
|
});
|