Skip to content

Releases: DerpyCrabs/EffectWeb

EffectWeb 0.8.0

Choose a tag to compare

@DerpyCrabs DerpyCrabs released this 30 Sep 10:16

EffectWeb 0.8.0 shrinks the API to what applications use, compiles every JSX file, adds four authoring APIs that replace patterns consumers had been writing by hand, and speeds up the renderer.

Breaking changes and migration

  • Every file containing JSX is compiled and linted unless a @jsxImportSource pragma names another runtime. A view file that imported only sibling components used to be skipped and then fail inside the bundler. The allJsx compiler and lint option is removed.
  • className is removed; write class. renderList is removed; import list.
  • defineTasks(owner, definitions) is now ownedTasks(owner, definitions); defineTasks keeps only the component builder form.
  • program, modelOwner and defineTasks no longer accept name; it only fed the removed tracing.
  • Removed from effectweb/advanced: mapTransition, mapCommand, defineField and the field types, observeBindings, inspectBindings, mountBindingInspector, observePrograms, fromStream, fromAtom, fromSubscriptionRef, makeDomMount, makeDomBinding, makeEffectHandler. Pass a uiRuntime(context) to domMount, domBinding and effectEvent for services; observe streams and atoms from a controller that publishes into a modelOwner.
  • The lint preset reports every rule as an error and adds effectweb/no-hook-names.

Additions

  • list(rows, identity, render) keys rows with an inline identity; collection(identity) is for rows that are also shared with share.
  • controllerView({ create, view, identity }) creates a controller from a view's props and disposes it with the view.
  • domHandle() gives a controller an element reference through use={handle.mount} and handle.element().
  • ownedTasks(owner, { save: { run, policy } }) binds named actions to an owner's slots.
  • commandSlots releases keys nobody references any more, so long-lived applications do not accumulate one slot per entity.
  • Lint: EW3004 covers collection and commandSlots created inside a view; EW3005 flags sequence rows with editable controls or filtered components; EW3006 flags index-derived identity; EW3007 (no-hook-names) flags useX names. EW3003 also catches a slot held in a local and run once.

Renderer

Single-element content keeps no comment markers, event handlers no longer allocate a scope each, attribute reconciliation is a single pass, and teardown under a removed ancestor skips per-node work. On the 1000-row benchmark, mount went from 35.3 to 30.6 ms and removing all rows from 16.8 to 9.9 ms.

Tooling

npm run build:js writes each package to dist.next and renames it into place, so linked consumers never see a half-written dist. Evaluate-only renderer specs run under happy-dom in tests/unit; only browser-dependent behavior stays in Playwright. AUTHORING.md documents the new APIs, the make* naming convention, domMount timing and the no-hooks rule, and every snippet compiles in authoring-guide.typecheck.tsx.

All 15 npm packages share version 0.8.0. The Effect peer remains effect@4.0.0-rc.112. Native compiler packages support glibc Linux x64/arm64, macOS x64/arm64, and Windows x64.

Packaging

The release workflow verified all platforms and published all 15 packages with npm provenance.

EffectWeb 0.7.0

Choose a tag to compare

@DerpyCrabs DerpyCrabs released this 29 Sep 16:49

EffectWeb 0.7.0 moves server data into a separate @effectweb/query package built around one kind of cached query, and adds owned commands to lifetime().

Breaking changes and migration

  • Install @effectweb/query and import query, queryGroup, infiniteQuery, infiniteResource, makeQueryCache, scopedQueryCache, observeQuery, and their types from it. available and resourceError remain in effectweb.
  • resourceComponent is removed. Define a query, whose identity is every argument, and read it in the view with observe(querySource(cache, query, args), render). Loaders take services from the cache runtime, makeQueryCache(uiRuntime(context)), not from props or closures.
  • pages, its model and message types, and UiPage are removed from effectweb/advanced. Paginate with infiniteQuery: views read it through querySource and load pages with fetchNextPage; controllers use infiniteResource.
  • scopedQueryCache moved from effectweb/advanced to @effectweb/query.
  • fromPromise is removed. Adapt Promise APIs at their boundary with Effect.tryPromise.
  • The effectweb/query-key lint (EW2002) checks query imported from @effectweb/query.

Additions and fixes

  • querySource(cache, query, args) returns a live, cached source for views. Equal arguments share one source, which loads while observed and is released when the last observer leaves. It also accepts infinite queries.
  • fetchNextPage(cache, query, args) and retryPage(...) load infinite-query pages from event handlers and commands.
  • lifetime() owns commands like modelOwner: run, cancel, isRunning, awaitIdle, and close.
  • programView accepts beforeDispose to capture DOM state before its child is disposed.
  • modelOwner.read() includes writes accepted while a command is starting.
  • protectSnapshot is available from effectweb/advanced for adapter authors.
  • Render-safety lint checks callback props passed to components, and accepts functions supplied through the view's model, whose closures are checked where they are created.
  • Identity lint (EW3001) treats literal tuples and records, such as [['id', 'Label']].map(...), as fixed rows.

All 15 npm packages share version 0.7.0; @effectweb/query is new. The Effect peer remains effect@4.0.0-rc.112. Native compiler packages support glibc Linux x64/arm64, macOS x64/arm64, and Windows x64.

Packaging

The release workflow verified all platforms and published 14 packages with npm provenance. @effectweb/query was published once from the maintainer's machine, because npm trusted publishing requires an existing package.

EffectWeb 0.6.0

Choose a tag to compare

@DerpyCrabs DerpyCrabs released this 29 Sep 09:17

EffectWeb 0.6.0 simplifies the public authoring API, adds identity diagnostics, and improves routing and test utilities.

Breaking changes and migration

  • Import recommended application APIs from effectweb. Specialized APIs such as listView, lazyView, projectionSource, shareValue, scopedQueryCache, pages, and defineField now live in effectweb/advanced.
  • Replace the former per-module subpaths (effectweb/program, /source, /cache, /session, /form, and others) with the root or advanced entry point. effectweb/testing, /jsx, /jsx-runtime, /jsx-dev-runtime, and the compiler-facing /dom remain available.
  • Replace UiLoad with Effect.Effect, loadEffect with Effect.suspend, and application-specific cachedLoad/httpJson helpers with application-owned code using Effect.
  • Replace taskComponent, taskControls, and keyedTasks with defineTasks, owned commands, and stable command slots. Use commandSlots(name) for work keyed by domain identity.
  • Replace queryResource with observeQuery(owner, cache, query, changed). lifetime() now implements resource ownership through own().
  • Use native input event handlers instead of the removed inputText, inputChecked, and inputNumber wrappers. submit remains available.

The package includes AUTHORING.md, a tested guide to choosing APIs, owning work, and rendering immutable snapshots.

Additions and fixes

  • clock(interval) publishes time while observed; commandSlots(name) provides stable per-key command identities.
  • renderView in effectweb/testing mounts fixed-input views, records messages, and supports model updates and cleanup.
  • createLink(router) in @effectweb/tanstack-router provides typed anchors, active/disabled state, and in-place navigation. External destinations, modified clicks, and downloads retain native browser behavior.
  • DOM setup functions may return nothing, with cleanup and close semantics preserved.
  • Optional effectweb/identity lint warns about positional stateful rows, unstable DOM setup callbacks, fresh command slots, and sources created during render (EW3001–EW3004).
  • Render-safety lint checks list and slot callbacks and reports multiple independent issues. It checks work evaluated when selecting an observed source while allowing stable controller source references.
  • Identity diagnostics catch filtered, sliced, conditional, and spread-derived rows whose positions can shift.

All 14 npm packages share version 0.6.0. The Effect peer remains effect@4.0.0-rc.112. Native compiler packages support glibc Linux x64/arm64, macOS x64/arm64, and Windows x64.

Packaging

The six adapter packages include a packaging-only follow-up adding the repository metadata required by npm provenance. Runtime and compiler code are unchanged from the v0.6.0 tag. The completed release workflow verifies all platforms and publishes the remaining packages without replacing existing versions.

EffectWeb 0.5.1

Choose a tag to compare

@DerpyCrabs DerpyCrabs released this 28 Sep 16:20

EffectWeb 0.5.1 adds reusable library adapters and fixes form, authentication, and native select behavior.

  • New packages: @effectweb/tanstack-router, @effectweb/tanstack-form, @effectweb/tanstack-table, @effectweb/keycloak, @effectweb/antd-icons, and @effectweb/json-render.
  • JSON rendering uses consumer-defined catalogs and registries. Application components, styling, and action policy remain in the consumer.
  • Form reset cancels pending submissions without allowing old validation or completion to affect the new draft.
  • Keycloak refresh errors are observable and no longer force logout after temporary network failures.
  • Infinite queries support freshness and unused-query policies for both aggregate and page queries.
  • Native selects preserve explicit empty option values.
  • All adapters participate in versioning, packaging, and release validation.

Lucide import migration: the root icon barrel has been removed. Replace import { Camera } from '@effectweb/lucide' with import Camera from '@effectweb/lucide/icons/camera'. Shared types are available from @effectweb/lucide/types. This prevents development servers from loading the entire icon catalog.

The runtime still requires effect@4.0.0-rc.112. Native compiler packages cover glibc Linux x64/arm64, macOS x64/arm64, and Windows x64.

EffectWeb 0.5.0

Choose a tag to compare

@DerpyCrabs DerpyCrabs released this 11 Sep 19:20

EffectWeb 0.5.0 adds scoped rendering for Effect applications and fixes resource ownership across mounting, queries, and UI operations.

  • Create applications with mount, makeUiRuntime, makeProgram, and makeModelOwner; capture services in view setup, event handlers, and DOM bindings.
  • Observe existing Effect streams, SubscriptionRefs, and atoms through Source, with explicit projections and independently subscribed view regions.
  • Use memoView and listView to skip unchanged view evaluations through explicit input comparisons.
  • Encode non-plain query arguments and pagination cursors explicitly, and use the captured Effect clock for cache freshness.
  • Join asynchronous cleanup on cancellation and closure, preserve failure exits, and handle reentrant query selection and unmounting correctly.
  • Keep the minimal renderer within the existing 18 KB gzip budget; optional render-safety lint remains available.

The runtime, compiler, Lucide package, and all five native compiler packages are released together at 0.5.0. Effect remains a peer dependency, pinned to 4.0.0-rc.112.

Validation: 583 unit tests, 123 browser tests, compiler tests, type/lint checks, bundle-size checks, example build, and clean installed-package smoke tests.

Release checks passed on all supported platforms.

EffectWeb 0.3.1

Choose a tag to compare

@DerpyCrabs DerpyCrabs released this 10 Sep 14:18

EffectWeb 0.3.1 strengthens compiler safety, component ownership, and asynchronous resource handling.

  • Unify compiler purity, dependency, and ownership checks in one semantic analysis. Track reads and effects through local helpers, arguments, destructuring, and callbacks, and reject unproven render calls.
  • Validate native methods and compiled slots at runtime. Reject snapshot accessors before invoking them.
  • Add cache retention and cancellation policies, grouped invalidation, shared infinite queries, and per-key task scheduling with observable outcomes.
  • Await owned resource finalizers during shutdown and improve structural sharing for large collections.
  • Improve component input reconciliation, local state, and command ownership. Add mapTransition and recoverable errorBoundary composition.
  • Align Vite and Oxlint file handling and add compiler equivalence tests in development and production.

Upgrade runtime and compiler together. Render helpers imported from application modules now need an audited pureImports contract in both compiler/Vite and Oxlint options, or should be evaluated outside render and passed as immutable model data. Contracts promise no observable effects, ambient reads, input mutation, or eager execution of unchecked callbacks. Plain snapshot data must use values rather than getters or setters.

Validated with 513 unit tests, nine Rust tests, 91 Chromium tests, bundle limits, and clean-package production tests. All five local consumers were also validated; LocalChat retains 13 platform-specific skips.

Runtime, compiler, Lucide, and all five native compiler packages are released together as 0.3.1. Effect 4.0.0-rc.112 remains the runtime peer dependency.

Release checks passed on all supported platforms.

EffectWeb 0.3.0

Choose a tag to compare

@DerpyCrabs DerpyCrabs released this 08 Sep 21:26

EffectWeb 0.3.0 adds recursively immutable snapshots, explicit command ownership, and broader native JSX support.

  • Protect published plain data in every build. Preserve readonly types across views, collections, tasks, forms, and query results.
  • Use typed command slots and explicit concurrency policies, including queued writes and keeping only the newest pending save.
  • Derive query identity from all request arguments. Add shared-cache writes while keeping query definitions and cache internals opaque.
  • Add lazy views and custom HTML/SVG portal targets. Expand native event and SVG declarations and support typed custom elements.
  • Fix compiler dependency tracking, DOM ownership, input restoration, and cleanup during asynchronous or reentrant updates.
  • Update the public examples to the current API.

Validated with 356 unit tests, nine Rust tests, 66 Chromium tests, bundle limits, clean-package production tests, and the standard test suites and builds of all five local consumers.

Runtime, compiler, Lucide, and all five native compiler packages are released together as 0.3.0. Effect 4.0.0-rc.112 remains the runtime peer dependency.

Release checks passed on all supported platforms.

EffectWeb 0.2.3

Choose a tag to compare

@DerpyCrabs DerpyCrabs released this 06 Sep 17:27

EffectWeb 0.2.3 improves compiler output and reduces the common program's runtime dependencies while preserving the full Effect command API.

  • Compile static DOM structures into reusable templates, with native construction for HTML parser edge cases.
  • Reduce snapshot closure allocations and redundant component prop caches while preserving snapshot semantics, Effect-returning events, and dynamic content lifetimes.
  • Publish program snapshots directly without a per-program Atom registry. Commands, streams, cancellation, subscriptions, and idle tracking remain supported.
  • Improve copied-array mutation diagnostics and DOM class/list updates.

The EffectWeb-only js-framework-benchmark rerun reduced Brotli size from 27.0 to 14.6 KiB. Median selection improved by 31% and clearing by 24%. Some CPU timings increased slightly. LocalChat's measured heap use fell about 26%; full-application timings remained sensitive to run order.

Validated with 181 unit tests, 37 framework browser tests, clean package installation, and regression suites for TeleVecha, Inbox, and LocalChat. The release workflow also builds and checks all five supported native compiler targets.

Runtime, compiler, Lucide, and native compiler packages are released together as 0.2.3. The runtime continues to require Effect 4.0.0-rc.112.

EffectWeb 0.2.2

Choose a tag to compare

@DerpyCrabs DerpyCrabs released this 05 Sep 22:50
  • Add collection(identity).share(previous, next) to preserve unchanged entities across insertion, deletion and reorder.
  • Add field-specific sharing strategies to shareValue.
  • Add a share option to query definitions.

Runtime, compiler, Lucide and native compiler packages are published as 0.2.2.

EffectWeb 0.2.1

Choose a tag to compare

@DerpyCrabs DerpyCrabs released this 05 Sep 21:24

EffectWeb 0.2.1 consolidates query ownership and adds compact controller task declarations. It also includes the authoring, compiler diagnostics, and immutable snapshot improvements developed across TeleVecha, LocalChat, and Inbox since 0.1.1.

  • Query callbacks can change selection, reset the cache, or dispose without delivering stale results or losing subscription cleanup.
  • modelOwner, observeQuery, and defineTasks(owner, definitions) share existing Effect execution and lifetime rules. Controller task arguments and service requirements remain inferred.
  • pages(definition).create(props) uses the same pagination reducer as components. Equivalent input reconciliation preserves model identity.
  • The Oxc compiler supports destructured view inputs and provides Oxlint diagnostics through @effectweb/compiler/oxlint.
  • Development Vite builds detect mutation of published plain snapshot data. Production builds retain immutable snapshots without the development checks.
  • List updates avoid unnecessary movement planning when retained identities remain in order. Unused compiled views can be removed by the bundler.

Upgrade runtime, compiler, Lucide, and native packages together to 0.2.1. Use effectweb() from @effectweb/compiler/vite, compile() for direct compilation, and makeQueryCache() for query caches. Legacy compiler/cache aliases and the resource, pagedResource, and makePagedResource helpers are removed. Use typed queries and queryResource/observeQuery, or pages for pagination.

Validation: 156 framework unit tests, nine Rust tests, 28 framework browser tests, packed-package consumption and all five native platform jobs passed. TeleVecha passed 301 unit and 302 browser tests; LocalChat passed 28 unit and 23 browser tests with 13 existing skips; Inbox passed 21 unit and 37 browser tests.

The 0.2.0 workflow stopped at a stale test-file path before any npm publication. This release fixes that workflow; no 0.2.0 packages were published.