Giter VIP home page Giter VIP logo

uri.js's Introduction

URI.js


I always want to shoot myself in the head when looking at code like the following:

var url = "http://example.org/foo?bar=baz",
    separator = url.indexOf('?') > -1 ? '&' : '?';

url += separator + encodeURIComponent("foo") + "=" + encodeURIComponent("bar");

I still can't believe javascript - the f**ing backbone-language of the web - doesn't offer an API for mutating URLs. Browsers (Firefox) don't expose the Location object (the structure behind window.location). Yes, one could think of decomposed IDL attributes as a native URL management library. But it relies on the DOM element <a>, it's slow and doesn't offer any convenience at all.

How about a nice, clean and simple API for mutating URIs:

var url = new URI("http://example.org/foo?bar=baz");
url.addQuery("foo", "bar");

URI.js is here to help with that.

API Example

// mutating URLs
URI("http://example.org/foo.html?hello=world")
    .username("rodneyrehm")
        // -> http://[email protected]/foo.html?hello=world
    .username("")
        // -> http://example.org/foo.html?hello=world
    .directory("bar")
        // -> http://example.org/bar/foo.html?hello=world
    .suffix("xml")
        // -> http://example.org/bar/foo.xml?hello=world
    .query("")
        // -> http://example.org/bar/foo.xml
    .tld("com")
        // -> http://example.com/bar/foo.xml
    .query({ foo: "bar", hello: ["world", "mars"] });
        // -> http://example.com/bar/foo.xml?foo=bar&hello=world&hello=mars

// cleaning things up
URI("?&foo=bar&&foo=bar&foo=baz&")
    .normalizeQuery();
        // -> ?foo=bar&foo=baz

// working with relative paths
URI("/foo/bar/baz.html")
    .relativeTo("/foo/bar/world.html");
        // -> ./baz.html

URI("/foo/bar/baz.html")
    .relativeTo("/foo/bar/sub/world.html")
        // -> ../baz.html
    .absoluteTo("/foo/bar/sub/world.html");
        // -> /foo/bar/baz.html

// URI Templates
URI.expand("/foo/{dir}/{file}", {
  dir: "bar",
  file: "world.html"
});
// -> /foo/bar/world.html

See the About Page and API Docs for more stuff.

Using URI.js

Browser

I guess you'll manage to use the build tool or follow the instructions below to combine and minify the various files into URI.min.js - and I'm fairly certain you know how to <script src=".../URI.min.js"></script> that sucker, too.

Node.js and NPM

Install with npm install URIjs or add "URIjs" to the dependencies in your package.json.

// load URI.js
var URI = require('URIjs');
// load an optional module (e.g. URITemplate)
var URITemplate = require('URIjs/src/URITemplate');

URI("/foo/bar/baz.html")
    .relativeTo("/foo/bar/sub/world.html")
// -> ../baz.html

RequireJS

Clone the URI.js repository or use a package manager to get URI.js into your project.

require.config({
    paths: {
        URIjs: 'where-you-put-uri.js/src'
    }
});

require(['URIjs/URI'], function(URI) {
    console.log("URI.js and dependencies: ", URI("//amazon.co.uk").is('sld') ? 'loaded' : 'failed');
});
require(['URIjs/URITemplate'], function(URITemplate) {
    console.log("URITemplate.js and dependencies: ", URITemplate._cache ? 'loaded' : 'failed');
});

Minify

See the build tool or use Google Closure Compiler:

// ==ClosureCompiler==
// @compilation_level SIMPLE_OPTIMIZATIONS
// @output_file_name URI.min.js
// @code_url http://medialize.github.com/URI.js/src/IPv6.js
// @code_url http://medialize.github.com/URI.js/src/punycode.js
// @code_url http://medialize.github.com/URI.js/src/SecondLevelDomains.js
// @code_url http://medialize.github.com/URI.js/src/URI.js
// @code_url http://medialize.github.com/URI.js/src/URITemplate.js
// ==/ClosureCompiler==

Resources

Documents specifying how URLs work:

Informal stuff

How other environments do things

Discussion on Hacker News

Alternatives

If you don't like URI.js, you may like one of these:

URL Manipulation

URL Parsers

URI Template

Various

Authors

Contains Code From

License

URI.js is published under the MIT license and GPL v3.

Changelog

1.10.1 (April 2nd 2013)

1.10.0 (March 16th 2013)

1.9.1 (February 12th 2013)

  • fixing IE9 compatibility with location import: URI(location)
  • fixing string character access for IE7 - (Issue #67), (Issue #68)

1.9.0 (February 11th 2013)

1.8.3 (January 9th 2013)

1.8.2 (December 27th 2012)

1.8.1 (November 15th 2012)

  • fixing build() to properly omit empty query and fragment (Issue #53)

1.8.0 (November 13th 2012)

  • adding .resource() as compound of [path, query, fragment]
  • adding jQuery 1.8.x compatibility for jQuery.URI.js (remaining backwards compatibility!)
  • adding default ports for gopher, ws, wss
  • adding .duplicateQueryParameters() to control if key=value duplicates have to be preserved or reduced (Issue #51)
  • updating Punycode.js to version 1.1.1
  • improving AMD/Node using UMD returnExports - (Issue #44, Issue #47)
  • fixing .addQuery("empty") to properly add ?empty - (Issue #46)
  • fixing parsing of badly formatted userinfo http://username:pass:word@hostname
  • fixing parsing of Windows-Drive-Letter paths file://C:/WINDOWS/foo.txt
  • fixing URI(location) to properly parse the URL - (Issue #52)
  • fixing type error for fragment abuse demos - (Issue #50)
  • adding documentation for various encode/decode functions
  • adding some pointers on possible problems with URLs to About URIs
  • adding tests for fragment abuse and splitting tests into separate scopes
  • adding meta-data for Jam and Bower

Note: QUnit seems to be having some difficulties on IE8. While the jQuery-plugin tests fail, the plugin itself works. We're still trying to figure out what's making QUnit "lose its config state".

1.7.4 (October 21st 2012)

  • fixing parsing of /wiki/Help:IPA - (Issue #49)

1.7.3 (October 11th 2012)

  • fixing strictEncodeURIComponent() to properly encode * to %2A
  • fixing IE9's incorrect report of img.href being available - (Issue #48)

1.7.2 (August 28th 2012)

1.7.1 (August 14th 2012)

1.7.0 (August 11th 2012)

1.6.3 (June 24th 2012)

1.6.2 (June 23rd 2012)

1.6.1 (May 19th 2012)

1.6.0 (March 19th 2012)

1.5.0 (February 19th 2012)

  • adding Second Level Domain (SLD) Support - (Issue #17)

1.4.3 (January 28th 2012)

1.4.2 (January 25th 2012)

1.4.1 (January 21st 2012)

1.4.0 (January 12th 2012)

1.3.1 (January 3rd 2011)

  • updating Punycode.js to version 0.3.0
  • adding edge-case tests ("jim")
  • fixing edge-cases in .protocol(), .port(), .subdomain(), .domain(), .tld(), .filename()
  • fixing parsing of hostname in .hostname()

1.3.0 (December 30th 2011)

  • adding .subdomain() convenience accessor
  • improving internal deferred build handling
  • fixing thrown Error for URI("http://example.org").query(true) - (Issue #6)
  • adding examples for extending URI.js for fragment abuse, see src/URI.fragmentQuery.js and src/URI.fragmentURI.js - (Issue #2)

1.2.0 (December 29th 2011)

1.1.0 (December 28th 2011)

1.0.0 (December 27th 2011)

  • Initial URI.js

uri.js's People

Contributors

rodneyrehm avatar christianharms avatar fgribreau avatar hgezim avatar mutewinter avatar grimen avatar larrybattle avatar mark-rushakoff avatar mathiasbynens avatar nostalgiaz avatar mortenn avatar yaph avatar fidian avatar victorblomberg avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.