2026-04-12
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
zntc는 거의 하루 내내 Reanimated worklet 변환을 다듬었습니다. 클로저 분석을 어느 시점의 함수 본문으로 할지가 핵심 쟁점이었습니다. 변환 전 원본 본문(#1107), 방문 후 본문(#1127, #1128)을 오간 끝에, ES5 헬퍼가 끼지 않은 방문 전 본문을 쓰고 codegen이 TS·Flow 노드를 걷어 내며 JS 전역 목록을 넓히는 방식으로 정리했습니다(#1134~#1139). 그 사이 scope hoisting rename이 __closure와 worklet 해시 할당에 반영되지 않던 문제(#1111, #1112, #1117), 화살표 함수 worklet에 플러그인이 호출되지 않던 문제(#1119), 클로저 변수 이름의 use-after-free(#1132), dev 모드 크래시를 막는 __stackDetails(#1133)를 고쳤습니다.
이어서 클로저 분석을 화이트리스트 대신 노드 레이아웃 기반 범용 AST walker로 바꾸고(#1162), 중첩 함수·메서드 본문 순회, 메서드 매개변수와 지역 변수 제외, 자기 참조 제외, cover grammar 화살표 매개변수를 처리했습니다(#1155, #1158, #1159, #1163, #1165). 알려진 함수 호출의 인자를 자동으로 worklet으로 만드는 auto-workletization(#1148), 객체 메서드의 worklet directive(#1167), Layout Animation SIGABRT를 일으키던 두 원인 수정(#1172)이 뒤를 이었습니다. 이어 Babel react-native-worklets/plugin의 테스트 169개를 기준선으로 포팅하고(#1174), .withCallback() Layout Animation auto-worklet, getter/setter worklet, __pluginVersion 주입, substituteWebPlatformChecks 옵션, generator/async parity 테스트를 단계별로 병합했습니다(#1175~#1180).
worklet 밖에서는 ES5 클래스 필드 초기화를 super() 호출 직후로 옮기고(#1146), re-export 체인을 거치는 CJS default import를 canonical export 이름으로 해석하게 했으며(#1153), CSS 의존성 갱신과 함께 @emotion/react·Tailwind v4 스모크 테스트를 추가했습니다(#1126). CLAUDE.md는 329줄에서 52줄로 줄였습니다(#1123).
bungae는 worklet 수정이 들어갈 때마다 ZTS 서브모듈을 올렸고, ZTS 네이티브 worklet 변환으로 대체된 reanimated를 Babel 플러그인 감지 대상에서 뺐습니다. RN 프리셋에 빠져 있던 strictExecutionOrder를 넣고, 예제 앱에 Layout Animation 등 worklet parity 데모를 추가했습니다.
공개 커밋 92개, 해당일 생성 또는 병합된 PR 62개를 정리했습니다. PR 생성 62개·병합 60개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/bungae
- example(ExampleApp): add ZTS worklet parity demos (Phase 2/4)
- chore: update ZTS submodule and bun.lock
- chore: ZTS 서브모듈 업데이트 (zig fmt + 이슈 등록)
- chore: ZTS 서브모듈 업데이트 (worklet 테스트 37개 + default param fix)
- chore: ZTS 서브모듈 업데이트 (arrow default param worklet fix)
- chore: ZTS 서브모듈 업데이트 (worklet pre-visit body + expanded JS_GLOBALS)
- chore: ZTS 서브모듈 업데이트 (worklet codegen TS stripping + pre-visit body)
- chore: ZTS 서브모듈 업데이트 (worklet body ES5 lowering skip)
- chore: ZTS 서브모듈 업데이트 (worklet initData pre-visit body fix)
- chore: ZTS 서브모듈 업데이트 (worklet pre-visit body — remote function deadlock fix)
- chore: ZTS 서브모듈 업데이트 (worklet __stackDetails 추가 — dev mode crash fix)
- chore: ZTS 서브모듈 업데이트 (worklet closure name use-after-free fix)
- chore: ZTS 서브모듈 업데이트 (nested closure walk + visitFunction body fix + tests)
- chore: ZTS 서브모듈 업데이트 (function worklet closure ES5 helper fix)
- chore: ZTS 서브모듈 업데이트 (worklet arrow closure ES5 helper fix)
- chore: ZTS 서브모듈 업데이트 (arrow worklet assignment_target_identifier param fix)
- chore: ZTS 서브모듈 업데이트 (worklet 통합 테스트 6개 추가)
- chore: ZTS 서브모듈 업데이트 (dispatchFunctionPlugins 헬퍼 추출 + original_body_idx 수정)
- chore: ZTS 서브모듈 업데이트 (arrow worklet plugin dispatch fix)
- chore: ZTS 서브모듈 업데이트 (worklet __closure scope hoisting rename fix)
- chore: ZTS 서브모듈 업데이트 (unary_expression data.extra 수정)
- chore: ZTS 서브모듈 업데이트 (NAPI closure original body 수정)
- chore: ZTS 서브모듈 업데이트 (worklet symbol_id copy for rename)
- chore: ZTS 서브모듈 업데이트 (worklet scope hoisting rename + edge case tests)
- fix: add strictExecutionOrder to bungae RN preset
- chore: ZTS 서브모듈 업데이트 (ternary data format + edge case tests)
- chore: ZTS 서브모듈 업데이트 (if_statement ternary data format 수정)
- refactor: remove reanimated/worklet from Babel plugin detection
- chore: ZTS 서브모듈 업데이트 (원본 AST closure 분석)
ohah/zntc
- test(worklet): activate generator/async parity tests (Phase 6.3)
- feat(worklet): substituteWebPlatformChecks option (Phase 6.2)
- feat(worklet): inject __pluginVersion property (Phase 6.1)
- fix(worklet): dispatcher body-offset for arrow_function_expression
- feat(worklet): getter/setter worklet via factory body (Babel 호환)
- feat(worklet): Layout Animation auto-worklet via .withCallback()
- test(worklet): port Babel plugin 169 test cases as parity baseline
- refactor(worklet): extract RN bool preset to shared source
- fix(worklet): RN auto-enable + strip directive from method IIFE body
- fix(worklet): skip getter/setter methods in worklet transformation
- feat(worklet): support object method worklet directive (#1143)
- refactor(worklet): unify param collection with collectAllIdentifiers
- fix(worklet): handle cover grammar arrow params in closure analysis
- refactor(worklet): extract walkScopedBody helper for function/arrow/method
- fix(worklet): traverse nested function/arrow bodies for closure capture
- refactor(worklet): generic AST walker for closure analysis using nodeLayout()
- fix(napi): pass func_name to getClosureVars for self-reference exclusion
- refactor(worklet): move self-reference exclusion into collectClosureVars
- fix(worklet): exclude function self-reference from __closure
- fix(worklet): exclude method params and body locals from closure refs
- fix(worklet): fix closure analysis shadowing bug in method traversal
- fix(worklet): traverse object method/getter/setter bodies in closure analysis
- fix(linker): use canonical export name for CJS re-export default resolution
- chore(worklet): clarify dual-strip comment in worklet plugin
- fix(worklet): strip directive from visited body to preserve inner auto-worklet
- fix(worklet): save/restore auto_worklet_next flag to prevent nested call leaking
- feat(worklet): auto-workletization for known function callees
- fix(es5): insert class fields after super() call, before constructor body
- chore: zig fmt
- test(worklet): add comprehensive test coverage for all fixes
- fix(worklet): handle assignment_expression in collectBindingNames
- fix(worklet): use pre-visit body with expanded JS_GLOBALS
- fix(codegen): add Flow expression node stripping alongside TS
- fix(worklet): add TS node stripping to codegen for pre-visit body
- fix(worklet): skip ES5 lowering inside worklet function bodies
- fix(worklet): generate initData code from pre-visit body
- fix(worklet): use pre-visit body for closure analysis and initData code
- fix(worklet): add __stackDetails to prevent dev mode crash
- fix(worklet): dupe closure var names to prevent use-after-free
- test(worklet): add nested function closure analysis tests
- test(worklet): add nested function closure analysis tests
- fix(worklet): walk nested function bodies for closure analysis
- fix(worklet): use post-visit body for function declaration closure analysis
- fix(worklet): use post-visit body for arrow closure analysis
- chore(fmt): zig fmt transformer_test.zig
- chore(fmt): apply oxfmt to bundle-smoke.test.ts
- chore: bump CSS deps + add @emotion/react · tailwind smoke tests
- docs: CLAUDE.md 축약 — CLI 옵션/JS API 예시 제거
- chore: remove duplicate comment and debug print in worklet tests
- fix(worklet): handle assignment_target_identifier in param exclusion
- chore: run zig fmt on 4 files
- test(worklet): add integration tests for worklet transformation
- refactor(worklet): extract dispatchFunctionPlugins helper + fix original_body_idx
- fix(worklet): add plugin dispatch for arrow→function lowering
- refactor(worklet): remove dead guard on ref_idx in buildClosureObject
- fix(worklet): copy symbol_id to __closure identifier for scope hoisting rename
- fix(worklet): unary_expression uses data.extra, not data.unary (#1115)
- fix(napi): use original body/params for closure analysis in serializeFunctionInfo
- fix(worklet): use original binding_identifier span for scope hoisting rename (#1110)
- fix(worklet): use original binding_identifier span for scope hoisting rename (#1110)
- fix(worklet): if_statement/try_statement/for_in use ternary data, not extra
- fix(worklet): if_statement/try_statement/for_in use ternary data, not extra
- refactor(worklet): use original body for closure analysis (Babel-compatible)
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.