Skip to content

Commit f043519

Browse files
committed
fix
1 parent 70c9f4b commit f043519

File tree

3 files changed

+28
-13
lines changed

3 files changed

+28
-13
lines changed

eslint.config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,13 @@ export default [
4949
},
5050
rules: {
5151
'@typescript-eslint/await-thenable': 'error',
52-
'@typescript-eslint/prefer-promise-reject-errors': 'error',
5352
'@typescript-eslint/require-await': 'error',
5453
'no-console': 'error',
5554
'lube/svelte-naming-convention': ['error', { fixSameNames: true }],
5655
// eslint isn't that well-versed with JSDoc to know that `foo: /** @type{..} */ (foo)` isn't a violation of this rule, so turn it off
5756
'object-shorthand': 'off',
57+
// eslint is being a dummy here too
58+
'@typescript-eslint/prefer-promise-reject-errors': 'off',
5859
'no-var': 'off',
5960

6061
// TODO: enable these rules and run `pnpm lint:fix`

packages/svelte/src/compiler/phases/3-transform/client/visitors/AwaitExpression.js

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,33 @@
11
/** @import { AwaitExpression, Expression, Property, SpreadElement } from 'estree' */
22
/** @import { Context } from '../types' */
3-
import { dev } from '../../../../state.js';
3+
import { dev, is_ignored } from '../../../../state.js';
44
import * as b from '../../../../utils/builders.js';
55

66
/**
77
* @param {AwaitExpression} node
88
* @param {Context} context
99
*/
1010
export function AwaitExpression(node, context) {
11-
const save =
12-
// preserve context if this is a top-level await in `<script>`
13-
(context.state.is_instance && context.state.scope.function_depth === 1) ||
14-
// or if this is a derived/template expression
15-
(is_reactive_expression(context) && !is_last_evaluated_expression(context, node));
16-
17-
if (dev || save) {
18-
const expression = /** @type {Expression} */ (context.visit(node.argument));
19-
return b.call(b.await(b.call('$.save', expression, !save && b.false)));
11+
const argument = /** @type {Expression} */ (context.visit(node.argument));
12+
13+
const tla = context.state.is_instance && context.state.scope.function_depth === 1;
14+
15+
// preserve context for
16+
// a) top-level await and
17+
// b) awaits that precede other expressions in template or `$derived(...)`
18+
if (tla || is_reactive_expression(context)) {
19+
if (tla || !is_last_evaluated_expression(context, node)) {
20+
return b.call(b.await(b.call('$.save', argument)));
21+
}
22+
}
23+
24+
// in dev, note which values are read inside a reactive expression,
25+
// but don't track them
26+
else if (dev && !is_ignored(node, 'await_reactivity_loss')) {
27+
return b.call(b.await(b.call('$.save', argument, b.false)));
2028
}
2129

22-
return context.next();
30+
return argument === node.argument ? node : { ...node, argument };
2331
}
2432

2533
/**

packages/svelte/src/internal/client/reactivity/deriveds.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,13 @@ export function async_derived(fn, location) {
116116

117117
render_effect(() => {
118118
if (DEV) from_async_derived = active_effect;
119-
var p = fn();
119+
120+
try {
121+
var p = fn();
122+
} catch (error) {
123+
p = Promise.reject(error);
124+
}
125+
120126
if (DEV) from_async_derived = null;
121127

122128
promise =

0 commit comments

Comments
 (0)