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

@brainhubeu/sqrs

v1.0.3

Published

CQRS framework for JavaScript/TypeScript servers

Downloads

46

Readme

sqrs

SQRS is a JavaScript library for implementing CQRS pattern.

Best used with TypeScript as it exposes interfaces for Commands, CommandHandlers, Queries, QueryHandlers and more.

When paired with a dependency injection framework it provides a fully-fledged inversion of control experience in JavaScript.

Installation

To install sqrs run

npm install sqrs

the packages comes with it's own TypeScript types.

ES2015 execution environment is required. For NodeJS that means at least Node 8 LTS.

Getting started

Introduction to CQRS

In short, CQRS is a pattern that differentiates between read operations and write operations. Write operations are achieved via commands that represent intent to change the system's state, and read operations are achieved via queries that read the system's state. The distinction between the to comes from the principle that asking a question shouldn't change the response.

You can read more about CQRS here:

  • https://www.martinfowler.com/bliki/CQRS.html
  • http://www.cqrs.nu

Using the library

See the longer guide for getting started

Short version

Writing commands (note you don't have to use classes, you can also use object factories):

import { Command } from '@brainhubeu/sqrs';

export class AddNoteCommand implements Command {
  public type = 'add-note';
  public text: string;

  constructor (text: string) {
    this.text = text;
  }
}

Writing command handlers:

import { CommandHandler } from '@brainhubeu/sqrs';

class AddNoteCommandHandler implements CommandHandler {
  public handle (command: AddNoteCommand) {
    // do something with the command
  }
}

Writing queries:

import { Query } from '@brainhubeu/sqrs';

export class GetNotesQuery implements Query<string, Note[]> {
  public queryName = 'GetNotes';
}

Writing query handlers:

import { QueryHandler } from '@brainhubeu/sqrs';

export class GetNotesQueryHandler implements QueryHandler<GetNotesQuery> {
  execute (query: GetNotesQuery): Promise<Note[]> {
    // get notes from somewhere
  }
}

Final usage:

import { DefaultCommandBus, CommandBus, DefaultQueryExecutor, QueryExecutor } from '@brainhubeu/sqrs';

const commandBus: CommandBus = new DefaultCommandBus(
  // created somewhere else
  commandHandlerProvider,
  commandValidatorProvider
);
const queryExecutor: QueryExecutor = new DefaultQueryExecutor(
  // created somewhere else
  queryHandlerProvider
);

const addNoteCommand = new AddNoteCommand('hello');
await commandBus.dispatch(addNoteCommand);

const getNotesQuery = new GetNotesQuery();
const notes = await queryExecutor.execute(getNotesQuery);

API reference

API reference generated from JSDoc comment can be found here

Example project

Example project created using this library can be found here