npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

hyrest-mobx

v0.2.4

Published

A hybrid REST library for the frontend and backend. MobX connector package.

Downloads

8

Readme

hyrest-mobx

npm pipeline status coverage report

Hyrest is a hybrid REST framework for both the client and the server.

This is the MobX frontend utility package.

After creating and exposing a REST API using hyrest and hyrest-express it might be useful to re-use the existing models and validation from the server side in the client to store data next to forms and perform validation on it.

Usage

Fields

Let's say a model has been defined which is already used by a controller:

import { is, email, length } from "hyrest";
class User {
    @is().validate(email) public email: string;
    @is().validate(length(5, 20)) public name: string;
    @is().validate(length({ min: 10 })) public password: string;
}

In order to create a new user, one might want to implement a sign up form. This is where this package can come in handy.

Instead of creating a @observable public email: string and so on for each field on the User model, simple utilize hyrest-mobx:

import * as React from "react";
import { observer } from "mobx-react";
import { field, hasFields, Field } from "hyrest-mobx";

@observer @hasFields()
class Signup extends React.Component {
    @field(User) private user: Field<User>;

    @action.bound private handleSubmit() {
        console.log(user.value); // Will log the unwrapped user.
    }

    public render() {
        return (
            <form onSubmit={this.handleSubmit}>
                <input type="text" {...this.user.nested.email.reactInput} />
                <input type="text" {...this.user.nested.name.reactInput} />
                <input type="password" {...this.user.nested.password.reactInput} />
                {
                    this.users.errors.map((err, index) => <p key={index}>{err}</p>)
                }
                <button disabled={!this.user.valid}>Signup</button>
            </form>
        );
    }
}

The decorator @field will mark the property as a field with the type User.

After marking the class with @hasFields, new Fields will automatically be injected upon creation.

The injected values already utilize Mobx under the hood and hence no @observables are no longer necessary.

Store

A utility for generating stores from controllers exists.

Let's say you implemented a controller with search, get and create methods:

class Model {
    id?: string;
    name?: string;
}

class DemoController {
    public async create(model: Model) {
        ...
    }

    public async search(name: string, id?: string) {
        ...
    }

    public async get(id: string) {
        ...
    }
}

It is then possible to generate similar actions on the store's base class. These methods will keep the internal entities map in sync and perform the corresponding operations on the controller:

class DemoStore extends Store(DemoController) {
    protected controller = new DemoController();
}

// `DemoStore.create` exists.
// `DemoStore.get` exists.
// `DemoStore.getLazy` exists.
// `DemoStore.search` exists.

Resources