Skip to content

fix(extractor): preserve exact literal coercion - #786

Merged
owjs3901 merged 3 commits into
mainfrom
fix/exact-literal-coercion
Oct 18, 2026
Merged

owjs3901 merged 3 commits into
mainfrom
fix/exact-literal-coercion

Conversation

@owjs3901

@owjs3901 owjs3901 commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Refs #686 (W69가 재현한 리터럴 문자열 키 및 단항 숫자 변환 오류의 후속 수정). main의 a26bb579를 실제 두 부모 merge로 반영한 브랜치입니다. #785는 이미 main에 병합되어 선행 PR 의존성은 없습니다.

요약

  • JavaScript 키의 원래 문자열과 CSS 숫자 값 정규화를 분리합니다. 05와 5, 0.50과 0.5가 정적 객체 조회와 생성된 유한 클래스 맵에서 충돌하지 않습니다.
  • 공유 키 reader의 호출부를 확인하고, main에서 새로 추가된 styled 조회 판정과 StyleX 키 그룹 빠른 경로도 같은 정확한 키를 읽도록 연결했습니다.
  • 단독 문자열의 단항 +/-는 JavaScript와 일치함이 증명되는 숫자만 정적으로 처리합니다. Rust 전용 inf/잘못된 대소문자 Infinity 별칭은 잘못된 Infinity가 아니라 NaN이며, 증명하지 못하는 입력은 원래 식을 기존 보수적 경로에 남깁니다.
  • #785의 완전한 cooked 템플릿 및 템플릿 전용 inf guard를 유지합니다. 새 스타일링 런타임, 의존성, 커버리지 제외, 스냅샷 변경은 없습니다. WASM changepack은 Patch입니다.

동작

각각 상태를 초기화한 공개 WASM 프로브의 실제 per-file CSS 결과입니다. 클래스명은 추출 상태에 따라 바뀝니다.

// 입력
<Box color={{ '05': 'red', '5': 'blue' }['05']} />
// 추출
<div className="a-a" />
.a-a{color:red}
// 입력
<Box content={`"value:${+'inf'}"`} />
// 추출
<div className="a-a" />
.a-a{content:"value:NaN"}
  • 동적으로 고르는 객체/StyleX 키도 두 철자를 구분하며 키 호출은 한 번만 실행합니다. StyleX 합성은 기존 D1대로 나중 값이 이깁니다.
  • styled의 조건부 spread는 원래 색과 guard/after 실행 순서를 보존합니다. 네 기존 테스트의 유한/정적 표시자만 정확해진 정적 클래스 경로에 맞췄으며, 색·NaN·부작용 기대값은 바꾸지 않았습니다.
  • 일반 CSS 값은 그대로 최적화됩니다: opacity 문자열 0.50은 .5, Devup padding 문자열 05는 20px입니다. 배열 비정규 인덱스, 미확정 coercion, 메타데이터 및 selector cascade 정책을 넓히지 않습니다.

새로 생기는 오류

새 오류 종류나 형식을 추가하지 않습니다. 정확한 숫자 변환을 증명하지 못한 값은 기존 요소의 CSS 변수 경로를 사용하고, 값을 소유할 요소가 없는 독립 스타일에서는 기존 위치가 있는 빌드 오류 경로를 유지합니다. 효과가 있는 식을 빌드 때 임의 실행하거나 삭제하지 않습니다.

남는 한계

  • 일반 JavaScript 계산 전체를 새 Number 파서로 구현하지 않습니다. 정적 증명이 없는 식은 기존 보수적 처리에 남습니다.
  • imports/fontFaces/selector params의 미확정 구조 입력 누락과 따옴표 안 CSS 문자열 최적화 문제는 승인된 별도 후속 작업(PR2/PR3)입니다. 이 PR에 섞지 않았고 main의 RED 증거를 별도로 보존했습니다.
  • Boa의 signed-inf 변환 자체가 생성 렌더러를 잘못 관측하는 경우를 제품 오류와 분리했습니다. 낮춰진 const 식은 원래 전체 식 보존을 검사하고, 동일한 생성 코드를 실제 Bun/React SSR로 실행해 NaN을 확인합니다. 실제 JSX const의 정적 NaN 검사도 별도로 유지합니다.

검증

  • W69의 증거와 W70의 수정 전 재현을 계승했습니다. 초기 Rust 36 통과/38 실패, 공개 WASM 20개 실패였으며, main 통합 후 새 호출부에서도 Rust 18개 실패와 실제 StyleX SSR 8개 실패를 먼저 확인했습니다.
  • 새 Rust 회귀 147개를 포함한 전체 workspace 5,004 통과/0 실패. 기존 스냅샷 변경 없음.
  • 최신 Rust stable 1.99.1, Bun 1.4.3, 기본 Rust 스택, CARGO_BUILD_JOBS=2. fmt 및 strict clippy 통과. 변경하지 않은 main TypeScript의 기존 ESLint 경고 20개 외 추가 경고 없음.
  • 새 WASM 및 루트 빌드, verify:dist 통과. 실제 공개 WASM + React SSR 118/118 통과(리터럴/변환 64, StyleX/styled 42, 동일한 낮춰진 const 12), 두 CSS 모드 및 반복 추출 결정론 확인.
  • 전체 CI-unset pre-commit hook 통과: 최종 merge hook 647초, Bun 6,032 통과/0 실패, 함수/라인 100%. Windows native job으로 전체 프로세스 트리를 제한했고 빌드/테스트 6 GiB, hook 12 GiB를 적용했습니다. 최종 hook의 raw PeakJobMemoryUsed는 4.16 GiB입니다.
  • Windows 보통 너비 LLVM은 **97.88%(19,028/19,441)**이며 호스트 측 수치를 100%라고 주장하지 않습니다. 최종 기준인 원격 Linux wide-format --fail-under 100은 **100.00%(13,566/13,566)**로 통과했습니다.
  • Rust LSP daemon은 시간 초과로 사용할 수 없었으며 clean 진단으로 보고하지 않습니다. 실제 컴파일러/테스트/strict clippy 검증은 통과했습니다.
  • 독립적인 코드/수동 QA gate review는 APPROVE이며 구현 차단 사항은 없었습니다. Hook이 실행한 테스트 소유 Next 서버의 종료 로그와 실행 후 프로세스 정리도 확인했습니다.

원격 CI 성공: 39115332104, head 60ae848546b7a91d3a2611d372f79a79ef2f93dd. Linux Rust 100.00%(13,566/13,566), Bun 6,032 통과/0 실패, 함수/라인 100%, Bun preload race 별도 회귀 9/9 통과입니다. publish, landing-next-e2e, react-18, vinext-rsc-css-e2e, benchmark 다섯 검증 작업이 모두 성공했습니다. 배포/릴리스 작업은 PR 실행 정책대로 skip이며 PR은 ready/CLEAN 상태입니다.

owjs3901 and others added 3 commits October 17, 2026 23:26
Refs #686

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #686

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #686

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@codecov

codecov Bot commented Oct 18, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

Files with missing lines Coverage Δ
libs/extractor/src/build_time_values.rs 100.00% <100.00%> (ø)
libs/extractor/src/css_utils.rs 100.00% <ø> (ø)
.../extractor/extract_style_from_member_expression.rs 100.00% <ø> (ø)
...extractor/src/extractor/styled_record_selection.rs 100.00% <ø> (ø)
libs/extractor/src/lib.rs 100.00% <ø> (ø)
libs/extractor/src/mutations.rs 100.00% <100.00%> (ø)
libs/extractor/src/utils.rs 100.00% <100.00%> (ø)
libs/extractor/src/visit.rs 100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@owjs3901
owjs3901 merged commit 2e704fe into main Oct 18, 2026
8 checks passed
@owjs3901
owjs3901 deleted the fix/exact-literal-coercion branch October 18, 2026 11:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant