Giter Club home page Giter Club logo

pipe-maker's Introduction

Welcome to pipeline-runner ๐Ÿ‘‹

Version Documentation Maintenance License: MIT TypeScript

This library provides a mechanism to create flows of calls to functions in the form of a pipeline with a fluid and very flexible API.

๐Ÿ  Homepage

Install

npm install pipeline-runner

Note: The package includes Typescript type metadata for secure typing support, it is lightweight and easy to use. It's very cool

Usage

This library allows to implement a well-known and used pipeline pattern, for example, in the http framework that performs a pipeline of the processing of the incoming http request, where a context is handled that is passed to each agent / function to receive said context and a 'next' function that allows the execution line to continue. The philosophy is simple and well known

const { usePipeline } = require("pipeline-runner");

function someObject(){
  this.test = false;
}

const value = new someObject();
const pipeline = usePipeline((x, next) => { x.test = true; next(); })
 .pipe((x, next) => { x.test = false; next(); })
 .pipe((x, next) => { x.test = true;  });
pipeline.run(value); // the last agent set the value to true

Observation

  • The 'next' argument allows the execution of the next agent in the pipeline to continue.
  • You can import the 'usePipeline' helper to factory a pipeline object without instance the class.
  • The method run invoke the pipeline and require an argument that this is a context
const { usePipeline } = require("pipeline-runner");

function someObject(){
  this.test = false;
}

const value = new someObject();
const pipeline = usePipeline((x, next) => { x.test = true; next(); })
 .pipe((x, next) => { x.test = false;  })
 .pipe((x, next) => { x.test = true;  });
pipeline.run(value); // the last agent executed set false because the next is not invoked

Note: If the argument is 'next' it is omitted, that is, a function is passed that only receives one argument, the context, then the pipeline is given continuously by itself

Using Typescript

import { usePipeline } from 'pipeline-runner';

class ContextA {
    public msg: string;
    public num: number;
}

// tslint:disable-next-line: max-classes-per-file
class ContextB {
    public result: string;
    constructor(_result: string){
        this.result = _result;
    }
}

const result = usePipeline<ContextA>(x => x.msg = "data")
.pipe(x => x.num = 22)
.mutate(x => new ContextB(`this is a message: ${x.msg} and number ${x.num}`))
.pipe(x => x.result += '...')
.run(new ContextA())

console.log(result.result);

Typescript allows to improve the development experience significantly for well-known reasons, it also makes using the context mutations make sense, since in each mutation the IDE through the type system, it will not say the properties and context methods that we are passing in the pipeline In other words, we will have autocompletion of the current context using the 'pipe' method and when we invoke 'run', the type of argument will be the one that initially had the first pipeline instance. So the 'mutate' method concatenates n pipes as we like to allow us a flexible and typed flow.

Note: Note that you are using functions in this pipeline without the next argument, an example of an auto continuous pipeline

Async Pipeline Support

Not everything is synchronous and linear in Javascript, so it can come to us asynchronously certain information through events, service responses and etc, for that, a special type of pipeline is implemented, which works with asynchronous agents (pipes) where each process waits for its predecessor to be executed.

Run tests

You can run the many tests included in this repo, then you must clone this repo and install dependencies.

npm run test

Author

๐Ÿ‘ค Oliver Valiente

๐Ÿค Contributing

Contributions, issues and feature requests are welcome!

Feel free to check issues page. You can also take a look at the contributing guide.

Show your support

Give a โญ๏ธ if this project helped you!

๐Ÿ“ License

Copyright ยฉ 2021 Oliver Valiente.

This project is MIT licensed.


This README was generated with โค๏ธ by readme-md-generator

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.