django-js-reverse
Version:
JavaScript url handling for Django that doesn't hurt.
98 lines (81 loc) • 3.15 kB
JavaScript
const module = {};module.exports = (function () {
"use strict";
var data = false;
function factory(d) {
var url_patterns = d.urls;
var url_prefix = d.prefix;
var Urls = {};
var self_url_patterns = {};
var _get_url = function (url_pattern) {
return function () {
var _arguments, index, url, url_arg, url_args, _i, _len, _ref,
_ref_list, match_ref, provided_keys, build_kwargs;
_arguments = arguments;
_ref_list = self_url_patterns[url_pattern];
if (arguments.length == 1 && typeof (arguments[0]) == "object") {
// kwargs mode
var provided_keys_list = Object.keys (arguments[0]);
provided_keys = {};
for (_i = 0; _i < provided_keys_list.length; _i++)
provided_keys[provided_keys_list[_i]] = 1;
match_ref = function (ref)
{
var _i;
// Verify that they have the same number of arguments
if (ref[1].length != provided_keys_list.length)
return false;
for (_i = 0;
_i < ref[1].length && ref[1][_i] in provided_keys;
_i++);
// If for loop completed, we have all keys
return _i == ref[1].length;
}
build_kwargs = function (keys) {return _arguments[0];}
} else {
// args mode
match_ref = function (ref)
{
return ref[1].length == _arguments.length;
}
build_kwargs = function (keys) {
var kwargs = {};
for (var i = 0; i < keys.length; i++) {
kwargs[keys[i]] = _arguments[i];
}
return kwargs;
}
}
for (_i = 0;
_i < _ref_list.length && !match_ref(_ref_list[_i]);
_i++);
// can't find a match
if (_i == _ref_list.length)
return null;
_ref = _ref_list[_i];
url = _ref[0], url_args = build_kwargs(_ref[1]);
for (url_arg in url_args) {
var url_arg_value = url_args[url_arg];
if (url_arg_value === undefined || url_arg_value === null) {
url_arg_value = '';
} else {
url_arg_value = url_arg_value.toString();
}
url = url.replace("%(" + url_arg + ")s", url_arg_value);
}
return url_prefix + url;
};
};
var name, pattern, url, _i, _len, _ref;
for (_i = 0, _len = url_patterns.length; _i < _len; _i++) {
_ref = url_patterns[_i], name = _ref[0], pattern = _ref[1];
self_url_patterns[name] = pattern;
url = _get_url(name);
Urls[name.replace(/[-_]+(.)/g, function (_m, p1) { return p1.toUpperCase(); })] = url;
Urls[name.replace(/-/g, '_')] = url;
Urls[name] = url;
}
return Urls;
}
return data ? factory(data) : factory;
})();
export default module.exports;