datastar

A Nim SDK for https://data-star.dev

Pure Nim score 15/100 · tests present · no docs generated

Summary

Latest Version 0.2.1
License MIT
CI Status Failing
Downloads 0
Last Indexed 2026-07-21 05:27

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