2026-04-02
요약 (AI 작성)
ZTS에서 fixpoint 관련 수정과 Producer-Consumer 패턴 전환, jsx-dev 모드 지원 등 핵심 작업을 수행했습니다. RN 호환 Flow 파싱 2차 개선(static variance, const generic, match expression, typed arrow)을 완료하고, Flow match expression을 if-else IIFE로 변환하는 codegen을 구현했습니다. ES5 타겟에서 async/await state machine 직접 변환, class lowering, destructuring 등 대규모 ES5 다운레벨링을 진행하고, --rn-platform=ios|android CLI 옵션을 추가했습니다. Suji에서는 CEF IPC, DevTools, 키보드 단축키, macOS 메뉴바, E2E 테스트 24개, 크로스 플랫폼 빌드, 핫 리로드, Node.js 백엔드, Windows 빌드 지원 등 대규모 기능을 구현했습니다.
커밋
ohah/zts
- fix(test): ES5 RN 번들 테스트 yield 오탐 수정
- refactor(linker): CJS preamble 래퍼를 PreambleWriter 구조체로 추출
- fix(codegen): export default self-reference var 재선언 방지
- fix(linker): CJS preamble 변수 scope 충돌 수정
- refactor(codegen): emitJSXText 중복 제거 — writeJSXTextEscaped 재사용
- chore(test): hermes-compiler 최신 버전 + hermesc threshold 업데이트
- fix(codegen): JSX 텍스트 줄바꿈 이스케이프
- refactor(flow): match 파서 주석 정리 + 통합 테스트 추가
- fix(flow): match expression → if-else IIFE 변환 + JSX member expression
- fix(jsx): JSX member expression 파싱 + flow_match codegen
- test(integration): hermesc 구문 검증 테스트 추가
- test(transformer): generator for-of 테스트 추가 + for-in yield 주석
- fix(transformer): generator for-of yield state machine 변환
- refactor(codegen): emitImportSpecifierRename 헬퍼 추출
- fix(codegen): CJS import destructuring rename as → : 변환
- fix(flow): JSX+Flow에서
() => body generic arrow 감지 - fix(flow): nullable return type + ternary typed arrow 수정
- fix(flow): Babel 방식 paren/function type 파싱 + 테스트 추가
- refactor(flow): parseMatchExpression에 skipBalanced 재사용 + isContextual 패턴
- fix(flow): RN 호환 Flow 파싱 2차 개선 — static variance, const generic, match, typed arrow
- chore(test): Metro 비교 threshold 80% → 100%
- fix(transformer): catch 파라미터 var 호이스팅 누락 수정
- style(flow): is_likely_fn 주석 정리
- refactor(flow): tryParseGenericArrow rollback 중복 제거
- fix(flow): RN 호환 Flow 파싱 개선 — import typeof, generic arrow, function type
- refactor(cli): rn-platform stringToEnum 패턴 + 플랫폼 검증
- refactor(cli): rn-platform 확장자 중복 제거 + 값 검증 추가
- feat(cli): --rn-platform=ios|android 옵션 추가 (#613)
- fix(transformer): ES5 try/catch return await 값 유실 수정 (#614)
- test(integration): RN ES5 CI 회귀 테스트 + ExampleApp 번들 + Metro 비교
- test(transformer): ES5 테스트 커버리지 + do-while yield + JSX closing tag + async runtime 수정
- fix(transformer,codegen): destructuring default parameter + tryRewriteRequire 크래시 수정
- fix(transformer): ES5 class async method + unary/update expression 데이터 레이아웃 수정
- fix(transformer): yield 추출 temp 변수 저장 + member expression 크래시 + expression 핸들러 추가
- fix(transformer): state machine에서 조건식/표현식 내부의 yield/await 추출
- fix(transformer): generator/async state machine에서 destructuring var 호이스팅 수정
- fix(transformer): ES5 타겟에서 async/await → state machine 직접 변환
- fix(transformer): ES5 class lowering에서 computed key를 bracket notation으로 출력
- fix(transformer): export default class + ES5 + CJS에서 module.exports=; 빈 값 출력 수정
- fix(codegen): CJS re-export에서 default 예약어를 식별자로 출력하던 버그 수정
- fix(codegen): destructuring 문자열 키를 bracket notation으로 출력
- fix(codegen): U+2028/U+2029 이스케이프 추가 (/simplify 리뷰)
- fix(codegen): 템플릿 리터럴 → 문자열 연결 변환 시 줄바꿈 이스케이프 누락
- fix: lint/fmt 대상에서 tests/test262 서브모듈 제외
- refactor: 테스트 패키지를 packages/ → tests/로 이동
- refactor: /simplify 리뷰 반영
- style: oxfmt 포맷 적용
- fix(watch): --watch-json 초기 빌드 stdout NDJSON 프로토콜 준수
ohah/suji
- Fix macOS libnode build: use macos-15 runner + Xcode 16.2
- Fix libnode build: add contents:write permission, timeout for Unix build
- Docs: add Node.js backend section to CLAUDE.md
- Fix CI: conditional Node.js compilation (stub when libnode absent)
- Add Windows to libnode build workflow (vcbuild.bat dll)
- Add libnode build workflow + CI download for Node backend
- Add Node.js backend support via libnode embedding
- Simplify + add tests: stack buffer polling, narrower RwLock, 6 new tests
- Fix Windows: avoid std.posix.getenv (unavailable), use hardcoded fallback
- Fix Windows: only define char16_t macro on macOS (uchar.h exists on Linux/Windows)
- Add Windows build support + CI runner
- Simplify: merge duplicate reload functions, fix registering_backend cleanup
- Fix Linux tests: use real directories for inotify addPath tests
- Fix Linux: use raw inotify syscalls instead of std.posix wrappers
- Add backend hot reload: file watcher + dylib reload + RwLock safety
- Update PLAN: mark cross-backend calls done, clarify hot reload scope
- Update docs: Step 8 complete, add cross-platform section
- Fix loader test: accept any error for empty path (OS-dependent behavior)
- Fix Linux: remove parent_view from debug print (macOS-only field)
- Fix Linux: isolate macOS parent_view access via comptime function dispatch
- Fix Linux: use @field for macOS-only parent_view in cef_window_info_t
- Fix Linux: skip char16_t macro define when uchar.h available
- Step 8: Cross-platform build support (macOS + Linux)
- Move state_plugin tests to separate step (requires pre-built dylib)
- Fix CI: ignore missing Resources dir in CEF minimal build
- Fix CI: correct CEF download URL (v146.0.9, macOS arm64)
- Add suji:// custom protocol, remove webview.h dependency, add CI
- Simplify: remove --disable-web-security, APFS clone, hardlink helpers, fix leak
- Add macOS .app bundling (suji build --cef)
- Simplify E2E tests: invoke helper, parameterized tests, timeout fixes
- Add E2E tests: 24 tests via Puppeteer CDP (all pass in 204ms)
- Update PLAN: Step 5 done, merge Step 4 into Step 7 (bundling)
- Add 22 more CEF IPC tests (total 54)
- Restore in-app DevTools with dedicated client, toggle from DevTools window
- DevTools via CDP browser (CEF 144+ macOS in-app DevTools crash)
- Fix DevTools: open via CDP in system browser (ALLOY mode limitation)
- Fix DevTools crash: pass null window_info (Alloy style not supported for DevTools)
- Match Electron menu bar: full View/Edit/Help menus, DevTools toggle fix
- Fix DevTools close killing main app: distinguish main vs DevTools browser
- Full Electron-style macOS menu bar: App, File, Edit, View, Window
- Add Electron-compatible keyboard shortcuts via CefKeyboardHandler
- Add macOS keyboard shortcuts (Cmd+C/V/X/A/Z) via NSMenu Edit menu
- Add CEF IPC tests: jsonToHexEscape (8), chain parsing (2), roundtrip
- Simplify: fix injection, remove dead code, cleanup debug logs
- Fix plugin path: fallback to suji binary-relative plugins/ directory
- Fix CEF IPC: JS-managed Promises, EventBus→renderer push, fanout/core, rpath
- Align CEF JS API with webview ipc.zig: invoke(channel, data, options), emit, chain, fanout, core
- Fix macOS keychain popup: add --use-mock-keychain + ad-hoc codesign
- Add CEF IPC layer (Step 2-3): V8Handler + CefProcessMessage + BackendRegistry bridge