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

jsonthefly

v2.4.0

Published

string, math, array, object utils that i use

Downloads

15

Readme

JSONTHEFLY

This repo has been started to practise javascript on the fly. However, I found some codes are very interesting. Let me introduce some features.

Features

Subject for the observer pattern

You can extend Subject to use the observer pattern.

import Subject from 'jsonthefly/pattern/observer/Subject';

export default class Toggler extends Subject {
  constructor(initState) {
    super(initState);
    this.toggle = this.toggle.bind(this);
  }

  toggle() {
    this.setState(prev => ({
      isOpen: !prev.isOpen
    }));
  }
}

Singleton useReducer for react.js

  1. Create a reducer.
// reducers/pizzaReducer.js

const initState = { cheeze: 10, dough: 'normal' };

function _reduceCheeze(state, cheeze) {
    if (state.cheeze === cheeze) {
        return state;
    };
    return { ...state, cheeze };
}

function _reduceChangeDough(state, dough) {
    if (state.dough === dough) {
        return state;
    };
    return { ...state, dough };
}

function pizzaReducer(state, action) {
    switch (action.type) {
        case 'jumbo':
            return _reduceChangeDough(_reduceCheeze(state, 30), 'heavy');
        case 'thin':
            return _reduceChangeDough(_reduceCheeze(state, 10), 'light');
        default:
            throw new Error('invalid action of reducePizza');
    }
}

const actionTypes = ['jumbo', 'thin'];

export { initState, actionTypes };

export default pizzaReducer;
  1. Create a module ref for usePizzaReducer.
// reducers/usePizzaReducer.js

import createSingletonUseReducer from 'jsonthefly/react/createSingletonUseReducer';
import pizzaReducer, { initState, actionTypes } from './pizzaReducer';

export { initState, actionTypes };
export default createSingletonUseReducer(pizzaReducer, initState);
  1. Just use it in many components
import usePizzaReducer from 'reducers/usePizzaReducer';

export default function MyComponent(props) {
    const [{dough, cheeze}, dispatchPizza] = usePizzaReducer();
    ...
}

usePizzaReducer is safe from MyComponent's unmount.

  • You can make the singletoneUseReducer watch another resource.
export default createSingletonUseReducer(pizzaReducer, initState, setState => {
    // bind it to DOM
    window.addEventListener('resize', e => {
        // ...
        setState(something);
    });
    // or
    // ...
    anotherSubject.register({ update: setState });
});

The callback is executed at the very beginning.

  • You can create singletoneUseReducer with a Storage
import createSingletonUseReducer from 'jsonthefly/react/createSingletonUseReducer';
import StorageSubject from 'jsonthefly/pattern/observer/StorageSubject'
import colorReducer, { initState, actionTypes } from './reduceColor';

export { initState, actionTypes };
export default createSingletonUseReducer(colorReducer, new StorageSubject(localStorage, 'color', initState));

StorageSubject supports only number, string, boolean and plain object. The type of initState and following states should be constant. The storage does not need to be a built-in object if you do not use storage events. If it has getItem and setItem, it is ok.

  • I cannot come up with an idea that manages life cycles of createSingletonUseReducer. create-react-app uses webpack to bundle javascript modules, which compose a huge permanant ref tree. I can only detach an object in a module, but not a module. If I detached createSingletonUseReducer in some way, it would not have been imported like
import usePizzaReducer from '../states/usePizzaReducer';

I prefer this way so far.

Cancel promises

pseudoPromise disables subsequent methods of Promise. You can hijack the promise sequences of exsting codes. It will be very helpful in debugging or edge cases.

import { pseudoPromise } from 'jsonthefly/async';

// just add .then(pseudoPromise, pseudoPromise)
...promise1.promise2.promise3.then(pseudoPromise, pseudoPromise).promise4.promise5.promise6...
// or return pseudoPromise() in a callback you want to be the point of cascading.
...then(v=> {
    ...
    return pseudoPromise();
})...

License

MIT © wooheemusic