Skip to content

Commit

Permalink
Fixes for named-register extra. (#2352)
Browse files Browse the repository at this point in the history
  • Loading branch information
joeldenning committed Aug 17, 2021
1 parent 47c3afb commit 6a5a620
Show file tree
Hide file tree
Showing 9 changed files with 88 additions and 12 deletions.
2 changes: 1 addition & 1 deletion docs/hooks.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ This function downloads and executes the code for a module. The promise must res

The default system.js implementation is to append a script tag that downloads and executes the module's code, subsequently resolving the promise with the most recent register: `resolve(System.getRegister())`. [Example](https://github.com/systemjs/systemjs/blob/master/src/features/script-load.js).

#### getRegister() -> [deps: String[], declare: Function]
#### getRegister(url) -> [deps: String[], declare: Function]

> This hook is intended for custom module format integrations only.
Expand Down
21 changes: 14 additions & 7 deletions src/extras/named-register.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@
SystemJS.prototype = systemJSPrototype;
System.constructor = SystemJS;

var firstNamedDefine;
var firstNamedDefine, firstName;

function setRegisterRegistry(systemInstance) {
systemInstance.registerRegistry = Object.create(null);
systemInstance.namedRegisterAliases = Object.create(null);
}

var register = systemJSPrototype.register;
Expand All @@ -31,10 +32,12 @@
this.registerRegistry[name] = define;
if (!firstNamedDefine) {
firstNamedDefine = define;
Promise.resolve().then(function () {
firstNamedDefine = null;
});
firstName = name;
}
setTimeout(function () {
firstNamedDefine = null;
firstName = null;
});
return register.apply(this, [deps, declare]);
};

Expand All @@ -45,7 +48,7 @@
return resolve.call(this, id, parentURL);
} catch (err) {
if (id in this.registerRegistry) {
return id;
return this.namedRegisterAliases[id] || id;
}
throw err;
}
Expand All @@ -63,12 +66,16 @@
};

var getRegister = systemJSPrototype.getRegister;
systemJSPrototype.getRegister = function () {
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);
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);
2 changes: 1 addition & 1 deletion src/extras/transform.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import { errMsg } from '../err-msg.js';
})
.then(function (source) {
(0, eval)(source + '\n//# sourceURL=' + url);
return loader.getRegister();
return loader.getRegister(url);
});
};

Expand Down
2 changes: 1 addition & 1 deletion src/features/fetch-load.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ systemJSPrototype.instantiate = function (url, parent) {
if (source.indexOf('//# sourceURL=') < 0)
source += '\n//# sourceURL=' + url;
(0, eval)(source);
return loader.getRegister();
return loader.getRegister(url);
});
});
};
2 changes: 1 addition & 1 deletion src/features/script-load.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ systemJSPrototype.instantiate = function (url, firstParentUrl) {
reject(lastWindowError);
}
else {
var register = loader.getRegister();
var register = loader.getRegister(url);
// Clear any auto import registration for dynamic import scripts during load
if (register && register[0] === lastAutoImportDeps)
clearTimeout(lastAutoImportTimeout);
Expand Down
2 changes: 1 addition & 1 deletion src/features/worker-load.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ if (hasSelf && typeof importScripts === 'function')
var loader = this;
return Promise.resolve().then(function () {
importScripts(url);
return loader.getRegister();
return loader.getRegister(url);
});
};
26 changes: 26 additions & 0 deletions test/browser/named-register.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,4 +171,30 @@ suite('Named System.register', function() {
assert.equal(m.b, 'b');
});
});

// https://github.com/systemjs/systemjs/issues/2349
test('Bundles with named register do not instantiate last module more than once', function () {
// First import the module via URL
return System.import('./fixtures/browser/named-instantiate-count.js').then(function (urlModule) {
// Then import the same module via named register name
return System.import('named-instantiate-count').then(function (namedModule) {
assert.equal(urlModule.getInstantiateCount(), 1);
assert.equal(namedModule.getInstantiateCount(), 1);
assert.equal(urlModule, namedModule);
});
});
});

// https://github.com/systemjs/systemjs/issues/2349
test('Named bundles that self import', function () {
// First import the module via URL
return System.import('./fixtures/browser/named-self-import.js').then(function (urlModule) {
// Then import the same module via named register name
return System.import('named-self-import').then(function (namedModule) {
assert.equal(urlModule.getInstantiateCount(), 1);
assert.equal(namedModule.getInstantiateCount(), 1);
assert.equal(urlModule, namedModule);
});
});
});
});
12 changes: 12 additions & 0 deletions test/fixtures/browser/named-instantiate-count.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
let instantiateCount = 0;

System.register("named-instantiate-count", [], function (_export) {
instantiateCount++;
return {
execute: function () {
_export('getInstantiateCount', function () {
return instantiateCount;
});
}
};
});
31 changes: 31 additions & 0 deletions test/fixtures/browser/named-self-import.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
let instantiateCount = 0;

System.register("named-self-import", ["named-self-import/dep"], function (_export) {
instantiateCount++;
var dep;

return {
setters: [
function (d) {
dep = d;
}
],
execute: function () {
dep.method();

_export('getInstantiateCount', function () {
return instantiateCount;
});
}
};
});

System.register("named-self-import/dep", [], function (_export) {
return {
execute: function () {
_export("method", function () {
return 1;
});
}
};
});

0 comments on commit 6a5a620

Please sign in to comment.