1- ## [ 0.5.0] - Unreleased
1+ ## [ 0.5.0] - 2026-08-13
22
33The local database release: an ActiveRecord-like, reactive local store on
44in-browser SQLite (picoruby-sqlite3), with the Rails server as the source
5- of truth. Entries below accumulate as the feature lands.
5+ of truth. Plus the first round of fixes and API gaps surfaced by building
6+ a real shop on the framework.
67
78### Added
89
@@ -26,6 +27,30 @@ of truth. Entries below accumulate as the feature lands.
2627 ` Funicular.confirm_handler= ` injects the dialog for tests or custom
2728 UIs; SSR never blocks. The guard must not suspend.
2829
30+ - ` Funicular::SSR.render_component(component_name, props:, state:) ` :
31+ render one component to static HTML with no route lookup, so a
32+ server-rendered (ERB) page can embed a Funicular component -- a shared
33+ site header, say -- instead of duplicating its markup. The component
34+ is named by string and resolved after ` boot! ` (host apps keep
35+ app/funicular out of Rails autoloading); a constant that is not a
36+ ` Funicular::Component ` subclass is rejected with ArgumentError. No
37+ hydration and no handler binding: links work, onclick does not.
38+
39+ - ` Funicular::Testing::DOMTest ` gains the negative assertions
40+ ` assert_no_selector ` / ` assert_no_text ` and a ` selector_count ` helper;
41+ "this must NOT render" was previously untestable without hand-rolled
42+ JS.eval node counting.
43+
44+ - ` Funicular::Testing.ensure_compiled! ` : one call in a test helper that
45+ syncs plugin assets and recompiles app.mrb when sources are newer,
46+ replacing the boilerplate every host app grew by hand. Plain
47+ controller tests that render ` funicular_plugin_include_tags ` no
48+ longer fail order-dependently on unsynced plugin CSS.
49+
50+ - ` Funicular::HTTP::Response#body ` as an alias of ` #data ` : components
51+ reach for the universal name first, and the resulting NoMethodError
52+ used to vanish inside the JS bridge as a silently frozen page.
53+
2954- The SQLite local-database subsystem is now globally opt-in through
3055 ` config.local_database = true ` and defaults off. REST-only applications do
3156 not start SQLite, IndexedDB, Web Locks, replica write-through, or session
@@ -360,6 +385,20 @@ of truth. Entries below accumulate as the feature lands.
360385- ` Model#initialize ` uses key-presence lookups instead of ` || ` , so a
361386 string-keyed ` false ` (boolean columns) no longer collapses to nil.
362387
388+ - Dev-mode SSR reloads edited component sources instead of caching them
389+ per process (the railtie enables it in development): SSR markup no
390+ longer goes stale behind the middleware's recompiled app.mrb until a
391+ server restart. Concurrent renders serialize the reload, and a file
392+ vanishing mid-edit does not break the mtime check.
393+
394+ - Event-handler and HTTP-callback exceptions name the component and
395+ handler on the console before re-raising, instead of an anonymous
396+ "Callback <id >" line -- or, for HTTP callbacks, nothing at all.
397+
398+ - ` Schema.build ` skips validator introspection for ` readonly: true `
399+ attributes: server-managed columns no longer fail client-side
400+ validation against values the client never edits.
401+
363402- ` Schema::RegexpTranslator ` unescapes Ruby's ` \# ` identity escape, which
364403 survives in ` Regexp#source ` but is rejected by the JS RegExp engine under
365404 the ` u ` flag (` URI::MailTo::EMAIL_REGEXP ` is the common casualty: one such
0 commit comments