Skip to content

Commit

Permalink
fix(hmr): catch errors and clear state for next render
Browse files Browse the repository at this point in the history
  • Loading branch information
smalluban committed May 18, 2018
1 parent 52563e0 commit 8f1f749
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 11 deletions.
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 8f1f749

Please # to comment.