diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/global.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/global.js index 3e2ed55637..136bb020a9 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/global.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/global.js @@ -54,16 +54,25 @@ export const global_visitors = { binding?.kind === 'prop' || is_store ) { - let fn = node.operator === '++' ? '$.increment' : '$.decrement'; + /** @type {import('estree').Expression[]} */ + const args = []; + + let fn = '$.update'; if (node.prefix) fn += '_pre'; - if (binding.kind === 'prop') fn += '_prop'; if (is_store) { fn += '_store'; - return b.call(fn, serialize_get_binding(b.id(name), state), b.call('$' + name)); + args.push(serialize_get_binding(b.id(name), state), b.call('$' + name)); + } else { + if (binding.kind === 'prop') fn += '_prop'; + args.push(b.id(name)); + } + + if (node.operator === '--') { + args.push(b.literal(-1)); } - return b.call(fn, b.id(name)); + return b.call(fn, ...args); } return next(); diff --git a/packages/svelte/src/internal/client/proxy/proxy.js b/packages/svelte/src/internal/client/proxy/proxy.js index 9a68f23ec4..96752f10ca 100644 --- a/packages/svelte/src/internal/client/proxy/proxy.js +++ b/packages/svelte/src/internal/client/proxy/proxy.js @@ -3,7 +3,7 @@ import { effect_active, get, set, - increment, + update, source, updating_derived, UNINITIALIZED, @@ -143,7 +143,7 @@ const handler = { const s = metadata.s.get(prop); if (s !== undefined) set(s, UNINITIALIZED); - if (prop in target) increment(metadata.v); + if (prop in target) update(metadata.v); return delete target[prop]; }, @@ -224,7 +224,7 @@ const handler = { } } if (not_has) { - increment(metadata.v); + update(metadata.v); } // @ts-ignore target[prop] = value; diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 9bcb31a80a..a8334a33b9 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -1577,111 +1577,55 @@ export function bubble_event($$props, event) { /** * @param {import('./types.js').Signal} signal + * @param {1 | -1} [d] * @returns {number} */ -export function increment(signal) { +export function update(signal, d = 1) { const value = get(signal); - set_signal_value(signal, value + 1); + set_signal_value(signal, value + d); return value; } /** * @param {((value?: number) => number)} fn + * @param {1 | -1} [d] * @returns {number} */ -export function increment_prop(fn) { +export function update_prop(fn, d = 1) { const value = fn(); - fn(value + 1); + fn(value + d); return value; } /** * @param {import('./types.js').Store} store * @param {number} store_value + * @param {1 | -1} [d] * @returns {number} */ -export function increment_store(store, store_value) { - store.set(store_value + 1); +export function update_store(store, store_value, d = 1) { + store.set(store_value + d); return store_value; } /** * @param {import('./types.js').Signal} signal + * @param {1 | -1} [d] * @returns {number} */ -export function decrement(signal) { - const value = get(signal); - set_signal_value(signal, value - 1); - return value; -} - -/** - * @param {((value?: number) => number)} fn - * @returns {number} - */ -export function decrement_prop(fn) { - const value = fn(); - fn(value - 1); - return value; -} - -/** - * @param {import('./types.js').Store} store - * @param {number} store_value - * @returns {number} - */ -export function decrement_store(store, store_value) { - store.set(store_value - 1); - return store_value; -} - -/** - * @param {import('./types.js').Signal} signal - * @returns {number} - */ -export function increment_pre(signal) { - const value = get(signal) + 1; - set_signal_value(signal, value); - return value; -} - -/** - * @param {((value?: number) => number)} fn - * @returns {number} - */ -export function increment_pre_prop(fn) { - const value = fn() + 1; - fn(value); - return value; -} - -/** - * @param {import('./types.js').Store} store - * @param {number} store_value - * @returns {number} - */ -export function increment_pre_store(store, store_value) { - const value = store_value + 1; - store.set(value); - return value; -} - -/** - * @param {import('./types.js').Signal} signal - * @returns {number} - */ -export function decrement_pre(signal) { - const value = get(signal) - 1; +export function update_pre(signal, d = 1) { + const value = get(signal) + d; set_signal_value(signal, value); return value; } /** * @param {((value?: number) => number)} fn + * @param {1 | -1} [d] * @returns {number} */ -export function decrement_pre_prop(fn) { - const value = fn() - 1; +export function update_pre_prop(fn, d = 1) { + const value = fn() + d; fn(value); return value; } @@ -1689,10 +1633,11 @@ export function decrement_pre_prop(fn) { /** * @param {import('./types.js').Store} store * @param {number} store_value + * @param {1 | -1} [d] * @returns {number} */ -export function decrement_pre_store(store, store_value) { - const value = store_value - 1; +export function update_pre_store(store, store_value, d = 1) { + const value = store_value + d; store.set(value); return value; } diff --git a/packages/svelte/src/internal/index.js b/packages/svelte/src/internal/index.js index 8cdf28a48d..048105d0f9 100644 --- a/packages/svelte/src/internal/index.js +++ b/packages/svelte/src/internal/index.js @@ -17,18 +17,12 @@ export { safe_equal, tick, untrack, - increment, - increment_prop, - increment_store, - decrement, - decrement_prop, - decrement_store, - increment_pre, - increment_pre_prop, - increment_pre_store, - decrement_pre, - decrement_pre_prop, - decrement_pre_store, + update, + update_prop, + update_store, + update_pre, + update_pre_prop, + update_pre_store, mutate, mutate_store, value_or_fallback,