Incarnate
Runtime Dependency Lifecycle Management for JavaScript.
Install
npm i -S incarnate
API Docs
http://incarnate.resist.design
Usage Example
import Incarnate from 'incarnate'; // Declare your application.const inc = subMap: // Keep track of your state. state: subMap: user: authToken: undefined // Supply some services. services: // Some services need authorization information. shared: user: 'state.user' subMap: user: true login: { return async { // Make a login request, get the `authToken`. const fakeToken = `:`; // For demo purposes we'll use the `Buffer` API in node.js to base64 encode the credentials. return Buffer; }; } accounts: dependencies: user: 'user' { return async { // NOTE: IF we call this service method AFTER `login`, // the `authToken` will have been automatically updated, // in this service, by Incarnate. if !authToken throw 'The accounts service requires an authorization token but none was supplied.'; // Get a list of accounts with the `authToken` in the headers. console; return name: 'Account 1' name: 'Account 2' name: 'Account 3' name: 'Account 4' ; }; } // Expose some actions that call services and store the results in a nice, tidy, reproducible way. actions: shared: user: 'state.user' loginService: 'services.login' subMap: user: true loginService: true login: dependencies: loginService: 'loginService' setters: setUser: 'user' { return async { // Login const authToken = await ; // Store the `authToken`. ; return true; }; } ; // Here's your app. { // Get the Login Action. const loginAction = inc; // Do the login. const loginResult = await ; // Get the Accounts Service. It needs the User's `authToken`, // but you declared it as a Dependency, // so Incarnate took care of that for you. const accountsService = inc; // Get those accounts you've been dying to see... const accounts = await ; // Here they are! console;} // You need to run your app.;