aboutsummaryrefslogtreecommitdiff
path: root/test/fixtures/lib
diff options
context:
space:
mode:
Diffstat (limited to 'test/fixtures/lib')
-rw-r--r--test/fixtures/lib/index.js172
1 files changed, 172 insertions, 0 deletions
diff --git a/test/fixtures/lib/index.js b/test/fixtures/lib/index.js
new file mode 100644
index 0000000..052e296
--- /dev/null
+++ b/test/fixtures/lib/index.js
@@ -0,0 +1,172 @@
+var nodeUrl = require('url');
+var querystring = require('querystring');
+var _ = require('underscore');
+
+var UrlGrey = function(url){
+ this.url = url;
+ this._parsed = null;
+};
+
+UrlGrey.prototype.parsed = function(){
+ if (!this._parsed){
+ this._parsed = nodeUrl.parse(this.url);
+ var p = this._parsed;
+ if (p.protocol){
+ p.protocol = p.protocol.slice(0,-1);
+ } else {
+ p.protocol = 'http';
+ }
+ if (p.hash){
+ p.hash = p.hash.substring(1);
+ }
+ p.username = '';
+ p.password = '';
+ if (!p.hostname){
+ p.hostname = 'localhost';
+ }
+ if (!p.port){
+ p.port = 80;
+ } else {
+ p.port = parseInt(p.port, 10);
+ }
+ if (p.auth){
+ var auth = p.auth.split(':');
+ p.username = auth[0];
+ p.password = auth[1];
+ }
+ }
+ return this._parsed;
+};
+
+UrlGrey.prototype.query = function(mergeObject){
+ var path;
+ if (mergeObject === false){
+ // clear the query entirely if the input === false
+ return this.queryString('');
+ }
+
+ var url = this.url;
+ if (!mergeObject){
+ var parsed = nodeUrl.parse(url);
+ if (!!parsed.search){
+ var qstr = parsed.search.substring(1);
+ return querystring.parse(qstr);
+ }
+ return {};
+ } else {
+ // read the object out
+ var oldQuery = querystring.parse(this.queryString());
+ _.each(mergeObject, function(v, k){
+ if (v === null){
+ delete oldQuery[k];
+ } else {
+ oldQuery[k] = v;
+ }
+ });
+ var newString = querystring.stringify(oldQuery, '&', '=');
+ return this.queryString(newString);
+ }
+};
+
+
+addPropertyGetterSetter('protocol');
+addPropertyGetterSetter('port');
+addPropertyGetterSetter('username');
+addPropertyGetterSetter('password');
+addPropertyGetterSetter('hostname');
+addPropertyGetterSetter('hash');
+// add a method called queryString that manipulates 'query'
+addPropertyGetterSetter('query', 'queryString');
+addPropertyGetterSetter('pathname', 'path');
+
+UrlGrey.prototype.path = function(){
+ var args = _.toArray(arguments);
+ if (args.length !== 0){
+ var obj = new UrlGrey(this.toString());
+ var str = _.flatten(args).join('/');
+ str = str.replace(/\/+/g, '/'); // remove double slashes
+ str = str.replace(/\/$/, ''); // remove all trailing slashes
+ if (str[0] !== '/'){ str = '/' + str; }
+ obj.parsed().pathname = str;
+ return obj;
+ }
+ return this.parsed().pathname;
+};
+
+
+UrlGrey.prototype.encode = function(str){
+ return querystring.escape(str);
+};
+
+UrlGrey.prototype.decode = function(str){
+ return querystring.unescape(str);
+};
+
+UrlGrey.prototype.parent = function(){
+ // read-only. (can't SET parent)
+ var pieces = this.path().split("/");
+ var popped = pieces.pop();
+ if (popped === ''){ // ignore trailing slash
+ pieces.pop();
+ }
+ return this.path(pieces.join("/"));
+};
+
+UrlGrey.prototype.child = function(suffix){
+ if (suffix){
+ suffix = encodeURIComponent(suffix);
+ return this.path(this.path(), suffix);
+ } else {
+ // if no suffix, return the child
+ var pieces = this.path().split("/");
+ var last = _.last(pieces);
+ if ((pieces.length > 1) && (last === '')){
+ // ignore trailing slashes
+ pieces.pop();
+ last = _.last(pieces);
+ }
+ return last;
+ }
+};
+
+UrlGrey.prototype.toJSON = function(){
+ return this.toString();
+};
+
+UrlGrey.prototype.toString = function(){
+ var p = this.parsed();
+ var userinfo = p.username + ':' + p.password;
+ var retval = this.protocol() + '://';
+ if (userinfo != ':'){
+ retval += userinfo + '@';
+ }
+ retval += p.hostname;
+ if (this.port() !== 80){
+ retval += ':' + this.port();
+ }
+ retval += this.path() === '/' ? '' : this.path();
+ var qs = this.queryString();
+ if (qs){
+ retval += '?' + qs;
+ }
+ if (p.hash){
+ retval += '#' + p.hash;
+ }
+ return retval;
+};
+
+module.exports = function(url){ return new UrlGrey(url); };
+
+function addPropertyGetterSetter(propertyName, methodName){
+ if (!methodName){
+ methodName = propertyName;
+ }
+ UrlGrey.prototype[methodName] = function(str){
+ if (!!str || str === ''){
+ var obj = new UrlGrey(this.toString());
+ obj.parsed()[propertyName] = str;
+ return obj;
+ }
+ return this.parsed()[propertyName];
+ };
+}