diff --git a/.changeset/chatty-readers-ask.md b/.changeset/chatty-readers-ask.md new file mode 100644 index 000000000..18e980070 --- /dev/null +++ b/.changeset/chatty-readers-ask.md @@ -0,0 +1,5 @@ +--- +'@tanstack/form-core': patch +--- + +fixes partial prerendering in NextJS using cache components diff --git a/packages/form-core/package.json b/packages/form-core/package.json index 898c25e38..ff58f9665 100644 --- a/packages/form-core/package.json +++ b/packages/form-core/package.json @@ -52,7 +52,6 @@ ], "dependencies": { "@tanstack/devtools-event-client": "^0.3.5", - "@tanstack/pacer": "^0.15.3", "@tanstack/store": "^0.7.7" }, "devDependencies": { diff --git a/packages/form-core/src/FormApi.ts b/packages/form-core/src/FormApi.ts index 319b98531..712a67be3 100644 --- a/packages/form-core/src/FormApi.ts +++ b/packages/form-core/src/FormApi.ts @@ -1,5 +1,4 @@ import { Derived, Store, batch } from '@tanstack/store' -import { throttle } from '@tanstack/pacer' import { deleteBy, determineFormLevelErrorSourceAndValue, @@ -12,6 +11,7 @@ import { isNonEmptyArray, mergeOpts, setBy, + throttle, uuid, } from './utils' import { defaultValidationLogic } from './ValidationLogic' @@ -1316,9 +1316,7 @@ export class FormApi< id: this._formId, state: state, }), - { - wait: 300, - }, + 300, ) // devtool broadcasts diff --git a/packages/form-core/src/utils.ts b/packages/form-core/src/utils.ts index cf9383d84..d74f70ebd 100644 --- a/packages/form-core/src/utils.ts +++ b/packages/form-core/src/utils.ts @@ -603,3 +603,12 @@ export function uuid(): string { IDX++ return out } + +export function throttle) => any>(fn: TFn, delay: number) { + let timer: ReturnType | undefined; + + return function (...args: Parameters) { + clearTimeout(timer); + timer = setTimeout(() => fn(...args), delay); + }; +} diff --git a/packages/form-core/tests/utils.spec.ts b/packages/form-core/tests/utils.spec.ts index 229e7cdd9..c6f457e55 100644 --- a/packages/form-core/tests/utils.spec.ts +++ b/packages/form-core/tests/utils.spec.ts @@ -1,4 +1,4 @@ -import { describe, expect, expectTypeOf, it } from 'vitest' +import { describe, expect, expectTypeOf, it, vi } from 'vitest' import { concatenatePaths, createFieldMap, @@ -10,6 +10,7 @@ import { makePathArray, mergeOpts, setBy, + throttle, uuid, } from '../src/index' @@ -825,3 +826,16 @@ describe('uuid', () => { expect(['8', '9', 'a', 'b']).toContain(parts[3]?.[0]) }) }) + +describe('throttle', () => { + it('should throttle a function', async () => { + const fn = vi.fn() + vi.useFakeTimers() + const throttledFn = throttle(fn, 100) + throttledFn() + throttledFn() + await vi.runAllTimersAsync() + vi.useRealTimers() + expect(fn).toHaveBeenCalledTimes(1) + }) +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3e67cc34..02c85f1e4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1233,9 +1233,6 @@ importers: '@tanstack/devtools-event-client': specifier: ^0.3.5 version: 0.3.5 - '@tanstack/pacer': - specifier: ^0.15.3 - version: 0.15.4 '@tanstack/store': specifier: ^0.7.7 version: 0.7.7 @@ -4788,10 +4785,6 @@ packages: resolution: {integrity: sha512-B7+x7eP2FFvi3fgd3rNH9o/Eixt+pp0zCIdGhnQbAJjFrlwIKGjGnwyJjhWJ5fMQlGks/E2LdDTqEV4W9Plx7g==} engines: {node: '>=12'} - '@tanstack/pacer@0.15.4': - resolution: {integrity: sha512-vGY+CWsFZeac3dELgB6UZ4c7OacwsLb8hvL2gLS6hTgy8Fl0Bm/aLokHaeDIP+q9F9HUZTnp360z9uv78eg8pg==} - engines: {node: '>=18'} - '@tanstack/query-core@5.90.5': resolution: {integrity: sha512-wLamYp7FaDq6ZnNehypKI5fNvxHPfTYylE0m/ZpuuzJfJqhR5Pxg9gvGBHZx4n7J+V5Rg5mZxHHTlv25Zt5u+w==} @@ -14255,11 +14248,6 @@ snapshots: '@tanstack/history@1.133.28': {} - '@tanstack/pacer@0.15.4': - dependencies: - '@tanstack/devtools-event-client': 0.3.5 - '@tanstack/store': 0.7.7 - '@tanstack/query-core@5.90.5': {} '@tanstack/react-devtools@0.7.8(@types/react-dom@19.1.5(@types/react@19.1.6))(@types/react@19.1.6)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.9)':