# micro-locator

> Service locator for microservices

Latest version **1.1.0** (published 2017-09-18) · MIT license · 0 weekly downloads

## Install

```sh
npm install micro-locator
pnpm add micro-locator
yarn add micro-locator
bun add micro-locator
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.1.0 |
| Published | 2017-09-18 |
| First published | 2016-12-16 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 0 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 8 |
| Author | Jeremy Likness |
| Maintainers | jeremylikness |
| Keywords | microservices, http, service, locator |

## Links

- npm: https://www.npmjs.com/package/micro-locator
- Repository: https://github.com/jeremylikness/micro-locator
- Homepage: https://github.com/jeremylikness/micro-locator#readme
- Issues: https://github.com/jeremylikness/micro-locator/issues
- npm.io page: https://npm.io/package/micro-locator

## Recent versions

- 1.1.0 (latest) — 2017-09-18
- 0.2.2 — 2016-12-22
- 0.2.1 — 2016-12-22
- 0.2.0 — 2016-12-22
- 0.1.5 — 2016-12-22
- 0.1.4 — 2016-12-22
- 0.1.3 — 2016-12-16
- 0.1.2 — 2016-12-16
- 0.1.1 — 2016-12-16
- 0.1.0 — 2016-12-16

## README

# Micro-Locator 

![Build Status](https://api.travis-ci.org/JeremyLikness/micro-locator.svg?branch=master) [![npm](https://img.shields.io/npm/dt/micro-locator.svg)](https://www.npmjs.com/package/micro-locator)

A service locator for microservices. 

Originally written by [Jeremy Likness](https://twitter.com/jeremylikness).

Contact me on Twitter or via [my blog](https://csharperimage.jeremylikness.com).

## Reference 

Install: `npm -i micro-locator --save`

```TypeScript 
import { Locator } from 'micro-locator';

// do this when you bootstrap your app 
let loc = new Locator(); 
loc.configure({...});

// 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: 

`http://localost:1234/someapi` 

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: 

`/api/accounting/func1`

`/api/accounting/func2`

`/api/billing/func3`

`/api/billing/func4` 

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:

`http://api.myapp.com/api...` 

With micro-locator, you change a call like this: 

`$http.get('/api/accounting/func1')`

to this: 

`$http.get(locate('/api/accounting/func1'))` 

If you do nothing, the endpoint is simply reflected back. For production, just configure the locator like this: 

`locator.rebase('/', 'http://api.myapp.com/)` 

Now all urls will resolve like this: 

`/api/accounting/func1 -> http://api.myapp.com/api/accounting/func1` 

You can choose to truncate the path you rebase (for example, rebase `/api` to `http://api.myapp.com/` and remove the `/api` prefix) and replace specific end points. You may configure as many rebases and replacements at any level you like, allowing micro-locator to scale to large applications.

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. 

## Examples 

Based on [these test scenarios](https://github.com/JeremyLikness/micro-locator/blob/master/test/microLocator.scenarios.spec.ts):

### Rebase all calls 

```TypeScript
loc.rebase('/', 'http://production'); // everything
loc.resolve('/api/accounting/func1'); 
// http://production/api/accounting/func1
```

### Rebase to new path 

```TypeScript
loc.rebase('/api/billing', 'http://billing.production/');
// everything under /api/billing 
loc.resolve('/api/billing/func3');
// http://billing.production/api/billing/func3
```

### Rebase and truncate the path 

```TypeScript 
loc.rebase('/api/billing', 'http://billing.production').truncate();
// everything under /api/billing 
loc.resolve('/api/billing/func3');
// http://billing.production/func3 
```

### Replace a node 

```TypeScript 
loc.replace('/api/accounting/func2', 'http://experimental/func');
// only for the specific /api/accounting/func2 request
loc.resolve('/api/accounting/func2');
// http://experimental/func 
```

### Configuration syntax for bootstrapping 

```TypeScript 
loc.configure([{
    rebase: ['/', 'http://production']
}, {
    rebase: ['/api/billing', 'http://billing.production/'],
    truncate: true
}, {
    replace: ['/api/accounting/func2', 'http://experimental/func']
}]);
```

---
_Source: https://npm.io/package/micro-locator · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
