|
|
|
/*
|
|
|
|
* docuri: Rich document ids for CouchDB.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2014 null2 GmbH Berlin
|
|
|
|
* Licensed under the MIT license.
|
|
|
|
*/
|
|
|
|
|
|
|
|
// type/id/subtype/index/version
|
|
|
|
var DEFINITION = ['type', 'id', 'subtype', 'index', 'version'];
|
|
|
|
var docuri;
|
|
|
|
|
|
|
|
module.exports = exports = docuri = {};
|
|
|
|
|
|
|
|
docuri.definition = function(definition) {
|
|
|
|
if (definition) {
|
|
|
|
DEFINITION = definition;
|
|
|
|
|
|
|
|
return docuri;
|
|
|
|
}
|
|
|
|
|
|
|
|
return DEFINITION;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
docuri.parts = function(obj) {
|
|
|
|
if (typeof obj === 'string') {
|
|
|
|
obj = docuri.parse(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
var parts = DEFINITION.map(function(part) {
|
|
|
|
return obj[part];
|
|
|
|
});
|
|
|
|
|
|
|
|
while (parts.length && (typeof parts[parts.length - 1] === 'undefined' || parts[parts.length - 1] === null)) {
|
|
|
|
parts.pop();
|
|
|
|
}
|
|
|
|
|
|
|
|
return parts;
|
|
|
|
};
|
|
|
|
|
|
|
|
docuri.parse = function(str) {
|
|
|
|
str = str || '';
|
|
|
|
|
|
|
|
return str.split('/').reduce(function(obj, value, i) {
|
|
|
|
if (value) {
|
|
|
|
obj[DEFINITION[i]] = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
}, {});
|
|
|
|
};
|
|
|
|
|
|
|
|
docuri.stringify = function(obj) {
|
|
|
|
obj = obj || {};
|
|
|
|
|
|
|
|
return docuri.parts(obj).join('/');
|
|
|
|
};
|
|
|
|
|
|
|
|
docuri.merge = function(obj, objToMerge) {
|
|
|
|
objToMerge = objToMerge || {};
|
|
|
|
|
|
|
|
if (typeof obj === 'string') {
|
|
|
|
obj = docuri.parse(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
DEFINITION.forEach(function(part) {
|
|
|
|
if (part in objToMerge) {
|
|
|
|
obj[part] = objToMerge[part];
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return docuri.stringify(obj);
|
|
|
|
};
|
|
|
|
|