Skip to content

Add Gea (geajs.com) framework to the benchmark suite - #26

Open
rlorenzo wants to merge 1 commit into
lissy93:mainfrom
rlorenzo:claude/add-geajs-test-ch2sr4
Open

Add Gea (geajs.com) framework to the benchmark suite#26
rlorenzo wants to merge 1 commit into
lissy93:mainfrom
rlorenzo:claude/add-geajs-test-ch2sr4

Conversation

@rlorenzo

Copy link
Copy Markdown

Summary

Adds Gea (geajs.com), a compiler-first reactive UI framework, as a new implementation in the benchmark suite. It is a like-for-like port of the shared weather app, wired into the existing test, lint, build, and benchmark tooling.

Closes #25

What's included

New app (apps/geajs/)

  • Singleton WeatherStore extending Gea's Store. State lives in plain class fields made reactive through a deep Proxy; mutations are ordinary assignments.
  • Computed values are plain JavaScript getters (forecastDays, locationLabel, formatted temperature/humidity/wind/pressure, and so on).
  • JSX class components (SearchForm, WeatherDisplay, CurrentWeather, Forecast, ForecastItem, ErrorState) plus a function component (LoadingState), compiled by @geajs/vite-plugin (Vite 8) into surgical DOM patches with no virtual DOM.
  • Shared service/utils mirror the other apps: mock mode, geolocation fallback, localStorage persistence, one-at-a-time forecast expansion with scroll-into-view, and keyboard accessibility.

Tooling registration

  • frameworks.json: new geajs entry (build/test/lint config plus website metadata).
  • tests/config/playwright-geajs.config.js and an entry in playwright.config.base.js.
  • Root package.json: dev:geajs, build:geajs, test:geajs, lint:geajs.
  • eslint.config.mjs: an override for JSX-only component references (the same pattern React and Solid use).
  • .github/docs/apps.md: added Gea, corrected the framework count, and restored the previously missing Lume.js list entry.

Known parity differences worth a look

The suite compares identical apps, so I kept geajs matching the majority of implementations rather than any single one. A few spots where the reference apps themselves disagree:

  • Current weather tiles. geajs shows separate "Wind Speed" and "Wind Direction" tiles, matching react and vue. Solid is the outlier: it merges those into one "Wind" tile and uses the freed slot for "Precipitation". geajs follows react/vue.
  • Pressure in mock mode. geajs reads current.pressure_msl like react, svelte, and vanjs. The shared mock fixture only provides surface_pressure, so pressure renders as "NaN hPa" under ?mock=true for all of those apps, geajs included. This is kept intentionally for like-for-like parity; a real fix belongs in a cross-framework change to the mock data or the shared readers.
  • Page background. geajs lets the shared soft page background show through (like solid, react, vue, and most apps) instead of painting the app container near-white. vanjs still paints it, so geajs matches the majority rather than the vanjs template it was first modeled on.
  • Forecast behavior. Expansion state persists across searches (matching vanjs), one item is open at a time, and the list is capped at 7 days (matching solid/svelte).

Benchmarks (local run, for context)

Issue #25 asked how Gea would compare. From a fresh local run of scripts/benchmark across all frameworks on one machine (numbers are internally comparable; official CI figures will differ):

  • Bundle: about 9.97 KB gzipped app output. Among the build/compile frameworks that is second only to Solid (about 9.2 KB) and under Preact (about 10.1 KB); well under Vue (about 29), React (about 50), and Angular (about 62).
  • Build: about 596 ms, the fastest build in the set.
  • Lighthouse: Performance 99, Accessibility 100, Best Practices 100, SEO 90. FCP about 1.4 s, LCP about 1.7 s.

In short, it slots in with the lean compile-to-DOM frameworks (Solid, Preact) on size and speed.

Testing

  • npm run test:geajs: 22/22 Playwright tests pass (the full shared suite: 10 core plus 12 advanced and performance E2E), run repeatedly with no flakiness.
  • npm run lint:geajs: clean.
  • npm run build:geajs: production build succeeds.

🤖 Generated with Claude Code

Implements the shared weather app in Gea, a compiler-first reactive UI
framework, and wires it into the existing test/lint/build tooling.

- apps/geajs: weather app using @geajs/core with a proxy-based Store,
  getter-derived computed values, and class/function JSX components
  compiled by @geajs/vite-plugin (Vite 8)
- frameworks.json: register geajs with build, test, and meta config
- tests/config: add playwright-geajs.config.js and base config entry
- package.json: add dev/build/test/lint scripts for geajs
- eslint.config.mjs: ignore JSX-only component references in apps/geajs
- .github/docs/apps.md: add Gea (and the previously missing Lume.js) to
  the framework list and correct the count to 14

Behavior matches the reference implementations (react/vue/svelte/preact/
solid), including reading pressure from pressure_msl and single-item
forecast expansion with scroll-into-view. The page uses the shared soft
background like the majority of apps rather than painting the app
container near-white. Full Playwright suite passes locally (22/22).

Co-Authored-By: Claude <noreply@anthropic.com>
@rlorenzo
rlorenzo force-pushed the claude/add-geajs-test-ch2sr4 branch from ba54727 to 4a9d348 Compare July 17, 2026 20:52
github-actions Bot pushed a commit to nigrosimone/framework-benchmarks that referenced this pull request Jul 24, 2026
github-actions Bot pushed a commit to sathvikc/framework-benchmarks that referenced this pull request Jul 24, 2026
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.

Add GeaJS

1 participant