Releases: DerpyCrabs/EffectWeb
Release list
EffectWeb 0.8.0
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
@jsxImportSourcepragma names another runtime. A view file that imported only sibling components used to be skipped and then fail inside the bundler. TheallJsxcompiler and lint option is removed. classNameis removed; writeclass.renderListis removed; importlist.defineTasks(owner, definitions)is nowownedTasks(owner, definitions);defineTaskskeeps only the component builder form.program,modelOwneranddefineTasksno longer acceptname; it only fed the removed tracing.- Removed from
effectweb/advanced:mapTransition,mapCommand,defineFieldand the field types,observeBindings,inspectBindings,mountBindingInspector,observePrograms,fromStream,fromAtom,fromSubscriptionRef,makeDomMount,makeDomBinding,makeEffectHandler. Pass auiRuntime(context)todomMount,domBindingandeffectEventfor services; observe streams and atoms from a controller that publishes into amodelOwner. - 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 withshare.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 throughuse={handle.mount}andhandle.element().ownedTasks(owner, { save: { run, policy } })binds named actions to an owner's slots.commandSlotsreleases keys nobody references any more, so long-lived applications do not accumulate one slot per entity.- Lint: EW3004 covers
collectionandcommandSlotscreated inside a view; EW3005 flagssequencerows with editable controls or filtered components; EW3006 flags index-derived identity; EW3007 (no-hook-names) flagsuseXnames. 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
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/queryand importquery,queryGroup,infiniteQuery,infiniteResource,makeQueryCache,scopedQueryCache,observeQuery, and their types from it.availableandresourceErrorremain ineffectweb. resourceComponentis removed. Define aquery, whose identity is every argument, and read it in the view withobserve(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, andUiPageare removed fromeffectweb/advanced. Paginate withinfiniteQuery: views read it throughquerySourceand load pages withfetchNextPage; controllers useinfiniteResource.scopedQueryCachemoved fromeffectweb/advancedto@effectweb/query.fromPromiseis removed. Adapt Promise APIs at their boundary withEffect.tryPromise.- The
effectweb/query-keylint (EW2002) checksqueryimported 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)andretryPage(...)load infinite-query pages from event handlers and commands.lifetime()owns commands likemodelOwner:run,cancel,isRunning,awaitIdle, andclose.programViewacceptsbeforeDisposeto capture DOM state before its child is disposed.modelOwner.read()includes writes accepted while a command is starting.protectSnapshotis available fromeffectweb/advancedfor 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
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 aslistView,lazyView,projectionSource,shareValue,scopedQueryCache,pages, anddefineFieldnow live ineffectweb/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/domremain available. - Replace
UiLoadwithEffect.Effect,loadEffectwithEffect.suspend, and application-specificcachedLoad/httpJsonhelpers with application-owned code using Effect. - Replace
taskComponent,taskControls, andkeyedTaskswithdefineTasks, owned commands, and stable command slots. UsecommandSlots(name)for work keyed by domain identity. - Replace
queryResourcewithobserveQuery(owner, cache, query, changed).lifetime()now implements resource ownership throughown(). - Use native input event handlers instead of the removed
inputText,inputChecked, andinputNumberwrappers.submitremains 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.renderViewineffectweb/testingmounts fixed-input views, records messages, and supports model updates and cleanup.createLink(router)in@effectweb/tanstack-routerprovides 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/identitylint 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
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
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, andmakeModelOwner; capture services in view setup, event handlers, and DOM bindings. - Observe existing Effect streams,
SubscriptionRefs, and atoms throughSource, with explicit projections and independently subscribed view regions. - Use
memoViewandlistViewto 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.
EffectWeb 0.3.1
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
mapTransitionand recoverableerrorBoundarycomposition. - 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.
EffectWeb 0.3.0
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.
EffectWeb 0.2.3
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
- Add
collection(identity).share(previous, next)to preserve unchanged entities across insertion, deletion and reorder. - Add field-specific sharing strategies to
shareValue. - Add a
shareoption to query definitions.
Runtime, compiler, Lucide and native compiler packages are published as 0.2.2.
EffectWeb 0.2.1
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, anddefineTasks(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.