Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
c647ab5
fix(extractor): reject whole Devup namespace runtime escapes
owjs3901 Oct 4, 2026
81d9a56
fix(extractor): preserve exact lexical values and binding-aware require
owjs3901 Oct 4, 2026
d257aac
fix(extractor): preserve JavaScript props evaluation during lowering
owjs3901 Oct 4, 2026
d4e0187
fix(components): reorder compile-time style defaults after DOM spreads
owjs3901 Oct 4, 2026
58fe5a1
fix(landing): keep selector defaults after Card DOM props
owjs3901 Oct 4, 2026
955bf5e
test(extractor): cover direct literal selection and dynamic value paths
owjs3901 Oct 4, 2026
1e81fdf
test(extractor): cover native written class spread precedence
owjs3901 Oct 4, 2026
4b24361
test(extractor): cover scalar order and runtime CSS suffix branches
owjs3901 Oct 4, 2026
6749633
test(extractor): cover initialization and exact constant safety branches
owjs3901 Oct 4, 2026
5657601
test(extractor): cover native logical and suspension capture edges
owjs3901 Oct 4, 2026
f0969a0
refactor(extractor): make JSX ordering and pruning paths measurable
owjs3901 Oct 4, 2026
f2fc451
merge: update PR #756 with main
owjs3901 Oct 8, 2026
628f7c7
merge: update PR #756 with PR #750
owjs3901 Oct 16, 2026
d9cf389
fix(extractor): preserve explicit styles across parent merge
owjs3901 Oct 23, 2026
505e68a
fix(extractor): integrate settled main semantics
owjs3901 Oct 24, 2026
6e457e9
perf(extractor): avoid unused constant preparation
owjs3901 Oct 24, 2026
2b1087e
test(extractor): cover merged semantic edge paths
owjs3901 Oct 24, 2026
87746d1
fix: preserve JavaScript evaluation semantics and refresh dependencies
owjs3901 Nov 3, 2026
cc001fd
fix: integrate latest main with JavaScript semantics fixes
owjs3901 Nov 3, 2026
a90d9c5
fix: complete semantics coverage and optimize production WASM
owjs3901 Nov 3, 2026
0a2f366
test(extractor): cover constant traversal and styled capability inher…
owjs3901 Nov 3, 2026
4052942
test(extractor): exercise guarded local and native JSX paths
owjs3901 Nov 3, 2026
890773a
test(extractor): cover suspended native JSX attribute emission
owjs3901 Nov 3, 2026
eb102a0
refactor(extractor): make static JSX attribute eligibility explicit
owjs3901 Nov 3, 2026
fd04f00
perf(extractor): avoid unnecessary style capture wrappers
owjs3901 Nov 4, 2026
06f15ed
perf(extractor): elide lone template capture wrappers
owjs3901 Nov 4, 2026
8f1bce2
test(extractor): cover known spread ordering path
owjs3901 Nov 4, 2026
fc004bd
perf(extractor): keep lone static member styles in place
owjs3901 Nov 4, 2026
6555495
fix(extractor): keep spread ordering coverage executable
owjs3901 Nov 4, 2026
ad3147e
fix(extractor): remove unreachable spread coverage branches
owjs3901 Nov 4, 2026
a8e5f4d
fix(extractor): cover unknown spread ordering branch
owjs3901 Nov 4, 2026
cacb8b6
test(extractor): assert lone static member capture elision
owjs3901 Nov 4, 2026
83fcbd2
fix(extractor): keep lone run classification coverage stable
owjs3901 Nov 4, 2026
50fb7f3
fix(extractor): inline isolated dynamic style calls
owjs3901 Nov 5, 2026
8f3d17e
fix(extractor): elide eager single-use style captures
owjs3901 Nov 5, 2026
a19ff49
fix(extractor): flatten inlined string coercions
owjs3901 Nov 6, 2026
a9bc744
fix(extractor): erase outer type wrappers from style captures
owjs3901 Nov 7, 2026
47e0ca3
fix(extractor): remove unused and ordered capture wrappers
owjs3901 Nov 7, 2026
4551157
fix(extractor): reuse lexical captures instead of arrow wrappers
owjs3901 Nov 7, 2026
51d4548
fix(extractor): inline styled render stages and eager captures
owjs3901 Nov 7, 2026
4be75bf
test(extractor): cover styled inlining scope boundaries
owjs3901 Nov 7, 2026
bed6fa3
fix: preserve optional access in captured style selections
owjs3901 Nov 9, 2026
e99948f
fix(extractor): collapse static style selection scaffolding
owjs3901 Nov 10, 2026
41f90ea
fix(extractor): retain static classes in spread array selections
owjs3901 Nov 10, 2026
9be5c67
ci: drop the WASM size gate and the glue comment-stripping step
owjs3901 Nov 10, 2026
6fae97d
chore: update dependencies
owjs3901 Nov 10, 2026
e69de2a
fix(extractor): read style results in known JSX spread entries
owjs3901 Nov 11, 2026
80ab530
build(wasm): drop the size-only wasm-opt passes
owjs3901 Nov 11, 2026
63d7212
fix(extractor): declare leading captures as constants
owjs3901 Nov 11, 2026
c557cb4
fix(extractor): shorten inlined styled renderers
owjs3901 Nov 11, 2026
0a34fb7
fix(extractor): keep readable style values and plain template interpo…
owjs3901 Nov 11, 2026
0474d4a
fix(extractor): emit no generated let and unwrap what only passes val…
owjs3901 Nov 11, 2026
6af7793
fix(extractor): split an element on a choice of names after the props…
owjs3901 Nov 11, 2026
dbdf639
fix(extractor): rebuild a factory call around its captures after visi…
owjs3901 Nov 11, 2026
9207516
fix(extractor): drop generated names nothing needs and unpack one-val…
owjs3901 Nov 11, 2026
9af26ab
fix(extractor): build one-value branches as that value and guard hand…
owjs3901 Nov 11, 2026
fdfabbf
fix(extractor): compute more style values at build time and read Comm…
owjs3901 Nov 11, 2026
4a7ecf5
fix(extractor): run the condition of a conditional with the same bran…
owjs3901 Nov 11, 2026
70c8476
fix(extractor): write generated code no longer than it means
owjs3901 Nov 11, 2026
27def55
fix(extractor): join a component's classes to the caller's without an…
owjs3901 Nov 11, 2026
c5a43bc
fix(extractor): copy a styled component's props once and share its pr…
owjs3901 Nov 12, 2026
05d5fe0
perf(extractor): drop the constants the generated code only reads once
owjs3901 Nov 12, 2026
5020ecc
perf(extractor): render a styled component no other module extends wi…
owjs3901 Nov 12, 2026
7d0dce8
perf(extractor): fold the members of generated objects the build knows
owjs3901 Nov 12, 2026
5e19491
perf(extractor): write a constant read once where it is read when its…
owjs3901 Nov 12, 2026
76c15eb
perf(extractor): drop the generated constants and statements nothing …
owjs3901 Nov 12, 2026
ccc0ea5
test(extractor): close the coverage gaps CI's one-line formatting shows
owjs3901 Nov 12, 2026
b16528a
test(next-plugin): expect the attrs value written on the element
owjs3901 Nov 12, 2026
fcd1181
test(vite-plugin): read the classes a styled component writes with a …
owjs3901 Nov 12, 2026
fdc7ae9
fix(extractor): write a sequence JSX reads as an array it indexes
owjs3901 Nov 12, 2026
5e30a8c
fix(extractor): select no style at build time for a literal key a tab…
owjs3901 Nov 12, 2026
e96137a
fix(extractor): refuse element spreads that would pass styles on as p…
owjs3901 Nov 12, 2026
2f517df
fix(extractor): refuse conditional spreads that would pass styles on …
owjs3901 Nov 12, 2026
f75eb39
fix(extractor): compile conditional spreads in jsx() and read importe…
owjs3901 Nov 12, 2026
8048b05
fix(extractor): select no style at build time for a `+n` index an arr…
owjs3901 Nov 12, 2026
0e1b696
fix(extractor): emit only the styles a value the build knows can select
owjs3901 Nov 12, 2026
4e352a9
test(extractor): cover what the literal fold leaves to the extractor
owjs3901 Nov 12, 2026
edacbb1
fix(eslint-plugin): leave spreads the build refuses to the build
owjs3901 Nov 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .changepacks/changepack_log_constant_read_work.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"changes": {
"bindings/devup-ui-wasm/package.json": "Patch"
},
"note": "Avoid cloning unreferenced constant initializers and defer initialization analysis until constant reads need it. Extraction output and build errors are unchanged.",
"date": "2026-10-24T00:00:00.000Z"
}
7 changes: 7 additions & 0 deletions .changepacks/changepack_log_extraction_coverage.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"changes": {
"bindings/devup-ui-wasm/package.json": "Patch"
},
"note": "Add regression coverage for extraction safety, property pruning and source-order behavior; remove unreachable post-flatten spread handling and consolidate unknown property-shape rejection. Extraction output and build errors are unchanged.",
"date": "2026-10-24T00:00:00.000Z"
}
9 changes: 9 additions & 0 deletions .changepacks/changepack_log_js_semantics.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"changes": {
"bindings/devup-ui-wasm/package.json": "Patch",
"packages/components/package.json": "Patch",
"packages/reset-css/package.json": "Patch"
},
"note": "Keep unknown element-prop spreads wholly as native pass-through data: their keys never select, replace or remove separately authored styles, regardless of order. Preserve fully known ordinary spread composition, canonical aliases, source-ordered once-only values and native className/style merging without spread-key styling variables, fallbacks or conversion code. Preserve exact imported enum and Math values including negative zero, lexical constants, binding-aware CommonJS require, React createElement calls, type-only imports, and compiled reset CSS tests. Retain located errors for intrinsically unreadable explicit styles, runtime styleOrder, unmovable lazy logical suspension, whole Devup UI namespaces escaping to runtime, and immediate lexical temporal-dead-zone reads. Native Emotion css spread restrictions and separate styled css overlap restrictions remain unchanged. Inline eager styled render stages, attrs merges and destructuring carriers into their existing render scope, and reuse scoped captures for CSS composition and StyleX units. Preserve per-instance dynamic component targets, parameter environments, getter and iterator effects, function names and call receivers while removing unnecessary generated arrow functions.",
"date": "2026-10-01T00:00:00.000Z"
}
7 changes: 7 additions & 0 deletions .changepacks/changepack_log_jsx_call_spread.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"changes": {
"bindings/devup-ui-wasm/package.json": "Patch"
},
"note": "Attach extracted classes and authored CSS variables to jsx, jsxs and jsxDEV props wrapped in parentheses, as const or satisfies. Preserve source evaluation order, responsive and conditional styleOrder output, native className/style merging and whole unknown-spread pass-through. Syntax wrappers do not introduce spread replacement diagnostics or a styling runtime.",
"date": "2026-10-12T00:00:00.000Z"
}
12 changes: 12 additions & 0 deletions .changepacks/changepack_log_refresh_dependencies_20261102.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"changes": {
"bindings/devup-ui-wasm/package.json": "Patch",
"packages/components/package.json": "Patch",
"packages/eslint-plugin/package.json": "Patch",
"packages/react/package.json": "Patch",
"packages/rsbuild-plugin/package.json": "Patch",
"packages/vite-plugin/package.json": "Patch"
},
"note": "Refresh dependencies, including Oxc 0.156, wasm-bindgen 0.2.130, parse5 8.1 and Rsbuild 2.3. Preserve the React 18 compatibility fixture while updating its build tooling.",
"date": "2026-11-02T00:00:00.000Z"
}
132 changes: 0 additions & 132 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -106,138 +106,6 @@ jobs:
- name: Compare the Devup UI rows with the baseline
run: bun benchmark-check.js

wasm-size:
runs-on: ubuntu-latest
timeout-minutes: 60
permissions:
contents: read
env:
CARGO_BUILD_JOBS: "2"
RUSTUP_TOOLCHAIN: stable
steps:
- name: Checkout the tested source and both histories
uses: actions/checkout@v7
with:
fetch-depth: 0
persist-credentials: false
- uses: actions-rust-lang/setup-rust-toolchain@v2
with:
toolchain: stable
target: wasm32-unknown-unknown
cache: false
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- uses: actions/setup-node@v7
with:
node-version: '*'
check-latest: true
- name: Resolve and report exact WASM comparison sources
run: node resolve-wasm-size-sources.js
- *install-wasm-pack
- name: Cache registry downloads only
uses: actions/cache@v6
with:
path: |
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
key: cargo-wasm-size-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}
- name: Install the latest shared optimizer once
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
mkdir -p "$RUNNER_TEMP/wasm-size-tools/binaryen"
gh release download --repo WebAssembly/binaryen --pattern '*-x86_64-linux.tar.gz' --dir "$RUNNER_TEMP/wasm-size-tools"
tar -xzf "$RUNNER_TEMP"/wasm-size-tools/*.tar.gz --strip-components=1 -C "$RUNNER_TEMP/wasm-size-tools/binaryen"
echo "$RUNNER_TEMP/wasm-size-tools/binaryen/bin" >> "$GITHUB_PATH"
- name: Build exact sources with shared tools and lock-matched bindgen
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
export SIZE_ROOT="$RUNNER_TEMP/wasm-size"
mkdir -p "$SIZE_ROOT"
stage=source
trap 'echo "## WASM size: FAIL - $stage build or provenance failed; no comparison was skipped or substituted." >> "$GITHUB_STEP_SUMMARY"' ERR
for side in base candidate; do
if [[ "$side" == base ]]; then sha="$BASE_SHA"; else sha="$CANDIDATE_SHA"; fi
git cat-file -e "$sha^{commit}"
mkdir -p "$SIZE_ROOT/$side"
git archive "$sha" | tar -x -C "$SIZE_ROOT/$side"
done
cat > "$SIZE_ROOT/provenance.mjs" <<'NODE'
import { execFileSync } from 'node:child_process'
import { createHash } from 'node:crypto'
import { readFileSync, writeFileSync } from 'node:fs'
import { join } from 'node:path'
const run = (command, args) => execFileSync(command, args, { encoding: 'utf8' }).trim()
const tools = Object.fromEntries([
['rustc', 'rustc', ['--version', '--verbose']],
['wasmPack', 'wasm-pack', ['--version']],
['wasmBindgen', 'wasm-bindgen', ['--version']],
['wasmOpt', 'wasm-opt', ['--version']],
['bun', 'bun', ['--version']],
['node', 'node', ['--version']],
].map(([key, command, args]) => {
const path = run('which', [command])
const hash = createHash('sha256').update(readFileSync(path)).digest('hex')
return [key, `${run(command, args)}\n${path}\nsha256:${hash}`]
}))
const side = process.argv[2]
const file = join(process.env.SIZE_ROOT, 'metadata.json')
const metadata = side === 'base' ? {
jobId: `${process.env.GITHUB_RUN_ID}/${process.env.GITHUB_RUN_ATTEMPT}/${process.env.GITHUB_JOB}`,
buildCommand: 'cargo metadata --locked --format-version 1 > /dev/null && wasm-pack build --mode no-install --release --target nodejs --out-dir ./pkg --out-name index --locked && node script.js',
} : JSON.parse(readFileSync(file, 'utf8'))
const sha = side === 'base' ? process.env.BASE_SHA : process.env.CANDIDATE_SHA
metadata[side] = {
commit: run('git', ['rev-parse', `${sha}^{commit}`]),
tree: run('git', ['rev-parse', `${sha}^{tree}`]),
wasmBindgenVersion: process.env.WASM_BINDGEN_VERSION,
packageDir: join(process.env.SIZE_ROOT, side, 'bindings/devup-ui-wasm/pkg'), tools,
}
writeFileSync(file, JSON.stringify(metadata, null, 2) + '\n')
NODE
shared_path="$PATH"
for side in base candidate; do
stage="$side"
(
WASM_BINDGEN_VERSION="$(bun resolve-wasm-bindgen.js "$SIZE_ROOT/$side/Cargo.lock")"
export WASM_BINDGEN_VERSION
bindgen_root="$SIZE_ROOT/abi-tools/$WASM_BINDGEN_VERSION"
if [[ ! -x "$bindgen_root/bin/wasm-bindgen" ]]; then
cargo binstall wasm-bindgen-cli --version "=$WASM_BINDGEN_VERSION" --root "$bindgen_root" --no-confirm --force
fi
export PATH="$bindgen_root/bin:$shared_path"
node "$SIZE_ROOT/provenance.mjs" "$side"
cd "$SIZE_ROOT/$side/bindings/devup-ui-wasm"
export CARGO_TARGET_DIR="$SIZE_ROOT/$side-target"
cargo metadata --locked --format-version 1 > /dev/null
wasm-pack build --mode no-install --release --target nodejs --out-dir ./pkg --out-name index --locked
node script.js
) 2>&1 | tee "$SIZE_ROOT/$side-build.log"
done
- name: Compare all four relative size metrics
run: |
node verify-wasm-size.js \
--base-pkg "$RUNNER_TEMP/wasm-size/base/bindings/devup-ui-wasm/pkg" \
--candidate-pkg "$RUNNER_TEMP/wasm-size/candidate/bindings/devup-ui-wasm/pkg" \
--metadata "$RUNNER_TEMP/wasm-size/metadata.json" \
--report "$RUNNER_TEMP/wasm-size/wasm-size.json"
- name: Upload size measurements and build evidence
uses: actions/upload-artifact@v7
if: ${{ !cancelled() }}
with:
name: wasm-size
path: |
${{ runner.temp }}/wasm-size/metadata.json
${{ runner.temp }}/wasm-size/wasm-size.json
${{ runner.temp }}/wasm-size/*-build.log
if-no-files-found: error
retention-days: 30

# The landing app is the only real-scale acceptance target in this repo, and
# `publish` runs it against the deployed vinext/@devup-ui/vite-plugin build.
# This job runs the SAME 128 assertions and the SAME screenshot baselines
Expand Down
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,5 @@ playwright-report
.omo
/.changepacks/publish.tgz
benchmark-run.json
wasm-size.json
release-results.json
release-package-build.json
Loading
Loading