node package manager



Build Status

A service locator for microservices.

Originally written by Jeremy Likness.

Contact me on Twitter or via my blog.


import { Locator } from 'micro-locator';
// do this when you bootstrap your app 
let loc = new Locator(); 
// use this throughout your app
let locate = (sig: string) => loc.resolve(sig);

Quick Start

Most front-end web applications either hard-code calls to Web APIs or configure a base URL, something like:


The goal of micro-locator is to make it simple and easy to follow a standard convention for calling APIs throughout your app, and then override the actual end points as needed. For example, consider the following end points:





These may be hosted in a local build and the relative syntax is fine. In production, however, a dedicated webserver hosts the end points on a domain:

With micro-locator, you change a call like this:


to this:


If you do nothing, the endpoint is simply reflected back. For production, just configure the locator like this:

locator.rebase('/', '

Now all urls will resolve like this:

/api/accounting/func1 ->

You can choose to truncate the path you rebase (for example, rebase /api to and remove the /api prefix) and replace specific end points.

The configure function enables simple, one-pass configuration when you bootstrap your app, and you can simply register the locator function with your dependency injection to hide any implementation details of the micro-services locator itself.


Based on these test scenarios:

Rebase all calls

loc.rebase('/', 'http://production'); // everything
// http://production/api/accounting/func1

Rebase to new path

loc.rebase('/api/billing', 'http://billing.production/');
// everything under /api/billing 
// http://billing.production/api/billing/func3

Rebase and truncate the path

loc.rebase('/api/billing', 'http://billing.production').truncate();
// everything under /api/billing 
// http://billing.production/func3 

Replace a node

loc.replace('/api/accounting/func2', 'http://experimental/func');
// only for the specific /api/accounting/func2 request
// http://experimental/func 

Configuration syntax for bootstrapping

    rebase: ['/', 'http://production']
}, {
    rebase: ['/api/billing', 'http://billing.production/'],
    truncate: true
}, {
    replace: ['/api/accounting/func2', 'http://experimental/func']