forked from systemjs/systemjs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
named-register.js
85 lines (76 loc) · 2.69 KB
/
named-register.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
(function () {
/*
* SystemJS named register extension
* Supports System.register('name', [..deps..], function (_export, _context) { ... })
*
* Names are written to the registry as-is
* System.register('x', ...) can be imported as System.import('x')
*/
(function (global) {
var System = global.System;
setRegisterRegistry(System);
var systemJSPrototype = System.constructor.prototype;
var constructor = System.constructor;
var SystemJS = function () {
constructor.call(this);
setRegisterRegistry(this);
};
SystemJS.prototype = systemJSPrototype;
System.constructor = SystemJS;
var firstNamedDefine, firstName;
function setRegisterRegistry(systemInstance) {
systemInstance.registerRegistry = Object.create(null);
systemInstance.namedRegisterAliases = Object.create(null);
}
var register = systemJSPrototype.register;
systemJSPrototype.register = function (name, deps, declare, metas) {
if (typeof name !== 'string')
return register.apply(this, arguments);
var define = [deps, declare, metas];
this.registerRegistry[name] = define;
if (!firstNamedDefine) {
firstNamedDefine = define;
firstName = name;
}
Promise.resolve().then(function () {
firstNamedDefine = null;
firstName = null;
});
return register.apply(this, [deps, declare, metas]);
};
var resolve = systemJSPrototype.resolve;
systemJSPrototype.resolve = function (id, parentURL) {
try {
// Prefer import map (or other existing) resolution over the registerRegistry
return resolve.call(this, id, parentURL);
} catch (err) {
if (id in this.registerRegistry) {
return this.namedRegisterAliases[id] || id;
}
throw err;
}
};
var instantiate = systemJSPrototype.instantiate;
systemJSPrototype.instantiate = function (url, firstParentUrl, meta) {
var result = this.registerRegistry[url];
if (result) {
this.registerRegistry[url] = null;
return result;
} else {
return instantiate.call(this, url, firstParentUrl, meta);
}
};
var getRegister = systemJSPrototype.getRegister;
systemJSPrototype.getRegister = function (url) {
// Calling getRegister() because other extras need to know it was called so they can perform side effects
var register = getRegister.call(this, url);
if (firstName && url) {
this.namedRegisterAliases[firstName] = url;
}
var result = firstNamedDefine || register;
firstNamedDefine = null;
firstName = null;
return result;
};
})(typeof self !== 'undefined' ? self : global);
})();