@getforma/core 1.0.8 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -134,6 +134,11 @@ declare function untrack<T>(fn: () => T): T;
134
134
  * Uses alien-signals' `effectScope` under the hood for native graph-level
135
135
  * effect tracking, with a userland disposer list for non-effect cleanup
136
136
  * (e.g., event listeners, DOM references, timers).
137
+ *
138
+ * Roots created inside another root are automatically owned by the parent
139
+ * (Solid-style). When the parent is disposed, all child roots are disposed
140
+ * too. Use {@link createUnownedRoot} for roots that must outlive their
141
+ * lexical parent (e.g., mount points, test harnesses).
137
142
  */
138
143
  /**
139
144
  * Create a reactive root scope.
@@ -143,6 +148,9 @@ declare function untrack<T>(fn: () => T): T;
143
148
  * userland level (via registerDisposer). The returned `dispose` function
144
149
  * tears down everything.
145
150
  *
151
+ * Roots created inside another root are automatically owned by the parent.
152
+ * When the parent is disposed, this root is disposed too.
153
+ *
146
154
  * ```ts
147
155
  * const dispose = createRoot(() => {
148
156
  * createEffect(() => console.log(count()));
@@ -152,6 +160,22 @@ declare function untrack<T>(fn: () => T): T;
152
160
  * ```
153
161
  */
154
162
  declare function createRoot<T>(fn: (dispose: () => void) => T): T;
163
+ /**
164
+ * Create a reactive root that is NOT owned by any parent root.
165
+ *
166
+ * Use this for roots that must outlive their lexical parent:
167
+ * top-level mount points, island hydration, test harnesses, etc.
168
+ *
169
+ * ```ts
170
+ * createRoot(() => {
171
+ * // This root outlives the parent even though it's nested:
172
+ * createUnownedRoot((dispose) => {
173
+ * // effects here survive parent disposal
174
+ * });
175
+ * });
176
+ * ```
177
+ */
178
+ declare function createUnownedRoot<T>(fn: (dispose: () => void) => T): T;
155
179
 
156
180
  /**
157
181
  * Register a cleanup function in the current reactive scope.
@@ -1146,4 +1170,4 @@ declare function onIntersect(el: HTMLElement, handler: (entry: IntersectionObser
1146
1170
  */
1147
1171
  declare function onMutation(el: HTMLElement, handler: (mutations: MutationRecord[]) => void, options?: MutationObserverInit): () => void;
1148
1172
 
1149
- export { $, $$, type CleanupFn, type ComponentDef, type Context, type CreateListOptions, type Dispatch, type ErrorHandler, type EventBus, Fragment, type HistoryControls, type IslandHydrateFn, type KeyOptions, type ListTransitionHooks, type PersistOptions, type ReconcileResult, type Ref, type SetupFn, SignalGetter, type StoreSetter, type SwitchCase, activateIslands, addClass, batch, children, cleanup, closest, createBus, createComputed, createContext, createEffect, createErrorBoundary, createHistory, createList, createMemo, createPortal, createReducer, createRef, createRoot, createShow, createStore, createSuspense, createSwitch, createText, deactivateAllIslands, deactivateIsland, defineComponent, delegate, disposeComponent, fragment, h, hydrateIsland, inject, mount, nextSibling, on, onCleanup, onError, onIntersect, onKey, onMount, onMutation, onResize, onUnmount, parent, persist, prevSibling, provide, reconcileList, removeClass, setAttr, setHTMLUnsafe, setStyle, setText, siblings, template, templateMany, toggleClass, trackDisposer, unprovide, untrack };
1173
+ export { $, $$, type CleanupFn, type ComponentDef, type Context, type CreateListOptions, type Dispatch, type ErrorHandler, type EventBus, Fragment, type HistoryControls, type IslandHydrateFn, type KeyOptions, type ListTransitionHooks, type PersistOptions, type ReconcileResult, type Ref, type SetupFn, SignalGetter, type StoreSetter, type SwitchCase, activateIslands, addClass, batch, children, cleanup, closest, createBus, createComputed, createContext, createEffect, createErrorBoundary, createHistory, createList, createMemo, createPortal, createReducer, createRef, createRoot, createShow, createStore, createSuspense, createSwitch, createText, createUnownedRoot, deactivateAllIslands, deactivateIsland, defineComponent, delegate, disposeComponent, fragment, h, hydrateIsland, inject, mount, nextSibling, on, onCleanup, onError, onIntersect, onKey, onMount, onMutation, onResize, onUnmount, parent, persist, prevSibling, provide, reconcileList, removeClass, setAttr, setHTMLUnsafe, setStyle, setText, siblings, template, templateMany, toggleClass, trackDisposer, unprovide, untrack };
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { hydrateIsland } from './chunk-7Q7LIV23.js';
2
- export { Fragment, cleanup, createList, createShow, fragment, h, hydrateIsland, reconcileList } from './chunk-7Q7LIV23.js';
3
- import { internalEffect, createRoot, untrack, createEffect, pushSuspenseContext, popSuspenseContext, __DEV__, reportError, batch } from './chunk-TBWZZ3SI.js';
4
- export { batch, createEffect, createMemo, createReducer, createRef, createResource, createRoot, getBatchDepth, isComputed, isEffect, isEffectScope, isSignal, on, onCleanup, onError, trigger, untrack } from './chunk-TBWZZ3SI.js';
1
+ import { hydrateIsland } from './chunk-AFRFF7XL.js';
2
+ export { Fragment, cleanup, createList, createShow, fragment, h, hydrateIsland, reconcileList } from './chunk-AFRFF7XL.js';
3
+ import { internalEffect, createUnownedRoot, createRoot, untrack, registerDisposer, createEffect, pushSuspenseContext, popSuspenseContext, __DEV__, reportError, batch } from './chunk-3G7ET4O5.js';
4
+ export { batch, createEffect, createMemo, createReducer, createRef, createResource, createRoot, createUnownedRoot, getBatchDepth, isComputed, isEffect, isEffectScope, isSignal, on, onCleanup, onError, trigger, untrack } from './chunk-3G7ET4O5.js';
5
5
  import { createSignal } from './chunk-HLM5BZZQ.js';
6
6
  export { createComputed, createSignal } from './chunk-HLM5BZZQ.js';
7
7
 
@@ -25,12 +25,12 @@ function mount(component, container) {
25
25
  }
26
26
  let disposeRoot;
27
27
  if (target.hasAttribute("data-forma-ssr")) {
28
- createRoot((dispose) => {
28
+ createUnownedRoot((dispose) => {
29
29
  disposeRoot = dispose;
30
30
  hydrateIsland(component, target);
31
31
  });
32
32
  } else {
33
- const dom = createRoot((dispose) => {
33
+ const dom = createUnownedRoot((dispose) => {
34
34
  disposeRoot = dispose;
35
35
  return component();
36
36
  });
@@ -111,6 +111,13 @@ function createSwitch(value, cases, fallback) {
111
111
  if (DEBUG) console.log("[forma:switch] inserted", currentNode.nodeName, "before end marker");
112
112
  }
113
113
  });
114
+ registerDisposer(() => {
115
+ for (const entry of cache2.values()) {
116
+ entry.dispose();
117
+ }
118
+ cache2.clear();
119
+ currentNode = null;
120
+ });
114
121
  fragment2.__switchDispose = () => {
115
122
  switchDispose();
116
123
  for (const entry of cache2.values()) {
@@ -326,7 +333,7 @@ function hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps) {
326
333
  const props = loadIslandProps(root, id, sharedProps);
327
334
  root.setAttribute("data-forma-status", "hydrating");
328
335
  let activeRoot = root;
329
- createRoot((dispose) => {
336
+ createUnownedRoot((dispose) => {
330
337
  activeRoot = hydrateIsland(() => hydrateFn(root, props), root);
331
338
  activeRoot.__formaDispose = dispose;
332
339
  });