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
- fix: DEV define을 react-native 플랫폼에서만 적용
- fix(bundler): DEV 자동 define + define 치환 타입 수정
- fix(bundler): __esm function 호이스팅 제거 + init_xxx() 주입 + var import (#652)
- fix(linker): __esm 모듈 init_xxx() 호출 주입 + /simplify 반영 (#652)
- feat(emitter): __esm 래퍼 function 선언 호이스팅 (#652)
- ci: Hermes 검증 job 추가 (integration.yml)
- fix(emitter): __export default 예약어 수정 + hermesc CI 스크립트
- refactor(bundler): /simplify 리뷰 반영 + WrapESM 테스트 8개 추가
- feat(bundler): CJS 래핑 모듈의 scope hoisted ESM import 처리 (#645)
- feat(bundler): CJS→WrapESM 참조 변환 + ESM 모듈 CJS codegen (#645)
- feat(bundler): WrapKind.esm + __esm 래퍼 기반 구현 (#645)
- fix(linker): scope hoisted 모듈에도 require_rewrites 맵 구축
- refactor(codegen): require rewrite 로직 공통 헬퍼 추출 + 비관용적 패턴 제거
- fix(codegen): emitImportCJS에서 ESM import→require 변환 시 require_rewrites 맵 미참조
- fix(bundler): esm_with_dynamic_fallback 모듈이 require()로 불릴 때 __commonJS 래핑 누락
- fix(test): TSC contextual typing 3개 테스트 skip 처리
- fix(test): hermesc 바이너리 경로를 플랫폼별로 분기
- revert: helpers.ts 원본 복원 — workspace 루트 실행 문제는 bun 환경 이슈
- fix(test): bundleAndRun에 cwd 전달하여 workspace 환경 격리
- style: zig fmt 적용
- feat(transformer): ES2022 private method (#method) 다운레벨링
- 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에서 <T>() => 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=; 빈 값 출력 수정
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.