2026-04-02

날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.

요약 (AI 작성)

zntc는 ES5 다운레벨링 결함을 몰아서 고쳤습니다. ES5 타깃에서 async/await를 generator를 거치지 않고 바로 상태 기계로 바꾸고(#605), 상태 기계 안의 구조 분해 var 호이스팅(#606), 조건식·표현식 안의 yield/await 추출(#607, #608), 클래스 async 메서드(#609), generator for-of(#627), finally 없는 try/catch에서 return await 값이 사라지던 문제(#615), catch 파라미터 호이스팅 누락(#618)을 차례로 수정했습니다. export default class의 빈 출력(#603)과 computed key 표기(#604)도 바로잡았고, ES2022 private method를 WeakSet 기반으로 다운레벨링하는 기능(#640)을 넣었습니다.

React Native 번들 호환도 크게 진척됐습니다. Metro의 플랫폼 확장자 규칙에 맞춘 --rn-platform=ios|android(#616)를 추가했고, Flow 파싱을 import typeof·generic arrow·static variance·const generic·match 식 등으로 넓혀 resolve 모듈 수를 449개에서 577개로 늘렸으며(#617, #620~#624), Flow match 식은 if-else IIFE로 변환합니다(#631). RN ExampleApp 번들을 hermesc로 컴파일해 보는 검증 테스트와 CI job(#629, #651)을 두고, CJS import 별칭 변환, JSX 멤버 태그와 텍스트 줄바꿈, CJS preamble 변수 충돌, export default 자기 참조 재선언을 고쳐 hermesc 에러를 0으로 만들었습니다(#636, #637).

번들러는 esbuild·rolldown과 같은 WrapKind.esm과 __esm 래퍼를 도입해(#646) require로 소비되는 ESM 모듈의 live binding과 지연 초기화를 지원하고, CJS 모듈이 scope hoisting된 ESM을 import할 때까지 require 미변환을 없앴습니다(#647, #648). __esm 안의 함수 선언 호이스팅은 넣었다가 실행 순서 문제로 걷어 내고 init_xxx() 호출 주입으로 정리했으며(#653~#655), react-native 플랫폼에서 __DEV__를 자동 define하도록 했습니다(#656, #657).

suji는 이날 PR 네 개를 main에 병합했습니다. suji:// 사용자 정의 프로토콜과 webview.h 제거·CI 추가(#1), macOS·Linux 크로스 플랫폼 빌드(#2), 파일 감시와 dylib 재적재 기반 백엔드 핫 리로드(#3), libnode를 임베드한 Node.js 백엔드(#4)입니다.

공개 커밋 60개, 해당일 생성 또는 병합된 PR 55개를 정리했습니다. PR 생성 55개·병합 55개는 같은 PR이 양쪽에 포함될 수 있습니다.

커밋

ohah/zntc

PR (해당일 생성/머지)

상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.

저장소PR해당일 활동상태대상 브랜치제목
ohah/suji#4생성 · 병합mergedmainAdd Node.js backend (libnode embedding + IPC)
ohah/suji#3생성 · 병합mergedmainAdd backend hot reload (file watcher + dylib reload)
ohah/suji#2생성 · 병합mergedmainStep 8: Cross-platform build (macOS + Linux)
ohah/suji#1생성 · 병합mergedmainAdd suji:// custom protocol, remove webview.h, add CI
ohah/zntc#657생성 · 병합mergedmainfix: DEV define을 RN에서만 적용 (/simplify)
ohah/zntc#656생성 · 병합mergedmainfix: DEV 자동 define + define boolean 치환 수정
ohah/zntc#655생성 · 병합mergedmainfix(bundler): __esm 호이스팅 제거 + init 주입 + var import — 런타임 에러 3건 해결
ohah/zntc#654생성 · 병합mergedmainfix(linker): __esm init_xxx() 호출 주입 + template 호이스팅 수정
ohah/zntc#653생성 · 병합mergedmainfeat(emitter): __esm 래퍼 function 선언 호이스팅
ohah/zntc#651생성 · 병합mergedmainci: Hermes 검증 job 추가
ohah/zntc#650생성 · 병합mergedmainfix(emitter): __export default 예약어 SyntaxError + hermesc CI
ohah/zntc#649생성 · 병합mergedmainrefactor(bundler): /simplify + WrapESM 테스트 8개 + default 키워드 인용 수정
ohah/zntc#648생성 · 병합mergedmainfeat(bundler): CJS→scope hoisted ESM import 처리 — require 미변환 0개 달성
ohah/zntc#647생성 · 병합mergedmainfeat(bundler): CJS→WrapESM 참조 변환 + ESM 모듈 CJS codegen
ohah/zntc#646생성 · 병합mergedmainfeat(bundler): WrapKind.esm + __esm 래퍼 기반 구현
ohah/zntc#644생성 · 병합mergedmainfix(linker): scope hoisted 모듈의 require() 미변환 + buildRequireRewrites 공통 헬퍼
ohah/zntc#643생성 · 병합mergedmainrefactor(codegen): require rewrite 공통 헬퍼 추출 + 코드 품질 개선
ohah/zntc#642생성 · 병합mergedmainfix(codegen): CJS 래핑 모듈의 ESM import→require 변환 시 require_xxx() 치환 누락
ohah/zntc#641생성 · 병합mergedmainfix(bundler): esm_with_dynamic_fallback 모듈 require 시 __commonJS 래핑 누락
ohah/zntc#640생성 · 병합mergedmainfeat(transformer): ES2022 private method (#method) 다운레벨링
ohah/zntc#639생성 · 병합mergedmainfix(test): ES5 RN 번들 테스트 yield 오탐 수정
ohah/zntc#638생성 · 병합mergedmainrefactor(linker): CJS preamble PreambleWriter 구조체 추출
ohah/zntc#637생성 · 병합mergedmainfix(codegen): export default self-reference 재선언 방지 (hermesc 0 에러)
ohah/zntc#636생성 · 병합mergedmainfix(linker): CJS preamble 변수 scope 충돌 수정 (hermesc 9→1)
ohah/zntc#635생성 · 병합mergedmainrefactor(codegen): emitJSXText 중복 제거
ohah/zntc#634생성 · 병합mergedmainchore(test): hermes-compiler 최신 버전으로 업그레이드
ohah/zntc#633생성 · 병합mergedmainfix(codegen): JSX 텍스트 줄바꿈 이스케이프
ohah/zntc#632생성 · 병합mergedmainrefactor(flow): match 주석 정리 + 통합 테스트
ohah/zntc#631생성 · 병합mergedmainfix(flow): match expression → if-else IIFE 변환
ohah/zntc#630생성 · 병합mergedmainfix(jsx): JSX member expression <Foo.Bar> 파싱
ohah/zntc#629생성 · 병합mergedmaintest(integration): hermesc 구문 검증 테스트 추가
ohah/zntc#628생성 · 병합mergedmaintest(transformer): generator for-of 테스트 보강
ohah/zntc#627생성 · 병합mergedmainfix(transformer): generator for-of yield state machine 변환
ohah/zntc#626생성 · 병합mergedmainrefactor(codegen): emitImportSpecifierRename 헬퍼 추출
ohah/zntc#625생성 · 병합mergedmainfix(codegen): CJS import { X as Y } → { X: Y } 변환
ohah/zntc#624생성 · 병합mergedmainfix(flow): JSX+Flow <T>() => body generic arrow 감지 (에러 0)
ohah/zntc#623생성 · 병합mergedmainfix(flow): nullable return type + ternary typed arrow (에러 41→1)
ohah/zntc#622생성 · 병합mergedmainfix(flow): Babel 방식 paren/function type 파싱 (에러 6→3)
ohah/zntc#621생성 · 병합mergedmainrefactor(flow): parseMatchExpression 중복 제거
ohah/zntc#620생성 · 병합mergedmainfix(flow): RN 호환 Flow 파싱 2차 개선 (에러 146→60)
ohah/zntc#619생성 · 병합mergedmainchore(test): Metro 비교 threshold 100%로 상향
ohah/zntc#618생성 · 병합mergedmainfix(transformer): catch 파라미터 var 호이스팅 누락 수정
ohah/zntc#617생성 · 병합mergedmainfix(flow): RN 호환 Flow 파싱 개선 (449→577 모듈)
ohah/zntc#616생성 · 병합mergedmainfeat(cli): --rn-platform=ios|android 옵션 추가
ohah/zntc#615생성 · 병합mergedmainfix(transformer): ES5 try/catch return await 값 유실 수정
ohah/zntc#612생성 · 병합mergedmaintest(integration): RN ES5 다운레벨링 CI 회귀 테스트 추가
ohah/zntc#611생성 · 병합mergedmaintest(transformer): ES5 async/generator 테스트 커버리지 확대 + do-while yield 수정
ohah/zntc#610생성 · 병합mergedmainfix(transformer,codegen): destructuring default parameter + tryRewriteRequire 크래시 수정
ohah/zntc#609생성 · 병합mergedmainfix(transformer): ES5 class async method가 state machine으로 변환되지 않는 버그 수정
ohah/zntc#608생성 · 병합mergedmainfix(transformer): yield 추출 temp 변수 + member expression 크래시 + expression 핸들러 추가
ohah/zntc#607생성 · 병합mergedmainfix(transformer): state machine에서 조건식/표현식 내부의 yield/await 추출
ohah/zntc#606생성 · 병합mergedmainfix(transformer): generator/async state machine에서 destructuring var 호이스팅 수정
ohah/zntc#605생성 · 병합mergedmainfix(transformer): ES5 타겟에서 async/await → state machine 직접 변환
ohah/zntc#604생성 · 병합mergedmainfix(transformer): ES5 class computed key bracket notation 수정
ohah/zntc#603생성 · 병합mergedmainfix(transformer): export default class + ES5 + CJS에서 빈 값 출력 수정