pull/15844/head
Rich Harris 3 months ago
parent 70c9f4be08
commit f043519924

@ -49,12 +49,13 @@ export default [
},
rules: {
'@typescript-eslint/await-thenable': 'error',
'@typescript-eslint/prefer-promise-reject-errors': 'error',
'@typescript-eslint/require-await': 'error',
'no-console': 'error',
'lube/svelte-naming-convention': ['error', { fixSameNames: true }],
// 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
'object-shorthand': 'off',
// eslint is being a dummy here too
'@typescript-eslint/prefer-promise-reject-errors': 'off',
'no-var': 'off',
// TODO: enable these rules and run `pnpm lint:fix`

@ -1,6 +1,6 @@
/** @import { AwaitExpression, Expression, Property, SpreadElement } from 'estree' */
/** @import { Context } from '../types' */
import { dev } from '../../../../state.js';
import { dev, is_ignored } from '../../../../state.js';
import * as b from '../../../../utils/builders.js';
/**
@ -8,18 +8,26 @@ import * as b from '../../../../utils/builders.js';
* @param {Context} context
*/
export function AwaitExpression(node, context) {
const save =
// preserve context if this is a top-level await in `<script>`
(context.state.is_instance && context.state.scope.function_depth === 1) ||
// or if this is a derived/template expression
(is_reactive_expression(context) && !is_last_evaluated_expression(context, node));
if (dev || save) {
const expression = /** @type {Expression} */ (context.visit(node.argument));
return b.call(b.await(b.call('$.save', expression, !save && b.false)));
const argument = /** @type {Expression} */ (context.visit(node.argument));
const tla = context.state.is_instance && context.state.scope.function_depth === 1;
// preserve context for
// a) top-level await and
// b) awaits that precede other expressions in template or `$derived(...)`
if (tla || is_reactive_expression(context)) {
if (tla || !is_last_evaluated_expression(context, node)) {
return b.call(b.await(b.call('$.save', argument)));
}
}
// in dev, note which values are read inside a reactive expression,
// but don't track them
else if (dev && !is_ignored(node, 'await_reactivity_loss')) {
return b.call(b.await(b.call('$.save', argument, b.false)));
}
return context.next();
return argument === node.argument ? node : { ...node, argument };
}
/**

@ -116,7 +116,13 @@ export function async_derived(fn, location) {
render_effect(() => {
if (DEV) from_async_derived = active_effect;
try {
var p = fn();
} catch (error) {
p = Promise.reject(error);
}
if (DEV) from_async_derived = null;
promise =

Loading…
Cancel
Save