Skip to content

feat(wasm): bundler build() minimal export + JS bridge round-trip 검증 (#1885 Phase 2 PR 6-2c-1)#1941

Merged
ohah merged 3 commits into
mainfrom
feat/wasm-bundler-build-export-1885
Apr 25, 2026
Merged

feat(wasm): bundler build() minimal export + JS bridge round-trip 검증 (#1885 Phase 2 PR 6-2c-1)#1941
ohah merged 3 commits into
mainfrom
feat/wasm-bundler-build-export-1885

Conversation

@ohah
Copy link
Copy Markdown
Owner

@ohah ohah commented Apr 25, 2026

Summary

Phase 2 핵심 — JS host ↔ WASM bundler 의 `zts_fs` callback round-trip 동작 검증. 실제 `bundler.bundle()` 호출은 PR 6-2c-2.

핵심 검증:
```
VFS.set("/foo.ts", "...")
→ build("/foo.ts")
→ wasm bundler_entry.build()
→ fs.readFile (Zig)
→ zts_fs.readFile callback (JS)
→ VFS.get → packed result
→ wasm → JS decode
→ { code: "..." }
```

변경

`packages/wasm/src/wasm_bundler_entry.zig`

  • `c_allocator` (wasi-musl malloc, thread-safe) — Zig 0.15 `wasm_allocator` 가 multi-threaded 미지원
  • `main()` stub — wasi-musl libc 가 main 심볼 강제
  • `alloc` / `dealloc` export — JS 측 메모리 관리
  • `build(entry_path_ptr, len)` export — `fs.readFile` 통과 echo

`build.zig`

  • `wasm-bundler` 에 `linkLibC()` 추가 (wasi-musl)

`packages/wasm/index.ts`

  • `createWasiImports` 확장 — wasi-musl 의존 fn 풀 stub (args/environ/proc_exit/fd_/path_/sched_yield/poll_oneoff)
  • `BundlerExports` 갱신 + `bundlerMemory` 별도 보관 (`import_memory` 라 `instance.exports.memory` undefined)
  • `initBundler` 가 SharedArrayBuffer 기반 `WebAssembly.Memory` 생성 + `env.memory` import
  • `build()` API — entry path → packed result decode

`packages/wasm/index.test.ts`

  • 통합 테스트 4개: bundlerVersion / build (file 1, file 2) / null

검증

  • `zig build wasm-bundler` 통과 — zts-bundler.wasm 5.5 KB
  • `bun test` 38 통과 (transpile 29 + VFS 5 + Bundler 4)
  • JS bridge round-trip 동작
  • zts_fs.readFile callback 정확히 호출됨

디자인 노트

wasi-musl 의존 이유: Zig 0.15 의 `wasm_allocator` (page_allocator 도 동일) 가 multi-threaded wasm 미지원. `wasm32-wasi-musl` + `linkLibC` 로 thread-safe `malloc` 사용.

WASI shim: bundler 가 wasi-musl libc 의존 → wasi_snapshot_preview1 의 다수 fn 호출. JS 측 stub (대부분 `return 0`) 으로 link 통과. bundler 가 실제 OS 의존 호출 안 한다는 가정.

SharedArrayBuffer: `shared_memory=true` + `import_memory=true` → JS 측이 `WebAssembly.Memory({ shared: true })` 생성, `env.memory` 로 import.

다음 단계

🤖 Generated with Claude Code

…1885 PR 6-2c-1)

Phase 2 핵심 — JS host ↔ WASM bundler 의 zts_fs callback round-trip 동작 검증.
실제 bundler.bundle() 호출은 PR 6-2c-2.

변경:
- packages/wasm/src/wasm_bundler_entry.zig:
  * c_allocator (wasi-musl malloc, thread-safe) — Zig 0.15 wasm_allocator 가
    multi-threaded 미지원
  * main() stub — wasi-musl libc 가 main 심볼 강제
  * alloc/dealloc export — JS 측 메모리 관리
  * build(entry_path_ptr, len) export — fs.readFile 통과 echo (zts_fs 통과)
- build.zig: wasm-bundler 에 linkLibC 추가
- packages/wasm/index.ts:
  * createWasiImports 확장 — wasi-musl 의존 fn 풀 stub (args/environ/proc_exit/
    fd_*/path_*/sched_yield/poll_oneoff)
  * BundlerExports 갱신 (build/alloc/dealloc), bundlerMemory 별도 보관 (import_memory
    라 instance.exports.memory undefined)
  * initBundler 가 SharedArrayBuffer 기반 WebAssembly.Memory 생성 + env.memory import
  * build() API — entry path → packed result decode
- packages/wasm/index.test.ts: 통합 테스트 4개 (bundlerVersion/build/null)

검증:
- zts-bundler.wasm = 5.5 KB
- bun test 38 통과 (transpile 29 + VFS 5 + Bundler 4)
- JS bridge round-trip: VFS.set → build("/foo.ts") → zts_fs.readFile callback → wasm
  → packed result → JS decode

다음:
- PR 6-2c-2: wasm_bundler_entry build() 가 bundler.Bundler.init + bundle() 진짜 호출
- 호환성 검증 — Thread.Pool, fs.zig 의존, 기타 bundler 코드 wasm-musl link

Refs #1885

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ohah ohah added the enhancement New feature or request label Apr 25, 2026
@ohah ohah self-assigned this Apr 25, 2026
ohah and others added 2 commits April 25, 2026 21:27
Bundler (minimal) test 가 zig-out/bin/zts-bundler.wasm 의존 — CI workflow 가
wasm-bundler 빌드 안 해서 ENOENT.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
/simplify 검토 — wasi-musl libc 의 fd_prestat_get / path_* 가 0 (success)
반환 시 gibberish 메모리 read 시도 → panic. EBADF 가 안전한 fallback.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 25, 2026

Smoke Test Results (CI)

Smoke Test Results

Project ZTS Size Time esbuild Size Time rolldown Size Time rspack Size Time Output
lodash-es OK 45KB 20ms OK 64KB 58ms OK 99KB 328ms OK 122KB 115ms MATCH
preact OK 13KB 4ms OK 15KB 8ms OK 13KB 102ms OK 13KB 98ms MATCH
date-fns OK 36KB 15ms OK 47KB 38ms OK 77KB 115ms OK 102KB 139ms MATCH
uuid OK 1.8KB 3ms OK 2.1KB 7ms OK 2.0KB 99ms OK 3.9KB 95ms MATCH
zod OK 105KB 11ms OK 119KB 15ms OK 98KB 106ms OK 147KB 109ms MATCH
axios OK 343KB 18ms FAIL 436KB 30ms OK 399KB 124ms OK 411KB 137ms MATCH
toolkit OK 42KB 10ms OK 51KB 15ms OK 39KB 105ms OK 126KB 113ms MATCH
rxjs OK 324KB 16ms OK 367KB 35ms OK 308KB 130ms OK 325KB 125ms MATCH
immer OK 18KB 5ms OK 22KB 8ms OK 19KB 104ms OK 36KB 103ms MATCH
superjson OK 22KB 5ms OK 26KB 9ms OK 24KB 103ms OK 32KB 99ms MATCH
express OK 781KB 26ms OK 1138KB 49ms OK 908KB 143ms OK 917KB 164ms MATCH
react OK 53KB 7ms OK 64KB 8ms OK 53KB 105ms OK 18KB 94ms MATCH
commander OK 68KB 7ms OK 119KB 10ms OK 100KB 104ms OK 121KB 101ms MATCH
eventemitter3 OK 6.7KB 3ms OK 7.8KB 6ms OK 9.2KB 97ms OK 10KB 98ms MATCH
ms OK 3.6KB 2ms OK 4.3KB 5ms OK 4.0KB 94ms OK 5.0KB 93ms MATCH
dotenv OK 14KB 3ms OK 14KB 7ms OK 12KB 106ms OK 14KB 95ms MATCH
jsonwebtoken OK 115KB 8ms OK 137KB 16ms OK 141KB 112ms OK 159KB 112ms MATCH
bcryptjs OK 33KB 5ms OK 46KB 8ms OK 47KB 107ms OK 60KB 97ms MATCH
clsx OK 0.6KB 2ms OK 0.6KB 5ms OK 0.7KB 94ms OK 1.5KB 94ms MATCH
tiny-invariant OK 0.5KB 2ms OK 0.6KB 5ms OK 0.6KB 98ms OK 1.5KB 96ms MATCH
tanstack-query OK 46KB 5ms OK 57KB 11ms OK 49KB 103ms OK 59KB 106ms MATCH
fast-glob OK 162KB 10ms OK 199KB 19ms OK 187KB 118ms OK 201KB 107ms MATCH
micromatch OK 80KB 7ms OK 100KB 11ms OK 100KB 109ms OK 108KB 100ms MATCH
semver OK 55KB 5ms OK 66KB 11ms OK 52KB 101ms OK 67KB 102ms MATCH
debug OK 20KB 4ms FAIL 25KB 8ms OK 24KB 99ms OK 28KB 96ms MATCH
chalk OK 13KB 3ms OK 15KB 6ms OK 14KB 112ms OK 17KB 97ms MATCH
yaml OK 207KB 12ms OK 261KB 19ms OK 228KB 118ms OK 284KB 110ms MATCH
yargs OK 165KB 11ms OK 185KB 15ms OK 167KB 121ms OK 227KB 113ms MATCH
effect OK 583KB 105ms OK 477KB 147ms OK 368KB 242ms OK 1460KB 218ms MATCH
vue OK 1565KB 69ms OK 2009KB 75ms OK 1606KB 241ms OK 1216KB 159ms MATCH
svelte OK 1.8KB 9ms OK 4.7KB 15ms OK 3.5KB 108ms OK 197KB 116ms MATCH
svelte-mount OK 94KB 16ms OK 113KB 26ms OK 93KB 120ms OK 459KB 144ms MATCH
svelte-mount-min OK 44KB 18ms OK 37KB 27ms OK 28KB 122ms OK 22KB 179ms MATCH
svelte-full OK 100KB 16ms OK 121KB 25ms OK 104KB 123ms OK 462KB 141ms MATCH
svelte-full-min OK 47KB 17ms OK 40KB 28ms OK 30KB 127ms OK 24KB 181ms MATCH
solid-js OK 0.3KB 4ms OK 2.4KB 7ms OK 2.2KB 102ms OK 23KB 98ms MATCH
three OK 243KB 70ms OK 296KB 64ms OK 276KB 157ms OK 1280KB 222ms MATCH
graphql OK 477KB 20ms OK 604KB 31ms OK 547KB 132ms OK 100KB 107ms MATCH
supabase OK 367KB 18ms OK 759KB 30ms OK 706KB 134ms OK 779KB 169ms MATCH
mobx OK 225KB 17ms OK 271KB 22ms OK 234KB 136ms OK 190KB 116ms MATCH
jotai OK 20KB 4ms OK 23KB 7ms OK 20KB 111ms OK 26KB 96ms MATCH
mitt OK 0.5KB 2ms OK 0.6KB 5ms OK 0.7KB 99ms OK 1.5KB 95ms MATCH
zustand OK 1.1KB 2ms OK 1.2KB 5ms OK 1.3KB 99ms OK 2.3KB 97ms MATCH
valtio OK 6.6KB 4ms OK 7.5KB 7ms OK 8.3KB 105ms OK 24KB 97ms MATCH
react-dom OK 1108KB 35ms OK 1355KB 38ms OK 1116KB 173ms OK 534KB 111ms MATCH
d3 OK 108KB 33ms OK 100KB 63ms OK 96KB 145ms OK 150KB 171ms MATCH
hono OK 43KB 6ms OK 59KB 11ms OK 52KB 100ms OK 68KB 108ms MATCH
dayjs OK 11KB 3ms OK 14KB 6ms OK 11KB 105ms OK 8.9KB 96ms MATCH
nanoid OK 0.8KB 2ms OK 0.9KB 5ms OK 0.9KB 94ms OK 2.6KB 95ms MATCH
zlib OK 95KB 11ms OK 112KB 14ms OK 102KB 115ms OK 222KB 113ms MATCH
fp-ts OK 59KB 6ms OK 70KB 12ms OK 100KB 105ms OK 50KB 103ms MATCH
neverthrow OK 13KB 3ms OK 18KB 7ms OK 13KB 103ms OK 19KB 100ms MATCH
drizzle-orm OK 13KB 8ms OK 30KB 24ms OK 14KB 103ms OK 35KB 109ms MATCH
tslib OK 0.7KB 4ms OK 0.8KB 7ms OK 0.8KB 95ms OK 18KB 98ms MATCH
iconv-lite OK 303KB 7ms OK 543KB 13ms OK 319KB 111ms OK 325KB 107ms MATCH
qs OK 77KB 9ms OK 95KB 17ms OK 81KB 108ms OK 92KB 114ms MATCH
change-case OK 3.0KB 3ms OK 3.2KB 6ms OK 3.3KB 106ms OK 8.0KB 98ms MATCH
path-to-regexp OK 12KB 3ms OK 14KB 6ms OK 8.0KB 100ms OK 15KB 94ms MATCH
mime-types OK 178KB 7ms OK 235KB 12ms OK 198KB 113ms OK 164KB 117ms MATCH
ajv OK 210KB 12ms OK 243KB 19ms OK 208KB 119ms OK 239KB 108ms MATCH
cac OK 16KB 4ms OK 18KB 6ms OK 16KB 98ms OK 19KB 101ms MATCH
defu OK 1.9KB 2ms OK 2.1KB 6ms OK 1.8KB 92ms OK 3.0KB 94ms MATCH
pathe OK 3.0KB 4ms OK 3.4KB 7ms OK 3.0KB 101ms OK 13KB 96ms MATCH
destr OK 1.9KB 2ms OK 2.1KB 5ms OK 1.8KB 101ms OK 3.1KB 105ms MATCH
hookable OK 5.3KB 3ms OK 5.9KB 6ms OK 5.2KB 111ms OK 9.3KB 95ms MATCH
minimatch OK 45KB 6ms OK 56KB 10ms OK 47KB 105ms OK 90KB 103ms MATCH
cheerio OK 1634KB 53ms OK 2186KB 77ms OK 1747KB 240ms OK 2387KB 191ms MATCH
is-glob OK 4.9KB 3ms OK 6.4KB 6ms OK 4.9KB 96ms OK 6.0KB 94ms MATCH
glob-parent OK 6.2KB 3ms OK 8.4KB 7ms OK 6.3KB 99ms OK 7.9KB 99ms MATCH
escape-string-regexp OK 0.3KB 2ms OK 0.4KB 6ms OK 0.4KB 106ms OK 1.5KB 110ms MATCH
fast-deep-equal OK 2.4KB 2ms OK 2.9KB 5ms OK 2.3KB 99ms OK 3.2KB 100ms MATCH
deepmerge OK 4.9KB 3ms OK 5.5KB 7ms OK 4.5KB 98ms OK 6.0KB 104ms MATCH
color-convert OK 24KB 5ms OK 30KB 8ms OK 27KB 155ms OK 27KB 103ms MATCH
picomatch OK 47KB 6ms OK 58KB 9ms OK 55KB 112ms OK 61KB 104ms MATCH
type-is OK 186KB 9ms OK 244KB 14ms OK 210KB 110ms OK 179KB 123ms MATCH
object-assign OK 3.0KB 2ms OK 3.8KB 6ms OK 2.8KB 96ms OK 4.3KB 95ms MATCH
has-flag OK 0.4KB 2ms OK 0.5KB 5ms OK 1.5KB 101ms OK 1.7KB 100ms MATCH
p-limit OK 2.6KB 3ms OK 3.0KB 6ms OK 2.7KB 100ms OK 5.2KB 112ms MATCH
strip-ansi OK 0.7KB 2ms OK 0.8KB 5ms OK 0.8KB 96ms OK 2.2KB 94ms MATCH
ansi-regex OK 0.4KB 2ms OK 0.5KB 5ms OK 0.4KB 96ms OK 1.8KB 96ms MATCH
wrap-ansi OK 33KB 4ms OK 35KB 8ms OK 34KB 106ms OK 38KB 100ms MATCH
supports-color OK 3.6KB 2ms OK 3.8KB 5ms OK 4.6KB 104ms OK 5.7KB 98ms MATCH
cross-spawn OK 14KB 4ms OK 18KB 9ms OK 15KB 108ms OK 19KB 98ms MATCH
lru-cache OK 21KB 4ms OK 23KB 7ms OK 22KB 98ms OK 18KB 103ms MATCH
signal-exit OK 5.2KB 3ms OK 6.8KB 6ms OK 6.5KB 105ms OK 12KB 96ms MATCH
which OK 7.7KB 3ms OK 9.5KB 7ms OK 7.7KB 92ms OK 8.7KB 105ms MATCH
string-width OK 24KB 3ms OK 25KB 7ms OK 25KB 104ms OK 27KB 99ms MATCH
safe-buffer OK 2.8KB 2ms OK 3.8KB 6ms OK 1.7KB 104ms OK 3.8KB 95ms MATCH
bytes OK 3.4KB 2ms OK 4.3KB 6ms OK 4.3KB 96ms OK 5.5KB 99ms MATCH
depd OK 9.5KB 3ms OK 12KB 6ms OK 11KB 96ms OK 13KB 98ms MATCH
merge-descriptors OK 2.0KB 2ms OK 2.3KB 6ms OK 1.8KB 95ms OK 2.9KB 94ms MATCH
content-type OK 4.4KB 2ms OK 5.3KB 5ms OK 4.2KB 97ms OK 6.0KB 99ms MATCH
cookie OK 8.2KB 3ms OK 9.8KB 6ms OK 5.6KB 98ms OK 13KB 97ms MATCH
on-finished OK 5.2KB 3ms OK 6.9KB 6ms OK 6.6KB 101ms OK 8.3KB 96ms MATCH
statuses OK 4.6KB 2ms OK 5.8KB 6ms OK 5.3KB 96ms OK 6.1KB 97ms MATCH
etag OK 2.8KB 4ms OK 3.7KB 6ms OK 3.3KB 97ms OK 4.6KB 95ms MATCH
vary OK 3.1KB 2ms OK 3.7KB 5ms OK 3.5KB 94ms OK 5.1KB 96ms MATCH
flat OK 1.1KB 2ms OK 1.3KB 5ms OK 1.2KB 98ms OK 4.9KB 97ms MATCH
retry OK 7.2KB 3ms OK 8.6KB 7ms OK 7.0KB 103ms OK 7.3KB 96ms MATCH
camelcase OK 3.4KB 2ms OK 3.7KB 5ms OK 3.5KB 96ms OK 4.5KB 96ms MATCH
decamelize OK 1.2KB 2ms OK 1.3KB 5ms OK 1.3KB 99ms OK 3.0KB 95ms MATCH
memoize-one OK 2.6KB 2ms OK 3.1KB 6ms OK 2.3KB 106ms OK 2.4KB 97ms MATCH
rfdc OK 6.9KB 3ms OK 8.2KB 6ms OK 6.4KB 101ms OK 7.7KB 98ms MATCH
ohash OK 3.6KB 3ms OK 4.1KB 6ms OK 3.9KB 97ms OK 4.6KB 97ms MATCH
nanoevents OK 0.5KB 2ms OK 0.5KB 5ms OK 0.5KB 93ms OK 1.6KB 97ms MATCH
typebox OK 104KB 18ms OK 116KB 24ms OK 123KB 121ms OK 182KB 131ms MATCH
ts-pattern OK 10KB 4ms OK 12KB 7ms OK 11KB 98ms OK 9.6KB 96ms MATCH
valibot OK 5.5KB 10ms OK 6.8KB 14ms OK 8.0KB 104ms OK 193KB 116ms MATCH
ts-results-es OK 19KB 3ms OK 22KB 7ms OK 26KB 96ms OK 34KB 101ms MATCH
remeda OK 2.2KB 8ms OK 2.6KB 16ms OK 2.5KB 109ms OK 3.7KB 109ms MATCH
nanostores OK 4.7KB 3ms OK 5.7KB 8ms OK 5.1KB 100ms OK 8.2KB 105ms MATCH
ky OK 26KB 5ms OK 30KB 8ms OK 30KB 111ms OK 49KB 101ms MATCH
typedi OK 22KB 3ms OK 27KB 7ms OK 28KB 100ms OK 25KB 100ms MATCH
io-ts OK 85KB 11ms OK 104KB 14ms OK 117KB 113ms OK 102KB 111ms MATCH
type-fest OK 0.1KB 2ms OK 0.1KB 5ms OK 0.1KB 97ms OK 0.9KB 92ms MATCH
arktype OK 257KB 18ms OK 297KB 28ms OK 273KB 129ms OK 382KB 143ms MATCH
kysely OK 223KB 18ms OK 371KB 36ms OK 357KB 135ms OK 471KB 152ms MATCH
lodash-es@es5 OK 12KB 19ms OK 18KB 49ms OK 28KB 125ms FAIL - 0ms MATCH
clsx@es5 OK 0.6KB 2ms OK 0.6KB 5ms OK 0.6KB 95ms FAIL - 0ms MATCH
ms@es5 OK 3.6KB 2ms OK 4.5KB 5ms OK 4.0KB 102ms FAIL - 0ms MATCH
deepmerge@es5 OK 4.9KB 2ms OK 5.7KB 6ms OK 4.5KB 101ms FAIL - 0ms MATCH
fast-deep-equal@es5 OK 2.4KB 2ms OK 3.0KB 6ms OK 2.3KB 101ms FAIL - 0ms MATCH
semver@es5 OK 63KB 6ms FAIL - 10ms OK 52KB 110ms FAIL - 0ms MATCH
lodash-es@es2015 OK 12KB 21ms OK 18KB 49ms OK 28KB 125ms FAIL - 0ms MATCH
superjson@es2015 OK 23KB 5ms OK 27KB 10ms OK 24KB 99ms FAIL - 0ms MATCH
flat@es2017 OK 1.1KB 2ms OK 1.3KB 5ms OK 1.2KB 98ms FAIL - 0ms MATCH
defu@es2017 OK 1.9KB 2ms OK 2.8KB 5ms OK 1.8KB 107ms FAIL - 0ms MATCH
picomatch@es2018 OK 47KB 6ms OK 58KB 9ms OK 55KB 102ms FAIL - 0ms MATCH
semver@es2019 OK 55KB 5ms OK 66KB 11ms OK 52KB 104ms FAIL - 0ms MATCH
clsx@es2019 OK 0.5KB 2ms OK 0.6KB 6ms OK 0.6KB 94ms FAIL - 0ms MATCH
nanoid@es2019 OK 0.8KB 2ms OK 1.0KB 5ms OK 0.9KB 101ms FAIL - 0ms MATCH
dayjs@es2020 OK 11KB 3ms OK 14KB 7ms OK 11KB 104ms FAIL - 0ms MATCH
ohash@es2020 OK 3.7KB 3ms OK 4.8KB 6ms OK 3.9KB 105ms FAIL - 0ms MATCH
lru-cache@es2021 OK 30KB 5ms OK 35KB 8ms OK 22KB 107ms FAIL - 0ms MATCH
nanostores@es2021 OK 1.7KB 3ms OK 2.3KB 7ms OK 1.9KB 100ms FAIL - 0ms MATCH
lodash-es@chrome80 OK 45KB 21ms OK 64KB 52ms OK 99KB 126ms FAIL - 0ms MATCH
clsx@chrome49 OK 0.6KB 2ms OK 0.6KB 6ms OK 0.7KB 100ms FAIL - 0ms MATCH
dayjs@safari14 OK 11KB 3ms OK 14KB 8ms OK 11KB 102ms FAIL - 0ms MATCH
nanoid@node16 OK 0.7KB 3ms OK 0.9KB 6ms OK 0.9KB 98ms FAIL - 0ms DIFF

Size Comparison (ZTS vs esbuild)

Project ZTS esbuild rolldown rspack Ratio Status
effect 583KB 477KB 368KB 1460KB 1.22x ⚠️
type-fest 0.1KB 0.1KB 0.1KB 0.9KB 1.18x ⚠️
svelte-mount-min 44KB 37KB 28KB 22KB 1.17x ⚠️
svelte-full-min 47KB 40KB 30KB 24KB 1.17x ⚠️
d3 108KB 100KB 96KB 150KB 1.08x
dotenv 14KB 14KB 12KB 14KB 0.96x
string-width 24KB 25KB 25KB 27KB 0.96x
camelcase 3.4KB 3.7KB 3.5KB 4.5KB 0.94x
supports-color 3.6KB 3.8KB 4.6KB 5.7KB 0.93x
destr 1.9KB 2.1KB 1.8KB 3.1KB 0.93x
wrap-ansi 33KB 35KB 34KB 38KB 0.93x
decamelize 1.2KB 1.3KB 1.3KB 3.0KB 0.92x
change-case 3.0KB 3.2KB 3.3KB 8.0KB 0.91x
lru-cache 21KB 23KB 22KB 18KB 0.91x
cac 16KB 18KB 16KB 19KB 0.91x
hookable 5.3KB 5.9KB 5.2KB 9.3KB 0.90x
clsx 0.6KB 0.6KB 0.7KB 1.5KB 0.90x
clsx@chrome49 0.6KB 0.6KB 0.7KB - 0.90x
clsx@es5 0.6KB 0.6KB 0.6KB - 0.89x
yargs 165KB 185KB 167KB 227KB 0.89x
clsx@es2019 0.5KB 0.6KB 0.6KB - 0.89x
typebox 104KB 116KB 123KB 182KB 0.89x
uuid 1.8KB 2.1KB 2.0KB 3.9KB 0.89x
ts-pattern 10KB 12KB 11KB 9.6KB 0.89x
defu 1.9KB 2.1KB 1.8KB 3.0KB 0.89x
zustand 1.1KB 1.2KB 1.3KB 2.3KB 0.89x
rxjs 324KB 367KB 308KB 325KB 0.88x
zod 105KB 119KB 98KB 147KB 0.88x
deepmerge 4.9KB 5.5KB 4.5KB 6.0KB 0.88x
valtio 6.6KB 7.5KB 8.3KB 24KB 0.88x
ohash 3.6KB 4.1KB 3.9KB 4.6KB 0.88x
flat@es2017 1.1KB 1.3KB 1.2KB - 0.88x
pathe 3.0KB 3.4KB 3.0KB 13KB 0.88x
flat 1.1KB 1.3KB 1.2KB 4.9KB 0.88x
tslib 0.7KB 0.8KB 0.8KB 18KB 0.88x
superjson 22KB 26KB 24KB 32KB 0.88x
has-flag 0.4KB 0.5KB 1.5KB 1.7KB 0.88x
ky 26KB 30KB 30KB 49KB 0.88x
lru-cache@es2021 30KB 35KB 22KB - 0.87x
arktype 257KB 297KB 273KB 382KB 0.86x
ajv 210KB 243KB 208KB 239KB 0.86x
remeda 2.2KB 2.6KB 2.5KB 3.7KB 0.86x
preact 13KB 15KB 13KB 13KB 0.86x
chalk 13KB 15KB 14KB 17KB 0.86x
eventemitter3 6.7KB 7.8KB 9.2KB 10KB 0.86x
ts-results-es 19KB 22KB 26KB 34KB 0.86x
deepmerge@es5 4.9KB 5.7KB 4.5KB - 0.86x
p-limit 2.6KB 3.0KB 2.7KB 5.2KB 0.85x
zlib 95KB 112KB 102KB 222KB 0.85x
superjson@es2015 23KB 27KB 24KB - 0.85x
jotai 20KB 23KB 20KB 26KB 0.85x
ansi-regex 0.4KB 0.5KB 0.4KB 1.8KB 0.85x
mitt 0.5KB 0.6KB 0.7KB 1.5KB 0.85x
tiny-invariant 0.5KB 0.6KB 0.6KB 1.5KB 0.85x
memoize-one 2.6KB 3.1KB 2.3KB 2.4KB 0.85x
strip-ansi 0.7KB 0.8KB 0.8KB 2.2KB 0.85x
nanoevents 0.5KB 0.5KB 0.5KB 1.6KB 0.84x
fast-deep-equal 2.4KB 2.9KB 2.3KB 3.2KB 0.84x
merge-descriptors 2.0KB 2.3KB 1.8KB 2.9KB 0.84x
rfdc 6.9KB 8.2KB 6.4KB 7.7KB 0.84x
fp-ts 59KB 70KB 100KB 50KB 0.84x
jsonwebtoken 115KB 137KB 141KB 159KB 0.84x
cookie 8.2KB 9.8KB 5.6KB 13KB 0.83x
immer 18KB 22KB 19KB 36KB 0.83x
retry 7.2KB 8.6KB 7.0KB 7.3KB 0.83x
mobx 225KB 271KB 234KB 190KB 0.83x
react 53KB 64KB 53KB 18KB 0.83x
semver@es2019 55KB 66KB 52KB - 0.83x
semver 55KB 66KB 52KB 67KB 0.83x
path-to-regexp 12KB 14KB 8.0KB 15KB 0.83x
svelte-full 100KB 121KB 104KB 462KB 0.83x
svelte-mount 94KB 113KB 93KB 459KB 0.83x
toolkit 42KB 51KB 39KB 126KB 0.83x
content-type 4.4KB 5.3KB 4.2KB 6.0KB 0.83x
nanostores 4.7KB 5.7KB 5.1KB 8.2KB 0.83x
io-ts 85KB 104KB 117KB 102KB 0.82x
ms 3.6KB 4.3KB 4.0KB 5.0KB 0.82x
three 243KB 296KB 276KB 1280KB 0.82x
vary 3.1KB 3.7KB 3.5KB 5.1KB 0.82x
react-dom 1108KB 1355KB 1116KB 534KB 0.82x
valibot 5.5KB 6.8KB 8.0KB 193KB 0.81x
fast-glob 162KB 199KB 187KB 201KB 0.81x
tanstack-query 46KB 57KB 49KB 59KB 0.81x
qs 77KB 95KB 81KB 92KB 0.81x
depd 9.5KB 12KB 11KB 13KB 0.81x
bytes 3.4KB 4.3KB 4.3KB 5.5KB 0.81x
picomatch@es2018 47KB 58KB 55KB - 0.81x
picomatch 47KB 58KB 55KB 61KB 0.81x
escape-string-regexp 0.3KB 0.4KB 0.4KB 1.5KB 0.81x
which 7.7KB 9.5KB 7.7KB 8.7KB 0.81x
object-assign 3.0KB 3.8KB 2.8KB 4.3KB 0.81x
color-convert 24KB 30KB 27KB 27KB 0.81x
micromatch 80KB 100KB 100KB 108KB 0.80x
dayjs@es2020 11KB 14KB 11KB - 0.80x
dayjs 11KB 14KB 11KB 8.9KB 0.80x
dayjs@safari14 11KB 14KB 11KB - 0.80x
statuses 4.6KB 5.8KB 5.3KB 6.1KB 0.80x
typedi 22KB 27KB 28KB 25KB 0.80x
nanoid@es2019 0.8KB 1.0KB 0.9KB - 0.80x
nanoid 0.8KB 0.9KB 0.9KB 2.6KB 0.79x
yaml 207KB 261KB 228KB 284KB 0.79x
minimatch 45KB 56KB 47KB 90KB 0.79x
ms@es5 3.6KB 4.5KB 4.0KB - 0.79x
nanoid@node16 0.7KB 0.9KB 0.9KB - 0.79x
fast-deep-equal@es5 2.4KB 3.0KB 2.3KB - 0.79x
graphql 477KB 604KB 547KB 100KB 0.79x
ohash@es2020 3.7KB 4.8KB 3.9KB - 0.78x
cross-spawn 14KB 18KB 15KB 19KB 0.78x
vue 1565KB 2009KB 1606KB 1216KB 0.78x
date-fns 36KB 47KB 77KB 102KB 0.77x
is-glob 4.9KB 6.4KB 4.9KB 6.0KB 0.76x
etag 2.8KB 3.7KB 3.3KB 4.6KB 0.76x
signal-exit 5.2KB 6.8KB 6.5KB 12KB 0.76x
type-is 186KB 244KB 210KB 179KB 0.76x
mime-types 178KB 235KB 198KB 164KB 0.76x
nanostores@es2021 1.7KB 2.3KB 1.9KB - 0.76x
on-finished 5.2KB 6.9KB 6.6KB 8.3KB 0.75x
neverthrow 13KB 18KB 13KB 19KB 0.75x
cheerio 1634KB 2186KB 1747KB 2387KB 0.75x
safe-buffer 2.8KB 3.8KB 1.7KB 3.8KB 0.74x
glob-parent 6.2KB 8.4KB 6.3KB 7.9KB 0.73x
hono 43KB 59KB 52KB 68KB 0.72x
lodash-es@chrome80 45KB 64KB 99KB - 0.71x
lodash-es 45KB 64KB 99KB 122KB 0.71x
bcryptjs 33KB 46KB 47KB 60KB 0.70x
express 781KB 1138KB 908KB 917KB 0.69x
defu@es2017 1.9KB 2.8KB 1.8KB - 0.67x
lodash-es@es2015 12KB 18KB 28KB - 0.65x
lodash-es@es5 12KB 18KB 28KB - 0.65x
kysely 223KB 371KB 357KB 471KB 0.60x
commander 68KB 119KB 100KB 121KB 0.57x
iconv-lite 303KB 543KB 319KB 325KB 0.56x
supabase 367KB 759KB 706KB 779KB 0.48x
drizzle-orm 13KB 30KB 14KB 35KB 0.42x
svelte 1.8KB 4.7KB 3.5KB 197KB 0.39x
solid-js 0.3KB 2.4KB 2.2KB 23KB 0.11x

Average ratio: 0.82x | Smaller: 131 | Similar(±10%): 1 | Larger: 4

Auto-generated by CI on 2026-04-25 12:34 UTC

@ohah ohah merged commit 525e1a1 into main Apr 25, 2026
11 of 13 checks passed
@ohah ohah deleted the feat/wasm-bundler-build-export-1885 branch April 25, 2026 12:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant