url.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * @preserve jquery-param (c) 2015 KNOWLEDGECODE | MIT
  3. */
  4. import { UrlQueryMap } from 'app/types';
  5. export function renderUrl(path: string, query: UrlQueryMap | undefined): string {
  6. if (query && Object.keys(query).length > 0) {
  7. path += '?' + toUrlParams(query);
  8. }
  9. return path;
  10. }
  11. export function toUrlParams(a) {
  12. const s = [];
  13. const rbracket = /\[\]$/;
  14. const isArray = obj => {
  15. return Object.prototype.toString.call(obj) === '[object Array]';
  16. };
  17. const add = (k, v) => {
  18. v = typeof v === 'function' ? v() : v === null ? '' : v === undefined ? '' : v;
  19. if (typeof v !== 'boolean') {
  20. s[s.length] = encodeURIComponent(k) + '=' + encodeURIComponent(v);
  21. } else {
  22. s[s.length] = encodeURIComponent(k);
  23. }
  24. };
  25. const buildParams = (prefix, obj) => {
  26. let i, len, key;
  27. if (prefix) {
  28. if (isArray(obj)) {
  29. for (i = 0, len = obj.length; i < len; i++) {
  30. if (rbracket.test(prefix)) {
  31. add(prefix, obj[i]);
  32. } else {
  33. buildParams(prefix, obj[i]);
  34. }
  35. }
  36. } else if (obj && String(obj) === '[object Object]') {
  37. for (key in obj) {
  38. buildParams(prefix + '[' + key + ']', obj[key]);
  39. }
  40. } else {
  41. add(prefix, obj);
  42. }
  43. } else if (isArray(obj)) {
  44. for (i = 0, len = obj.length; i < len; i++) {
  45. add(obj[i].name, obj[i].value);
  46. }
  47. } else {
  48. for (key in obj) {
  49. buildParams(key, obj[key]);
  50. }
  51. }
  52. return s;
  53. };
  54. return buildParams('', a).join('&');
  55. }