Releases: bcdev/remotestate
Releases · bcdev/remotestate
Release list
0.3.3
Version 0.3.3
-
Improved usability of the Python
Storeclass:- Introduced public protocol
StoreAtnow returned fromStore.atinstead of internal_StoreAttype. - Added
StoreAt.valueread-only property to access the value of a node returned byStore.at.
- Introduced public protocol
-
The Python
ServeResultclass now renders as an HTML table in notebooks.
0.3.2
0.3.1
Changes in 0.3.1
- Relaxed remotestate Python library dependencies:
- fastapi >=0.136,<1
- uvicorn >=0.46,<1
Full Changelog: v0.3.0...v0.3.1
0.3.0
Changes in 0.3.0
Python library
Storenow accepts any root state value, exposes it through the typed
stateproperty, and supports root reads/writes with the empty path.Store.get()now defaults to the root state value when no path is passed.- Removed the built-in
Service.get()query andService.set()action.
Store reads and writes now use dedicatedget/setprotocol messages, while
service actions and queries are reserved for domain methods. Serviceis now generic over the root state type, soservice.store
preserves theStore[T]type.- Added notebook-friendly
Store.__getitem__()andStore.__setitem__()
aliases:store["items[0].label"]uses RemoteState string path syntax.store["items", 0, "label"]uses tuple path segments.store[()]addresses the root state value.
- Added notebook-friendly
store.atsugar for nested store paths:store.at.items[0].label = "x"writes throughStore.set().- evaluating
store.at.items[0].labelin notebooks renders the current
stored value instead of the path accessor object.
- Relaxed the path grammar so the empty string addresses the root value and
paths may start with a bracketed array index or string key, such as
[0].labelor["display name"].value. - Updated JSONPath conversion helpers so
""maps to$and[0]maps to
$[0]. - Added public
PathInputandPathSegmentInputaliases plus
normalize_path()andnormalize_path_segment()helpers under
remotestate.path. - Removed the Python-only
PropertyandIndexparsed path segment classes.
Parsed paths now use primitive tuple segments, such as("items", 0, "label"), matching the TypeScript path model. - Aligned
PathInputwith TypeScript: pass a string path or a sequence of
path segments. Root array entries can be addressed as"[0]"or(0,). - Changed the WebSocket protocol to carry normalized path arrays instead of
path strings. Store update results now use[{path, value}]entries instead
of path-to-value objects.
TypeScript library
- Relaxed the shared path grammar so the empty string addresses the root value
and paths may start with a bracketed array index or string key, such as
[0].labelor["display name"].value. - Changed
Pathfrom a non-empty tuple type to a general segment array so
[]represents the root state value. - Removed the redundant
RelativePathexport;Pathis now the single parsed
segment-array type. Store.get()anduseRemoteStateValue()now default to the root state value
when no path is passed.Store.set()now uses a dedicated storesetprotocol message and receives
set_resultupdates instead of dispatching a service action namedset.- Updated the transport-backed store cache so root subscriptions overlap all
descendant updates, root updates materialize cached descendants, and leaf
updates can patch cached root snapshots. - Renamed the public path input alias from
PathLiketoPathInput, and added
PathSegmentInputfor raw segment values.
Full Changelog: v0.2.0...v0.3.0
0.2.0
Changes in version 0.2.0
Python package
- Tightened the shared path grammar to a strict JSONPath subset without the
$.prefix:- Root paths must start with an identifier.
- Later segments may use dotted identifiers, bracketed integer indices, or
bracketed string keys. - Bracketed string keys may use either single or double quotes; formatting
stays canonical with double quotes. - Invalid paths now fail explicitly instead of silently returning a parsed
prefix.
- Added
format_path()as the public Python path formatter. - Updated parser docstrings, README examples, and path tests to match the
shared grammar. - Added
twineto dev-dependencies. - Changed member names in the
Serviceclass:init_appto_init_appget_statetogetset_statetosetupdate_tasktonotify
- Added
__version__attribute to main package. - Exposed the
pathsubmodule from the package root and movedPath,
PathSegment,Property, andIndexunderremotestate.path. - Changed the
Storedefault factory API:- Renamed the keyword argument from
default_value_factoryto
default_factory. - The factory now receives a parsed
Pathtuple instead of a path string.
- Renamed the keyword argument from
- Changed store update notifications to emit only the exact paths written by
Store.set(), instead of also including all parent prefixes. - Broadcast Python-side
Store.set()updates to connected WebSocket clients
even when the mutation did not originate from a JavaScript action. - Changed signature and behavior of
serve()function:- Replaced
open_browserandopen_iframewith a genericdisplay
parameter. serve()now returns aServeResultwith resolved server, WebSocket,
and UI URLs.- Renamed
iframe_heighargument intoheight, and addedwidth. - It is no longer using FastAPI/Uvicorn default
logging. Instead, all server logs are written toserver.log
and logging to stdout/stderr is suppressed.
- Replaced
TypeScript package
- Tightened the shared path grammar to a strict JSONPath subset without the
$.prefix:- Root paths must start with an identifier.
- Later segments may use dotted identifiers, bracketed integer indices, or
bracketed string keys. - Bracketed string keys may use either single or double quotes; formatting
stays canonical with double quotes. - Invalid paths now fail explicitly instead of silently returning a parsed
prefix.
- Added
normalizePath()as the public path validator/normalizer. - Updated parser docstrings, README examples, and path tests to match the
shared grammar. - Supporting optional remote backend with local state fallback:
- Added
fallback?: () => RemoteStateClienttoRemoteStateProvider. - Added
client?: RemoteStateClientsupport toRemoteStateProvider. - Removed
active?: booleanfromRemoteStateProvider. - Removed
useOptionalRemoteStateClient<S>(); hooks now always require a
provider with eitherurl,client, orfallback. createRemoteStateClient()now requires an explicit URL.- Added
createLocalStateClient()to wrap local stores and
action/query handlers as fallback clients. - Updated docs with:
- a basic counter RemoteState usage example
- an optional remote backend/local client fallback example
- root README references to
RemoteStateProvider
- Added
- Slimmed store update handling:
- The client now accepts exact changed paths from
action_resultupdates
instead of requiring redundant parent-prefix payloads. - Cached parent and child snapshots are reconciled locally when related
paths update. - Subscribed parent and child snapshots are now materialized from related
exact-path updates souseRemoteStateValue()rerenders for subpath
changes. Store.subscribe()now takes a required path first:
subscribe(path, listener).
- The client now accepts exact changed paths from
- Improved TypeScript package build output:
- Split library, Node/Vite config, and ESLint TypeScript projects.
- Clean
distbefore rebuilding to prevent stale artifacts. - Keep API docs in the bundled
.d.tsfile while stripping JSDoc blocks
from the bundled runtime JavaScript. - Ensure the library bundle externalizes React peer dependencies and avoids
publishing test/dev-only artifacts.
- Refactorings:
- Renamed
RemoteStatetoRemoteStateClient. - Renamed
RemoteStateOptionstoRemoteStateClientOptions. - Renamed
createRemoteStatetocreateRemoteStateClient. - Renamed
useRemoteStatetouseRemoteStateClient.
- Renamed
Full Changelog: v0.1.0...v0.2.0