Skip to content

Commit

Permalink
fix(hmr): catch render errors and clear state for module replacement (#3
Browse files Browse the repository at this point in the history
)
  • Loading branch information
smalluban authored May 18, 2018
1 parent af8895b commit 168340c
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 15 deletions.
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
"eslint-config-airbnb-base": "^12.1.0",
"eslint-loader": "^2.0.0",
"eslint-plugin-import": "^2.9.0",
"jasmine-core": "^2.99",
"jasmine-core": "^3.1.0",
"karma": "^2.0.0",
"karma-chrome-launcher": "^2.0.0",
"karma-coverage": "^1.1.1",
Expand Down
8 changes: 7 additions & 1 deletion src/cache.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,13 @@ export function get(target, key, getter) {
context = entry;

entry.deps = [];
entry.value = getter(target, entry.value);

try {
entry.value = getter(target, entry.value);
} catch (e) {
context = null;
throw e;
}

context = parentContext;

Expand Down
33 changes: 23 additions & 10 deletions src/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,39 @@ function update(iterator, startTime) {
} else {
const { done, value: target } = iterator.next();
const nextTime = performance.now();
const next = () => update(iterator, nextTime);

if (done) {
queue.clear();
} else if (map.has(target)) {
const key = map.get(target);
const prevFn = cache.get(target);
const nextFn = target[key];
let nextFn;

if (nextFn !== prevFn) {
cache.set(target, nextFn);
try {
nextFn = target[key];

Promise.resolve().then(() => {
nextFn();
update(iterator, nextTime);
});
} else {
update(iterator, nextTime);
if (nextFn !== prevFn) {
cache.set(target, nextFn);

Promise.resolve().then(() => {
try {
nextFn();
next();
} catch (e) {
next();
throw e;
}
});
} else {
next();
}
} catch (e) {
next();
throw e;
}
} else {
update(iterator, nextTime);
next();
}
}
}
Expand Down
40 changes: 40 additions & 0 deletions test/spec/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,44 @@ describe('render:', () => {
});
}));
});

it('catches error inside of the passed function', (done) => {
define('test-render-throws-in-render', {
render: () => {
throw Error();
},
});

let throwEl;

Promise.resolve().then(() => {
throwEl = document.createElement('test-render-throws-in-render');
document.body.appendChild(throwEl);
}).catch(() => {});

tree(el => resolveRender(() => {
expect(el.shadowRoot.children[0].textContent).toBe('0');
document.body.removeChild(throwEl);
done();
}));
});

it('catches error inside of the returned function', (done) => {
define('test-render-throws-in-callback', {
render: () => () => { throw Error; },
});

let throwEl;

Promise.resolve().then(() => {
throwEl = document.createElement('test-render-throws-in-callback');
document.body.appendChild(throwEl);
}).catch(() => {});

tree(el => resolveRender(() => {
expect(el.shadowRoot.children[0].textContent).toBe('0');
document.body.removeChild(throwEl);
done();
}));
});
});

0 comments on commit 168340c

Please # to comment.