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

immutablets

v0.15.0

Published

Immutable state management for TypeScript

Downloads

52

Readme

Performant immutable structures for TypeScript.

npm version travis build status

Designed for use with rxjs observables and Angular, but works without dependencies.

What is an immutable application state?

In short: If an object A equals object B, all properties of A are equal to the same property of B. Since most applications read data way more than modifying it, getting notified of changes instead of comparing values to previous values is way more efficient.

This plays nicely with angulars change detection, which compares by reference (===) and assumes that any input that receives the same value as before was not changed.

Getting started

npm install immutablets

Define your application state as a class decorated with @Immutable:

import { Immutable } from 'immutablets';

@Immutable()
class ApplicationState {
    folders: { [id: number]: Folder };
    files: { [id: number]: File };
    currentFolder: number;

    openFolder(folderId: number) {
        this.currentFolder = folderId;
    }

    filesLoaded(folderId: number, files: File[]) {
        this.folders = { ...this.folders, [folderId]: { ...this.folders[folderId], files } };
    }
}

Observe the application state for changes:

@Component({
    template: `
        <file-list [files]="(currentFolder | async)?.files">
        </file-list>`,
    changeDetection: ChangeDetectionStrategy.OnPush
})
class FolderDetailsComponent {
    currentFolder: Observable<Folder>;
    constructor(private appState: ApplicationState) {
        this.currentFolder = observeChanges(appState, Observable)
            .map(state => state.folders[state.currentFolder])
            .distinctUntilChanged();
    }
}

Write mutation-safe code and get notified when you did not

Instead of forcing you to use a different data structure to store your data, you will be encouraged to write mutation-safe code with plain javascript objects and arrays.

Checking your code for object mutations

If any method call changes properties of an existing reference instead of creating a new object, a MethodNonImmutableError will be thrown:

@Immutable()
class BadFolderListImplementation {
    private folders: Folder[];
    add(newFolder: Folder) {
        this.folders.push(newFolder);
        //           ^ push changes the array, therefore
        //             a MethodNonImmutableError is thrown.
    }
}

When the method creates a new object instead of changing an existing one, no error is thrown:

    add(newFolder: Folder) {
        this.folders = [...this.folders, newFolder];
    }

Documentation

(work in progress)

License

MIT