A few seconds.

uri-templates

URI Templates (RFC6570) including de-substitution

uri-templates

URI Templates (RFC6570) in JavaScript, including de-substitution.

It is tested against the official test suite, including the extended tests.

The "de-substitution" extracts parameter values from URIs. It is also tested against the official test suite (including extended tests).

Creation

In Node:

var uriTemplates = require('uri-templates');
var template1 = uriTemplates("/date/{colour}/{shape}/");

In browser:

var template2 = new UriTemplate("/prefix/{?params*}");

Substitution using an object

// "/categories/green/round/"
var uri1 = template1.fill({colour: "green", shape: "round"});

// "/prefix/?a=A&b=B&c=C
var uri2 = template2.fillFromObject({
    params: {a: "A", b: "B", c: "C"}
});

Substitution using a callback

// "/categories/example_colour/example_shape/"
var uri1b = template1.fill(function (varName) {
    return "example_" + varName;
});

Guess variables from URI ("de-substitution")

var uri2b = "/prefix/?beep=boop&bleep=bloop";
var params = template2.fromUri(url2b);
/*
    {
        params: {
            beep: "boop",
            bleep: "bloop"
        }
    }
*/

While templates can be ambiguous (e.g. "{var1}{var2}"), it will still produce something that reconstructs into the original URI.

It can handle all the cases in the official test suite, including the extended tests:

var template = uriTemplate("{/id*}{?fields,token}");

var values = template.fromUri("/person/albums?fields=id,name,picture&token=12345");
/*
{
    id: ["person", 'albums"],
    fields: ["id", "name", "picture"],
    token: "12345"
}
*/

strict option

Sometimes, you might want a more exact match, instead of a best guess. For example, this could be useful when using URI Templates for routing.

The strict option performs more checks, to see whether the URI being matched is plausible:

var template = uriTemplate("/prefix/{value}/{suffix}");

// Matches, even though "foo/bar" contains a "/" which is not allowed
var looseMatch = template.fromUri('/prefix/foo/bar/suffix');
// Does not match
var strictMatch = template.fromUri('/prefix/foo/bar/suffix', {strict: true});

Test URI

var uri2b = "/prefix/?beep=boop&bleep=bloop";
var isMatch = template2.test(url2b); // === true

This returns a boolean, and takes the same options as .fromUri().

License

This project is released as public-domain. Anybody can modify or re-license it for any purpose, without restriction.

Pincer is a project which aims to provide best library discovery tools for developers. We're growing day by day. We have only npm platform for now but we will add the others as much as we can.