datastar
A Nim SDK for https://data-star.dev
Summary
| Latest Version | 0.2.1 |
|---|---|
| License | MIT |
| CI Status | Failing |
| Downloads | 0 |
| Last Indexed | 2026-07-21 05:27 |
Tags
Authors
- YuryKL
Installation
nimble install datastar
choosenim install datastar
git clone https://github.com/YuryKL/datastar.nim
OS Compatibility
| Platform | Linux | macOS | Windows | FreeBSD | OpenBSD | NetBSD | Android | iOS | WASM | Embedded |
|---|---|---|---|---|---|---|---|---|---|---|
| datastar | ✓ | ✓ | ✓ | - | - | - | - | - | - | - |
Dependencies
| Package | Version | Optional |
|---|---|---|
| nim >= | 2.2.6 | No |
Source
| Repository | https://github.com/YuryKL/datastar.nim |
|---|---|
| Homepage | https://github.com/YuryKL/datastar.nim |
| Registry Source | nimble_official |
README
datastar.nim
A Nim SDK for Datastar - the hypermedia framework.
Installation
nimble install datastar
Usage
Basic Example with std/asynchttpserver
import std/[asyncdispatch, asynchttpserver]
import datastar
import datastar/asynchttpserver as DATASTAR
proc handler(req: Request) {.async.} =
let sse = await req.newSSEGenerator() ; defer: req.closeSSE()
await sse.patchElements("<div id=\"hello\">Hello World</div>")
proc main() {.async.} =
var server = newAsyncHttpServer()
server.listen(Port(8080))
while true:
if server.shouldAcceptRequest():
await server.acceptRequest(handler)
else:
await sleepAsync(100)
waitFor main()
Patch Elements
# Basic element patch
await sse.patchElements("<div>Content</div>")
# With selector and mode
await sse.patchElements("<div>Content</div>", selector="#target", mode=Append)
# With view transitions
await sse.patchElements("<div>Content</div>", useViewTransition=true)
Patch Signals
import std/json
# From JsonNode
await sse.patchSignals(%*{"count": 1, "name": "test"})
# Only if missing
await sse.patchSignals(%*{"count": 0}, onlyIfMissing=true)
Execute Script
# Auto-remove after execution (default)
await sse.executeScript("console.log('hello')")
# Keep script in DOM
await sse.executeScript("window.myFunc = () => {}", autoRemove=false)
# With custom attributes
import std/tables
await sse.executeScript("...", attributes={"type": "module"}.toTable)
Remove Elements
await sse.removeElements("#target")
await sse.removeElements(".items", useViewTransition=true)
Remove Signals
await sse.removeSignals(@["count", "name"])
Read Signals
# GET requests - extracts 'datastar' query parameter
let signals = readSignals(request.url.query)
echo signals["count"].getInt
# POST/PUT/etc - parse JSON body directly
let signals = readSignalsFromBody(request.body)
# Typed API - returns struct
type MySignals = object
count: int
name: string
let signals = readSignals(request.url.query, MySignals)
echo signals.count # Typed access
# From POST body (typed)
let signals = readSignalsFromBody(request.body, MySignals)
# Custom deserializer (e.g., jsony)
import jsony
let signals = readSignals(request.url.query, proc(s: string): MySignals = s.fromJson(MySignals))
Framework Adapters
std/asynchttpserver
import datastar/asynchttpserver as datastarAsync
proc handler(req: Request) {.async.} =
let sse = await req.newSSEGenerator()
defer: req.closeSSE()
# ...
Prologue
import datastar/prologue as datastarPrologue
proc handler(ctx: Context) {.async.} =
let sse = await ctx.newSSEGenerator()
defer: ctx.closeSSE()
# ...
Examples
Run the counter example:
nim c -r examples/counter.nim
Then open http://localhost:8080 in your browser.
Running Tests
The SDK includes golden tests that match the official Datastar SDK test suite.
# Run all tests
nim c -r test/test_golden.nim
# Or using nimble
nimble test
License
MIT