Skip to content

Commit

Permalink
Fix deleting modules after link failure. Resolves #2286. (#2288)
Browse files Browse the repository at this point in the history
  • Loading branch information
joeldenning committed Dec 16, 2020
1 parent 0c03f9b commit bbd15a3
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 53 deletions.
96 changes: 43 additions & 53 deletions src/system-core.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,14 +131,13 @@ export function getOrCreateLoad (loader, id, firstParentUrl) {
} : undefined);
load.e = declared.execute || function () {};
return [registration[0], declared.setters || []];
}, function (err) {
load.e = null;
load.er = err;
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, err, true);
throw err;
});

if (!process.env.SYSTEM_PRODUCTION)
instantiatePromise = instantiatePromise.catch(function (err) {
triggerOnload(loader, load, err, true);
throw err;
});

var linkPromise = instantiatePromise
.then(function (instantiation) {
return Promise.all(instantiation[0].map(function (dep, i) {
Expand All @@ -158,23 +157,13 @@ export function getOrCreateLoad (loader, id, firstParentUrl) {
}
return depLoad;
});
})
});
}))
.then(
function (depLoads) {
load.d = depLoads;
},
!process.env.SYSTEM_PRODUCTION && function (err) {
triggerOnload(loader, load, err, false);
throw err;
}
)
});

linkPromise.catch(function (err) {
load.e = null;
load.er = err;
.then(function (depLoads) {
load.d = depLoads;
});
});
linkPromise.catch(function () {});

// Capital letter = a promise function
return load = loader[REGISTRY][id] = {
Expand Down Expand Up @@ -223,6 +212,13 @@ function instantiateAll (loader, load, loaded) {
return instantiateAll(loader, dep, loaded);
}));
})
.catch(function (err) {
if (load.er)
throw err;
load.e = null;
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, err, false);
throw err;
});
}
}

Expand Down Expand Up @@ -257,56 +253,50 @@ function postOrderExec (loader, load, seen) {
// deps execute first, unless circular
var depLoadPromises;
load.d.forEach(function (depLoad) {
try {
var depLoadPromise = postOrderExec(loader, depLoad, seen);
if (depLoadPromise)
(depLoadPromises = depLoadPromises || []).push(depLoadPromise);
}
catch (err) {
load.e = null;
load.er = err;
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, err, false);
else throw err;
}
});
if (depLoadPromises)
return Promise.all(depLoadPromises).then(doExec, function (err) {
try {
var depLoadPromise = postOrderExec(loader, depLoad, seen);
if (depLoadPromise)
(depLoadPromises = depLoadPromises || []).push(depLoadPromise);
}
catch (err) {
load.e = null;
load.er = err;
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, err, false);
else throw err;
});
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, err, false);
throw err;
}
});
if (depLoadPromises)
return Promise.all(depLoadPromises).then(doExec);

return doExec();

function doExec () {
try {
var execPromise = load.e.call(nullContext);
if (execPromise) {
execPromise = execPromise.then(function () {
load.C = load.n;
load.E = null; // indicates completion
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, null, true);
}, function (err) {
load.er = err;
load.E = null;
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, err, true);
else throw err;
});
return load.E = load.E || execPromise;
execPromise = execPromise.then(function () {
load.C = load.n;
load.E = null; // indicates completion
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, null, true);
}, function (err) {
load.er = err;
load.E = null;
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, err, true);
throw err;
});
return load.E = execPromise;
}
// (should be a promise, but a minify optimization to leave out Promise.resolve)
load.C = load.n;
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, null, true);
load.L = load.I = undefined;
}
catch (err) {
load.er = err;
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, err, true);
else throw err;
throw err;
}
finally {
load.L = load.I = undefined;
load.e = null;
if (!process.env.SYSTEM_PRODUCTION) triggerOnload(loader, load, load.er, true);
}
}
}
Expand Down
14 changes: 14 additions & 0 deletions test/browser/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,20 @@ suite('SystemJS Standard Tests', function() {
});
});

// https://github.com/systemjs/systemjs/issues/2286
test('should allow deletion of modules that failed to instantiate', function () {
return System.import('fixtures/link-error.js').then(
function () {
throw Error('Link error expected');
},
function () {
assert.ok(System.delete(System.resolve('fixtures/link-error.js')));
assert.ok(System.delete(System.resolve('fixtures/link-error-child.js')));
assert.ok(System.delete(System.resolve('fixtures/not-found.js')));
}
);
});

var isIE11 = typeof navigator !== 'undefined' && navigator.userAgent.indexOf('Trident') !== -1;

function isCSSStyleSheet(obj) {
Expand Down
6 changes: 6 additions & 0 deletions test/fixtures/browser/link-error-child.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
System.register(['./not-found.js'], function () {
return {
execute: function () {
}
};
});
6 changes: 6 additions & 0 deletions test/fixtures/browser/link-error.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
System.register(['./link-error-child.js'], function () {
return {
execute: function () {
}
};
});

0 comments on commit bbd15a3

Please sign in to comment.