Skip to content

codelessly_sdk 7.0.0: Flutter 3.47, codelessly_api 5 and stability fixes - #59

Merged
rayliverified merged 22 commits into
masterfrom
claude/hopeful-brown-c8o8x7
Oct 13, 2026
Merged

rayliverified merged 22 commits into
masterfrom
claude/hopeful-brown-c8o8x7

Conversation

@rayliverified

Copy link
Copy Markdown
Contributor

Summary

Brings the SDK up to Flutter 3.47 / Dart 3.13 and codelessly_api 5.0.0 (Codelessly/CodelesslyAPI#34, merged), fixes the crashes and hangs found in an audit, and adds tests and CI.

Toolchain and dependencies

  • Upstream json_annotation/json_serializable replace the forked codegen, which no longer resolves on current Dart.
  • All dependencies at their latest versions; unused uuid, intl and path_provider removed.
  • Deprecated Flutter APIs replaced: scrollCacheExtent, RadioGroup, ShowValueIndicator.onDrag, Switch activeThumbColor, and the new Color component accessors.
  • The web view now works in WebAssembly builds (dart.library.js_interop).

Fixes

  • Auth could hang forever waiting for claims and always failed on Windows; the auth token was logged.
  • Startup hung if the publish-model stream errored.
  • Firestore listeners piled up per variable, so older queries could overwrite newer results.
  • onLoad API calls and non-blocking actions produced uncaught errors.
  • Crashes in CodelesslyWidget.didUpdateWidget and in PageView, TabBar and Accordion edge cases.
  • ScopedValues.of threw outside a CodelesslyContext.
  • The gapped slider track asserted.
  • Malformed links and failed SVG loads threw.

Rendering

  • Every parameter and enum value added in codelessly_api 5 now renders, including FilledButton and superellipse borders.
  • Material Symbols render (with fill/weight/grade/optical size); the URL format was checked against Google's CDN.
  • Cupertino icons render from the cupertino_icons font, through a generated const map that keeps icon tree shaking working.
  • Two-tone Material icons display again.
  • Web views reload when their bound URL changes; TabBar respects showDivider.

New options

  • CodelesslyConfig.useHostTheme and maxTextScaleFactor, both opt-in. The defaults keep layouts looking exactly as designed in the editor.

Tests, docs and CI

  • 22 tests: transformer smoke tests for 13 node types, icon URL and rendering tests, radio and slider tests.
  • README fixes: wrong option names and broken snippets; images now use absolute URLs so they render on pub.dev.
  • CHANGELOG and pubspec metadata for 7.0.0.
  • New CI: flutter analyze, flutter test, and a WebAssembly web build of the example.

Before publishing

codelessly_api resolves through a git dependency_overrides on CodelesslyAPI master, in pubspec.yaml and example/pubspec.yaml. Publish codelessly_api 5.0.0, remove both overrides, then publish 7.0.0.

Testing

  • flutter analyze: no issues (lib, test, example).
  • flutter test: 22 passing.
  • flutter build web --wasm of the example passes, locally and in CI.

🤖 Generated with Claude Code

https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY


Generated by Claude Code

claude added 22 commits October 13, 2026 01:59
The SDK no longer resolved on current Dart: codelessly_json_serializable
needs the removed _macros package. Switch to json_annotation and
json_serializable, depend on codelessly_api ^5.0.0 (overridden to the
API's development branch until it is published), and upgrade the
remaining dependencies to their latest majors.

- EquatableMixin -> Equatable (equatable 3).
- Import DateTimeConverter from codelessly_api.
- Drop a `final` parameter modifier that Dart 3.13 rejects.
- Map the enum values added in codelessly_api 5 to their Flutter
  counterparts, including FilledButton and RoundedSuperellipseBorder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
- ListView/GridView: cacheExtent -> scrollCacheExtent
  (ScrollCacheExtent.pixels).
- Radio: manage the group through RadioGroup instead of the deprecated
  Radio.groupValue/onChanged.
- Slider: ShowValueIndicator.always -> onDrag.
- Switch: activeColor -> activeThumbColor.
- Color: red/green/blue/alpha/opacity/value -> r/g/b/a/toARGB32.
- Await Hive writes inside try so storage failures are caught and
  logged instead of escaping.
- Apply dart fix and remove an unused constant; flutter analyze now
  reports no issues.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
- Radio, Slider, ListTile, CircularProgressIndicator, ExpansionTile and
  Text now render the parameters added in codelessly_api 5.
- Slider track and value indicator shapes are mapped exhaustively; the
  gapped track, drop and rounded rectangle indicators used to fall back
  to other shapes. The gapped track also needs SliderThemeData.trackGap,
  without which Flutter asserts.
- ScopedValues.of left a late field unset when no CodelesslyContext was
  in the tree, so any node widget built outside a layout threw a
  LateInitializationError.
- Add widget smoke tests for the radio and every slider shape.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
dart.library.html is false when compiling to Wasm, so the conditional
export fell back to the stub and web views never rendered there. Check
dart.library.js_interop, which is true for both JS and Wasm builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Auth
- Windows decoded IdTokenResult.toString() instead of the token, so
  claim checks always failed there.
- Waiting for project claims had no timeout and ignored errors from
  getIdTokenResult, so authentication could hang forever. Wait at most
  30s and propagate errors.
- reset() after dispose added to a closed stream; authenticate()
  force-unwrapped a missing token.
- Stop logging the project auth token and the auth response body.

Data
- A publish model stream error never completed the first-event future,
  so initialization waited forever (e.g. on a permission error).
- Background bundle refreshes and onLoad API calls failed as unhandled
  async errors; report them instead.
- Cloud variables kept every previous Firestore listener alive, so older
  queries overwrote newer results. Keep one listener per variable.
- Read font bytes with ByteData.sublistView.

Widgets
- CodelesslyWidget.didUpdateWidget threw when an explicit context was
  removed, adopted (and later disposed) the caller's controller when it
  was removed, wrote notifiers after unmount, and threw on a missing
  breakpoint.
- Non-blocking reactions' errors escaped as uncaught errors; a failing
  blocking action now stops its chain and is reported.
- PageView jumped before its controller had clients; TabBar asserted
  when tabs shrank below the initial index; Accordion ignored
  isExpanded, inverted enabled, and threw with fewer than two children.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Icons other than Material icons had no source and requested
SvgPicture.network(''), so they never showed; two-tone Material icons
built "materialiconstwo tone" into their URL.

- Material Symbols load Google's prebuilt SVGs, with fill, weight, grade
  and optical size from the icon model snapped to the published variants
  (verified against fonts.gstatic.com).
- Cupertino icons render from the cupertino_icons font through a
  generated const map from codepoint to CupertinoIcons, which keeps icon
  tree shaking working for apps (tool/generate_cupertino_icons.py).
- Icons without any source render an empty box instead of a failing
  network request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Layouts render with a default ThemeData and no text scaling so they
match the editor. Add CodelesslyConfig.useHostTheme and
maxTextScaleFactor so apps can follow their own theme and, within a
bound, the platform text size. The dropdown now extends the surrounding
theme instead of replacing it.

CodelesslyConfig.copyWith also dropped debugLog and accepted an unused
staggerDownloadQueue argument.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
- Web views loaded their source once, so URLs bound to variables never
  updated. Reload when the resolved source changes.
- TabBar ignored showDivider.
- Replace print calls in library code with DebugLogger, so output follows
  the debugLog setting. ConditionPrinter.prettify no longer prints as a
  side effect.
- Remove the font parser's main() CLI from the public library, which
  also took dart:io out of it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
- Text, divider, loading indicator and web view links called
  launchUrl(Uri.parse(...)), which threw on malformed URLs and left
  launch failures unhandled. Route them through
  FunctionsRepository.openLink.
- LocalDatabase and CodelessCacheManager closed their Hive boxes in
  `void dispose() async`, so close failures were unhandled; report them.
- Remove the unused uuid, intl and path_provider dependencies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
SvgPicture.network had no errorBuilder in icons, SVG icon images and the
image builder, so an offline or broken SVG reported an error instead of
leaving its space empty (or showing the image error builder).

Add widget tests that build thirteen node types through the real
PassiveNodeTransformerManager, including an accordion with no children.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
README: the crash-report option is automaticallySendCrashReports and
defaults to false; CodelesslyWidget takes publishSource, not isPreview;
fix the functions snippets; document useHostTheme and
maxTextScaleFactor; drop an embedded token; use absolute image URLs so
they render on pub.dev.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
The API changes are merged (Codelessly/CodelesslyAPI#34). Keep the git
override until codelessly_api 5.0.0 is published to pub.dev.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
5.0.0 is published, so drop the git dependency_overrides from the
package and the example.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
- AuthManager: Windows reads claims from the token, postAuthSuccess
  completes when the claim arrives, and times out or fails instead of
  hanging. The claims wait is now a constructor parameter so tests do
  not wait 30 seconds.
- DataManager: a publish model stream error fails listenToPublishModel
  instead of hanging.
- FirestoreCloudDatabase: a new query replaces the variable's previous
  listener and reset() cancels them all.

Each test fails against the code before its fix. The Firebase fakes are
hand-written because fake_cloud_firestore and firebase_auth_mocks still
require equatable 2.

Export DebugLogger and ErrorLogger: DataManager's public constructor
takes an ErrorLogger that apps could not name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
callFunction discarded the app function's result, so a blocking Call
Function action never waited for an async function before the next
action ran, and its errors went uncaught. Return the result so the
action chain awaits it and reports failures. triggerAction also catches
synchronous throws from performAction now.

Tests cover ordering, a failing function stopping the chain, and a
failing non-blocking function letting it continue; all three fail on the
previous code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
The embedded video transformer imported webview_flutter_wkwebview and
webview_flutter_android directly, pulling dart:io into web builds and
making the package incompatible with WebAssembly by pub.dev's analysis.
Move the platform-specific controller setup behind a conditional import,
as the web view transformer already does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
pub.dev deducts static analysis points for unformatted files; 90 files
predated the Dart 3.7 formatter style.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
@rayliverified
rayliverified merged commit a3e0f88 into master Oct 13, 2026
2 checks passed
rayliverified added a commit that referenced this pull request Oct 13, 2026
…xes (#59)

Upgrade to Flutter 3.47 / Dart 3.13 and codelessly_api 5.0.0 (pub.dev), replacing the forked JSON codegen and deprecated Flutter APIs. Fix auth and startup hangs, Firestore listener leaks, uncaught action errors, Call Function actions not awaiting app functions, and widget lifecycle crashes. Render Material Symbols, Cupertino and two-tone icons and every codelessly_api 5 parameter; add opt-in host theme and text scaling. Fully WebAssembly-compatible (pana 160/160). 34 tests and CI covering format, analyze, tests and a Wasm build.
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.

2 participants