Repository navigation
Conversation
…nd StyleX imports The generated stylesheet always resolved to an empty module, so Bun.build dropped every style, and the pre-parse gate only accepted import declarations of @devup-ui/react, so files using the alias packages, StyleX, subpaths or re-exports ran the runtime stubs. DevupUI() now serves the complete sheet to the CSS loader after defer(), and the gate reads the real imports with Bun.Transpiler.scanImports. Refs #686 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
… built stylesheets A stylesheet module is built on its first import, and the shared base is read from disk past the plugin, so styles extracted later were missing from webpack and Rsbuild output; Rsbuild also served a module-wide string kept only when it grew. The files the entries reach are now extracted before the build, the base on disk is kept current, and a compilation whose stylesheets changed is run once more, writing only the complete result. Rsbuild serves each stylesheet from the current sheet. Refs #686 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…into feat/deterministic-numbering # Conflicts: # packages/next-plugin/src/loader.ts
…inistic-numbering
…ing order Refs #694 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #694 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
… forwarding alone Refs #694 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Contributor
Changepacks@devup-ui/wasm@1.0.83 → 1.0.84 - bindings/devup-ui-wasm/package.jsonPatch
@devup-ui/bun-plugin@1.0.22 → 1.0.23 - packages/bun-plugin/package.jsonPatch
@devup-ui/components@0.1.60 → 0.1.61 - packages/components/package.jsonPatch
@devup-ui/eslint-plugin@1.0.22 → 1.0.23 - packages/eslint-plugin/package.jsonPatch
@devup-ui/next-plugin@1.0.90 → 1.0.91 - packages/next-plugin/package.jsonPatch
@devup-ui/plugin-utils@1.0.17 → 1.0.18 - packages/plugin-utils/package.jsonPatch
@devup-ui/rsbuild-plugin@1.0.67 → 1.0.68 - packages/rsbuild-plugin/package.jsonPatch
@devup-ui/vite-plugin@1.0.73 → 1.0.74 - packages/vite-plugin/package.jsonPatch
@devup-ui/webpack-plugin@1.0.71 → 1.0.72 - packages/webpack-plugin/package.jsonPatch
|
Codecov Report✅ All modified and coverable lines are covered by tests.
🚀 New features to boost your workflow:
|
Refs #694, #686 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This was referenced Oct 4, 2026
owjs3901
added a commit
that referenced
this pull request
Oct 6, 2026
Resolve packages/next-plugin/src/loader.ts using the #743 integration callback: preserve connection diagnostics/cache eviction and main dependency transport/full WASM. Apply the known coordinator-port test lint repair and add its missing connection-error coverage as a distinct EOF regression so the existing #743 test merges independently; retain main published versions, without numbering/state-writer features. Refs #686 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
owjs3901
added a commit
that referenced
this pull request
Oct 8, 2026
Merge main history while preserving this PR implementation. No manual conflict resolutions.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #694 (G: 처리 순서에 따라 class 이름과 파일 번호가 바뀌는 문제, part 1). 이 PR은 #703, #704, #726을 포함하는 통합 브랜치입니다. #703, #704, #726이 먼저 병합되어야 하며, 병합 후 이 PR의 diff는 G 작업만 남습니다.
요약
class 이름과 파일 번호를 "처음 본 순서"로 매기던 것을 경로 순서로 바꿨습니다. 같은 소스는 어떤 순서로, 몇 개의 워커가 동시에 처리해도 같은 이름을 얻습니다.
include패키지)을 훑어 경로 순으로 번호를 확정합니다(D9 사전 패스). 엔진의 새seedFileMap(files)가 정렬·중복 제거 후 번호를 매깁니다.동작 (이슈 항목별)
src/app만, webpack은src만, rsbuild는 아예 사전 패스가 없었고include패키지는 도착 순서였습니다. 모두 같은collectNumberedFiles(plugin-utils)로include패키지의 소스까지 포함합니다. 각 플러그인이 추출에 넘기는 이름(vite 절대 POSIX, webpack/next cwd 상대 POSIX, rsbuild/bun 절대)으로 번호를 매깁니다. 파일 목록 정렬도localeCompare(로케일 의존) 대신 코드 포인트 순서입니다. vanilla-extract ID에 들어가는 파일 번호도 이 번호를 씁니다.StyleSheet::update_styles가FxHashSet을 해시 순서로 돌며 class 이름을 등록하던 것을, 안정된 키(ExtractStyleValue의Ord)로 정렬한 뒤 등록합니다.exportClassMap/exportFileMap/exportCanonicalMap은 키를 정렬한 canonical JSON입니다.global_styles와constant_exports는 평가기가 실행한 순서(= 소스 순서)로 내보냅니다. 이 순서는 CSS 캐스케이드 의미를 가지므로 정렬하지 않고, 입력이 같으면 같은 순서임을 유지합니다. 코드 변경 없음.Math.random(),Date.now(),new Date(),Date()는 빌드 오류가 됩니다.new Date(0)처럼 고정된 날짜는 그대로 동작합니다.resetBuildState()가 이전 빌드가 엔진에 남긴 prefix, atom hoist, 라우트, 버킷, 이름·번호, 스타일, 모듈 해석기를 지웁니다.beginBuild(plugin-utils)가 이미 실행 중인 다른 빌드가 없을 때만 호출하므로 같은 프로세스의 동시 빌드를 지우지 않습니다. prefix는 값이 없어도 매 설정마다setPrefix(prefix ?? null)로 지정합니다.createStateWriter가 파일별로 직렬화합니다. 새 스냅샷이 들어오면 아직 시작하지 않은 오래된 쓰기는 버리므로 오래된 상태가 마지막에 쓰이지 않습니다(webpack/next 로더, rsbuild, vite). 쓰기가 없을 때는 즉시 시작합니다. 원자적 임시 파일 교체(writeFileAtomically)도 제공하지만, 플러그인 테스트가fs/promises.writeFile호출을 검증하므로 플러그인은 기존writeFile을 주입해 씁니다(직렬화/순서 보장만 적용).generateBundle의 서버importedCss정리는 W17(fix/vite-rsc-shared-css)이 같은 코드를 고치고 있어 이 PR에서는 건드리지 않았습니다. 순서 무관 처리는 그쪽에서 다룹니다.새로 생기는 오류
Math.random(),Date.now(),new Date(),Date()를 읽으면JS execution error: ... gives a different value each build: a stylesheet cannot read it로 보고됩니다. 빌드마다 값이 달라지는 코드라 같은 소스가 다른 CSS를 내는 것을 막습니다.남는 한계
@devup-ui·StyleX·별칭 패키지를 언급하는 파일만 받습니다. 그래도 이전보다 스타일을 내지 않는 파일이 슬롯을 차지할 수 있어, 접두사가 한 글자(26개)를 넘는 시점이 앞당겨질 수 있습니다.src(vite는src/app/lib후보, next는src/app/pages)와include패키지를 봅니다. 그 밖의 경로에서 도착한 파일은 정렬된 번호 뒤에 도착 순서로 번호를 받습니다.component_marker의미는 그대로이며 파일 번호를 쓰므로 이 PR의 번호 확정의 이점을 그대로 받습니다.측정: 사전 패스 비용
apps/landing(소스 138개, 그중 87개가@devup-ui사용)에서collectNumberedFiles+seedFileMap: 7회 중앙값 5.1 ms(스캔 4.9 ms, 번호 확정 0.19 ms). 파일당 약 0.04 ms이므로 1,000개 기준 약 40 ms입니다(이슈 예상 0.2~1초보다 작음, Windows 따뜻한 캐시 기준).검증
cargo fmt,cargo +1.99 clippy --workspace --all-targets -- -D warnings,cargo test --workspace통과 (1.99용 lint 수정 포함)resetBuildState, 비결정 가드next-plugin/src/__tests__/deterministic-numbering.test.ts), writer 순서 보장, 사전 패스와resetBuildState호출 각 플러그인 테스트, vite 사전 패스 테스트bun run build,bun test5510 통과, 커버리지 100%bun lint: 기존 경고 2개 외 없음next-plugin/src/loader.ts충돌은 두 쪽을 모두 유지(의존성 보고 + 연결 오류 처리)했고, #726의 린트 오류 한 건과 커버되지 않던 연결 오류 경로 테스트를 추가했습니다.W30 통합 업데이트: 이 브랜치는
main의a935315c까지 포함합니다 (#747 vinext/RSC CSS 보존 및 #700 버전 업데이트).W30 최종 CI
4f1f953cfb1cf29184f3d66d8152f1857fb89986,main의a935315c까지 포함; MERGEABLE/CLEAN 확인37172517071: success,publish/landing-next-e2e/vinext-rsc-css-e2e/benchmark모두 통과9843/9843), Bun5527통과 / 0 실패, 함수·라인 커버리지 100%2026-10-08 업데이트: main 11790bef를 merge commit으로 병합했습니다; 충돌 파일: 없음; 충돌 없이 자동 병합했고, 이미 포함된 squash 원본은 조상 확인 후 ours 전략으로 중복 적용하지 않았습니다.