MCPcopy
hub / github.com/systemjs/systemjs / resolveIfNotPlainOrUrl

Function resolveIfNotPlainOrUrl

src/common.js:36–114  ·  view source on GitHub ↗
(relUrl, parentUrl)

Source from the content-addressed store, hash-verified

34
35var backslashRegEx = /\\/g;
36export function resolveIfNotPlainOrUrl (relUrl, parentUrl) {
37 if (relUrl.indexOf('\\') !== -1)
38 relUrl = relUrl.replace(backslashRegEx, '/');
39 // protocol-relative
40 if (relUrl[0] === '/' && relUrl[1] === '/') {
41 return parentUrl.slice(0, parentUrl.indexOf(':') + 1) + relUrl;
42 }
43 // relative-url
44 else if (relUrl[0] === '.' && (relUrl[1] === '/' || relUrl[1] === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) ||
45 relUrl.length === 1 && (relUrl += '/')) ||
46 relUrl[0] === '/') {
47 var parentProtocol = parentUrl.slice(0, parentUrl.indexOf(':') + 1);
48 // Disabled, but these cases will give inconsistent results for deep backtracking
49 //if (parentUrl[parentProtocol.length] !== '/')
50 // throw Error('Cannot resolve');
51 // read pathname from parent URL
52 // pathname taken to be part after leading "/"
53 var pathname;
54 if (parentUrl[parentProtocol.length + 1] === '/') {
55 // resolving to a :// so we need to read out the auth and host
56 if (parentProtocol !== 'file:') {
57 pathname = parentUrl.slice(parentProtocol.length + 2);
58 pathname = pathname.slice(pathname.indexOf('/') + 1);
59 }
60 else {
61 pathname = parentUrl.slice(8);
62 }
63 }
64 else {
65 // resolving to :/ so pathname is the /... part
66 pathname = parentUrl.slice(parentProtocol.length + (parentUrl[parentProtocol.length] === '/'));
67 }
68
69 if (relUrl[0] === '/')
70 return parentUrl.slice(0, parentUrl.length - pathname.length - 1) + relUrl;
71
72 // join together and split for removal of .. and . segments
73 // looping the string instead of anything fancy for perf reasons
74 // '../../../../../z' resolved to 'x/y' is just 'z'
75 var segmented = pathname.slice(0, pathname.lastIndexOf('/') + 1) + relUrl;
76
77 var output = [];
78 var segmentIndex = -1;
79 for (var i = 0; i < segmented.length; i++) {
80 // busy reading a segment - only terminate on '/'
81 if (segmentIndex !== -1) {
82 if (segmented[i] === '/') {
83 output.push(segmented.slice(segmentIndex, i + 1));
84 segmentIndex = -1;
85 }
86 }
87
88 // new segment - check if it is relative
89 else if (segmented[i] === '.') {
90 // ../ segment
91 if (segmented[i + 1] === '.' && (segmented[i + 2] === '/' || i + 2 === segmented.length)) {
92 output.pop();
93 i += 2;

Callers 6

doResolveImportMapFunction · 0.90
url-resolution.mjsFile · 0.90
system-core.mjsFile · 0.90
resolve.jsFile · 0.90
resolveUrlFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…