콘텐츠로 이동

파이프라인 개요

pnpm codegen이 codegen/src/index.ts를 실행하며, 전체 파이프라인은 다음과 같습니다:

package.json 버전 번호
│
▼
loadTokenFiles() tokens/*.json 적재, Ajv 구조 검증, flatten 평탄화
│ LoadedTokenFile[] 반환(파일마다 namespace / isDark / flat 포함)
▼
resolveTokens() ref 해석(순환 감지 포함) + 다크 병합
│ { tokenSet, orphanDarkPaths, refMap } 반환
▼
loadSpecs() specs/*.json 적재(schema 검증)
loadCases() cases/*.json 적재(schema 검증)
│
▼
CodegenInput 조립 { tokens: tokenSet, specs, cases, version }
│
▼
dist/ 전체를 삭제하고 재구축
│
▼
5개 target을 순서대로 실행 ──► android → ios → harmony → c → docs
│ 각 target.generate(input)이 GeneratedFile[] 반환
▼
dist/<outDir>/<relativePath>에 파일별로 저장
상수 값
ROOT 리포지터리 루트(import.meta.dirname의 두 단계 위)
DIST <ROOT>/dist
targets [androidTarget, iosTarget, harmonyTarget, cTarget, docsTarget], 순서 고정
function main(): void

유일한 진입점입니다(index.ts는 어떤 실체도 내보내지 않고, main()은 내부 함수이며 파일 끝에서 직접 호출). 단계:

  1. readVersion()이 package.json의 버전 번호를 읽음
  2. loadTokenFiles()가 토큰을 적재
  3. resolveTokens(files)가 해석하고, tokenSet을 취함
  4. loadSpecs() / loadCases()가 계약과 케이스를 적재
  5. CodegenInput을 조립
  6. existsSync(DIST)일 때 rmSync(DIST, { recursive: true }) — 삭제 후 재구축, 산출물에 잔여물이 없도록 보장
  7. target마다 generate(input)을 호출해 dist/<outDir>/<relativePath>로 파일을 쓰고, 산출물마다 [target] path 로그를 출력
  8. 마지막 줄에 target 수, 파일 수, 버전을 집계

파일 머리 주석이 레드라인 1을 명시합니다: 토큰 골격만 생성하고 어떤 UI 구현도 생성하지 않습니다.

핵심 인터페이스(codegen/src/types.ts)

섹션 제목: “핵심 인터페이스(codegen/src/types.ts)”

아래는 파이프라인에서 가장 자주 쓰이는 네 인터페이스입니다. 내보내지는 16개 타입 전체의 완전한 참조는 타입 정의 types.ts를 참고하세요.

interface CodegenTarget {
name: string // 로그 접두사, 예: 'android'
outDir: string // dist 아래의 서브디렉터리 이름, 예: 'android'
generate(input: CodegenInput): GeneratedFile[]
}

각 플랫폼 target이 이 인터페이스를 구현합니다. 새 플랫폼의 추가 = target을 하나 추가해 targets 배열에 넣는 것입니다.

interface CodegenInput {
tokens: TokenSet // 해석된 라이트 토큰 집합 + 다크 덮어쓰기
specs: ComponentSpec[] // 현재 어떤 target도 소비하지 않음(향후 컴포넌트 문서/테스트 생성을 위해 예약)
cases: ComponentCases[] // 같음
version: string // package.json 버전 번호, 각 산출물의 머리 주석에 기록
}
interface GeneratedFile {
relativePath: string // dist/<outDir>/에 대한 상대 출력 경로
content: string
}
interface TokenSet {
tokens: ResolvedToken[] // 라이트 토큰(path 사전순)
byPath: Map<string, ResolvedToken> // 경로로 빠른 검색
dark: DarkOverrides // path -> 다크 덮어쓰기 값
}
target 파일 수
android 2(LhTokens.kt + LhDarkTokens.kt)
ios 2~3(shadow 토큰이 있을 때 LhShadow.swift 추가)
harmony 2~3(LhShadow.ets 추가)
c 2
docs 3

ios / harmony의 그림자 파일은 shadow 토큰이 있을 때만 생성되므로, 총 파일 수는 토큰 내용에 따라 달라지며 dist/의 실제 산출물을 기준으로 합니다.

모듈 역할
load.ts 적재와 구조 검증
resolve.ts 참조 해석과 다크 병합
format.ts 중성값 파싱과 플랫폼 포맷팅
tree.ts 평면에서 중첩으로
render.ts 템플릿 렌더링
types.ts 전체 타입 정의
targets/ 다섯 플랫폼 target
templates/ 7개 handlebars 템플릿

Copyright © 2024-2026 FengMo WenXue