packages feed

datastar-hs-0.1.0.0: src/Hypermedia/Datastar.hs

-- |
-- Module      : Hypermedia.Datastar
-- Description : Haskell SDK for building real-time hypermedia apps with Datastar
--
-- <https://data-star.dev/ Datastar> is a hypermedia framework: instead of
-- building a JSON API and a JavaScript SPA, you write HTML on the server and
-- let Datastar handle the interactivity. The browser sends requests, the
-- server holds the connection open as a server-sent event (SSE) stream, and
-- pushes HTML fragments, signal updates, or scripts back to the browser as
-- things change.
--
-- This SDK provides the server-side Haskell API. It builds on
-- <https://hackage.haskell.org/package/wai WAI> so it works with Warp, Scotty,
-- Servant, Yesod, or any other WAI-compatible framework.
--
-- === Minimal example
--
-- @
-- import Hypermedia.Datastar
-- import Network.Wai (Application, responseLBS, requestMethod, pathInfo)
-- import Network.Wai.Handler.Warp qualified as Warp
-- import Network.HTTP.Types (status404)
--
-- app :: Application
-- app req respond =
--   case (requestMethod req, pathInfo req) of
--     (\"GET\", [\"hello\"]) ->
--       respond $ sseResponse $ \\gen ->
--         sendPatchElements gen (patchElements \"\<div id=\\\"msg\\\"\>Hello!\<\/div\>\")
--     _ ->
--       respond $ responseLBS status404 [] \"Not found\"
--
-- main :: IO ()
-- main = Warp.run 3000 app
-- @
--
-- === Module guide
--
-- * "Hypermedia.Datastar.PatchElements" — send HTML to morph into the DOM
-- * "Hypermedia.Datastar.PatchSignals" — update the browser's reactive signals
-- * "Hypermedia.Datastar.ExecuteScript" — run JavaScript in the browser
-- * "Hypermedia.Datastar.WAI" — SSE streaming, signal decoding, request helpers
-- * "Hypermedia.Datastar.Types" — protocol types and defaults
--
-- === Further reading
--
-- * <https://data-star.dev/ Datastar homepage> — guides, reference, and examples
-- * <https://github.com/carlohamalainen/datastar-hs-examples Examples repository> — full working Haskell examples
-- * <https://cljdoc.org/d/dev.data-star.clojure/http-kit/1.0.0-RC7/doc/sdk-docs/using-datastar Clojure SDK docs> — excellent Datastar walkthrough that applies across SDKs
module Hypermedia.Datastar
  ( -- * Types
    EventType (..)
  , ElementPatchMode (..)
  , ElementNamespace (..)

    -- * Patch Elements
  , PatchElements (..)
  , patchElements
  , removeElements

    -- * Patch Signals
  , PatchSignals (..)
  , patchSignals

    -- * Execute Script
  , ExecuteScript (..)
  , executeScript

    -- * WAI
  , ServerSentEventGenerator
  , sseResponse
  , sendPatchElements
  , sendPatchSignals
  , sendExecuteScript
  , readSignals
  , isDatastarRequest
  )
where

import Hypermedia.Datastar.ExecuteScript (ExecuteScript (..), executeScript)
import Hypermedia.Datastar.PatchElements (PatchElements (..), patchElements, removeElements)
import Hypermedia.Datastar.PatchSignals (PatchSignals (..), patchSignals)
import Hypermedia.Datastar.Types (ElementNamespace (..), ElementPatchMode (..), EventType (..))
import Hypermedia.Datastar.WAI
  ( ServerSentEventGenerator
  , isDatastarRequest
  , readSignals
  , sendExecuteScript
  , sendPatchElements
  , sendPatchSignals
  , sseResponse
  )