Skip to content

[한만욱] 우아한 테크코스 8기 오픈 미션 제출 #3

Open
manNomi wants to merge 223 commits intowoowa-beforefrom
woowa-after
Open

[한만욱] 우아한 테크코스 8기 오픈 미션 제출 #3
manNomi wants to merge 223 commits intowoowa-beforefrom
woowa-after

Conversation

@manNomi
Copy link
Copy Markdown
Collaborator

@manNomi manNomi commented Nov 24, 2025

🦀 i18nexus-tools: TypeScript → Rust Migration (40% Complete)

📝 Overview

TypeScript/Babel 기반 i18nexus-tools를 Rust/SWC로 마이그레이션을 목표로 잡았습니다.
빌드 타임 성능 최적화와 향후 namespace 자동 분리 기능을 위한 기반 작업입니다.

진행률: ~40% (핵심 변환 로직 완성, AST 노드 교체 및 일부 기능 미완성)


✨ What's Done

🎯 Core Achievements

  • Wtf8Atom → &str 변환 구현: SWC의 특수 문자열 타입을 Rust의 표준 타입으로 변환하는 핵심 로직 완성
  • Deref Coercion 활용: 소스코드 분석을 통해 to_string_lossy() 메서드 발견 및 적용
  • 코드베이스 리팩토링: 500줄 단일 파일 → 모듈별 분리 (ast-helpers, ast-transformers, import-manager)
  • 테스트 전략 개선: 내부 구조 테스트 → E2E 중심 + 핵심 함수 단위 테스트

🔧 Technical Implementation

// Wtf8Atom → &str 변환 예시
let text = str_lit.value.to_string_lossy(); // Deref coercion 활용
let contains_korean = KOREAN_REGEX.is_match(&text);

🚧 What's Not Done Yet

⏳ In Progress

  • 실제 AST 노드 교체 (TemplateLiteral, JSXText)
  • i18n-ignore 주석 처리
  • 이미 래핑된 경우 스킵 기능
  • Namespace 자동 분리 (기획 완료, 구현 대기)

💭 Design Decisions

삭제된 기능:

  • 외부 파일 import 상수 자동 추출 → 복잡도 vs 가치 trade-off로 제거
  • 이유: 재귀적 파일 분석의 성능 저하, 잘못된 추론 가능성

추가 예정 기능:

  • Namespace 자동 분리: 파일 경로 기반 자동 할당 (TanStack Router 영감)
  • 타입 안전성: TypeScript Template Literal Types 활용

📚 Learning Resources

🦀 Rust Practice Projects

새로운 언어를 익숙한 문제로 학습하는 전략을 적용했습니다. 우테코 프리코스 미션을 Rust로 구현하며 소유권 시스템과 에러 핸들링을 체득했습니다.

🔢 Rust Calculator

manNomi/rust-calculator-8

🏎️ Rust Racing Car

manNomi/rust-racingcar-8

📖 Troubleshooting & Deep Dive

Rust로의 마이그레이션 동안 겪었던 문제들과 해결 과정을 정리한 기록입니다.

🔗 Notion Document — RUST i18nexus 마이그레이션 여정

https://second-system-cf4.notion.site/RUST-i18nexus-2a17cf19a36480238fe1e56cee9c02b2

  • Wtf8Atom 변환 3일간의 디버깅
  • 터보팩 소스코드 분석 경험
  • Deref trait 이해 과정
  • TypeScript → Rust 개념 매핑

manNomi and others added 30 commits November 4, 2024 12:00
- Add new `i18n-wrapper-swc` command for high-performance parsing (3-10× faster)
- Keep existing `i18n-wrapper` using Babel (stable, default)
- Add `parser` option to ScriptConfig ('babel' | 'swc')
- Add parseCode() and generateCode() methods for parser abstraction
- Update README and CLI documentation with performance comparison
- Add @babel/parser dependency back for Babel support
- Version 1.7.0: Transition period with both parsers available

Both commands produce identical output - only parsing speed differs.

Usage:
  npx i18n-wrapper      # Babel (default, stable)
  npx i18n-wrapper-swc  # SWC (high-performance)

Performance comparison:
  I18N_PERF_MONITOR=true npx i18n-wrapper
  I18N_PERF_MONITOR=true npx i18n-wrapper-swc
- 외부 상수 분석 기능 제거 (불안전하고 복잡함)
- props 체크 로직 제거
- JSXExpressionContainer MemberExpression 처리 제거
- 성능 측정을 핵심 병목만 측정하도록 간소화
- 성능 리포트 출력 함수 분리
- scripts/t-wrapper.ts를 scripts/t-wrapper/index.ts로 이동
- 내부 import 경로 수정 (상대 경로 조정)
- 동일한 기능 유지하며 모듈 구조 개선
- ScriptConfig에서 constantPatterns 필드 제거
- I18nexusConfig에서 constantPatterns 필드 제거
- CLI 옵션 --constant-patterns/-c 제거
- 관련 문서 및 help 메시지 정리
- scripts/default-config.ts 생성하여 모든 기본 설정 값 중앙 관리
- COMMON_DEFAULTS, GOOGLE_SHEETS_DEFAULTS 등 공통 설정 분리
- ScriptConfig 타입과 SCRIPT_CONFIG_DEFAULTS를 default-config.ts로 이동
- config-loader, extractor, clean-legacy에서 공통 설정 사용하도록 변경
- t-wrapper/index.ts에서 중앙화된 설정 사용
- performance-monitor.ts, performance-reporter.ts, default-config.ts를 scripts/common/으로 이동
- t-wrapper 관련 파일은 t-wrapper 폴더에 유지
- 모든 import 경로 업데이트 (../common/ 경로로 변경)
- 파일 구조 정리로 모듈화 개선
- completion-reporter.ts로 분리
- t-wrapper 전용이므로 같은 폴더에 위치
- translation-wrapper.ts로 클래스 분리
- t-wrapper 전용이므로 같은 폴더에 위치
- index.ts는 re-export만 담당
- PerformanceReporter에 printCompletionReport 메서드 추가
- 제목을 파라미터로 받아 재사용 가능하도록 개선
- completion-reporter.ts 파일 제거
- hasIgnoreComment, shouldSkipPath, isReactComponent, isServerComponent 분리
- 순수 함수로 구성하여 테스트 용이성 향상
- t-wrapper 전용이므로 같은 폴더에 위치
- createUseTranslationHook, addImportIfNeeded 분리
- import-manager.ts로 분리하여 테스트 용이성 향상
- parseFile, generateCode를 common/ast/parser-utils.ts로 분리
- extractor에서도 사용 가능하도록 공통화
- babel/swc 파서 선택 지원
- transformFunctionBody를 ast-transformers.ts로 분리
- StringLiteral, TemplateLiteral, JSXText 변환 로직 분리
- 테스트 용이성 향상
- Jest 설정 추가
- default-config 기본 설정 값 테스트 작성
- 7개 테스트 모두 통과
- parseWithBabel, parseFile 테스트
- generateWithBabel, generateCode 테스트
- 9개 테스트 모두 통과
- deprecated globals 설정을 transform으로 변경
- Jest, ts-jest, @types/jest 설치 확인
- 경고 메시지 제거
- types 필드 중복 제거
- jest 타입 포함하여 테스트 파일 타입 인식 가능하도록 수정
- test-utils.ts는 fs-utils의 단순 래퍼였으므로 제거
- 테스트 파일에서 fs-utils를 직접 사용하도록 변경
- setFile → writeFile로 변경
- runTranslationWrapper의 중복 로직 제거
- 성능 리포트 출력을 processFiles에서 직접 처리
- runTranslationWrapper는 단순 래퍼로 단순화
- processFiles 내부의 개별 파일 에러는 조용히 처리
- runTranslationWrapper의 불필요한 try-catch 제거
- 최상위(CLI)에서만 에러 출력하여 중복 방지
- ScriptConfig, TranslationWrapper re-export 제거
- 모든 파일에서 직접 import하도록 변경
- runTranslationWrapper 제거 및 TranslationWrapper 직접 사용
- Wtf8Atom/Atom을 문자열로 변환하여 한국어 감지
- TemplateLiteral i18next interpolation 형식 변환
- JSXText t() 함수 호출 생성
- rayon-usage.md 문서 제거
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