Build type-safe web apps with PureScript.

Overview

PUX

Build type-safe web applications with PureScript.

Documentation | Examples | Chat

Latest Release ComVer Build Status Gitter Chat

Pux is a PureScript library for building web applications. Interactive UI is modeled as a single state transition function, Event -> State -> (State, HTML) which is run for every event. Pux also provides tooling such as:

  • Isomorphic routing and rendering
  • Hot reloading
  • Render to React (or any virtual DOM library)
  • Time-travelling debug extension

Quick start

The starter app provides everything you need to get started:

git clone git://github.com/alexmingoia/pux-starter-app.git my-awesome-pux-app
cd my-awesome-pux-app
npm install
npm start

Example

The following chunk of code sets up a basic counter that can be incremented and decremented:

module Main where

import Prelude hiding (div)
import Control.Monad.Eff (Eff)
import Pux (CoreEffects, EffModel, start)
import Pux.DOM.Events (onClick)
import Pux.DOM.HTML (HTML)
import Pux.Renderer.React (renderToDOM)
import Text.Smolder.HTML (button, div, span)
import Text.Smolder.Markup (text, (#!))

data Event = Increment | Decrement

type State = Int

-- | Return a new state (and effects) from each event
foldp ::  fx. Event -> State -> EffModel State Event fx
foldp Increment n = { state: n + 1, effects: [] }
foldp Decrement n = { state: n - 1, effects: [] }

-- | Return markup from the state
view :: State -> HTML Event
view count =
  div do
    button #! onClick (const Increment) $ text "Increment"
    span $ text (show count)
    button #! onClick (const Decrement) $ text "Decrement"

-- | Start and render the app
main ::  fx. Eff (CoreEffects fx) Unit
main = do
  app <- start
    { initialState: 0
    , view
    , foldp
    , inputs: []
    }

  renderToDOM "#app" app.markup app.input

Benchmarks

Table of benchmarks comparing rendering speed of similar libraries

Why is Pux slow?

Pux has not focused on performance yet. The slow performance arises from translating Pux's (smolder) virtual DOM to React's virtual DOM. The goal is to write a purescript virtual DOM module for smolder, which would avoid that translation step and could be optimized for a monadic datastructure. I suspect this would achieve performance on par with Halogen.

Below are the render steps for the other libraries compared, which shows that Pux is the only one that has an intermediate virtual DOM representation (it has to render to React first then React has to render):

  • Elm = Virtual DOM -> DOM patch
  • React = Virtual DOM -> DOM patch
  • Thermite = Virtual DOM -> DOM patch
  • Halogen = Virtual DOM -> DOM patch
  • Pux = Smolder Markup -> React Virtual DOM -> DOM patch
Comments
  • Inter-component communication?

    Inter-component communication?

    I'm trying to translate some Elm tutorials into Pux, but currently getting stuck with inter-component communication: https://github.com/evancz/elm-architecture-tutorial/#example-4-a-fancier-list-of-counters.

    I'm struggling with how to get the child to communicate with the parent. In javascript, I could just pass a callback to the child. In Elm, they have the notion of addresses, for decoupled communication. I'm wondering how to do this in a typesafe way, without cyclical dependencies?

    Thanks from an FP beginner :)

    opened by stratospark 20
  • How to share global state?

    How to share global state?

    I'm writing a somewhat extensive app using Pux (currently around 20 components, but likely to be 200 or more). Basically, it's typical app but goes well beyond the relatively simple (but elegant) example apps that currently exist like #https://github.com/spicydonuts/pux-rock-paper-scissors.

    To give you an idea, my app implements nested routes as discussed here #https://github.com/alexmingoia/purescript-pux/issues/59. It has a structure very similar to this:

    ├── Application │ ├── Repository │ │ ├── Issues │ │ │ ├── IssueList.purs │ │ │ └── NewIssue.purs │ │ └── Issues.purs │ └── Repository.purs └── Application.purs

    For various reasons there are certain values that would be useful to share throughout most of the app. For example a user id, name and authentication token. (But also, conceivably numerous run time configuration options). The only way I can see to do this is by explicitly passing these values through Actions which seems quite clumsy and verbose?

    I'm aware of purescript-refs although I'm not quite sure how to use it. Might that be a reasonable solution?

    Am I missing something else?

    discussion 
    opened by simg 19
  • Avoid unnecessary vdom creation

    Avoid unnecessary vdom creation

    This was discussed on the Gitter channel. Since the output of Pux is 1 React component there is no place to use React's shouldComponentUpdate and thus avoid constructing vdom elements. Alex has suggested thunkifying the views which would allow deferring running them similarly to how React avoids running render.

    Some questions:

    • What does React put in the vdom when shouldComponentUpdate returns false? • How can views be thunkified without requiring the user to add something to their code?

    enhancement 
    opened by dkoontz 17
  • Documentation improvements

    Documentation improvements

    The documentation could always be better. I'd like this issue to be an open-ended discussion on the documentation.

    • How can existing documentation be improved?
    • What is missing from the docs?
    • What is confusing about the docs?

    Todo

    • [ ] Add note about using EXCEPTION effect because Pux's start / CoreEffects is already parametized with it.
    enhancement 
    opened by alexmingoia 14
  • Using JS React components

    Using JS React components

    I had looked around for information about using Pux with existing React components but was not successful in finding anything. I have an existing React system and I'd like to start converting it over bit by bit into Purescript. Is there an existing way to have a view render existing components including passing down props? If not, where would be a good place to look to add such functionality?

    enhancement 
    opened by dkoontz 14
  • Components

    Components

    Does Pux need them? What would the API look like? Most importantly, what problem(s) do components solve?

    A component is commonly understood as an encapsulation of model-view-update. Essentially, a Pux application can be seen as a single component.

    The reason I opened this issue is that multiple people have asked me about components in Pux. Unfortunately, there's no clear definition of what people mean by components, and it's not clear what problems they're actually looking to solve with such an abstraction.

    opened by alexmingoia 13
  • pattern match failure, crossed-wire?

    pattern match failure, crossed-wire?

    Hi,

    I'm experimenting with pux in a public project. Its just pretty much a pux app with a bunch of small demos of increasing complexity. One of them is an AJAX-backed list. I have a component for the AJAXList and a child component for the AJAXListItem, and the Action for AJAXList is partly composed of child actions for AJAXListItem, which seems pretty standard. Interestingly, in the AJAX list case, firing an item's Delete action should get wrapped in the parent's ItemAction constructor, but it actually results in a pattern match failure. It almost seems like the wrong signal is being provided to the wrong component.

    Here's how you'd repro it:

    git clone https://github.com/MichaelXavier/pux-scrapyard.git --branch rest
    cd pux-scrapyard
    npm install
    bower install
    npm run-script build
    npm run-script server
    

    Browse to http://localhost:8000 and click on AJAX List, then open your dev console and click Delete by the first item. You'll see the following error in the console:

    index.js:25374 Uncaught Error: Failed pattern match at Components.AJAXList line 60, column 1 - line 61, column 45: DeleteItem,Object

    The function in question is expecting to receive ItemAction Int AJAXListItem.Action but is instead receiving AJAXListItem.Action, despite the types check passing.

    Interestingly, there's also a demo there for a non-effectful list/listitem component that works fine. This leads me to believe that something about the effects system may be causing a signal to get routed to the wrong component or perhaps its dropping the wrapped version of the signal it uses for the parent's update function.

    Sorry for the somewhat convoluted repro steps. Please let me know if there's any further info I can provide!

    opened by MichaelXavier 11
  • Memoize isn't referentially transparent

    Memoize isn't referentially transparent

    memoize uses expandos on the state, which breaks referential transparency, and can cause some subtle bugs.

    module Main where
    
    import Prelude
    import Control.Monad.Eff (Eff)
    
    import Pux (start, CoreEffects)
    import Pux.DOM.HTML (HTML, memoize)
    import Pux.Renderer.React (renderToDOM)
    
    import Text.Smolder.HTML as H
    import Text.Smolder.Markup as HM
    
    type User =
      { name :: String
      , age :: Int
      }
    
    view1 :: ∀ ev. User -> HTML ev
    view1 { name } =
      H.div do
        HM.text name
    
    view2 :: ∀ ev. User -> HTML ev
    view2 { age } =
      H.div do
        HM.text (show age)
    
    view :: ∀ ev. User -> HTML ev
    view user =
      H.div do
        memoize view1 user
        memoize view2 user
    
    main :: ∀ fx. Eff (CoreEffects fx) Unit
    main = do
      let user = { name: "Bob", age: 42 }
      app <- start
        { initialState: user
        , view
        , foldp: const <<< absurd
        , inputs: []
        }
      renderToDOM "#app" app.markup app.input
    

    This example will render view1 twice because the render tree is tied to the user reference.

    opened by natefaubion 9
  • Recursive `forwardTo` doesn't work exactly how I'd hoped

    Recursive `forwardTo` doesn't work exactly how I'd hoped

    I'm working on a toy app with a recursive structure. Here's my action:

    data Action
        = Child Int Action
        | UpdateWeight Int Number
        | UpdateScore (Score Number)
        | AddGrade
        | Undo
        | Redo
    

    And an example on how I'm using it:

    renderScore :: Array (Score Number) -> Html Action
    renderScore gs = H.div # do
         H.button ! E.onClick (const AddGrade) # H.text "Add Grade"
         H.ul ## 
            forEachIndexed gs \i g ->
                H.li # (H.forwardTo (Child i) (viewGrade g))
    

    When the UI gets nested, forwardTo uses the most recent function given. It'd be nice if it composed the functions instead.

    opened by parsonsmatt 9
  • Target types of events in Pux.Html.Events have the wrong type

    Target types of events in Pux.Html.Events have the wrong type

    Currently all events with a target specify target :: Target and type Target = { value :: String } which is incorrect. Inspecting the value returned in the MouseEvent shows that target is a DOM element. This could be represented by a Pux type or probably better a DOM.Node.Node so that it could be passed in directly to DOM functions.

    bug 
    opened by dkoontz 8
  • Investigate using purescript-react

    Investigate using purescript-react

    @AppShipIt and @paf31 have asked why Pux isn't built ontop of purescript-react. The reason is that no functions from purescript-react are exposed in the Pux API. For example, Attribute a is used instead of Props, or Html a instead of ReactElement. When I wrote Pux, it was faster and less code to have Html a be a foreign data type corresponding directly to React.createElement.

    Advantages

    • Share bug-fixes, elements, and attributes with the wider ecosystem.

    Disadvantages

    • Additional types and function calls that aren't exposed in Pux's API.
    • Possible performance impact when rendering.

    Performance

    One concern is that if Html a translates to purescript-react's ReactElement, that adds an extra layer of function calls in the render method. The only place where performance is a real concern is the render method, because it blocks the application. Function calls have very little overhead but it's still a concern. Renders should be as lightweight as possible.

    Thoughts?

    opened by alexmingoia 8
  • Bump decode-uri-component from 0.2.0 to 0.2.2

    Bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump bower from 1.8.2 to 1.8.8

    Bump bower from 1.8.2 to 1.8.8

    Bumps bower from 1.8.2 to 1.8.8.

    Release notes

    Sourced from bower's releases.

    v1.8.8

    Fix security issue connected to extracting .tar.gz archives

    This bug allows to write arbitrary file on filesystem when Bower extracts malicious package

    Needlessly to say, please upgrade

    v1.8.7

    Fixes side effect of fix from v1.8.6 that caused improper permissions for extracted folders

    bower/bower#2532

    v1.8.6

    Fix Zip Slip Vulnerability of decompress-zip package: https://snyk.io/research/zip-slip-vulnerability

    Note: v1.8.5 has been unpublished because of missing files

    v1.8.4

    • Fixes release 1.8.3 by publishing with npm@3 instead of npm@5 (to include lib/node_modules)

    v1.8.3

    • 451c60e Do not store resolutions if --save is not used, fixes #2344 (#2508)
    • 50ee729 Allow to disable shorthand resolver (#2507)
    • bb17839 Allow shallow cloning when source is a ssh protocol (#2506)
    • 5a6ae54 Add support for Arrays in Environment Variable replacement (#2411)
    • 74af42c Only replace last @ after (if any) last / with # (#2395)
    • 💯Make tests work on Windows / Linux / OSX on node versions 0.10 / 0.12 / 4 / 6 / 8 / 9
    • 💅Format source code with prettier
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot ignore this [patch|minor|major] version will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Starter app fails to build with error

    Starter app fails to build with error "Module Data.Comparison imports itself"

    PS E:\Users\david\OneDrive\projects\purescript\pux\my-awesome-pux-app> npm start
    
    > [email protected] start E:\Users\david\OneDrive\projects\purescript\pux\my-awesome-pux-app
    > npm run watch
    
    
    > [email protected] watch E:\Users\david\OneDrive\projects\purescript\pux\my-awesome-pux-app
    > npm run clean && webpack-dev-server --content-base static/ --hot --inline --config webpack.config.js      
    
    
    > [email protected] clean E:\Users\david\OneDrive\projects\purescript\pux\my-awesome-pux-app
    > rimraf static/dist
    
    Project is running at http://localhost:8080/
    webpack output is served from http://localhost:8080/dist/
    Content not from webpack is served from E:\Users\david\OneDrive\projects\purescript\pux\my-awesome-pux-app\static
    Hash: bcea626a1c5addfd6b86
    Version: webpack 2.7.0
    Time: 9807ms
        Asset    Size  Chunks                    Chunk Names
    bundle.js  352 kB       0  [emitted]  [big]  main
    chunk    {0} bundle.js (main) 322 kB [entry] [rendered]
        [2] (webpack)/hot/emitter.js 77 bytes {0} [built]
        [3] (webpack)-dev-server/client?http://localhost:8080 7.93 kB {0} [built]
        [4] (webpack)/hot/dev-server.js 1.57 kB {0} [built]
        [5] ./support/entry.js 373 bytes {0} [built]
       [12] ./~/loglevel/lib/loglevel.js 7.86 kB {0} [built]
       [13] ./~/punycode/punycode.js 14.7 kB {0} [built]
       [14] ./src/Main.purs 556 bytes {0} [built] [failed] [1 error]
       [17] ./~/querystring-es3/index.js 127 bytes {0} [built]
       [19] ./~/strip-ansi/index.js 161 bytes {0} [built]
       [20] ./~/url/url.js 23.3 kB {0} [built]
       [22] (webpack)-dev-server/client/overlay.js 3.67 kB {0} [built]
       [23] (webpack)-dev-server/client/socket.js 1.08 kB {0} [built]
       [25] (webpack)/hot nonrecursive ^\.\/log$ 160 bytes {0} [built]
       [26] (webpack)/hot/log-apply-result.js 1.02 kB {0} [built]
       [27] multi (webpack)-dev-server/client?http://localhost:8080 webpack/hot/dev-server ./support/entry.js 52 bytes {0} [built]
         + 13 hidden modules
         ...
      7  import Data.Functor.Contravariant (class Contravariant)
      8  import Data.Monoid (class Monoid)
      9  import Data.Newtype (class Newtype)
                                           ^
    
      Module Data.Comparison imports itself.
    
               Src   Lib   All
    Warnings   0     0     0
    Errors     1     0     1
    
    webpack: Failed to compile.
    
    
    opened by davedawkins 0
  • Starter app includes outdated bower, fails to build

    Starter app includes outdated bower, fails to build

    The error you get is as described here: https://stackoverflow.com/questions/51020317/einvres-request-to-https-bower-herokuapp-com-packages-failed-with-502

    The preferred solution is to upgrade bower globally, which fails because the locally installed version is used instead.

    I think this app needs to either remove the "bower" dependency in package.json, or update the version from 1.7.9 to 1.8

    opened by davedawkins 0
  • Define lifted log because of new Aff api

    Define lifted log because of new Aff api

    purescript-aff used to have its own log, but as far as I can tell, it no longer does.

    Please feel free to suggest alternative ways to improve the docs; I just know that this confused me since I'm very new to Purescript, I couldn't import the log function as described.

    opened by james1293 0
Releases(v11.0.0)
  • v11.0.0(Aug 17, 2017)

    • Support for purescript-smolder 10 (fixes tail-recursive/stack issue with large num of elements) #139.
    • Use create-react-class module to avoid deprecation warning #142.
    • Fix crash when React event object is null #136.
    • Add basic test suite #133.
    Source code(tar.gz)
    Source code(zip)
  • v9.2.0(May 20, 2017)

    • Use React component class for memoized views. Significantly improves performance by avoiding unnecessary React VDOM subtree comparison. This brings performance characteristics in line with vanilla React and a single state atom and PureRenderMixin.
    • Check for target.value. Fixes #119
    Source code(tar.gz)
    Source code(zip)
  • v9.0.0(May 2, 2017)

  • v8.7.0(Apr 7, 2017)

  • v8.3.0(Apr 3, 2017)

    Improved React rendering performance by caching virtual DOM returned by memoized views. This provides the same performance optimization as React's shouldComponentUpdate.

    Source code(tar.gz)
    Source code(zip)
  • v8.0.0(Mar 30, 2017)

    This is a major upgrade and rewrite with breaking changes:

    • Markup now uses purescript-smolder and Html has been replaced with a new HTML type.
    • Event handlers now receive the raw DOM event from purescript-dom, and Pux no longer provides its own event types.
    • Type signatures for start, Config, App have changed to include a new type parameter and different labels.
    • Effects in the EffModel now return Maybe a instead of a.
    • Rendering is no longer tied to React. Other virtual DOM renderers can be implemented.
    • Added memoize function for views is provided to prevent unnecessary renders.
    • Added constructor for style element and attribute which takes CSS from purescript-css.
    • Added full isomorphic routing and rendering setup to pux-starter-app.
    • Actions are now referred to as events in source code and documentation.
    • The "update" function is now referred to as the "foldp" function in source code and documentation.

    See the updated guide for help upgrading to Pux 8.

    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Mar 27, 2016)

    • The VirtualDOM monad has been replaced with # operator and rebindable do, which enables the use of both array notation or do notation for composing views.
    • VirtualDOM is now Html a and is parameterized by the component's action type.
    • One-to-one mapping between event types and React's synthetic events.
    • The Update function no longer receives an input Signal.Channel.
    • EffModel type has changed to { state: state, effects: Array (Aff eff action), and actions are automatically fed into the input channel.
    Source code(tar.gz)
    Source code(zip)
Owner
Alex Mingoia
The Internet changed my life.
Alex Mingoia
A simple PureScript wrapper for React

purescript-thermite purescript-thermite is a PureScript wrapper for purescript-react. It does not provide all of the functionality of React, but inste

Phil Freeman 353 Dec 16, 2022
100% type-safe query builder for node-postgres :: Generated types, call any function, tree-shakable, implicit type casts, and more

⚠️ This library is currently in alpha. Contributors wanted! tusken Postgres client from a galaxy far, far away. your database is the source-of-truth f

alloc 54 Dec 29, 2022
A zero-dependency, buildless, terse, and type-safe way to write HTML in JavaScript.

hdot A sensible way to write HTML in JavaScript. Type-safe. Helps you follow the HTML spec. Terse. Almost character for character with plain HTML. Bui

Will Martin 31 Oct 24, 2022
Type Safe Object Notation & Validation

tson Type Safe Object Notation & Validation ?? Work in Progress, not ready for production... Features ?? Functional ?? Immutable ✅ Well tested Why? Af

null 9 Aug 10, 2022
Cloudy is a set of constructs for the AWS Cloud Development Kit that aim to improve the DX by providing a faster and type-safe code environment.

cloudy-ts These packages aren't yet published on npm. This is still highly experimental. Need to figure out a few things before releasing the first ve

Cristian Pallarés 5 Nov 3, 2022
Zero runtime type-safe CSS in the same file as components

macaron comptime-css is now called macaron! macaron is a zero-runtime and type-safe CSS-in-JS library made with performance in mind Powered by vanilla

Mokshit Jain 205 Jan 4, 2023
A next-gen framework for type-safe command-line applications

Zors ?? Next-gen framework for building modern, type-safe command-line applications. ?? Tiny (zero dependencies) ?? Runtime agonistic (supports both D

Sidharth Rathi 13 Dec 1, 2022
A compiled-away, type-safe, readable RegExp alternative

?? magic-regexp A compiled-away, type-safe, readable RegExp alternative ✨ Changelog ?? Documentation ▶️ Online playground Features Runtime is zero-dep

Daniel Roe 1.5k Jan 8, 2023
A fully type-safe and lightweight internationalization library for all your TypeScript and JavaScript projects.

?? typesafe-i18n A fully type-safe and lightweight internationalization library for all your TypeScript and JavaScript projects. Advantages ?? lightwe

Hofer Ivan 1.3k Jan 4, 2023
A script that combines a folder of SVG files into a single sprites file and generates type definitions for safe usage.

remix-sprites-example A script that combines a folder of .svg files into a single sprites.svg file and type definitions for safe usage. Technical Over

Nicolas Kleiderer 19 Nov 9, 2022
A functional, immutable, type safe and simple dependency injection library inspired by angular.

func-di English | 简体中文 A functional, immutable, type safe and simple dependency injection library inspired by Angular. Why func-di Installation Usage

null 24 Dec 11, 2022
👩‍🎤 Headless, type-safe, UI components for the next generation Web3.Storage APIs.

Headless, type-safe, UI components for the next generation Web3.Storage APIs. Documentation beta.ui.web3.storage Examples React Sign up / Sign in Sing

Web3 Storage 47 Dec 22, 2022
Type safe library for interacting with Mindbody's Public API (v6) and Webhooks

Mindbody API Type safe library for interacting with Mindbody's Public API (v6) and Webhooks ⚠️ Read before installing This library is typed according

SplitPass 4 Dec 9, 2022
A fully type-safe and lightweight way of using exceptions instead of throwing errors

??️ exceptionally A fully type-safe and lightweight way of using exceptions instead of throwing errors ?? fully typesafe ?? lightweight (209 bytes) ??

Hofer Ivan 16 Jan 4, 2023
Type-safe session for all Astro SSR project

Astro Session Why use Astro Session? When building server application with Astro, you will often need session system to identify request coming from t

Steven Yung 8 Dec 19, 2022
Sample apps showing how to build music and video apps for Xbox using a WebView.

description languages name page_type products urlFragment Sample showing how to build music and video apps using primarily web technologies for Xbox.

Microsoft 11 Dec 14, 2022
Type predicate functions for checking if a value is of a specific type or asserting that it is.

As-Is Description As-Is contains two modules. Is - Type predicates for checking values are of certain types. As - Asserting values are of a certain ty

Declan Fitzpatrick 8 Feb 10, 2022
Combine type and value imports using Typescript 4.5 type modifier syntax

type-import-codemod Combines your type and value imports together into a single statement, using Typescript 4.5's type modifier syntax. Before: import

Ian VanSchooten 4 Sep 29, 2022
🧬 A type builder for pagination with prisma and type-graphql.

?? Prisma TypeGraphql Pagination Prisma TypeGraphql Pagination builds prisma pagination types for type-graphql. import { ... } from 'type-graphql'

Arthur Fiorette 2 Apr 21, 2022