From b83afb0528af1bfcec71b99e23298ce3d017eeea Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 10 Dec 2017 10:12:01 -0500 Subject: [PATCH] await...then shorthand - fixes #957 --- src/parse/state/mustache.ts | 12 ++++- .../samples/await-then-shorthand/_config.js | 45 +++++++++++++++++++ .../samples/await-then-shorthand/main.html | 5 +++ 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 test/runtime/samples/await-then-shorthand/_config.js create mode 100644 test/runtime/samples/await-then-shorthand/main.html diff --git a/src/parse/state/mustache.ts b/src/parse/state/mustache.ts index b59cf92b8f97..bd1db0746040 100644 --- a/src/parse/state/mustache.ts +++ b/src/parse/state/mustache.ts @@ -283,14 +283,22 @@ export default function mustache(parser: Parser) { } } + let awaitBlockShorthand = type === 'AwaitBlock' && parser.eat('then'); + if (awaitBlockShorthand) { + parser.requireWhitespace(); + block.value = parser.readIdentifier(); + parser.allowWhitespace(); + } + parser.eat('}}', true); parser.current().children.push(block); parser.stack.push(block); if (type === 'AwaitBlock') { - block.pending.start = parser.index; - parser.stack.push(block.pending); + const childBlock = awaitBlockShorthand ? block.then : block.pending; + childBlock.start = parser.index; + parser.stack.push(childBlock); } } else if (parser.eat('yield')) { // {{yield}} diff --git a/test/runtime/samples/await-then-shorthand/_config.js b/test/runtime/samples/await-then-shorthand/_config.js new file mode 100644 index 000000000000..e777dbc5c62d --- /dev/null +++ b/test/runtime/samples/await-then-shorthand/_config.js @@ -0,0 +1,45 @@ +let fulfil; + +let thePromise = new Promise(f => { + fulfil = f; +}); + +export default { + data: { + thePromise + }, + + html: ``, + + test(assert, component, target) { + fulfil(42); + + return thePromise + .then(() => { + assert.htmlEqual(target.innerHTML, ` +

the value is 42

+ `); + + let reject; + + thePromise = new Promise((f, r) => { + reject = r; + }); + + component.set({ + thePromise + }); + + assert.htmlEqual(target.innerHTML, ``); + + reject(new Error('something broke')); + + return thePromise.catch(() => {}); + }) + .then(() => { + assert.htmlEqual(target.innerHTML, ` +

oh no! something broke

+ `); + }); + } +}; \ No newline at end of file diff --git a/test/runtime/samples/await-then-shorthand/main.html b/test/runtime/samples/await-then-shorthand/main.html new file mode 100644 index 000000000000..cf121d5b8ceb --- /dev/null +++ b/test/runtime/samples/await-then-shorthand/main.html @@ -0,0 +1,5 @@ +{{#await thePromise then theValue}} +

the value is {{theValue}}

+{{catch theError}} +

oh no! {{theError.message}}

+{{/await}} \ No newline at end of file