JSPM

path-proxy

1.0.0
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 112483
  • Score
    100M100P100Q191528F
  • License MIT

A path proxy object constructor

Package Exports

  • path-proxy

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (path-proxy) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

path-proxy

Given an group of paths (say, from an API schema), you might need to create a set of proxy objects for interacting with those paths. This is the situation I found myself in while working on the Node client for the Heroku API.

Given a set of paths and a base constructor function, path-proxy will create a network of logical proxy objects based on the paths and attach it to the constructor's prototype.

Install

npm install path-proxy --save

Usage

var pathProxy = require('path-proxy');

function ApiClient() {}

pathProxy.proxy(ApiClient, [
  "/foo",
  "/foo/{id}/bar"
]);

var client = new ApiClient();
client.foo("qux").bar();

This may not appear all that useful—they're mostly just empty functions—until you start mucking around with their prototypes:

var BarProxy = pathProxy.pathProxy(ApiClient, "/foo/{id}/bar");
BarProxy.prototype.sayHello = function () {
  console.log("hello");
};

client.foo("qux").bar().sayHello(); // Logs "hello".

They also have access to a few useful attributes:

var baz = client.foo("qux").bar("baz");
baz.params;       // ["qux", "baz"]
baz.pathSegments; // ["foo", "qux", "bar", "baz"]
baz.path;         // "/foo/qux/bar/baz"

And can access the instance of the base constructor they're based off of:

ApiClient.prototype.delete = function (path, callback) {
  var message = this.name + " deleted at " + path;
  callback(message);
};

var client = new ApiClient();
client.name = "Jonathan";

BarProxy.prototype.delete = function (callback) {
  this.base.delete(this.path, callback);
};

// This:
client.foo("qux").bar("baz").delete(function (message) {
  // message == "Jonathan deleted at /foo/qux/bar/baz"
});

// Is equivalent to this:
client.delete("/foo/qux/bar/baz", function (message) {
  // message == "Jonathan deleted at /foo/qux/bar/baz"
});

Tests

path-proxy uses jasmine-node for tests. To run them:

$ npm install
$ npm test