From d8bad21a00f7a8b6ca0725830327b821cec827de Mon Sep 17 00:00:00 2001 From: NGBAMA William Date: Wed, 6 Aug 2025 08:00:23 +0200 Subject: [PATCH 1/5] fix(core): useEffect to reset fast refresh after children execution --- packages/core/src/management.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/core/src/management.ts b/packages/core/src/management.ts index 3a77a27..ed7a9d7 100644 --- a/packages/core/src/management.ts +++ b/packages/core/src/management.ts @@ -42,7 +42,7 @@ export type SetupComponent> = (props: ShallowReact * @param name - component name */ export function $unison>(fn: SetupComponent, name?: string) { - if (!isFastRefresh() && typeof window !== "undefined") { + if (!isFastRefresh() && typeof window !== 'undefined') { window.__UNISON_REFRESH__ = { root: null }; } const component = React.forwardRef((props, ref) => { @@ -62,13 +62,15 @@ export function $unison>(fn: SetupComponent, na } instance.runEffects(); - useEffect(unset); + useEffect(() => { + unset(); + // reset if end of fast refresh + if (isFastRefresh() && window.__UNISON_REFRESH__.root === instance) { + window.__UNISON_REFRESH__ = undefined; + } + }); const result = instance.render(); - if (isFastRefresh() && window.__UNISON_REFRESH__.root === instance) { - window.__UNISON_REFRESH__ = undefined; - } - return result; }); if (name) { From 3cd4a8c0f4a927a3f88f8282a767333700eddfd2 Mon Sep 17 00:00:00 2001 From: NGBAMA William Date: Wed, 6 Aug 2025 08:02:33 +0200 Subject: [PATCH 2/5] feat(core): export isFastRefresh() --- packages/core/src/index.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index af1c786..b21c8b1 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,13 +1,13 @@ export { $unison, createReactHook, usePlugin, type SetupComponent } from './management'; -export { type EventType } from './context'; +export { type EventType, isFastRefresh } from './context'; export { useUnison } from './use-unison'; -export { - HookManager, - toUnisonHook, - BaseSignal, - type UnisonHookOptions, - type HookOptions +export { + HookManager, + toUnisonHook, + BaseSignal, + type UnisonHookOptions, + type HookOptions } from './plugins/hook-manager/index'; export type * from './plugins/index'; From 3f33ac18b52c4c5c4089680f02e7c9fbb236d917 Mon Sep 17 00:00:00 2001 From: NGBAMA William Date: Wed, 6 Aug 2025 08:03:27 +0200 Subject: [PATCH 3/5] fix(vue): reset the element cache on fast refresh --- packages/vue/src/jsx-runtime.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vue/src/jsx-runtime.ts b/packages/vue/src/jsx-runtime.ts index ef350da..76988f4 100644 --- a/packages/vue/src/jsx-runtime.ts +++ b/packages/vue/src/jsx-runtime.ts @@ -1,4 +1,4 @@ -import { usePlugin, getCurrentInstance, type UnisonPlugin, type ComponentInternalInstance } from '@unisonjs/core'; +import { isFastRefresh, usePlugin, getCurrentInstance, type UnisonPlugin, type ComponentInternalInstance } from '@unisonjs/core'; import { unref } from './index'; import { computed, type ComputedRefImpl } from './reactivity/computed'; @@ -39,7 +39,7 @@ export function rsx(callback: Callback) { if (!cache) return callback(); let element = cache.getElement(callback); - if (!element) { + if (!element || isFastRefresh()) { const ref: ComputedRefImpl = computed(callback); const result = ref.value; From 327574fe9d0030e5ca32d6568e5a4fe199365fc0 Mon Sep 17 00:00:00 2001 From: NGBAMA William Date: Wed, 6 Aug 2025 08:05:05 +0200 Subject: [PATCH 4/5] refactor(vue): fix types on ElementCache plugin --- packages/vue/src/jsx-runtime.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/vue/src/jsx-runtime.ts b/packages/vue/src/jsx-runtime.ts index 76988f4..d275dd5 100644 --- a/packages/vue/src/jsx-runtime.ts +++ b/packages/vue/src/jsx-runtime.ts @@ -6,6 +6,7 @@ type Callback = () => React.ReactNode; class ElementCache implements UnisonPlugin { + onInstanceFastRefresh(instance: ComponentInternalInstance): void {} #cache = new Map>(); /** @@ -13,7 +14,7 @@ class ElementCache implements UnisonPlugin { * @param key - The key associated with the element. * @returns The cached element or undefined if not found. */ - getElement(key) { + getElement(key: Callback) { return this.#cache.get(key); } @@ -40,7 +41,7 @@ export function rsx(callback: Callback) { let element = cache.getElement(callback); if (!element || isFastRefresh()) { - const ref: ComputedRefImpl = computed(callback); + const ref: ComputedRefImpl = computed(callback) as unknown as ComputedRefImpl; const result = ref.value; if (ref.dep.subs) { From feeb493e46360029cf876d50949acf6ea55ad679 Mon Sep 17 00:00:00 2001 From: NGBAMA William Date: Wed, 6 Aug 2025 08:24:35 +0200 Subject: [PATCH 5/5] chore: add changeset --- .changeset/silent-bottles-beg.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/silent-bottles-beg.md diff --git a/.changeset/silent-bottles-beg.md b/.changeset/silent-bottles-beg.md new file mode 100644 index 0000000..f5e7bfe --- /dev/null +++ b/.changeset/silent-bottles-beg.md @@ -0,0 +1,6 @@ +--- +'@unisonjs/core': patch +'@unisonjs/vue': patch +--- + +Fix fast refresh on children components