Zeronode - minimal building block for NodeJS microservices

Overview

Zeronode

JavaScript Style Guide

NPM

Known Vulnerabilities GitHub license GitHub issues

Tweet GitHub stars

Zeronode - minimal building block for NodeJS microservices

Why you need ZeroNode ?

Application backends are becoming complex these days and there are lots of moving parts talking to each other through network. There is a great difference between sending a few bytes from A to B, and doing messaging in reliable way.

  • How to handle dynamic components ? (i.e., pieces that come and/or go away temporarily, scaling a microservice instances )
  • How to handle messages that we can't deliver immediately ? (i.e waiting for a component to come back online)
  • How to route messages in complex microservice architecture ? (i.e. one to one, one to many, custom grouping)
  • How we handle network errors ? (i.e., reconnecting of various pieces)

We created Zeronode on top of zeromq as to address these and some more common problems that developers will face once building solid systems.
With zeronode its just super simple to create complex server-to-server communications (i.e. build network topologies).

Installation & Important notes

Zeronode depends on zeromq
For Debian, Ubuntu, MacOS you can just run

$ npm install zeronode --save

and it'll also install zeromq for you.
Kudos to Dave for adding install scripts. For other platforms please open an issue or feel free to contribute.

Basics

Zeronode allows to create complex network topologies (i.e. line, ring, partial or full mesh, star, three, hybrid ...) Each participant/actor in your network topology we call znode, which can act as a sever, as a client or hybrid.

import Node from 'zeronode';

let znode = new Node({
    id: 'steadfast',
    options: {}, 
    config: {}
});

// ** If znode is binded to some interface then other znodes can connect to it
// ** In this case znode acts as a server, but it's not limiting znode to connect also to other znodes (hybrid)
(async () => {
    await znode.bind('tcp://127.0.0.1:6000');
})();

// ** znode can connect to multiple znodes
znode.connect({address: 'tcp://127.0.0.1:6001'})
znode.connect({address: 'tcp://127.0.0.1:6002'})

// ** If 2 znodes are connected together then we have a channel between them 
// ** and both znodes can talk to each other via various messeging patterns - i.e. request/reply, tick (fire and forgot) etc ...

Much more interesting patterns and features you can discover by reading the API document. In case you have a question or suggestion you can talk to authors on Zeronode Gitter chat

Benchmark

All Benchmark tests are completed on Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz.

Zeronode Seneca (tcp) Pigato
1000 msg, 1kb data 394ms 2054ms 342ms
50000 msg, 1kb data 11821ms 140934ms FAIL(100s timeout)

API

Basic methods

Simple messaging methods

Attaching/Detaching handlers to tick and request

Load balancing methods

Debugging and troubleshooting

let znode = new Node({ id: String, bind: Url, options: Object, config: Object })

Node class wraps many client instances and one server instance. Node automatically handles:

  • Client/Server ping/pong
  • Reconnections
import { Node } from 'zeronode';

let znode = new Node({
    id: 'node',
    bind: 'tcp://127.0.0.1:6000',
    options: {}
    config: {}
});

All four arguments are optional.

  • id is unique string which identifies znode.
  • options is information about znode which is shared with other connected znoded. It could be used for advanced use cases of load balancing and messege routing.
  • config is an object for configuring znode
    • logger - logger instance, default is Winston.
    • REQUEST_TIMEOUT - duration after which request()-s promise will be rejected, default is 10,000 ms.
    • RECONNECTION_TIMEOUT (for client znodes) - zeronode's default is -1 , which means zeronode is always trying to reconnect to failed znode server. Once RECONNECTION_TIMEOUT is passed and recconenction doesn't happen zeronode will fire SERVER_RECONNECT_FAILURE.
    • CONNECTION_TIMEOUT (for client znodes) - duration for trying to connect to server after which connect()-s promise will be rejected.

There are some events that triggered on znode instances:

  • NodeEvents.CLIENT_FAILURE - triggered on server znode when client connected to it fails.

  • NodeEvents.CLIENT_CONNECTED - triggered on server znode when new client connects to it.

  • NodeEvents.CLIENT_STOP - triggered on server znode when client successfully disconnects from it.

  • NodeEvents.SERVER_FAILURE - triggered on client znode when server znode fails.

  • NodeEvents.SERVER_STOP - triggered on client znode when server successfully stops.

  • NodeEvents.SERVER_RECONNECT - triggered on client znode when server comes back and client znode successfuly reconnects.

  • NodeEvents.SERVER_RECONNECT_FAILURE - triggered on client znode when server doesn't come back in reconnectionTimeout time provided during connect(). If reconnectionTimeout is not provided it uses config.RECONNECTION_TIMEOUT which defaults to -1 (means client znode will try to reconnect to server znode for ages).

  • NodeEvents.CONNECT_TO_SERVER - triggered on client znode when it successfully connects to new server.

  • NodeEvents.METRICS - triggered when metrics enabled.

znode.bind(address: Url)

Binds the znode to the specified interface and port and returns promise. You can bind only to one address. Address can be of the following protocols: tcp, inproc(in-process/inter-thread), ipc(inter-process).

znode.connect({ address: Url, timeout: Number, reconnectionTimeout: Number })

Connects the znode to server znode with specified address and returns promise. znode can connect to multiple znodes. If timeout is provided (in milliseconds) then the connect()-s promise will be rejected if connection is taking longer.
If timeout is not provided it will wait for ages till it connects. If server znode fails then client znode will try to reconnect in given reconnectionTimeout (defaults to RECONNECTION_TIMEOUT) after which the SERVER_RECONNECT_FAILURE event will be triggered.

znode.unbind()

Unbinds the server znode and returns promise. Unbinding doesn't stop znode, it can still be connected to other nodes if there are any, it just stops the server behaviour of znode, and on all the client znodes (connected to this server znode) SERVER_STOP event will be triggered.

znode.disconnect(address: Url)

Disconnects znode from specified address and returns promise.

znode.stop()

Unbinds znode, disconnects from all connected addresses (znodes) and returns promise.

znode.request({ to: Id, event: String, data: Object, timeout: Number })

Makes request to znode with id(to) and returns promise.
Promise resolves with data that the requested znode replies.
If timeout is not provided it'll be config.REQUEST_TIMEOUT (defaults to 10000 ms).
If there is no znode with given id, than promise will be rejected with error code ErrorCodes.NODE_NOT_FOUND.

znode.tick({ to: Id, event: String, data: Object })

Ticks(emits) event to given znode(to).
If there is no znode with given id, than throws error with code ErrorCodes.NODE_NOT_FOUND.

znode.onRequest(requestEvent: String/Regex, handler: Function)

Adds request handler for given event on znode.

/**
* @param head: { id: String, event: String }
* @param body: {} - requestedData
* @param reply(replyData: Object): Function
* @param next(error): Function 
*/
// ** listening for 'foo' event
znode.onRequest('foo', ({ head, body, reply, next }) => {
  // ** request handling logic 
  // ** move forward to next handler or stop the handlers chain with 'next(err)'
  next() 
})

// ** listening for any events matching Regexp
znode.onRequest(/^fo/, ({ head, body, reply, next }) => {
  // ** request handling logic 
  // ** send back reply to the requester znode
  reply(/* Object data */) 
})

znode.onTick(event: String/Regex, handler: Function)

Adds tick(event) handler for given event.

znode.onTick('foo', (data) => {
   // ** tick handling logic 
})

znode.offRequest(requestEvent: String/Regex, handler: Function)

Removes request handler for given event.
If handler is not provided then removes all of the listeners.

znode.offTick(event: String/Regex, handler: Function)

Removes given tick(event) handler from event listeners' list.
If handler is not provided then removes all of the listeners.

znode.requestAny({ event: String, data: Object, timeout: Number, filter: Object/Function, down: Bool, up: Bool })

General method to send request to only one znode satisfying the filter.
Filter can be an object or a predicate function. Each filter key can be object itself, with this keys.

  • $eq - strict equal to provided value.
  • $ne - not equal to provided value.
  • $aeq - loose equal to provided value.
  • $gt - greater than provided value.
  • $gte - greater than or equal to provided value.
  • $lt - less than provided value.
  • $lte - less than or equal to provided value.
  • $between - between provided values (value must be tuple. eg [10, 20]).
  • $regex - match to provided regex.
  • $in - matching any of the provided values.
  • $nin - not matching any of the provided values.
  • $contains - contains provided value.
  • $containsAny - contains any of the provided values.
  • $containsNone - contains none of the provided values.
    // ** send request to one of znodes that have version 1.*.*
    znode.requestAny({
        event: 'foo',
        data: { foo: 'bar' },
        filter: { version: /^1.(\d+\.)?(\d+)$/ }
    })
    
    // ** send request to one of znodes whose version is greater than 1.0.0
    znode.requestAny({
        event: 'foo',
        data: { foo: 'bar' },
        filter: { version: { $gt: '1.0.0' } }
    })
    
    // ** send request to one of znodes whose version is between 1.0.0 and 2.0.0
    znode.requestAny({
        event: 'foo',
        data: { foo: 'bar' },
        filter: { version: { $between: ['1.0.0', '2.0.0.'] } }
    })

    // ** send request to one of znodes that have even length of name.
    znode.requestAny({
        event: 'foo',
        data: { foo: 'bar' },
        filter: (options) => !(options.name.length % 2)
    })

    // ** send request to one of znodes that connected to your znode (downstream client znodes)
    znode.requestAny({
        event: 'foo',
        data: { foo: 'bar' },
        up: false
    })

    // ** send request to one of znodes that your znode is connected to (upstream znodes).
    znode.requestAny({
        event: 'foo',
        data: { foo: 'bar' },
        down: false
    })

znode.requestDownAny({ event: String, data: Object, timeout: Number, filter: Object/Function })

Send request to one of downstream znodes (znodes which has been connected to your znode via connect() ).

znode.requestUpAny({ event: String, data: Object, timeout: Number, filter: Object/Function })

Send request to one of upstream znodes (znodes to which your znode has been connected via connect() ).

znode.tickAny({ event: String, data: Object, filter: Object/Function, down: Bool, up: Bool })

General method to send tick-s to only one znode satisfying the filter.
Filter can be an object or a predicate function. Usage is same as node.requestAny

znode.tickDownAny({ event: String, data: Object, filter: Object/Function })

Send tick-s to one of downstream znodes (znodes which has been connected to your znode via connect() ).

znode.tickUpAny({ event: String, data: Object, filter: Object/Function })

Send tick-s to one of upstream znodes (znodes to which your znode has been connected via connect() ).

znode.tickAll({ event: String, data: Object, filter: Object/Function, down: Bool, up: Bool })

Tick to ALL znodes satisfying the filter (object or predicate function), up ( upstream ) and down ( downstream ).

znode.tickDownAll({ event: String, data: Object, filter: Object/Function })

Tick to ALL downstream znodes.

znode.tickUpAll({ event: String, data: Object, filter: Object/Function })

Tick to ALL upstream znodes.

znode.enableMetrics(interval)

Enables metrics, events will be triggered by the given interval. Default interval is 1000 ms.

znode.disableMetrics()

Stops triggering events, and removes all collected data.

Examples

Simple client server example

NodeServer is listening for events, NodeClient connects to NodeServer and sends events:
(myServiceClient) ----> (myServiceServer)

Lets create server first

myServiceServer.js

import Node from 'zeronode';

(async function() {
    let myServiceServer = new Node({ id: 'myServiceServer',  bind: 'tcp://127.0.0.1:6000', options: { layer: 'LayerA' } });

    // ** attach event listener to myServiceServer
    myServiceServer.onTick('welcome', (data) => {
        console.log('onTick - welcome', data);
    });

    // ** attach request listener to myServiceServer
    myServiceServer.onRequest('welcome', ({ head, body, reply, next }) => {
        console.log('onRequest - welcome', body);
        reply("Hello client");
        next();
    });

    // second handler for same channel
    myServiceServer.onRequest('welcome', ({ head, body, reply, next }) => {
        console.log('onRequest second - welcome', body);
    });

    // ** bind znode to given address provided during construction
    await myServiceServer.bind();
}());

Now lets create a client

myServiceClient.js

import Node from 'zeronode'

(async function() {
    let myServiceClient = new Node({ options: { layer: 'LayerA' } });

    //** connect one node to another node with address
    await myServiceClient.connect({ address: 'tcp://127.0.0.1:6000' });

    let serverNodeId = 'myServiceServer';

    // ** tick() is like firing an event to another node
    myServiceClient.tick({ to: serverNodeId, event: 'welcome', data:'Hi server!!!' });

    // ** you request to another node and getting a promise
    // ** which will be resolve after reply.
    let responseFromServer = await myServiceClient.request({ to: serverNodeId, event: 'welcome', data: 'Hi server, I am client !!!' });

    console.log(`response from server is "${responseFromServer}"`);
    // ** response from server is "Hello client."
}());

Example of filtering the znodes via options.

Let's say we want to group our znodes logicaly in some layers and send messages considering that layering.

  • znode-s can be grouped in layers (and other options) and then send messages to only filtered nodes by layers or other options.
  • the filtering is done on senders side which keeps all the information about the nodes (both connected to sender node and the ones that sender node is connected to)

In this example, we will create one server znode that will bind in some address, and three client znodes will connect to our server znode. 2 of client znodes will be in layer A, 1 in B.

serverNode.js

import Node from 'zeronode'

(async function() {
    let server = new Node({ bind: 'tcp://127.0.0.1:6000' });
    await server.bind();
}());

clientA1.js

import Node from 'zeronode'

(async function() {
    let clientA1 = new Node({ options: { layer: 'A' } });
   
    clientA1.onTick('foobar', (msg) => {
        console.log(`go message in clientA1 ${msg}`);
    });
    
    // ** connect to server address and set connection timeout to 20 seconds
    await clientA1.connect({ address: 'tcp:://127.0.0.1:6000', 20000 });
}());

clientA2.js

import Node from 'zeronode'

(async function() {
    let clientA2 = new Node({ options: { layer: 'A' } });
   
    clientA2.onTick('foobar', (msg) => {
        console.log(`go message in clientA2 ${msg}`);
    });
    // ** connect to server address and set connection timeout infinite
    await clientA2.connect({ address: 'tcp:://127.0.0.1:6000') };
}());

clientB1.js

import Node from 'zeronode'

(async function() {
    let clientB1 = new Node({ options: { layer: 'B' } });
   
    clientB1.onTick('foobar', (msg) => {
        console.log(`go message in clientB1 ${msg}`);
    });
    
    // ** connect to server address and set connection timeout infinite
    await clientB1.connect({ address: 'tcp:://127.0.0.1:6000' });
}());

Now that all connections are set, we can send events.

// ** this will tick only one node of the layer A nodes;
server.tickAny({ event: 'foobar', data: { foo: 'bar' }, filter: { layer: 'A' } });

// ** this will tick to all layer A nodes;
server.tickAll({ event: 'foobar', data: { foo: 'bar' }, filter: { layer: 'A' } });

// ** this will tick to all nodes that server connected to, or connected to server.
server.tickAll({ event: 'foobar', data: { foo: 'bar' } });


// ** you even can use regexp to filer znodes to which the tick will be sent
// ** also you can pass a predicate function as a filter which will get znode-s options as an argument
server.tickAll({ event: 'foobar', data: { foo: 'bar' }, filter: {layer: /[A-Z]/} })

Still have a question ?

We'll be happy to answer your questions. Try to reach out us on zeronode gitter chat

Contributing

Contributions are always welcome!
Please read the contribution guidelines first.

Contributors

More about zeronode internals

Under the hood we are using zeromq-s Dealer and Router sockets.

License

MIT

Comments
  • Code example fix

    Code example fix

    Thanks for the nice library, just some minor fixes which I noticed when reading the documentation.

    Line 65 add async function for await otherwise, it will not work. Line 68 add quotes. Line 366 throws error and server exit when the client sends a request. There is no need for next() function.

    opened by nairihar 3
  • Bump handlebars from 4.1.2 to 4.7.6

    Bump handlebars from 4.1.2 to 4.7.6

    Bumps handlebars from 4.1.2 to 4.7.6.

    Changelog

    Sourced from handlebars's changelog.

    v4.7.6 - April 3rd, 2020

    Chore/Housekeeping:

    Compatibility notes:

    • Restored Node.js compatibility

    Commits

    v4.7.5 - April 2nd, 2020

    Chore/Housekeeping:

    • Node.js version support has been changed to v6+ Reverted in 4.7.6

    Compatibility notes:

    • Node.js < v6 is no longer supported Reverted in 4.7.6

    Commits

    v4.7.4 - April 1st, 2020

    Chore/Housekeeping:

    Compatibility notes:

    • No incompatibilities are to be expected

    Commits

    v4.7.3 - February 5th, 2020

    Chore/Housekeeping:

    • #1644 - Download links to aws broken on handlebarsjs.com - access denied (@Tea56)
    • Fix spelling and punctuation in changelog - d78cc73

    Bugfixes:

    • Add Type Definition for Handlebars.VERSION, Fixes #1647 - 4de51fe
    • Include Type Definition for runtime.js in Package - a32d05f

    Compatibility notes:

    Commits
    Maintainer changes

    This version was pushed to npm by erisds, a new releaser for handlebars since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump lodash from 4.17.15 to 4.17.19

    Bump lodash from 4.17.15 to 4.17.19

    Bumps lodash from 4.17.15 to 4.17.19.

    Release notes

    Sourced from lodash's releases.

    4.17.16

    Commits
    Maintainer changes

    This version was pushed to npm by mathias, a new releaser for lodash since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump handlebars from 4.1.2 to 4.5.3

    Bump handlebars from 4.1.2 to 4.5.3

    Bumps handlebars from 4.1.2 to 4.5.3.

    Changelog

    Sourced from handlebars's changelog.

    v4.5.3 - November 18th, 2019

    Bugfixes:

    • fix: add "no-prototype-builtins" eslint-rule and fix all occurences - f7f05d7
    • fix: add more properties required to be enumerable - 1988878

    Chores / Build:

    • fix: use !== 0 instead of != 0 - c02b05f
    • add chai and dirty-chai and sinon, for cleaner test-assertions and spies, deprecate old assertion-methods - 93e284e, 886ba86, 0817dad, 93516a0

    Security:

    • The properties __proto__, __defineGetter__, __defineSetter__ and __lookupGetter__ have been added to the list of "properties that must be enumerable". If a property by that name is found and not enumerable on its parent, it will silently evaluate to undefined. This is done in both the compiled template and the "lookup"-helper. This will prevent new Remote-Code-Execution exploits that have been published recently.

    Compatibility notes:

    • Due to the security-fixes. The semantics of the templates using __proto__, __defineGetter__, __defineSetter__ and __lookupGetter__ in the respect that those expression now return undefined rather than their actual value from the proto.
    • The semantics have not changed in cases where the properties are enumerable, as in:
    {
      __proto__: 'some string'
    }
    
    • The change may be breaking in that respect, but we still only increase the patch-version, because the incompatible use-cases are not intended, undocumented and far less important than fixing Remote-Code-Execution exploits on existing systems.

    Commits

    v4.5.2 - November 13th, 2019

    Bugfixes

    • fix: use String(field) in lookup when checking for "constructor" - d541378
    • test: add fluent API for testing Handlebars - c2ac79c

    Compatibility notes:

    • no incompatibility are to be expected
    ... (truncated)
    Commits
    • c819c8b v4.5.3
    • 827c9d0 Update release notes
    • f7f05d7 fix: add "no-prototype-builtins" eslint-rule and fix all occurences
    • 1988878 fix: add more properties required to be enumerable
    • 886ba86 test/chore: add chai/expect and sinon to "runtime"-environment
    • 0817dad test: add sinon as global variable to eslint in the specs
    • 93516a0 test: add sinon.js for spies, deprecate current assertions
    • 93e284e chore: add chai and dirty-chai for better test assertions
    • c02b05f fix: use !== 0 instead of != 0
    • 8de121d v4.5.2
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot ignore this [patch|minor|major] version will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Preinstall.sh not working with macos

    Preinstall.sh not working with macos

    Issue

    This command is executed at the end of the preinstall.sh script.

    $packageManager install -y $libzmq
    

    -y is not a valid brew option, see thorwn error message:

    Error: invalid option: -y

    Potential Solution

    If -y in other OS library manager means say yes to all questions, then it could be replaced by yes, eg:

    yes | $packageManager install $libzmq
    

    Need to check support first.

    opened by roine 1
  • Bump eslint-utils from 1.4.0 to 1.4.2

    Bump eslint-utils from 1.4.0 to 1.4.2

    Bumps eslint-utils from 1.4.0 to 1.4.2.

    Commits
    • 4e1bc07 1.4.2
    • e4cb014 🐛 add null test
    • 230a4e2 1.4.1
    • 08158db 🐛 fix getStaticValue security issue
    • 587cca2 🐛 fix getStringIfConstant to handle literals correctly
    • c119e83 🐛 fix getStaticValue to handle bigint correctly
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot ignore this [patch|minor|major] version will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump qs from 6.7.0 to 6.11.0

    Bump qs from 6.7.0 to 6.11.0

    Bumps qs from 6.7.0 to 6.11.0.

    Changelog

    Sourced from qs's changelog.

    6.11.0

    • [New] [Fix] stringify: revert 0e903c0; add commaRoundTrip option (#442)
    • [readme] fix version badge

    6.10.5

    • [Fix] stringify: with arrayFormat: comma, properly include an explicit [] on a single-item array (#434)

    6.10.4

    • [Fix] stringify: with arrayFormat: comma, include an explicit [] on a single-item array (#441)
    • [meta] use npmignore to autogenerate an npmignore file
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbol, object-inspect, tape

    6.10.3

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [actions] reuse common workflows
    • [Dev Deps] update eslint, @ljharb/eslint-config, object-inspect, tape

    6.10.2

    • [Fix] stringify: actually fix cyclic references (#426)
    • [Fix] stringify: avoid encoding arrayformat comma when encodeValuesOnly = true (#424)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] add note and links for coercing primitive values (#408)
    • [actions] update codecov uploader
    • [actions] update workflows
    • [Tests] clean up stringify tests slightly
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, object-inspect, safe-publish-latest, tape

    6.10.1

    • [Fix] stringify: avoid exception on repeated object values (#402)

    6.10.0

    • [New] stringify: throw on cycles, instead of an infinite loop (#395, #394, #393)
    • [New] parse: add allowSparse option for collapsing arrays with missing indices (#312)
    • [meta] fix README.md (#399)
    • [meta] only run npm run dist in publish, not install
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbols, tape
    • [Tests] fix tests on node v0.6
    • [Tests] use ljharb/actions/node/install instead of ljharb/actions/node/run
    • [Tests] Revert "[meta] ignore eclint transitive audit warning"

    6.9.7

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Fix] stringify: avoid encoding arrayformat comma when encodeValuesOnly = true (#424)
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] add note and links for coercing primitive values (#408)
    • [Tests] clean up stringify tests slightly
    • [meta] fix README.md (#399)
    • Revert "[meta] ignore eclint transitive audit warning"

    ... (truncated)

    Commits
    • 56763c1 v6.11.0
    • ddd3e29 [readme] fix version badge
    • c313472 [New] [Fix] stringify: revert 0e903c0; add commaRoundTrip option
    • 95bc018 v6.10.5
    • 0e903c0 [Fix] stringify: with arrayFormat: comma, properly include an explicit `[...
    • ba9703c v6.10.4
    • 4e44019 [Fix] stringify: with arrayFormat: comma, include an explicit [] on a s...
    • 113b990 [Dev Deps] update object-inspect
    • c77f38f [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbol, tape
    • 2cf45b2 [meta] use npmignore to autogenerate an npmignore file
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump decode-uri-component from 0.2.0 to 0.2.2

    Bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump snyk from 1.216.1 to 1.996.0

    Bump snyk from 1.216.1 to 1.996.0

    Bumps snyk from 1.216.1 to 1.996.0.

    Release notes

    Sourced from snyk's releases.

    v1.996.0

    1.996.0 (2022-09-01)

    Bug Fixes

    • bump golang plugin version (8893f81)

    Features

    v1.995.0

    1.995.0 (2022-08-31)

    Bug Fixes

    • matching configurations error on gradle version catalog (20dcdae)

    v1.994.0

    1.994.0 (2022-08-31)

    Bug Fixes

    Features

    • add custom severities to iac test config (9d86574)
    • add ignore count in the experimental version of iac test (d390ca2)
    • Added support for depth-detection (8cf1815)

    v1.993.0

    1.993.0 (2022-08-29)

    Features

    v1.992.0

    1.992.0 (2022-08-25)

    Bug Fixes

    ... (truncated)

    Commits
    • f614f80 Merge pull request #3803 from snyk/fix/bump-golang-plugin-version
    • d779654 Merge pull request #3620 from snyk/chore/cliv2_support_alpine
    • 8893f81 fix: bump golang plugin version
    • d2fd088 Merge pull request #3792 from snyk/feat/add-var-file-support
    • 544b0f1 Merge pull request #3800 from snyk/chore/capsule-doesnt-exist
    • 537372d feat: add --var-file support
    • 581ebb8 chore: handle GOOS alpine in Makefile
    • 424289d chore: remove code ownership from Capsule
    • 9717d2a Merge pull request #3793 from snyk/fix/bump-gradle-plugin-version
    • 20dcdae fix: matching configurations error on gradle version catalog
    • Additional commits viewable in compare view
    Maintainer changes

    This version was pushed to npm by snyk-admin, a new releaser for snyk since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump @hapi/hoek, @hapi/joi, optioner and use-plugin

    Bump @hapi/hoek, @hapi/joi, optioner and use-plugin

    Bumps @hapi/hoek, @hapi/joi, optioner and use-plugin. These dependencies needed to be updated together. Updates @hapi/hoek from 6.2.4 to 8.5.1

    Commits

    Updates @hapi/joi from 15.1.0 to 15.1.1

    Commits

    Updates optioner from 4.0.0 to 4.2.0

    Commits

    Updates use-plugin from 5.1.0 to 5.2.1

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump jszip from 3.2.2 to 3.10.1

    Bump jszip from 3.2.2 to 3.10.1

    Bumps jszip from 3.2.2 to 3.10.1.

    Changelog

    Sourced from jszip's changelog.

    v3.10.1 2022-08-02

    • Add sponsorship files.
      • If you appreciate the time spent maintaining JSZip then I would really appreciate your sponsorship.
    • Consolidate metadata types and expose OnUpdateCallback #851 and #852
    • use const instead var in example from README.markdown #828
    • Switch manual download link to HTTPS #839

    Internals:

    • Replace jshint with eslint #842
    • Add performance tests #834

    v3.10.0 2022-05-20

    • Change setimmediate dependency to more efficient one. Fixes Stuk/jszip#617 (see #829)
    • Update types of currentFile metadata to include null (see #826)

    v3.9.1 2022-04-06

    • Fix recursive definition of InputFileFormat introduced in 3.9.0.

    v3.9.0 2022-04-04

    • Update types JSZip#loadAsync to accept a promise for data, and remove arguments from new JSZip() (see #752)
    • Update types for compressionOptions to JSZipFileOptions and JSZipGeneratorOptions (see #722)
    • Add types for generateInternalStream (see #774)

    v3.8.0 2022-03-30

    • Santize filenames when files are loaded with loadAsync, to avoid "zip slip" attacks. The original filename is available on each zip entry as unsafeOriginalName. See the documentation. Many thanks to McCaulay Hudson for reporting.

    v3.7.1 2021-08-05

    • Fix build of dist files.
      • Note: this version ensures the changes from 3.7.0 are actually included in the dist files. Thanks to Evan W for reporting.

    v3.7.0 2021-07-23

    • Fix: Use a null prototype object for this.files (see #766)
      • This change might break existing code if it uses prototype methods on the .files property of a zip object, for example zip.files.toString(). This approach is taken to prevent files in the zip overriding object methods that would exist on a normal object.

    v3.6.0 2021-02-09

    • Fix: redirect main to dist on browsers (see #742)
    • Fix duplicate require DataLengthProbe, utils (see #734)
    • Fix small error in read_zip.md (see #703)

    v3.5.0 2020-05-31

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump ajv from 6.10.2 to 6.12.6

    Bump ajv from 6.10.2 to 6.12.6

    Bumps ajv from 6.10.2 to 6.12.6.

    Release notes

    Sourced from ajv's releases.

    v6.12.6

    Fix performance issue of "url" format.

    v6.12.5

    Fix uri scheme validation (@​ChALkeR). Fix boolean schemas with strictKeywords option (#1270)

    v6.12.4

    Fix: coercion of one-item arrays to scalar that should fail validation (failing example).

    v6.12.3

    Pass schema object to processCode function Option for strictNumbers (@​issacgerges, #1128) Fixed vulnerability related to untrusted schemas (CVE-2020-15366)

    v6.12.2

    Removed post-install script

    v6.12.1

    Docs and dependency updates

    v6.12.0

    Improved hostname validation (@​sambauers, #1143) Option keywords to add custom keywords (@​franciscomorais, #1137) Types fixes (@​boenrobot, @​MattiAstedrone) Docs:

    v6.11.0

    Time formats support two digit and colon-less variants of timezone offset (#1061 , @​cjpillsbury) Docs: RegExp related security considerations Tests: Disabled failing typescript test

    Commits
    • fe59143 6.12.6
    • d580d3e Merge pull request #1298 from ajv-validator/fix-url
    • fd36389 fix: regular expression for "url" format
    • 490e34c docs: link to v7-beta branch
    • 9cd93a1 docs: note about v7 in readme
    • 877d286 Merge pull request #1262 from b4h0-c4t/refactor-opt-object-type
    • f1c8e45 6.12.5
    • 764035e Merge branch 'ChALkeR-chalker/fix-comma'
    • 3798160 Merge branch 'chalker/fix-comma' of git://github.com/ChALkeR/ajv into ChALkeR...
    • a3c7eba Merge branch 'refactor-opt-object-type' of github.com:b4h0-c4t/ajv into refac...
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
Owner
Steadfast
Your steadfast digital partner.
Steadfast
:rocket: Progressive microservices framework for Node.js

Moleculer Moleculer is a fast, modern and powerful microservices framework for Node.js. It helps you to build efficient, reliable & scalable services.

MoleculerJS 5.5k Jan 4, 2023
A microservices toolkit for Node.js.

A Node.js toolkit for Microservice architectures This open source module is sponsored and supported by Voxgig. seneca Lead Maintainer: Richard Rodger

Seneca Microservices Framework 3.9k Dec 19, 2022
🔬 Writing reliable & fault-tolerant microservices in Node.js

A Node.js microservices toolkit for the NATS messaging system Run on repl.it Node: v6+ Documentation: https://hemerajs.github.io/hemera/ Lead Maintain

HemeraJs 800 Dec 14, 2022
A progressive Node.js framework for building efficient, scalable, and enterprise-grade server-side applications on top of TypeScript & JavaScript (ES6, ES7, ES8) 🚀

A progressive Node.js framework for building efficient and scalable server-side applications. Description Nest is a framework for building efficient,

nestjs 53.2k Dec 31, 2022
Marble.js - functional reactive Node.js framework for building server-side applications, based on TypeScript and RxJS.

Functional reactive Node.js framework for building server-side applications, based on TypeScript and RxJS. Ecosystem Name Description @marblejs/core F

Marble.js 2.1k Dec 16, 2022
Catberry is an isomorphic framework for building universal front-end apps using components, Flux architecture and progressive rendering.

Catberry What the cat is that? Catberry was developed to help create "isomorphic/Universal" Web applications. Long story short, isomorphic/universal a

Catberry.js 801 Dec 20, 2022
A well documented set of tools for building node web applications.

Perk Framework Perk is a well documented set of tools for building node web applications. The goal of Perk is first and foremost to provide a well doc

Aaron Larner 179 Oct 26, 2022
A template project for building high-performance, portable, and safe serverless functions in Vercel.

Tutorial | Demo for image processing | Demo for tensorflow This is a Next.js project bootstrapped with create-next-app. This project is aimed to demon

Second State 63 Dec 8, 2022
Actionhero is a realtime multi-transport nodejs API Server with integrated cluster capabilities and delayed tasks

Actionhero The reusable, scalable, and quick node.js API server for stateless and stateful applications NPM | Web Site | Latest Docs | GitHub | Slack

Actionhero 2.3k Jan 4, 2023
Framework for setting up RESTful JSON APIs with NodeJS.

Restberry works with both Express and Restify! Framework for setting up RESTful JSON APIs with NodeJS. Define your models and setup CRUD API calls wit

Restberry 117 Jul 5, 2021
Component based MVC web framework for nodejs targeting good code structures & modularity.

Component based MVC web framework for nodejs targeting good code structures & modularity. Why fortjs Based on Fort architecture. MVC Framework and fol

Ujjwal Gupta 47 Sep 27, 2022
AWS Lambda router for NodeJS

AWS Lambda Router for NodeJS A collection of tools to handle ApiGateway requests and direct function invocation calls on AWS Lambda. Use it as a stand

Dumitru Glavan 11 Apr 22, 2019
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till mÀnniskor pÄ flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
A block preview that directly displays the block fields, including tabs.

Kirby Block Preview Fields This plugin for Kirby 3 displays the block fields directly in the block preview, including tabs. Inspired by the Kirby Fiel

JUNO 8 May 10, 2023
Chronos is an ML Scheduler Tool, helping students to block and manage time with minimal manual intervention.

Chronos (Currently in progress) Chronos is an ML Scheduler Tool, helping students to block and manage time with minimal manual intervention. It adapts

Shromann Majumder 3 Aug 17, 2022
Asynchronous HTTP microservices

Disclaimer: Micro was created for use within containers and is not intended for use in serverless environments. For those using Vercel, this means tha

Vercel 10.3k Jan 4, 2023
:rocket: Progressive microservices framework for Node.js

Moleculer Moleculer is a fast, modern and powerful microservices framework for Node.js. It helps you to build efficient, reliable & scalable services.

MoleculerJS 5.5k Jan 4, 2023
A microservices toolkit for Node.js.

A Node.js toolkit for Microservice architectures This open source module is sponsored and supported by Voxgig. seneca Lead Maintainer: Richard Rodger

Seneca Microservices Framework 3.9k Dec 19, 2022