feat: `$derived.by` get current value as first argument

derived-by-current-value
paoloricciuti 12 months ago
parent 501f415190
commit 9595bc676b

@ -0,0 +1,5 @@
---
'svelte': patch
---
feat: `$derived.by` get current value as first argument

@ -202,7 +202,7 @@ declare namespace $derived {
* *
* https://svelte-5-preview.vercel.app/docs/runes#$derived-by * https://svelte-5-preview.vercel.app/docs/runes#$derived-by
*/ */
export function by<T>(fn: () => T): T; export function by<T>(fn: (current: T | null) => T): T;
// prevent intellisense from being unhelpful // prevent intellisense from being unhelpful
/** @deprecated */ /** @deprecated */

@ -419,16 +419,6 @@ export function template(elements, expressions) {
* @returns {ESTree.Expression} * @returns {ESTree.Expression}
*/ */
export function thunk(expression, async = false) { export function thunk(expression, async = false) {
if (
expression.type === 'CallExpression' &&
expression.callee.type !== 'Super' &&
expression.callee.type !== 'MemberExpression' &&
expression.callee.type !== 'CallExpression' &&
expression.arguments.length === 0
) {
return expression.callee;
}
const fn = arrow([], expression); const fn = arrow([], expression);
if (async) fn.async = true; if (async) fn.async = true;
return fn; return fn;

@ -17,7 +17,7 @@ import { inspect_effects, set_inspect_effects } from './sources.js';
/** /**
* @template V * @template V
* @param {() => V} fn * @param {(current: V | null ) => V} fn
* @returns {Derived<V>} * @returns {Derived<V>}
*/ */
/*#__NO_SIDE_EFFECTS__*/ /*#__NO_SIDE_EFFECTS__*/
@ -47,7 +47,7 @@ export function derived(fn) {
/** /**
* @template V * @template V
* @param {() => V} fn * @param {(current: NoInfer<V> | null) => V} fn
* @returns {Derived<V>} * @returns {Derived<V>}
*/ */
/*#__NO_SIDE_EFFECTS__*/ /*#__NO_SIDE_EFFECTS__*/

@ -25,7 +25,7 @@ export interface Reaction extends Signal {
export interface Derived<V = unknown> extends Value<V>, Reaction { export interface Derived<V = unknown> extends Value<V>, Reaction {
/** The derived function */ /** The derived function */
fn: () => V; fn: (current: V | null) => V;
/** Reactions created inside this signal */ /** Reactions created inside this signal */
children: null | Reaction[]; children: null | Reaction[];
} }

@ -309,7 +309,11 @@ export function update_reaction(reaction) {
derived_sources = null; derived_sources = null;
try { try {
var result = /** @type {Function} */ (0, reaction.fn)(); var args = [];
if (reaction.f & DERIVED) {
args.push(/**@type {Derived}*/ (reaction).v);
}
var result = /** @type {Function} */ (0, reaction.fn)(...args);
var deps = reaction.deps; var deps = reaction.deps;
if (new_deps !== null) { if (new_deps !== null) {
@ -783,7 +787,6 @@ export function get(signal) {
update_derived(derived); update_derived(derived);
} }
} }
return signal.v; return signal.v;
} }

@ -471,7 +471,7 @@ describe('signals', () => {
}); });
test('owned deriveds correctly cleanup when no longer connected to graph', () => { test('owned deriveds correctly cleanup when no longer connected to graph', () => {
let a: Derived<unknown>; let a: Derived<void>;
let s = state(0); let s = state(0);
const destroy = effect_root(() => { const destroy = effect_root(() => {

@ -6,6 +6,6 @@ export default function Svelte_element($$anchor, $$props) {
var fragment = $.comment(); var fragment = $.comment();
var node = $.first_child(fragment); var node = $.first_child(fragment);
$.element(node, tag, false); $.element(node, () => tag(), false);
$.append($$anchor, fragment); $.append($$anchor, fragment);
} }
Loading…
Cancel
Save