Projekt

Obecné

Profil

Stáhnout (2.1 KB) Statistiky
| Větev: | Revize:
1 3a515b92 cagy
(function (global, factory) {
2
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
  typeof define === 'function' && define.amd ? define(factory) :
4
  (global.resolvePathname = factory());
5
}(this, (function () { 'use strict';
6
7
  function isAbsolute(pathname) {
8
    return pathname.charAt(0) === '/';
9
  }
10
11
  // About 1.5x faster than the two-arg version of Array#splice()
12
  function spliceOne(list, index) {
13
    for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {
14
      list[i] = list[k];
15
    }
16
17
    list.pop();
18
  }
19
20
  // This implementation is based heavily on node's url.parse
21
  function resolvePathname(to, from) {
22
    if (from === undefined) from = '';
23
24
    var toParts = (to && to.split('/')) || [];
25
    var fromParts = (from && from.split('/')) || [];
26
27
    var isToAbs = to && isAbsolute(to);
28
    var isFromAbs = from && isAbsolute(from);
29
    var mustEndAbs = isToAbs || isFromAbs;
30
31
    if (to && isAbsolute(to)) {
32
      // to is absolute
33
      fromParts = toParts;
34
    } else if (toParts.length) {
35
      // to is relative, drop the filename
36
      fromParts.pop();
37
      fromParts = fromParts.concat(toParts);
38
    }
39
40
    if (!fromParts.length) return '/';
41
42
    var hasTrailingSlash;
43
    if (fromParts.length) {
44
      var last = fromParts[fromParts.length - 1];
45
      hasTrailingSlash = last === '.' || last === '..' || last === '';
46
    } else {
47
      hasTrailingSlash = false;
48
    }
49
50
    var up = 0;
51
    for (var i = fromParts.length; i >= 0; i--) {
52
      var part = fromParts[i];
53
54
      if (part === '.') {
55
        spliceOne(fromParts, i);
56
      } else if (part === '..') {
57
        spliceOne(fromParts, i);
58
        up++;
59
      } else if (up) {
60
        spliceOne(fromParts, i);
61
        up--;
62
      }
63
    }
64
65
    if (!mustEndAbs) for (; up--; up) fromParts.unshift('..');
66
67
    if (
68
      mustEndAbs &&
69
      fromParts[0] !== '' &&
70
      (!fromParts[0] || !isAbsolute(fromParts[0]))
71
    )
72
      fromParts.unshift('');
73
74
    var result = fromParts.join('/');
75
76
    if (hasTrailingSlash && result.substr(-1) !== '/') result += '/';
77
78
    return result;
79
  }
80
81
  return resolvePathname;
82
83
})));