From 5cfb7db6477e8b07c174b06204988e9f74f10cb8 Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 12 Mar 2025 12:14:03 +0530 Subject: [PATCH 1/5] intellisense support for fragment and lazy fixed --- build/index.d.ts | 1 + build/jsx.d.ts | 11 +---- build/lazy/Lazyloading.d.ts | 5 ++- build/refract.es.js | 5 ++- src/components/FC1.tsx | 8 ++-- src/components/IntellisenseTest.tsx | 63 +++++++++++++++++++++++++++++ src/components/Test.tsx | 2 +- src/index.ts | 4 +- src/jsx.ts | 12 +----- src/lazy/Lazyloading.tsx | 11 +++-- 10 files changed, 90 insertions(+), 32 deletions(-) create mode 100644 src/components/IntellisenseTest.tsx diff --git a/build/index.d.ts b/build/index.d.ts index 8861999..23b2294 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -7,6 +7,7 @@ import { JSXInternal } from './jsx'; export * from './jsx'; declare global { export import JSX = JSXInternal; + const FRAGMENT = "FRAGMENT"; } export * from './types'; export { cleanUp, createEffect, createSignal, render, createPromise, createRef, computed, createElement, lazy, ArraySignal, BaseSignal, ObjectSignal, PrimitiveSignal, PublicArraySignal, PublicObjectSignal, PublicSignal, Ref, }; diff --git a/build/jsx.d.ts b/build/jsx.d.ts index 9245ad3..48395c2 100644 --- a/build/jsx.d.ts +++ b/build/jsx.d.ts @@ -1,5 +1,4 @@ import { Ref } from './index'; -import { Fiber } from './types'; type Defaultize = Props extends any ? Partial>> & // Include the remaining properties from Props Pick> : never; type Booleanish = boolean | "true" | "false"; @@ -64,7 +63,7 @@ export declare namespace JSXInternal { export type ElementType

= { [K in keyof IntrinsicElements]: P extends IntrinsicElements[K] ? K : never; }[keyof IntrinsicElements] | ComponentType

; - export type Element = Fiber; + export type Element = ComponentChild; export type ElementClass = ComponentType; export interface ElementAttributesProperty { props: any; @@ -81,13 +80,7 @@ export declare namespace JSXInternal { export interface CSSProperties extends AllCSSProperties, DOMCSSProperties { cssText?: string | null; } - export interface SignalLike { - value: T; - peek(): T; - subscribe(fn: (value: T) => void): () => void; - } - export type Signalish = T | SignalLike; - export type UnpackSignal = T extends SignalLike ? V : T; + export type Signalish = T | (() => T); export interface SVGAttributes extends HTMLAttributes { accentHeight?: Signalish; accumulate?: Signalish<"none" | "sum" | undefined>; diff --git a/build/lazy/Lazyloading.d.ts b/build/lazy/Lazyloading.d.ts index 0179d6b..0b99eb4 100644 --- a/build/lazy/Lazyloading.d.ts +++ b/build/lazy/Lazyloading.d.ts @@ -1,8 +1,9 @@ +import { ComponentChildren } from '../index'; type PropsOf any> = Parameters extends [] ? {} : Parameters[0]; export declare function lazy any>(importFn: () => Promise<{ default: T; }>): (props: PropsOf & { - fallback?: string | Node; - errorFallback?: string | Node | ((error: Error) => Node); + fallback?: ComponentChildren; + errorFallback?: ComponentChildren | ((error: Error) => ComponentChildren); }) => ReturnType; export {}; diff --git a/build/refract.es.js b/build/refract.es.js index 45b769a..3644bd0 100644 --- a/build/refract.es.js +++ b/build/refract.es.js @@ -1208,7 +1208,10 @@ function ot(e) { throw new Error( "Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node." ); - return /* @__PURE__ */ oe("FRAGMENT", null, () => o.value ? r.fallback : l.value !== null ? r.errorFallback ? typeof r.errorFallback == "function" ? r.errorFallback(l.value) : r.errorFallback : "Unknown error occurred while lazy loading component, use errorFallback prop to override" : t && /* @__PURE__ */ oe(t, { ...r })); + return /* @__PURE__ */ oe("FRAGMENT", null, () => o.value ? r.fallback : l.value !== null ? r.errorFallback ? typeof r.errorFallback == "function" ? r.errorFallback(l.value) : r.errorFallback : "Unknown error occurred while lazy loading component, use errorFallback prop to override" : ( + // @ts-expect-error + t && /* @__PURE__ */ oe(t, { ...r }) + )); }; } export { diff --git a/src/components/FC1.tsx b/src/components/FC1.tsx index 73701b5..8634824 100644 --- a/src/components/FC1.tsx +++ b/src/components/FC1.tsx @@ -21,19 +21,19 @@ const FC1 = () => { }); // const compText = computed(() => "FC1" + str.value); return ( - <> +

This is FC1 {() => textSignal.value + str.value}

This is {() => str.value}

- +
); }; export default FC1; diff --git a/src/components/IntellisenseTest.tsx b/src/components/IntellisenseTest.tsx new file mode 100644 index 0000000..192345c --- /dev/null +++ b/src/components/IntellisenseTest.tsx @@ -0,0 +1,63 @@ +import { + createSignal, + createPromise, + createRef, + createEffect, + cleanUp, + computed, + lazy, +} from "../index"; + +const LazyFC = lazy(() => import("./FC1")); + +const IntellisenseTest = () => { + const count = createSignal(0); + const arr = createSignal([1, 2]); + const obj = createSignal({ a: 1, b: 2 }); + + createEffect(() => { + count.update((prev) => prev + 1); + arr.update((prev) => prev.push(1)); + obj.update((prev) => prev.a++); + }); + const comp = computed(() => arr.value[0]); + const promise = createPromise(async () => { + return await fetch("fakeapi"); + }); + const ref = createRef(); + + cleanUp(() => { + console.log("cleanup"); + }); + return ( +
+ IntellisenseTest + + "hello" + err.message} + /> + hello
} /> + } /> + } /> + {() => { + promise.value.status === "resolved" + ? promise.value.data + : promise.value.error; + }} +
count.value.toString()} + data-test="test" + >
+ <>Fragment + + ); +}; + +const Test = () => { + return
test
; +}; +export default IntellisenseTest; diff --git a/src/components/Test.tsx b/src/components/Test.tsx index 136dfaa..736ad7a 100644 --- a/src/components/Test.tsx +++ b/src/components/Test.tsx @@ -23,7 +23,7 @@ const Test = () => { setTimeout(() => { showTextSignal.update((prev) => !prev); }, 2000); - const h1ref = createRef(); + const h1ref = createRef(); // console.log("hello"); return (
diff --git a/src/index.ts b/src/index.ts index b60eaaa..814c818 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,10 +21,12 @@ import type { } from "./signals/signal"; export * from "./jsx"; -import { JSXInternal } from "./jsx"; +import { JSXInternal, FRAGMENT as Fragment } from "./jsx"; declare global { // @ts-expect-error export import JSX = JSXInternal; + // @ts-expect-error + const FRAGMENT = "FRAGMENT"; } export * from "./types"; export { diff --git a/src/jsx.ts b/src/jsx.ts index f6267c7..a2a58c9 100644 --- a/src/jsx.ts +++ b/src/jsx.ts @@ -130,7 +130,7 @@ export namespace JSXInternal { : never; }[keyof IntrinsicElements] | ComponentType

; - export type Element = Fiber; + export type Element = ComponentChild; export type ElementClass = ComponentType; export interface ElementAttributesProperty { @@ -158,15 +158,7 @@ export namespace JSXInternal { cssText?: string | null; } - export interface SignalLike { - value: T; - peek(): T; - subscribe(fn: (value: T) => void): () => void; - } - - export type Signalish = T | SignalLike; - - export type UnpackSignal = T extends SignalLike ? V : T; + export type Signalish = T | (() => T); export interface SVGAttributes extends HTMLAttributes { diff --git a/src/lazy/Lazyloading.tsx b/src/lazy/Lazyloading.tsx index e4afb2a..e8de40e 100644 --- a/src/lazy/Lazyloading.tsx +++ b/src/lazy/Lazyloading.tsx @@ -1,4 +1,4 @@ -import { createSignal, PublicSignal } from "../index"; +import { ComponentChildren, createSignal, Fiber, PublicSignal } from "../index"; declare const FRAGMENT = "FRAGMENT"; @@ -11,8 +11,10 @@ export function lazy any>( importFn: () => Promise<{ default: T }> ): ( props: PropsOf & { - fallback?: string | Node; - errorFallback?: string | Node | ((error: Error) => Node); + fallback?: ComponentChildren; + errorFallback?: + | ComponentChildren + | ((error: Error) => ComponentChildren); } ) => ReturnType { let Component: T | null = null; @@ -95,7 +97,8 @@ export function lazy any>( ? props.errorFallback(error.value) : props.errorFallback : "Unknown error occurred while lazy loading component, use errorFallback prop to override" - : Component && + : // @ts-expect-error + Component && } ) as unknown as ReturnType; From 250a21a2a370b6426392518d1df826c83634d973 Mon Sep 17 00:00:00 2001 From: Aditya Date: Mon, 17 Mar 2025 07:30:18 +0530 Subject: [PATCH 2/5] refactored the signal file for less build size --- build/jsx.d.ts | 228 +--- build/lib.d.ts | 7 - build/refract.cjs.js | 3 +- build/refract.cjs.js.map | 1 + build/refract.es.js | 2113 ++++++++++++++++++++++--------------- build/refract.es.js.map | 1 + build/refract.umd.js | 1 - build/signals/signal.d.ts | 16 - package-lock.json | 101 +- package.json | 2 + src/signals/signal.ts | 247 +---- src/signals/utils.ts | 73 ++ src/utils/general.ts | 6 - tsconfig.json | 6 +- vite.config.ts | 18 +- 15 files changed, 1524 insertions(+), 1299 deletions(-) create mode 100644 build/refract.cjs.js.map create mode 100644 build/refract.es.js.map delete mode 100644 build/refract.umd.js create mode 100644 src/signals/utils.ts diff --git a/build/jsx.d.ts b/build/jsx.d.ts index 48395c2..91e1988 100644 --- a/build/jsx.d.ts +++ b/build/jsx.d.ts @@ -1,12 +1,8 @@ import { Ref } from './index'; -type Defaultize = Props extends any ? Partial>> & // Include the remaining properties from Props -Pick> : never; +type Defaultize = Props extends any ? Partial>> & Pick> : never; type Booleanish = boolean | "true" | "false"; -/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ToggleEvent) */ interface ToggleEvent extends Event { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ToggleEvent/newState) */ readonly newState: string; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ToggleEvent/oldState) */ readonly oldState: string; } declare var ToggleEvent: { @@ -34,11 +30,8 @@ export interface RefractDOMAttributes extends Attributes { __html: string; }; } -/** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/CommandEvent) */ interface CommandEvent extends Event { - /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/CommandEvent/source) */ readonly source: Element | null; - /** [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/CommandEvent/command) */ readonly command: string; } declare var CommandEvent: { @@ -91,9 +84,7 @@ export declare namespace JSXInternal { "allow-reorder"?: Signalish<"no" | "yes" | undefined>; alphabetic?: Signalish; amplitude?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/arabic-form */ arabicForm?: Signalish<"initial" | "medial" | "terminal" | "isolated" | undefined>; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/arabic-form */ "arabic-form"?: Signalish<"initial" | "medial" | "terminal" | "isolated" | undefined>; ascent?: Signalish; attributeName?: Signalish; @@ -651,223 +642,58 @@ export declare namespace JSXInternal { onCommand?: CommandEventHandler; } export interface AriaAttributes { - /** Identifies the currently active element when DOM focus is on a composite widget, textbox, group, or application. */ "aria-activedescendant"?: Signalish; - /** Indicates whether assistive technologies will present all, or only parts of, the changed region based on the change notifications defined by the aria-relevant attribute. */ "aria-atomic"?: Signalish; - /** - * Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for an input and specifies how predictions would be - * presented if they are made. - */ "aria-autocomplete"?: Signalish<"none" | "inline" | "list" | "both" | undefined>; - /** - * Defines a string value that labels the current element, which is intended to be converted into Braille. - * @see aria-label. - */ "aria-braillelabel"?: Signalish; - /** - * Defines a human-readable, author-localized abbreviated description for the role of an element, which is intended to be converted into Braille. - * @see aria-roledescription. - */ "aria-brailleroledescription"?: Signalish; - /** Indicates an element is being modified and that assistive technologies MAY want to wait until the modifications are complete before exposing them to the user. */ "aria-busy"?: Signalish; - /** - * Indicates the current "checked" state of checkboxes, radio buttons, and other widgets. - * @see aria-pressed - * @see aria-selected. - */ "aria-checked"?: Signalish; - /** - * Defines the total number of columns in a table, grid, or treegrid. - * @see aria-colindex. - */ "aria-colcount"?: Signalish; - /** - * Defines an element's column index or position with respect to the total number of columns within a table, grid, or treegrid. - * @see aria-colcount - * @see aria-colspan. - */ "aria-colindex"?: Signalish; - /** - * Defines a human readable text alternative of aria-colindex. - * @see aria-rowindextext. - */ "aria-colindextext"?: Signalish; - /** - * Defines the number of columns spanned by a cell or gridcell within a table, grid, or treegrid. - * @see aria-colindex - * @see aria-rowspan. - */ "aria-colspan"?: Signalish; - /** - * Identifies the element (or elements) whose contents or presence are controlled by the current element. - * @see aria-owns. - */ "aria-controls"?: Signalish; - /** Indicates the element that represents the current item within a container or set of related elements. */ "aria-current"?: Signalish; - /** - * Identifies the element (or elements) that describes the object. - * @see aria-labelledby - */ "aria-describedby"?: Signalish; - /** - * Defines a string value that describes or annotates the current element. - * @see related aria-describedby. - */ "aria-description"?: Signalish; - /** - * Identifies the element that provides a detailed, extended description for the object. - * @see aria-describedby. - */ "aria-details"?: Signalish; - /** - * Indicates that the element is perceivable but disabled, so it is not editable or otherwise operable. - * @see aria-hidden - * @see aria-readonly. - */ "aria-disabled"?: Signalish; - /** - * Indicates what functions can be performed when a dragged object is released on the drop target. - * @deprecated in ARIA 1.1 - */ "aria-dropeffect"?: Signalish<"none" | "copy" | "execute" | "link" | "move" | "popup" | undefined>; - /** - * Identifies the element that provides an error message for the object. - * @see aria-invalid - * @see aria-describedby. - */ "aria-errormessage"?: Signalish; - /** Indicates whether the element, or another grouping element it controls, is currently expanded or collapsed. */ "aria-expanded"?: Signalish; - /** - * Identifies the next element (or elements) in an alternate reading order of content which, at the user's discretion, - * allows assistive technology to override the general default of reading in document source order. - */ "aria-flowto"?: Signalish; - /** - * Indicates an element's "grabbed" state in a drag-and-drop operation. - * @deprecated in ARIA 1.1 - */ "aria-grabbed"?: Signalish; - /** Indicates the availability and type of interactive popup element, such as menu or dialog, that can be triggered by an element. */ "aria-haspopup"?: Signalish; - /** - * Indicates whether the element is exposed to an accessibility API. - * @see aria-disabled. - */ "aria-hidden"?: Signalish; - /** - * Indicates the entered value does not conform to the format expected by the application. - * @see aria-errormessage. - */ "aria-invalid"?: Signalish; - /** Indicates keyboard shortcuts that an author has implemented to activate or give focus to an element. */ "aria-keyshortcuts"?: Signalish; - /** - * Defines a string value that labels the current element. - * @see aria-labelledby. - */ "aria-label"?: Signalish; - /** - * Identifies the element (or elements) that labels the current element. - * @see aria-describedby. - */ "aria-labelledby"?: Signalish; - /** Defines the hierarchical level of an element within a structure. */ "aria-level"?: Signalish; - /** Indicates that an element will be updated, and describes the types of updates the user agents, assistive technologies, and user can expect from the live region. */ "aria-live"?: Signalish<"off" | "assertive" | "polite" | undefined>; - /** Indicates whether an element is modal when displayed. */ "aria-modal"?: Signalish; - /** Indicates whether a text box accepts multiple lines of input or only a single line. */ "aria-multiline"?: Signalish; - /** Indicates that the user may select more than one item from the current selectable descendants. */ "aria-multiselectable"?: Signalish; - /** Indicates whether the element's orientation is horizontal, vertical, or unknown/ambiguous. */ "aria-orientation"?: Signalish<"horizontal" | "vertical" | undefined>; - /** - * Identifies an element (or elements) in order to define a visual, functional, or contextual parent/child relationship - * between DOM elements where the DOM hierarchy cannot be used to represent the relationship. - * @see aria-controls. - */ "aria-owns"?: Signalish; - /** - * Defines a short hint (a word or short phrase) intended to aid the user with data entry when the control has no value. - * A hint could be a sample value or a brief description of the expected format. - */ "aria-placeholder"?: Signalish; - /** - * Defines an element's number or position in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. - * @see aria-setsize. - */ "aria-posinset"?: Signalish; - /** - * Indicates the current "pressed" state of toggle buttons. - * @see aria-checked - * @see aria-selected. - */ "aria-pressed"?: Signalish; - /** - * Indicates that the element is not editable, but is otherwise operable. - * @see aria-disabled. - */ "aria-readonly"?: Signalish; - /** - * Indicates what notifications the user agent will trigger when the accessibility tree within a live region is modified. - * @see aria-atomic. - */ "aria-relevant"?: Signalish<"additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined>; - /** Indicates that user input is required on the element before a form may be submitted. */ "aria-required"?: Signalish; - /** Defines a human-readable, author-localized description for the role of an element. */ "aria-roledescription"?: Signalish; - /** - * Defines the total number of rows in a table, grid, or treegrid. - * @see aria-rowindex. - */ "aria-rowcount"?: Signalish; - /** - * Defines an element's row index or position with respect to the total number of rows within a table, grid, or treegrid. - * @see aria-rowcount - * @see aria-rowspan. - */ "aria-rowindex"?: Signalish; - /** - * Defines a human readable text alternative of aria-rowindex. - * @see aria-colindextext. - */ "aria-rowindextext"?: Signalish; - /** - * Defines the number of rows spanned by a cell or gridcell within a table, grid, or treegrid. - * @see aria-rowindex - * @see aria-colspan. - */ "aria-rowspan"?: Signalish; - /** - * Indicates the current "selected" state of various widgets. - * @see aria-checked - * @see aria-pressed. - */ "aria-selected"?: Signalish; - /** - * Defines the number of items in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. - * @see aria-posinset. - */ "aria-setsize"?: Signalish; - /** Indicates if items in a table or grid are sorted in ascending or descending order. */ "aria-sort"?: Signalish<"none" | "ascending" | "descending" | "other" | undefined>; - /** Defines the maximum allowed value for a range widget. */ "aria-valuemax"?: Signalish; - /** Defines the minimum allowed value for a range widget. */ "aria-valuemin"?: Signalish; - /** - * Defines the current value for a range widget. - * @see aria-valuetext. - */ "aria-valuenow"?: Signalish; - /** Defines the human readable text alternative of aria-valuenow for a range widget. */ "aria-valuetext"?: Signalish; } export type WAIAriaRole = "alert" | "alertdialog" | "application" | "article" | "banner" | "blockquote" | "button" | "caption" | "cell" | "checkbox" | "code" | "columnheader" | "combobox" | "command" | "complementary" | "composite" | "contentinfo" | "definition" | "deletion" | "dialog" | "directory" | "document" | "emphasis" | "feed" | "figure" | "form" | "grid" | "gridcell" | "group" | "heading" | "img" | "input" | "insertion" | "landmark" | "link" | "list" | "listbox" | "listitem" | "log" | "main" | "marquee" | "math" | "meter" | "menu" | "menubar" | "menuitem" | "menuitemcheckbox" | "menuitemradio" | "navigation" | "none" | "note" | "option" | "paragraph" | "presentation" | "progressbar" | "radio" | "radiogroup" | "range" | "region" | "roletype" | "row" | "rowgroup" | "rowheader" | "scrollbar" | "search" | "searchbox" | "section" | "sectionhead" | "select" | "separator" | "slider" | "spinbutton" | "status" | "strong" | "structure" | "subscript" | "superscript" | "switch" | "tab" | "table" | "tablist" | "tabpanel" | "term" | "textbox" | "time" | "timer" | "toolbar" | "tooltip" | "tree" | "treegrid" | "treeitem" | "widget" | "window" | "none presentation"; @@ -1059,21 +885,16 @@ export declare namespace JSXInternal { allow?: Signalish; allowFullScreen?: Signalish; allowTransparency?: Signalish; - /** @deprecated */ frameborder?: Signalish; - /** @deprecated */ frameBorder?: Signalish; height?: Signalish; loading?: Signalish<"eager" | "lazy" | undefined>; - /** @deprecated */ marginHeight?: Signalish; - /** @deprecated */ marginWidth?: Signalish; name?: Signalish; referrerpolicy?: Signalish; referrerPolicy?: Signalish; sandbox?: Signalish; - /** @deprecated */ scrolling?: Signalish; seamless?: Signalish; src?: Signalish; @@ -1295,9 +1116,7 @@ export declare namespace JSXInternal { } interface ScriptHTMLAttributes extends HTMLAttributes { async?: Signalish; - /** @deprecated */ charset?: Signalish; - /** @deprecated */ charSet?: Signalish; crossorigin?: Signalish; crossOrigin?: Signalish; @@ -1414,31 +1233,23 @@ export declare namespace JSXInternal { export interface MathMLAttributes extends HTMLAttributes { dir?: Signalish<"ltr" | "rtl" | undefined>; displaystyle?: Signalish; - /** @deprecated This feature is non-standard. See https://developer.mozilla.org/en-US/docs/Web/MathML/Global_attributes/href */ href?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Global_attributes/mathbackground */ mathbackground?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Global_attributes/mathcolor */ mathcolor?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Global_attributes/mathsize */ mathsize?: Signalish; nonce?: Signalish; scriptlevel?: Signalish; } export interface AnnotationMathMLAttributes extends MathMLAttributes { encoding?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/semantics#src */ src?: Signalish; } export interface AnnotationXmlMathMLAttributes extends MathMLAttributes { encoding?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/semantics#src */ src?: Signalish; } export interface MActionMathMLAttributes extends MathMLAttributes { - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/maction#actiontype */ actiontype?: Signalish<"statusline" | "toggle" | undefined>; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/maction#selection */ selection?: Signalish; } export interface MathMathMLAttributes extends MathMLAttributes { @@ -1455,27 +1266,20 @@ export declare namespace JSXInternal { separators?: Signalish; } export interface MFracMathMLAttributes extends MathMLAttributes { - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mfrac#denomalign */ denomalign?: Signalish<"center" | "left" | "right" | undefined>; linethickness?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mfrac#numalign */ numalign?: Signalish<"center" | "left" | "right" | undefined>; } export interface MiMathMLAttributes extends MathMLAttributes { - /** The only value allowed in the current specification is normal (case insensitive) - * See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mi#mathvariant */ mathvariant?: Signalish<"normal" | "bold" | "italic" | "bold-italic" | "double-struck" | "bold-fraktur" | "script" | "bold-script" | "fraktur" | "sans-serif" | "bold-sans-serif" | "sans-serif-italic" | "sans-serif-bold-italic" | "monospace" | "initial" | "tailed" | "looped" | "stretched" | undefined>; } export interface MmultiScriptsMathMLAttributes extends MathMLAttributes { - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mmultiscripts#subscriptshift */ subscriptshift?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mmultiscripts#superscriptshift */ superscriptshift?: Signalish; } export interface MNMathMLAttributes extends MathMLAttributes { } export interface MOMathMLAttributes extends MathMLAttributes { - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo#accent */ accent?: Signalish; fence?: Signalish; largeop?: Signalish; @@ -1507,9 +1311,7 @@ export declare namespace JSXInternal { export interface MRowMathMLAttributes extends MathMLAttributes { } export interface MSMathMLAttributes extends MathMLAttributes { - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/ms#browser_compatibility */ lquote?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/ms#browser_compatibility */ rquote?: Signalish; } export interface MSpaceMathMLAttributes extends MathMLAttributes { @@ -1520,71 +1322,46 @@ export declare namespace JSXInternal { export interface MSqrtMathMLAttributes extends MathMLAttributes { } export interface MStyleMathMLAttributes extends MathMLAttributes { - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mstyle#background */ background?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mstyle#color */ color?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mstyle#fontsize */ fontsize?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mstyle#fontstyle */ fontstyle?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mstyle#fontweight */ fontweight?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mstyle#scriptminsize */ scriptminsize?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mstyle#scriptsizemultiplier */ scriptsizemultiplier?: Signalish; } export interface MSubMathMLAttributes extends MathMLAttributes { - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/msub#subscriptshift */ subscriptshift?: Signalish; } export interface MSubsupMathMLAttributes extends MathMLAttributes { - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/msubsup#subscriptshift */ subscriptshift?: Signalish; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/msubsup#superscriptshift */ superscriptshift?: Signalish; } export interface MSupMathMLAttributes extends MathMLAttributes { - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/msup#superscriptshift */ superscriptshift?: Signalish; } export interface MTableMathMLAttributes extends MathMLAttributes { - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtable#align */ align?: Signalish<"axis" | "baseline" | "bottom" | "center" | "top" | undefined>; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtable#columnalign */ columnalign?: Signalish<"center" | "left" | "right" | undefined>; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtable#columnlines */ columnlines?: Signalish<"dashed" | "none" | "solid" | undefined>; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtable#columnspacing */ columnspacing?: Signalish; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtable#frame */ frame?: Signalish<"dashed" | "none" | "solid" | undefined>; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtable#framespacing */ framespacing?: Signalish; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtable#rowalign */ rowalign?: Signalish<"axis" | "baseline" | "bottom" | "center" | "top" | undefined>; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtable#rowlines */ rowlines?: Signalish<"dashed" | "none" | "solid" | undefined>; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtable#rowspacing */ rowspacing?: Signalish; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtable#width */ width?: Signalish; } export interface MTdMathMLAttributes extends MathMLAttributes { columnspan?: Signalish; rowspan?: Signalish; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtd#columnalign */ columnalign?: Signalish<"center" | "left" | "right" | undefined>; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtd#rowalign */ rowalign?: Signalish<"axis" | "baseline" | "bottom" | "center" | "top" | undefined>; } export interface MTextMathMLAttributes extends MathMLAttributes { } export interface MTrMathMLAttributes extends MathMLAttributes { - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtr#columnalign */ columnalign?: Signalish<"center" | "left" | "right" | undefined>; - /** Non-standard attribute See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mtr#rowalign */ rowalign?: Signalish<"axis" | "baseline" | "bottom" | "center" | "top" | undefined>; } export interface MUnderMathMLAttributes extends MathMLAttributes { @@ -1660,13 +1437,10 @@ export declare namespace JSXInternal { export interface IntrinsicMathMLElements { annotation: AnnotationMathMLAttributes; "annotation-xml": AnnotationXmlMathMLAttributes; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/maction */ maction: MActionMathMLAttributes; math: MathMathMLAttributes; - /** This feature is non-standard. See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/menclose */ menclose: MEncloseMathMLAttributes; merror: MErrorMathMLAttributes; - /** @deprecated See https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mfenced */ mfenced: MFencedMathMLAttributes; mfrac: MFracMathMLAttributes; mi: MiMathMLAttributes; diff --git a/build/lib.d.ts b/build/lib.d.ts index 34ec79d..fd7737f 100644 --- a/build/lib.d.ts +++ b/build/lib.d.ts @@ -6,11 +6,4 @@ export declare function applyMoves(arr: T[], moves: Record): T[]; -/** - * Computes the indices of the longest increasing subsequence in the given array. - * @param arr - An array of numbers. - * @returns An array of indices representing the longest increasing subsequence. - * - * Time Complexity: O(n log n) - */ export declare function longestIncreasingSubsequenceIndices(arr: number[]): number[]; diff --git a/build/refract.cjs.js b/build/refract.cjs.js index 3e5cdc3..d72c5be 100644 --- a/build/refract.cjs.js +++ b/build/refract.cjs.js @@ -1 +1,2 @@ -"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function T(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&Object.prototype.toString.call(e)==="[object Object]"}function _(e){return["boolean","string","number","undefined"].includes(typeof e)||e===null||e instanceof Error}const ce="http://www.w3.org/2000/svg",Fe=new Set(["svg","a","circle","clipPath","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","foreignObject","g","image","line","linearGradient","marker","mask","metadata","path","pattern","polygon","polyline","radialGradient","rect","script","set","stop","style","switch","symbol","text","textPath","title","tspan","use","view"]),Ce=new Set(["math","maction","maligngroup","malignmark","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mlongdiv","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mscarries","mscarry","msgroup","msline","mspace","msqrt","msrow","mstack","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),ke="http://www.w3.org/1998/Math/MathML",Z=/(PointerCapture)$|Capture$/i,Ae=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function Me(e){const t=[];for(const n in e){const r=e[n],o=n.replace(/([A-Z])/g,"-$1").toLowerCase();typeof r!="number"||Ae.test(o)?t.push(`${o}: ${r};`):t.push(`${o}: ${r}px;`)}return t.join(" ")}function Pe(e){const t={};for(const n in e){const r=e[n];if(typeof r=="object"&&r!==null){console.warn(`Nested styles not allowed for ${n}`);continue}r==null||r===!1||r===""||(t[n]=r)}return t}function Te(e){return T(e)||typeof e=="string"}function Le(e,t){if(!Te(e))throw new Error("Style attribute must be a plain object or a string");if(typeof e=="string")t.setAttribute("style",e);else{const n=Pe(e);t.setAttribute("style",Me(n))}}function Ne(e,t,n,r){e.__propName=t;const o=Ve(e);o==null||o===!1||(ee(t,o,n,r),e.__signals&&Ke(e,n))}const Re=/(PointerCapture)$|Capture$/i;function ee(e,t,n,r){if(e=="style"){Le(t,n);return}if(e[0]==="o"&&e[1]==="n"&&typeof t=="function"){const o=e!=(e=e.replace(Re,"$1"));e.toLowerCase()in n||e=="onFocusOut"||e=="onFocusIn"||e==="onGotPointerCapture"||e==="onLostPointerCapture"?e=e.toLowerCase().slice(2):e=e.slice(2),n.addEventListener(e,t,o);return}if(r===ce)e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!=="width"&&e!=="height"&&e!=="href"&&e!=="list"&&e!=="form"&&e!=="tabIndex"&&e!=="download"&&e!=="rowSpan"&&e!=="colSpan"&&e!=="role"&&e!=="popover"&&e in n)try{e==="value"&&n.tagName==="SELECT"?setTimeout(()=>{n[e]=t??""}):n[e]=t??"";return}catch{}t!=null&&(t!==!1||e[4]==="-")&&n.setAttribute(e,e==="popover"&&t===!0?"":t)}const w=Symbol("FRAGMENT");function B(e,t,...n){if(e==="FRAGMENT"){const r=L(n);return r[w]=!0,r}return{type:e,props:{...t,children:L(n)}}}function L(e){return e.map(t=>{if(typeof t=="object"){if(Array.isArray(t))return L(t);if(t===null)return v("");if(!t.type||!t.props)throw new Error("Invalid type for a dom node, found "+t);return t}else if(typeof t=="function"){const n=Ye(t);if(_(n))return j("TEXT_CHILD",{nodeValue:n!=null&&n!==!1?String(n):"",children:[]},t);if(Array.isArray(n)){const r=n[w];return j("FRAGMENT",{children:r?n:L(n)},t)}else if(!n.type||!n.props)throw new Error("Invalid type for a dom node, found "+n);return j(n.type,n.props,t)}else return v(t)}).flat()}function v(e){return{type:"TEXT_CHILD",props:{nodeValue:e!=null&&e!==!1?String(e):"",children:[]}}}function j(e,t,n){return{type:e,renderFunction:n,props:t}}function De(e){return e!=="children"&&e!=="key"&&e!=="ref"}function ue(e){let t=null;Fe.has(e.type)?t=ce:Ce.has(e.type)&&(t=ke);const n=e.type==="TEXT_CHILD"?document.createTextNode(""):t?document.createElementNS(t,e.type,e.props.is&&e.props):document.createElement(e.type);if(!e.props)return n;e.props.ref&&e.props.ref instanceof oe&&n instanceof HTMLElement&&(e.props.ref.current=n);for(const r in e.props){if(!De(r))continue;const o=e.props[r];typeof o=="function"&&r[0]!=="o"&&r[1]!=="n"?Ne(o,r,n,t):ee(r,o,n,t)}return n}function Ie(e,t,n){n==null||e==="key"||ee(e,n,t)}function Ge(e,t){x=t;const n=document.createDocumentFragment();b=n;const r={type:"div",props:{children:[e]},dom:n};e.parent=r,F.push(e),requestIdleCallback(fe)}function Oe(){b&&x&&x.appendChild(b)}let F=[],x=null,b=null,O=[];function ie(){for(let e=0;e0&&!t;){const n=F.pop();$e(n),t=e.timeRemaining()<1}if(F.length==0){Oe(),ie();return}requestIdleCallback(fe)}function $e(e){var t;if(e.type==="FRAGMENT"){const n=!e.props.children[w];let r=!1;for(let o=e.props.children.length-1;o>=0;o--)e.props.children[o].parent=e,n&&e.props.children[o].props.key===void 0&&e.renderFunction&&(r=!0),F.push(e.props.children[o]);r&&console.error("Array children must have a key attribute")}else if(typeof e.type=="function"){ge(e);const n=e.type(e.props);if(me(),Array.isArray(n)){for(let r=n.length-1;r>=0;r--)n[r].parent=e,F.push(n[r]);e.props.children=n}else n.parent=e,e.props.children.push(n),F.push(n);O.push(e)}else{e.dom||(e.dom=ue(e));let n=e.parent;for(;n&&!n.dom;)n=n.parent;n&&((t=n.dom)==null||t.appendChild(e.dom));for(let r=e.props.children.length-1;r>=0;r--)e.props.children[r].parent=e,F.push(e.props.children[r])}z(e)}function C(e){if(e.type==="FRAGMENT")if(e.props.children[w])for(const n of e.props.children)n.parent=e,C(n);else{let n=!1;for(const r of e.props.children)r.parent=e,r.props.key===void 0&&(n=!0),C(r);n&&console.error("Array children must have a key attribute")}else if(typeof e.type!="function")for(const t of e.props.children)t.parent=e,C(t);z(e)}function h(e,t,n,r,o){var l,i;if(e.type==="FRAGMENT")for(const s of e.props.children)r&&(s.parent=e),h(s,t,n,r,o);else if(typeof e.type=="function"){ge(e);const s=e.type(e.props);if(me(),Array.isArray(s)){for(const a of s)a.parent=e,h(a,t,n,!0,o);e.props.children=s}else s.parent=e,e.props.children.push(s),h(s,t,n,!0,o);queueMicrotask(()=>{Ee(e)})}else{if(e.dom||(e.dom=ue(e)),t)n?(l=t.parentElement)==null||l.replaceChild(e.dom,t):(i=t.parentElement)==null||i.insertBefore(e.dom,t);else{let s;if(o)s=o;else{let a=e.parent;for(;a&&!a.dom;)a=a.parent;s=a==null?void 0:a.dom}s==null||s.appendChild(e.dom)}for(const s of e.props.children)r&&(s.parent=e),h(s,void 0,void 0,r,e.dom)}r&&z(e)}let $=!0;function g(e,t){if(!(!e||!$)){if(e.renderFunction&&(t&&Qe(e.renderFunction),delete e.renderFunction),e.dom){for(const n in e.props)if(H(n)){let r=n.toLowerCase().substring(2);const o=r!=(r=r.replace(Z,"$1"));e.dom.removeEventListener(r,e.props[n],o),delete e.props[n]}else typeof e.props[n]=="function"?Je(e.props[n]):n==="ref"&&e.props[n]instanceof oe&&(e.props[n].current=null);e.dom.remove()}typeof e.type=="function"&&(rt(e,e.props),delete e.type),e.props.children.forEach(n=>g(n,!0))}}function z(e){e.renderFunction&&qe(e.renderFunction,e)}function pe(e,t){if(_(t)){const n={...v(t),parent:e.parent};C(n),E(e,n)}else if(Array.isArray(t)){const r={type:"FRAGMENT",props:{children:t[w]?t:L(t)},parent:e.parent};C(r),E(e,r)}else{const n={...t,parent:e.parent};C(n),E(e,n)}}function I(e,t){e.renderFunction&&(t.renderFunction=e.renderFunction,z(t))}function G(e,t,n){var r;if(n!==void 0){e.parent.props.children[n]=t;return}(r=e.parent)==null||r.props.children.forEach((o,l)=>{o===e&&(e.parent.props.children[l]=t)})}const H=e=>e.startsWith("on")||e=="onFocusOut"||e=="onFocusIn",se=e=>e!=="children"&&!H(e)&&e!=="key"&&e!=="ref",q=(e,t,n)=>e[n]!==t[n],He=(e,t,n)=>!(n in t);function de(e,t){var n,r;return e===t?!0:e.type!==t.type||((n=e.props)==null?void 0:n.key)!==((r=t.props)==null?void 0:r.key)?!1:P(e.props,t.props)}function P(e,t){if(e===t){if(e instanceof N&&t instanceof N)return P(e.value,t.value);if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let o=0;o=0;t--){const n=e.props.children[t],r=te(n);if(r)return r}}}function We(e){if(e)for(let t=e.props.children.length-1;t>=0;t--){const n=e.props.children[t],r=te(n);if(r)return r}}function Ue(e){if(!e)return;let t=e.parent;for(;t&&!t.dom;)t=t.parent;return t}function Xe(e){if(!e)return;if(e.dom)return e;let t=e.parent;for(;t&&!t.dom;)t=t.parent;return t}function E(e,t,n){if(!(!e&&!t)){if(e&&!t)g(e,!0),e.parent.props.children=e.parent.props.children.filter(r=>r!==e);else if(e&&t){const r=e.props,o=t.props;if(e.type==="FRAGMENT"||typeof e.type=="function")if(t.type==="FRAGMENT"||typeof t.type=="function")typeof e.type==typeof t.type&&typeof e.type=="function"?de(e,t)||(h(t,he(e),void 0,!0),I(e,t),g(e),G(e,t,n)):le(e,t);else{t.parent=e.parent;let l=e.props.children[0];for(;l&&!l.dom;)l=l.props.children[0];h(t,l==null?void 0:l.dom),I(e,t),g(e),G(e,t,n)}else{const l=e.dom;if(e.type==="TEXT_CHILD"&&t.type==="TEXT_CHILD"&&!t.dom&&(t.dom=e.dom),l===void 0)return;if(t.type==="FRAGMENT"||typeof t.type=="function")t.parent=e.parent,I(e,t),h(t,l),g(e),G(e,t,n);else{for(const i in r)if(se(i)&&He(r,o,i))l[i]="";else if(H(i)&&(!(i in o)||q(r,o,i))){let s=i.toLowerCase().substring(2);const a=s!=(s=s.replace(Z,"$1"));l.removeEventListener(s,r[i],a)}if(e.type!==t.type)t.parent=e.parent,I(e,t),h(t,l,!0),g(e),G(e,t,n);else{for(const i in o)if(se(i)&&q(r,o,i))l[i]=o[i],r[i]=o[i];else if(H(i)&&q(r,o,i)){let s=i.toLowerCase().substring(2);const a=s!=(s=s.replace(Z,"$1"));l.addEventListener(s,o[i],a),r[i]=o[i]}le(e,t)}}}}}}function ze(e,t){var a;const n=e.props.children,r=t.props.children,o={};for(let c=0;cc?e.props.children[c]=k:e.props.children.push(k),delete o[m];const A=t.props.children[c];A&&(A.parent=e),E(k,A,c),M(e.props.children[c],i==null?void 0:i.dom,l)}else s>c?e.props.children[c]=u:e.props.children.push(u),u.parent=e,h(u,l,!1,!1,i==null?void 0:i.dom)}for(const c in o)if(o.hasOwnProperty(c)){const u=o[c];g(u,!0)}for(;e.props.children.length>t.props.children.length;)e.props.children.pop()}function M(e,t,n){if(e.dom){if(e.dom===t||e.dom===n)return;n?t.insertBefore(e.dom,n):t.appendChild(e.dom)}else for(const r of e.props.children)M(r,t,n)}function le(e,t){const n=t.type==="FRAGMENT"&&!t.props.children[w],r=e.type==="FRAGMENT"&&!e.props.children[w];n&&r?ze(e,t)===!1&&ae(e,t):ae(e,t),t.type==="FRAGMENT"&&t.props.children[w]?e.props.children[w]=!0:e.props.children[w]=!1,e.type=t.type}function K(e,t){var r;let n=Math.max(e.props.children.length,t.props.children.length);for(let o=0;os,A=l.hasOwnProperty(m)&&l[m].newIndex{Q.forEach(t=>{const n=t();if(Y.has(n))return;Y.add(n),n.__cleanup&&typeof n.__cleanup=="function"&&(n.__cleanup(),n.__cleanup=null);const r=n();if(typeof r=="function"&&(n.__cleanup=r),W.has(n)){const o=W.get(n);o&&pe(o,r)}if(U.has(n)){const o=U.get(n);o&&n.__propName&&Ie(n.__propName,o,r)}}),Y.clear(),Q.clear(),J=!1}))}function qe(e,t){W.set(e,t)}function Ke(e,t){U.set(e,t)}function Je(e){U.delete(e);const t=e.__signals;if(t){for(const n of t)n.removeDep(e);e.__signals=null}}function Qe(e){W.delete(e);const t=e.__signals;if(t){for(const n of t)n.removeDep(e);e.__signals=null}}let y=null,f=null;function ne(e){y.__signals||(y.__signals=new Set),y.__signals.add(e)}function re(e){f.__signals||(f.__signals=new Set),f.__signals.add(e)}function Ye(e){var n;if(typeof e!="function")throw new Error("reactive takes a render function as the argument");y=e;const t=e();if(y=null,!_(t)&&T(t)&&!t.type&&!t.props&&!((n=t.props)!=null&&n.children))throw new Error("Reactive value must be primitive or functional component, got: "+typeof t);return t}function Ve(e){if(typeof e!="function")throw new Error("reactive takes a render function as the argument");y=e;const t=e();return y=null,t}function Ze(e){if(typeof e!="function")throw new Error("createEffect takes a effect function as the argument");Se(e),we()||ye(e)}function ye(e,t){if(typeof e!="function")return;f=e;const n=e();f.__signals&&typeof n=="function"&&(f.__cleanup=n),!f.__signals&&n&&typeof n=="function"&&(t?nt(n,t):_e(n)),f=null}function Be(e){if(typeof e!="function")throw new Error("computed takes a function as the argument");let t=we()!==null;f=()=>{if(t){t=!1;return}r.update(e())},Se(f);const n=e(),r=R(n);return f=null,{get value(){return r.value}}}function ve(e){if(typeof e!="function")throw new Error("createPromise takes a function as the argument");const t=e();if(!(t instanceof Promise))throw new Error("createPromise takes a function that returns a promise");const n=R({status:"pending",data:null,error:null});return t.then(r=>{n.update(o=>{o.data=r,o.status="resolved"})}).catch(r=>{n.update(o=>{o.error=r,o.status="rejected"})}),{get value(){return n.value}}}class oe{constructor(t){this.current=t}}function xe(){return new oe(null)}const X=["push","pop","unshift","shift","splice","fill","copyWithin","sort","reverse"];class N{constructor(t){this.isNotified=!1,this._val=t,this.deps=new Set}notify(){this.isNotified||(this.deps.size!==0&&(this.isNotified=!0),this.deps.forEach(t=>{je(()=>(this.isNotified=!1,t))}))}removeDep(t){this.deps.delete(t)}clearDeps(){this.deps.clear()}}class be extends N{constructor(t){if(!_(t))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");super(t)}get value(){return f&&(this.deps.add(f),re(this)),y&&(this.deps.add(y),ne(this)),this._val}update(t){if(typeof t=="function"){const n=t(this._val);if(!_(n))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");if(n===this._val)return;this._val=n,this.notify()}else{if(!_(t))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");if(t===this._val)return;this._val=t,this.notify()}}}class et extends N{constructor(t){if(!Array.isArray(t))throw new Error("Invalid type for ArraySignal; value must be an array");super(t),this.updateCalled=!1,this._val=this.createProxy(t)}createProxy(t){return new Proxy(t,{get:(n,r)=>{const o=n[r];if(typeof o=="function"){if(X.includes(String(r))&&!this.updateCalled)throw new Error("Cannot set a value on an array signal, use the update method for updating the array.");return(...l)=>{const i=o.apply(n,l);return X.includes(String(r))&&this.notify(),i}}return o},set:(n,r,o)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an array signal, use the update method for updating the array.");return n[r]=o,this.notify(),!0}})}get value(){return f&&(this.deps.add(f),re(this)),y&&(this.deps.add(y),ne(this)),this._val}update(t){if(this.updateCalled=!0,typeof t=="function")t(this._val);else{if(!Array.isArray(t))throw new Error("Invalid type for ArraySignal; value must be an array");if(t===this._val)return;this._val=this.createProxy(t),this.notify()}this.updateCalled=!1}}class tt extends N{constructor(t){if(!T(t))throw new Error("Invalid type for ObjectSignal; value must be a plain object");super(t),this.updateCalled=!1,this._val=this.createProxy(t)}createInternalArrayProxy(t){return new Proxy(t,{get:(n,r)=>{const o=n[r];if(typeof o=="function"){if(!this.updateCalled&&X.includes(String(r)))throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return(...l)=>{const i=o.apply(n,l);return X.includes(String(r))&&this.notify(),i}}return o},set:(n,r,o)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return n[r]=o,this.notify(),!0}})}createProxy(t){return new Proxy(t,{get:(n,r)=>{const o=n[r];return Array.isArray(o)?(n[r]=this.createInternalArrayProxy(o),n[r]):o},set:(n,r,o)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return typeof o=="function"?!1:(typeof o=="object"&&o!==null&&(o=this.createProxy(o)),o===n[r]||(n[r]=o,this.notify()),!0)},deleteProperty:(n,r)=>{const o=delete n[r];return this.notify(),o}})}get value(){return f&&(this.deps.add(f),re(this)),y&&(this.deps.add(y),ne(this)),this._val}update(t){if(this.updateCalled=!0,typeof t=="function")t(this._val);else{if(!T(t))throw new Error("Invalid type for ObjectSignal; value must be a plain object");if(t===this._val)return;this._val=this.createProxy(t),this.notify()}this.updateCalled=!1}}function R(e){if(typeof e=="function")throw new Error("Functions cannot be used as signal value");if(typeof e=="object"&&e!==null)if(Array.isArray(e)){const t=new et(e);return V(t),{get value(){return t.value},update:t.update.bind(t)}}else if(T(e)){const t=new tt(e);return V(t),{get value(){return t.value},update:t.update.bind(t)}}else throw new Error("Invalid type for signal initialization: "+typeof e);else if(_(e)){const t=new be(e);return V(t),{get value(){return t.value},update:t.update.bind(t)}}else throw new Error("Invalid type for signal initialization: "+typeof e)}let d=null,p=new WeakMap;function ge(e){d=e}function me(){d=null}function we(){return d}function Ee(e){if(p.has(e)){const t=p.get(e);for(const n of t.effects)ye(n,e)}}function _e(e){d&&(p.has(d)?p.get(d).cleanup.push(e):p.set(d,{signals:new Set,cleanup:[e],effects:new Set}))}function nt(e,t){t&&(p.has(t)?p.get(t).cleanup.push(e):p.set(t,{signals:new Set,cleanup:[e],effects:new Set}))}function Se(e){if(d)if(p.has(d))p.get(d).effects.add(e);else{const t=new Set;t.add(e),p.set(d,{signals:new Set,cleanup:[],effects:t})}}function V(e){if(d)if(p.has(d))p.get(d).signals.add(e);else{const t=new Set;t.add(e),p.set(d,{signals:t,cleanup:[],effects:new Set})}}function rt(e,t){const n=p.get(e);if(n){if(n.cleanup)for(const r of n.cleanup)r();n.cleanup=[];for(const r of n.effects){if(r.__cleanup&&typeof r.__cleanup=="function"&&r.__cleanup(),r.__signals)for(const o of r.__signals)o.removeDep(r);delete r.__signals,delete r.__cleanup}n.signals.forEach(r=>r.clearDeps()),n.signals.clear()}p.delete(e)}function ot(e){let t=null;const n=(r,o)=>{t?(r.update(!1),o.update(null)):e().then(l=>{if(l.default){if(typeof l.default!="function")throw new Error("Lazy-loaded component must be a functional component");t=l.default,r.update(!1),o.update(null)}else o.update(new Error("No default export found from lazy-loaded module"))}).catch(l=>{o.update(l),r.update(!1)})};return r=>{const o=R(!0),l=R(null);n(o,l);const i=s=>typeof s=="string"||s&&typeof s=="object"&&"props"in s&&"type"in s;if(r.fallback!==void 0&&!i(r.fallback))throw new Error("Invalid fallback: Expected a string or a valid JSX node.");if(r.errorFallback!==void 0&&!(typeof r.errorFallback=="function"||i(r.errorFallback)))throw new Error("Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node.");return B("FRAGMENT",null,()=>o.value?r.fallback:l.value!==null?r.errorFallback?typeof r.errorFallback=="function"?r.errorFallback(l.value):r.errorFallback:"Unknown error occurred while lazy loading component, use errorFallback prop to override":t&&B(t,{...r}))}}exports.cleanUp=_e;exports.computed=Be;exports.createEffect=Ze;exports.createElement=B;exports.createPromise=ve;exports.createRef=xe;exports.createSignal=R;exports.lazy=ot;exports.render=Ge; +"use strict";function e(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)&&"[object Object]"===Object.prototype.toString.call(e)}function t(e){return["boolean","string","number","undefined"].includes(typeof e)||null===e||e instanceof Error}Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n="http://www.w3.org/2000/svg",r=new Set(["svg","a","circle","clipPath","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","foreignObject","g","image","line","linearGradient","marker","mask","metadata","path","pattern","polygon","polyline","radialGradient","rect","script","set","stop","style","switch","symbol","text","textPath","title","tspan","use","view"]),o=new Set(["math","maction","maligngroup","malignmark","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mlongdiv","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mscarries","mscarry","msgroup","msline","mspace","msqrt","msrow","mstack","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),i=/(PointerCapture)$|Capture$/i,s=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function l(e,t,n,r){e.__propName=t;const o=function(e){if("function"!=typeof e)throw new Error("reactive takes a render function as the argument");Z=e;const t=e();return Z=null,t}(e);null!=o&&!1!==o&&(a(t,o,n,r),e.__signals&&function(e,t){J.set(e,t)}(e,n))}const p=/(PointerCapture)$|Capture$/i;function a(t,r,o,i){if("style"!=t){if("o"===t[0]&&"n"===t[1]&&"function"==typeof r){const e=t!=(t=t.replace(p,"$1"));return t=t.toLowerCase()in o||"onFocusOut"==t||"onFocusIn"==t||"onGotPointerCapture"===t||"onLostPointerCapture"===t?t.toLowerCase().slice(2):t.slice(2),void o.addEventListener(t,r,e)}if(i===n)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&"rowSpan"!==t&&"colSpan"!==t&&"role"!==t&&"popover"!==t&&t in o)try{return void("value"===t&&"SELECT"===o.tagName?setTimeout((()=>{o[t]=r??""})):o[t]=r??"")}catch(l){}null==r||!1===r&&"-"!==t[4]||o.setAttribute(t,"popover"===t&&!0===r?"":r)}else!function(t,n){if(!function(t){return e(t)||"string"==typeof t}(t))throw new Error("Style attribute must be a plain object or a string");if("string"==typeof t)n.setAttribute("style",t);else{const e=function(e){const t={};for(const n in e){const r=e[n];"object"==typeof r&&null!==r||null!=r&&!1!==r&&""!==r&&(t[n]=r)}return t}(t);n.setAttribute("style",function(e){const t=[];for(const n in e){const r=e[n],o=n.replace(/([A-Z])/g,"-$1").toLowerCase();"number"!=typeof r||s.test(o)?t.push(`${o}: ${r};`):t.push(`${o}: ${r}px;`)}return t.join(" ")}(e))}}(r,o)}const c=Symbol("FRAGMENT");function u(e,t,...n){if("FRAGMENT"===e){const e=f(n);return e[c]=!0,e}return{type:e,props:{...t,children:f(n)}}}function f(n){return n.map((n=>{if("object"==typeof n){if(Array.isArray(n))return f(n);if(null===n)return d("");if(!n.type||!n.props)throw new Error("Invalid type for a dom node, found "+n);return n}if("function"==typeof n){const r=function(n){var r;if("function"!=typeof n)throw new Error("reactive takes a render function as the argument");Z=n;const o=n();if(Z=null,!t(o)&&e(o)&&!o.type&&!o.props&&!(null==(r=o.props)?void 0:r.children))throw new Error("Reactive value must be primitive or functional component, got: "+typeof o);return o}(n);if(t(r))return h("TEXT_CHILD",{nodeValue:null!=r&&!1!==r?String(r):"",children:[]},n);if(Array.isArray(r))return h("FRAGMENT",{children:r[c]?r:f(r)},n);if(!r.type||!r.props)throw new Error("Invalid type for a dom node, found "+r);return h(r.type,r.props,n)}return d(n)})).flat()}function d(e){return{type:"TEXT_CHILD",props:{nodeValue:null!=e&&!1!==e?String(e):"",children:[]}}}function h(e,t,n){return{type:e,renderFunction:n,props:t}}function y(e){let t=null;r.has(e.type)?t=n:o.has(e.type)&&(t="http://www.w3.org/1998/Math/MathML");const i="TEXT_CHILD"===e.type?document.createTextNode(""):t?document.createElementNS(t,e.type,e.props.is&&e.props):document.createElement(e.type);if(!e.props)return i;e.props.ref&&e.props.ref instanceof te&&i instanceof HTMLElement&&(e.props.ref.current=i);for(const n in e.props){if("children"===(s=n)||"key"===s||"ref"===s)continue;const r=e.props[n];"function"==typeof r&&"o"!==n[0]&&"n"!==n[1]?l(r,n,i,t):a(n,r,i,t)}var s;return i}let m=[],g=null,v=null,w=[];function b(){for(let e=0;e0&&!t;)E(m.pop()),t=e.timeRemaining()<1;if(0==m.length)return v&&g&&g.appendChild(v),void b();requestIdleCallback(_)}function E(e){var t;if("FRAGMENT"===e.type){const t=!e.props.children[c];let n=!1;for(let r=e.props.children.length-1;r>=0;r--)e.props.children[r].parent=e,t&&void 0===e.props.children[r].props.key&&e.renderFunction&&(n=!0),m.push(e.props.children[r])}else if("function"==typeof e.type){ce(e);const t=e.type(e.props);if(ue(),Array.isArray(t)){for(let n=t.length-1;n>=0;n--)t[n].parent=e,m.push(t[n]);e.props.children=t}else t.parent=e,e.props.children.push(t),m.push(t);w.push(e)}else{e.dom||(e.dom=y(e));let n=e.parent;for(;n&&!n.dom;)n=n.parent;n&&(null==(t=n.dom)||t.appendChild(e.dom));for(let t=e.props.children.length-1;t>=0;t--)e.props.children[t].parent=e,m.push(e.props.children[t])}A(e)}function S(e){if("FRAGMENT"===e.type)if(e.props.children[c])for(const t of e.props.children)t.parent=e,S(t);else{let t=!1;for(const n of e.props.children)n.parent=e,void 0===n.props.key&&(t=!0),S(n)}else if("function"!=typeof e.type)for(const t of e.props.children)t.parent=e,S(t);A(e)}function x(e,t,n,r,o){var i,s;if("FRAGMENT"===e.type)for(const l of e.props.children)r&&(l.parent=e),x(l,t,n,r,o);else if("function"==typeof e.type){ce(e);const r=e.type(e.props);if(ue(),Array.isArray(r)){for(const i of r)i.parent=e,x(i,t,n,!0,o);e.props.children=r}else r.parent=e,e.props.children.push(r),x(r,t,n,!0,o);queueMicrotask((()=>{de(e)}))}else{if(e.dom||(e.dom=y(e)),t)n?null==(i=t.parentElement)||i.replaceChild(e.dom,t):null==(s=t.parentElement)||s.insertBefore(e.dom,t);else{let t;if(o)t=o;else{let n=e.parent;for(;n&&!n.dom;)n=n.parent;t=null==n?void 0:n.dom}null==t||t.appendChild(e.dom)}for(const t of e.props.children)r&&(t.parent=e),x(t,void 0,void 0,r,e.dom)}r&&A(e)}let k=!0;function F(e,t){if(e&&k){if(e.renderFunction&&(t&&function(e){W.delete(e);const t=e.__signals;if(t){for(const n of t)n.removeDep(e);e.__signals=null}}(e.renderFunction),delete e.renderFunction),e.dom){for(const t in e.props)if(T(t)){let n=t.toLowerCase().substring(2);const r=n!=(n=n.replace(i,"$1"));e.dom.removeEventListener(n,e.props[t],r),delete e.props[t]}else"function"==typeof e.props[t]?U(e.props[t]):"ref"===t&&e.props[t]instanceof te&&(e.props[t].current=null);e.dom.remove()}"function"==typeof e.type&&(function(e){const t=ae.get(e);if(t){if(t.cleanup)for(const e of t.cleanup)e();t.cleanup=[];for(const e of t.effects){if(e.__cleanup&&"function"==typeof e.__cleanup&&e.__cleanup(),e.__signals)for(const t of e.__signals)t.removeDep(e);delete e.__signals,delete e.__cleanup}t.signals.forEach((e=>e.clearDeps())),t.signals.clear()}ae.delete(e)}(e,e.props),delete e.type),e.props.children.forEach((e=>F(e,!0)))}}function A(e){e.renderFunction&&function(e,t){W.set(e,t)}(e.renderFunction,e)}function C(e,n){if(t(n)){const t={...d(n),parent:e.parent};S(t),R(e,t)}else if(Array.isArray(n)){const t={type:"FRAGMENT",props:{children:n[c]?n:f(n)},parent:e.parent};S(t),R(e,t)}else{const t={...n,parent:e.parent};S(t),R(e,t)}}function P(e,t){e.renderFunction&&(t.renderFunction=e.renderFunction,A(t))}function M(e,t,n){var r;void 0===n?null==(r=e.parent)||r.props.children.forEach(((n,r)=>{n===e&&(e.parent.props.children[r]=t)})):e.parent.props.children[n]=t}const T=e=>e.startsWith("on")||"onFocusOut"==e||"onFocusIn"==e,I=e=>"children"!==e&&!T(e)&&"key"!==e&&"ref"!==e,N=(e,t,n)=>e[n]!==t[n],L=(e,t,n)=>!(n in t);function j(e,t){var n,r;return e===t||e.type===t.type&&(null==(n=e.props)?void 0:n.key)===(null==(r=t.props)?void 0:r.key)&&O(e.props,t.props)}function O(e,n){if(e===n){if(e instanceof re&&n instanceof re)return O(e.value,n.value);if(Array.isArray(e)&&Array.isArray(n)){if(e.length!==n.length)return!1;for(let t=0;t=0;t--){const n=D(e.props.children[t]);if(n)return n}}}function R(e,t,n){if(e||t)if(e&&!t)F(e,!0),e.parent.props.children=e.parent.props.children.filter((t=>t!==e));else if(e&&t){const r=e.props,o=t.props;if("FRAGMENT"===e.type||"function"==typeof e.type)if("FRAGMENT"===t.type||"function"==typeof t.type)typeof e.type==typeof t.type&&"function"==typeof e.type?j(e,t)||(x(t,G(e),void 0,!0),P(e,t),F(e),M(e,t,n)):H(e,t);else{t.parent=e.parent;let r=e.props.children[0];for(;r&&!r.dom;)r=r.props.children[0];x(t,null==r?void 0:r.dom),P(e,t),F(e),M(e,t,n)}else{const s=e.dom;if("TEXT_CHILD"!==e.type||"TEXT_CHILD"!==t.type||t.dom||(t.dom=e.dom),void 0===s)return;if("FRAGMENT"===t.type||"function"==typeof t.type)t.parent=e.parent,P(e,t),x(t,s),F(e),M(e,t,n);else{for(const e in r)if(I(e)&&L(r,o,e))s[e]="";else if(T(e)&&(!(e in o)||N(r,o,e))){let t=e.toLowerCase().substring(2);const n=t!=(t=t.replace(i,"$1"));s.removeEventListener(t,r[e],n)}if(e.type!==t.type)t.parent=e.parent,P(e,t),x(t,s,!0),F(e),M(e,t,n);else{for(const e in o)if(I(e)&&N(r,o,e))s[e]=o[e],r[e]=o[e];else if(T(e)&&N(r,o,e)){let t=e.toLowerCase().substring(2);const n=t!=(t=t.replace(i,"$1"));s.addEventListener(t,o[e],n),r[e]=o[e]}H(e,t)}}}}}function $(e,t,n){if(e.dom){if(e.dom===t||e.dom===n)return;n?t.insertBefore(e.dom,n):t.appendChild(e.dom)}else for(const r of e.props.children)$(r,t,n)}function H(e,t){const n="FRAGMENT"===t.type&&!t.props.children[c],r="FRAGMENT"===e.type&&!e.props.children[c];n&&r?!1===function(e,t){var n;const r=e.props.children,o=t.props.children,i={};for(let a=0;a=0;t--){const n=D(e.props.children[t]);if(n)return n}}(e))?void 0:n.nextSibling,l=function(e){if(!e)return;let t=e.parent;for(;t&&!t.dom;)t=t.parent;return t}(e);if(0===o.length)return e.props.children.length=0,void((null==l?void 0:l.dom)instanceof HTMLElement&&(l.dom.innerHTML=""));const p=e.props.children.length;for(let a=0;aa?e.props.children[a]=n:e.props.children.push(n),delete i[c];const r=t.props.children[a];r&&(r.parent=e),R(n,r,a),$(e.props.children[a],null==l?void 0:l.dom,s)}else p>a?e.props.children[a]=n:e.props.children.push(n),n.parent=e,x(n,s,!1,!1,null==l?void 0:l.dom)}for(const a in i)i.hasOwnProperty(a)&&F(i[a],!0);for(;e.props.children.length>t.props.children.length;)e.props.children.pop()}(e,t)&&X(e,t):X(e,t),"FRAGMENT"===t.type&&t.props.children[c]?e.props.children[c]=!0:e.props.children[c]=!1,e.type=t.type}function z(e,t){var n;let r=Math.max(e.props.children.length,t.props.children.length);for(let o=0;ol,f=i.hasOwnProperty(c)&&i[c].newIndex{var t;t=()=>(this.isNotified=!1,e),V.add(t),q||(q=!0,queueMicrotask((()=>{V.forEach((e=>{const t=e();if(B.has(t))return;B.add(t),t.__cleanup&&"function"==typeof t.__cleanup&&(t.__cleanup(),t.__cleanup=null);const n=t();if("function"==typeof n&&(t.__cleanup=n),W.has(t)){const e=W.get(t);e&&C(e,n)}if(J.has(t)){const e=J.get(t);e&&t.__propName&&function(e,t,n){null!=n&&"key"!==e&&a(e,n,t)}(t.__propName,e,n)}})),B.clear(),V.clear(),q=!1})))})))}removeDep(e){this.deps.delete(e)}clearDeps(){this.deps.clear()}}class oe extends re{constructor(e){if(!t(e))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");super(e)}get value(){return K&&(this.deps.add(K),Y(this)),Z&&(this.deps.add(Z),Q(this)),this._val}update(e){if("function"==typeof e){const n=e(this._val);if(!t(n))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");if(n===this._val)return;this._val=n,this.notify()}else{if(!t(e))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");if(e===this._val)return;this._val=e,this.notify()}}}class ie extends re{constructor(e){if(!Array.isArray(e))throw new Error("Invalid type for ArraySignal; value must be an array");super(e),this.updateCalled=!1,this._val=this.createProxy(e)}createProxy(e){return new Proxy(e,{get:(e,t)=>{const n=e[t];if("function"==typeof n){if(ne.includes(String(t))&&!this.updateCalled)throw new Error("Cannot set a value on an array signal, use the update method for updating the array.");return(...r)=>{const o=n.apply(e,r);return ne.includes(String(t))&&this.notify(),o}}return n},set:(e,t,n)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an array signal, use the update method for updating the array.");return e[t]=n,this.notify(),!0}})}get value(){return K&&(this.deps.add(K),Y(this)),Z&&(this.deps.add(Z),Q(this)),this._val}update(e){if(this.updateCalled=!0,"function"==typeof e)e(this._val);else{if(!Array.isArray(e))throw new Error("Invalid type for ArraySignal; value must be an array");if(e===this._val)return;this._val=this.createProxy(e),this.notify()}this.updateCalled=!1}}class se extends re{constructor(t){if(!e(t))throw new Error("Invalid type for ObjectSignal; value must be a plain object");super(t),this.updateCalled=!1,this._val=this.createProxy(t)}createInternalArrayProxy(e){return new Proxy(e,{get:(e,t)=>{const n=e[t];if("function"==typeof n){if(!this.updateCalled&&ne.includes(String(t)))throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return(...r)=>{const o=n.apply(e,r);return ne.includes(String(t))&&this.notify(),o}}return n},set:(e,t,n)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return e[t]=n,this.notify(),!0}})}createProxy(e){return new Proxy(e,{get:(e,t)=>{const n=e[t];return Array.isArray(n)?(e[t]=this.createInternalArrayProxy(n),e[t]):n},set:(e,t,n)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return"function"!=typeof n&&("object"==typeof n&&null!==n&&(n=this.createProxy(n)),n===e[t]||(e[t]=n,this.notify()),!0)},deleteProperty:(e,t)=>{const n=delete e[t];return this.notify(),n}})}get value(){return K&&(this.deps.add(K),Y(this)),Z&&(this.deps.add(Z),Q(this)),this._val}update(t){if(this.updateCalled=!0,"function"==typeof t)t(this._val);else{if(!e(t))throw new Error("Invalid type for ObjectSignal; value must be a plain object");if(t===this._val)return;this._val=this.createProxy(t),this.notify()}this.updateCalled=!1}}function le(n){if("function"==typeof n)throw new Error("Functions cannot be used as signal value");if("object"==typeof n&&null!==n){if(Array.isArray(n)){const e=new ie(n);return me(e),{get value(){return e.value},update:e.update.bind(e)}}if(e(n)){const e=new se(n);return me(e),{get value(){return e.value},update:e.update.bind(e)}}throw new Error("Invalid type for signal initialization: "+typeof n)}if(t(n)){const e=new oe(n);return me(e),{get value(){return e.value},update:e.update.bind(e)}}throw new Error("Invalid type for signal initialization: "+typeof n)}let pe=null,ae=new WeakMap;function ce(e){pe=e}function ue(){pe=null}function fe(){return pe}function de(e){if(ae.has(e)){const t=ae.get(e);for(const n of t.effects)ee(n,e)}}function he(e){pe&&(ae.has(pe)?ae.get(pe).cleanup.push(e):ae.set(pe,{signals:new Set,cleanup:[e],effects:new Set}))}function ye(e){if(pe)if(ae.has(pe))ae.get(pe).effects.add(e);else{const t=new Set;t.add(e),ae.set(pe,{signals:new Set,cleanup:[],effects:t})}}function me(e){if(pe)if(ae.has(pe))ae.get(pe).signals.add(e);else{const t=new Set;t.add(e),ae.set(pe,{signals:t,cleanup:[],effects:new Set})}}exports.cleanUp=he,exports.computed=function(e){if("function"!=typeof e)throw new Error("computed takes a function as the argument");let t=null!==fe();K=()=>{t?t=!1:n.update(e())},ye(K);const n=le(e());return K=null,{get value(){return n.value}}},exports.createEffect=function(e){if("function"!=typeof e)throw new Error("createEffect takes a effect function as the argument");ye(e),fe()||ee(e)},exports.createElement=u,exports.createPromise=function(e){if("function"!=typeof e)throw new Error("createPromise takes a function as the argument");const t=e();if(!(t instanceof Promise))throw new Error("createPromise takes a function that returns a promise");const n=le({status:"pending",data:null,error:null});return t.then((e=>{n.update((t=>{t.data=e,t.status="resolved"}))})).catch((e=>{n.update((t=>{t.error=e,t.status="rejected"}))})),{get value(){return n.value}}},exports.createRef=function(){return new te(null)},exports.createSignal=le,exports.lazy=function(e){let t=null;return n=>{const r=le(!0),o=le(null);((n,r)=>{t?(n.update(!1),r.update(null)):e().then((e=>{if(e.default){if("function"!=typeof e.default)throw new Error("Lazy-loaded component must be a functional component");t=e.default,n.update(!1),r.update(null)}else r.update(new Error("No default export found from lazy-loaded module"))})).catch((e=>{r.update(e),n.update(!1)}))})(r,o);const i=e=>"string"==typeof e||e&&"object"==typeof e&&"props"in e&&"type"in e;if(void 0!==n.fallback&&!i(n.fallback))throw new Error("Invalid fallback: Expected a string or a valid JSX node.");if(void 0!==n.errorFallback&&"function"!=typeof n.errorFallback&&!i(n.errorFallback))throw new Error("Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node.");return u("FRAGMENT",null,(()=>r.value?n.fallback:null!==o.value?n.errorFallback?"function"==typeof n.errorFallback?n.errorFallback(o.value):n.errorFallback:"Unknown error occurred while lazy loading component, use errorFallback prop to override":t&&u(t,{...n})))}},exports.render=function(e,t){g=t;const n=document.createDocumentFragment();v=n;const r={type:"div",props:{children:[e]},dom:n};e.parent=r,m.push(e),requestIdleCallback(_)}; +//# sourceMappingURL=refract.cjs.js.map diff --git a/build/refract.cjs.js.map b/build/refract.cjs.js.map new file mode 100644 index 0000000..cc49275 --- /dev/null +++ b/build/refract.cjs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"refract.cjs.js","sources":["../src/utils/general.ts","../src/rendering/constants.ts","../src/lib.ts","../src/rendering/props.ts","../src/signals/signal.ts","../src/signals/batch.ts","../src/rendering/createElements.ts","../src/rendering/render.ts","../src/rendering/functionalComponents.ts","../src/lazy/Lazyloading.tsx"],"sourcesContent":["export function isPlainObject(variable: any) {\r\n return (\r\n typeof variable === \"object\" && // Must be an object\r\n variable !== null && // Cannot be null\r\n !Array.isArray(variable) && // Cannot be an array\r\n Object.prototype.toString.call(variable) === \"[object Object]\" // Must be a plain object\r\n );\r\n}\r\nexport function isPrimitive(val: any) {\r\n return (\r\n [\"boolean\", \"string\", \"number\", \"undefined\"].includes(typeof val) ||\r\n val === null ||\r\n val instanceof Error\r\n );\r\n}\r\n\r\nexport function swap(arr: any[], i: number, j: number) {\r\n const temp = arr[i];\r\n arr[i] = arr[j];\r\n arr[j] = temp;\r\n}\r\n","export const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\r\nexport const SVG_TAGS = new Set([\r\n \"svg\",\r\n \"a\",\r\n \"circle\",\r\n \"clipPath\",\r\n \"defs\",\r\n \"desc\",\r\n \"ellipse\",\r\n \"feBlend\",\r\n \"feColorMatrix\",\r\n \"feComponentTransfer\",\r\n \"feComposite\",\r\n \"feConvolveMatrix\",\r\n \"feDiffuseLighting\",\r\n \"feDisplacementMap\",\r\n \"feDistantLight\",\r\n \"feDropShadow\",\r\n \"feFlood\",\r\n \"feFuncA\",\r\n \"feFuncB\",\r\n \"feFuncG\",\r\n \"feFuncR\",\r\n \"feGaussianBlur\",\r\n \"feImage\",\r\n \"feMerge\",\r\n \"feMergeNode\",\r\n \"feMorphology\",\r\n \"feOffset\",\r\n \"fePointLight\",\r\n \"feSpecularLighting\",\r\n \"feSpotLight\",\r\n \"feTile\",\r\n \"feTurbulence\",\r\n \"filter\",\r\n \"foreignObject\",\r\n \"g\",\r\n \"image\",\r\n \"line\",\r\n \"linearGradient\",\r\n \"marker\",\r\n \"mask\",\r\n \"metadata\",\r\n \"path\",\r\n \"pattern\",\r\n \"polygon\",\r\n \"polyline\",\r\n \"radialGradient\",\r\n \"rect\",\r\n \"script\",\r\n \"set\",\r\n \"stop\",\r\n \"style\",\r\n \"switch\",\r\n \"symbol\",\r\n \"text\",\r\n \"textPath\",\r\n \"title\",\r\n \"tspan\",\r\n \"use\",\r\n \"view\",\r\n]);\r\nexport const MATH_TAGS = new Set([\r\n \"math\",\r\n \"maction\",\r\n \"maligngroup\",\r\n \"malignmark\",\r\n \"menclose\",\r\n \"merror\",\r\n \"mfenced\",\r\n \"mfrac\",\r\n \"mglyph\",\r\n \"mi\",\r\n \"mlabeledtr\",\r\n \"mlongdiv\",\r\n \"mmultiscripts\",\r\n \"mn\",\r\n \"mo\",\r\n \"mover\",\r\n \"mpadded\",\r\n \"mphantom\",\r\n \"mroot\",\r\n \"mrow\",\r\n \"ms\",\r\n \"mscarries\",\r\n \"mscarry\",\r\n \"msgroup\",\r\n \"msline\",\r\n \"mspace\",\r\n \"msqrt\",\r\n \"msrow\",\r\n \"mstack\",\r\n \"mstyle\",\r\n \"msub\",\r\n \"msup\",\r\n \"msubsup\",\r\n \"mtable\",\r\n \"mtd\",\r\n \"mtext\",\r\n \"mtr\",\r\n \"munder\",\r\n \"munderover\",\r\n]);\r\n\r\nexport const MATH_NAMESPACE = \"http://www.w3.org/1998/Math/MathML\";\r\n\r\nexport const CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\r\n","import { isPlainObject } from \"./utils/general\";\r\nexport const IS_NON_DIMENSIONAL =\r\n /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\r\n\r\nexport function styleObjectToString(\r\n style: Record\r\n): string {\r\n const newStyles: string[] = [];\r\n\r\n for (const key in style) {\r\n const value = style[key];\r\n const cssKey = key.replace(/([A-Z])/g, \"-$1\").toLowerCase(); // CamelCase to kebab-case\r\n\r\n if (typeof value != \"number\" || IS_NON_DIMENSIONAL.test(cssKey)) {\r\n newStyles.push(`${cssKey}: ${value};`); // Convert numbers to strings with px suffix\r\n } else {\r\n newStyles.push(`${cssKey}: ${value}px;`); // Convert numbers to strings with px suffix\r\n }\r\n }\r\n return newStyles.join(\" \");\r\n}\r\n\r\nexport function preprocessStyle(\r\n style: Record\r\n): Record {\r\n const processedStyle: Record = {};\r\n\r\n for (const key in style) {\r\n const value = style[key];\r\n // Handle nested styles\r\n if (typeof value === \"object\" && value !== null) {\r\n console.warn(`Nested styles not allowed for ${key}`);\r\n continue; // Skip nested styles\r\n }\r\n\r\n // Remove falsy values\r\n if (\r\n value === null ||\r\n value === undefined ||\r\n value === false ||\r\n value === \"\"\r\n ) {\r\n continue;\r\n }\r\n\r\n // Otherwise, add to processed style\r\n processedStyle[key] = value;\r\n }\r\n\r\n return processedStyle;\r\n}\r\n\r\nexport function isValidStyle(style: any) {\r\n return isPlainObject(style) || typeof style === \"string\";\r\n}\r\n\r\nexport function applyMoves(\r\n arr: T[],\r\n moves: Record\r\n): T[] {\r\n const n = arr.length;\r\n // Create an array for the final result (we use undefined as a marker)\r\n const result: (T | undefined)[] = new Array(n).fill(undefined);\r\n // Keep track of which indices in the original array are moved.\r\n const movedFrom = new Set();\r\n\r\n // First, place all moved elements at their target positions.\r\n // (For a swap both targets will be filled by the respective moves.)\r\n for (const key in moves) {\r\n const { from, to } = moves[key];\r\n // You can optionally ignore moves that are no-ops (from === to)\r\n if (from === to) continue;\r\n result[to] = arr[from];\r\n movedFrom.add(from);\r\n }\r\n\r\n // Next, fill in the \"gaps\" with the unmoved elements,\r\n // preserving their original order.\r\n let fillIndex = 0; // current position in `result` to fill\r\n for (let i = 0; i < n; i++) {\r\n // Skip any element that was moved.\r\n if (movedFrom.has(i)) continue;\r\n\r\n // Advance fillIndex until we find an empty slot in result.\r\n while (fillIndex < n && result[fillIndex] !== undefined) {\r\n fillIndex++;\r\n }\r\n if (fillIndex < n) {\r\n result[fillIndex] = arr[i];\r\n fillIndex++;\r\n }\r\n }\r\n\r\n return result as T[];\r\n}\r\n\r\n/**\r\n * Computes the indices of the longest increasing subsequence in the given array.\r\n * @param arr - An array of numbers.\r\n * @returns An array of indices representing the longest increasing subsequence.\r\n *\r\n * Time Complexity: O(n log n)\r\n */\r\nexport function longestIncreasingSubsequenceIndices(arr: number[]): number[] {\r\n const n = arr.length;\r\n const predecessors = new Array(n).fill(-1); // Track the previous index for each element in the subsequence.\r\n const lisIndices: number[] = []; // Stores indices of the smallest tail for all increasing subsequences of each length.\r\n\r\n for (let i = 0; i < n; i++) {\r\n const x = arr[i];\r\n\r\n // Binary search for the insertion point in lisIndices.\r\n let low = 0;\r\n let high = lisIndices.length;\r\n while (low < high) {\r\n const mid = Math.floor((low + high) / 2);\r\n if (arr[lisIndices[mid]] < x) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n\r\n // If low is at the end, extend lisIndices; otherwise, update the tail value.\r\n if (low === lisIndices.length) {\r\n lisIndices.push(i);\r\n } else {\r\n lisIndices[low] = i;\r\n }\r\n\r\n // Set the predecessor of arr[i] (if low is not the start of a subsequence).\r\n predecessors[i] = low > 0 ? lisIndices[low - 1] : -1;\r\n }\r\n\r\n // Reconstruct the longest increasing subsequence using the predecessors.\r\n const lis: number[] = [];\r\n let k = lisIndices.length > 0 ? lisIndices[lisIndices.length - 1] : -1;\r\n for (let i = lisIndices.length - 1; i >= 0; i--) {\r\n lis[i] = k;\r\n k = predecessors[k];\r\n }\r\n return lis;\r\n}\r\n","import { isValidStyle, preprocessStyle, styleObjectToString } from \"../lib\";\r\nimport { setReactiveAttributes } from \"../signals/batch\";\r\nimport { reactiveAttribute } from \"../signals/signal\";\r\nimport { SVG_NAMESPACE } from \"./constants\";\r\n\r\nexport function setStyle(\r\n style: Record | string,\r\n dom: HTMLElement\r\n) {\r\n if (!isValidStyle(style))\r\n throw new Error(\"Style attribute must be a plain object or a string\");\r\n\r\n if (typeof style === \"string\") {\r\n dom.setAttribute(\"style\", style);\r\n } else {\r\n const processedStyle = preprocessStyle(style);\r\n\r\n dom.setAttribute(\"style\", styleObjectToString(processedStyle));\r\n }\r\n}\r\n\r\n// handles setting the reactive attributes returned from a reactiveFunction\r\nexport function setReactiveAttribute(\r\n reactiveFunction: any,\r\n name: string,\r\n dom: HTMLElement,\r\n namespace?: string\r\n) {\r\n reactiveFunction.__propName = name;\r\n // registers the function in corresponding signal\r\n const val = reactiveAttribute(reactiveFunction);\r\n if (val === null || val === undefined || val === false) {\r\n return;\r\n }\r\n\r\n setAttribute(name, val, dom, namespace);\r\n // track this using signals if the function depended on any signal\r\n if (reactiveFunction.__signals)\r\n setReactiveAttributes(reactiveFunction, dom);\r\n}\r\n\r\nconst CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\r\n\r\nexport function setAttribute(\r\n name: string,\r\n value: any,\r\n dom: HTMLElement,\r\n namespace?: string\r\n) {\r\n if (name == \"style\") {\r\n setStyle(value, dom);\r\n return;\r\n }\r\n if (name[0] === \"o\" && name[1] === \"n\" && typeof value === \"function\") {\r\n const useCapture = name != (name = name.replace(CAPTURE_REGEX, \"$1\"));\r\n\r\n if (\r\n name.toLowerCase() in dom ||\r\n name == \"onFocusOut\" ||\r\n name == \"onFocusIn\" ||\r\n name === \"onGotPointerCapture\" ||\r\n name === \"onLostPointerCapture\"\r\n )\r\n name = name.toLowerCase().slice(2);\r\n else name = name.slice(2);\r\n // handle eventListeners\r\n dom.addEventListener(name, value, useCapture);\r\n return;\r\n }\r\n\r\n if (namespace === SVG_NAMESPACE) {\r\n name = name.replace(/xlink(H|:h)/, \"h\").replace(/sName$/, \"s\");\r\n }\r\n // For certain properties that exist on the dom element,\r\n // attempt to set them directly.\r\n else if (\r\n name !== \"width\" &&\r\n name !== \"height\" &&\r\n name !== \"href\" &&\r\n name !== \"list\" &&\r\n name !== \"form\" &&\r\n name !== \"tabIndex\" &&\r\n name !== \"download\" &&\r\n name !== \"rowSpan\" &&\r\n name !== \"colSpan\" &&\r\n name !== \"role\" &&\r\n name !== \"popover\" &&\r\n name in dom\r\n ) {\r\n try {\r\n // Set the property directly on the DOM element.\r\n if (name === \"value\" && dom.tagName === \"SELECT\") {\r\n setTimeout(() => {\r\n dom[name] = value == null ? \"\" : value;\r\n });\r\n } else {\r\n dom[name] = value == null ? \"\" : value;\r\n }\r\n // console.log(dom[name], dom);\r\n\r\n // We simply return after setting the property.\r\n return;\r\n } catch (e) {\r\n // If setting the property fails, fall through to update attributes.\r\n }\r\n }\r\n\r\n if (value != null && (value !== false || name[4] === \"-\")) {\r\n // For most attributes, if the value is valid, set the attribute.\r\n // Special case: for \"popover\", if value is true, set attribute to an empty string.\r\n\r\n dom.setAttribute(\r\n name,\r\n name === \"popover\" && value === true ? \"\" : value\r\n );\r\n }\r\n}\r\n","import {\r\n addEffect,\r\n addSignal,\r\n cleanUp,\r\n cleanUpWFiber,\r\n getCurrentFC,\r\n} from \"../rendering/functionalComponents\";\r\nimport { Fiber } from \"../types\";\r\nimport { isPlainObject, isPrimitive } from \"../utils/general\";\r\nimport { batchUpdate } from \"./batch\";\r\n\r\nlet currentReactiveFunction: any = null;\r\nlet currentEffect: any = null;\r\n\r\nfunction addSignalToReactiveFunction(signal: any) {\r\n if (!currentReactiveFunction.__signals) {\r\n currentReactiveFunction.__signals = new Set();\r\n }\r\n currentReactiveFunction.__signals.add(signal);\r\n}\r\nfunction addSignalToEffect(signal: any) {\r\n if (!currentEffect.__signals) currentEffect.__signals = new Set();\r\n currentEffect.__signals.add(signal);\r\n}\r\n\r\nexport function reactive(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"reactive takes a render function as the argument\");\r\n\r\n currentReactiveFunction = fn;\r\n const retVal = fn();\r\n currentReactiveFunction = null;\r\n if (\r\n !isPrimitive(retVal) &&\r\n isPlainObject(retVal) &&\r\n !retVal.type &&\r\n !retVal.props &&\r\n !retVal.props?.children\r\n )\r\n throw new Error(\r\n \"Reactive value must be primitive or functional component, got: \" +\r\n typeof retVal\r\n );\r\n return retVal;\r\n}\r\nexport function reactiveAttribute(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"reactive takes a render function as the argument\");\r\n\r\n currentReactiveFunction = fn;\r\n const retVal = fn();\r\n currentReactiveFunction = null;\r\n\r\n return retVal;\r\n}\r\nexport function createEffect(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"createEffect takes a effect function as the argument\");\r\n\r\n addEffect(fn);\r\n if (!getCurrentFC()) runEffect(fn);\r\n}\r\n\r\nexport function runEffect(effect: Function, fiber?: Fiber) {\r\n if (typeof effect !== \"function\") return;\r\n\r\n currentEffect = effect;\r\n\r\n const effectCleanup = effect();\r\n\r\n if (currentEffect.__signals && typeof effectCleanup === \"function\") {\r\n currentEffect.__cleanup = effectCleanup;\r\n }\r\n\r\n if (\r\n !currentEffect.__signals &&\r\n effectCleanup &&\r\n typeof effectCleanup === \"function\"\r\n ) {\r\n // which means this effect does not have any signals associated with so its just a cleanup function that we need to call when the component unmounts\r\n if (!fiber) {\r\n cleanUp(effectCleanup);\r\n } else {\r\n cleanUpWFiber(effectCleanup, fiber);\r\n }\r\n }\r\n\r\n currentEffect = null;\r\n}\r\n\r\nfunction computed>(\r\n fn: () => T\r\n) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"computed takes a function as the argument\");\r\n\r\n let firstRun = getCurrentFC() !== null;\r\n currentEffect = () => {\r\n if (firstRun) {\r\n firstRun = false;\r\n return;\r\n }\r\n signal.update(fn());\r\n };\r\n\r\n addEffect(currentEffect);\r\n\r\n const val = fn();\r\n\r\n // @ts-expect-error - Type assertion for signal\r\n const signal = createSignal(val);\r\n\r\n currentEffect = null;\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n };\r\n}\r\n\r\ntype PromiseOverload =\r\n | { status: \"pending\"; data: null; error: null }\r\n | { status: \"resolved\"; data: T; error: null }\r\n | { status: \"rejected\"; data: null; error: Error };\r\n\r\nexport function createPromise(fn: () => Promise) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"createPromise takes a function as the argument\");\r\n const promise = fn();\r\n\r\n if (!(promise instanceof Promise)) {\r\n throw new Error(\r\n \"createPromise takes a function that returns a promise\"\r\n );\r\n }\r\n const triggerSignal = createSignal>({\r\n status: \"pending\",\r\n data: null,\r\n error: null,\r\n });\r\n\r\n promise\r\n .then((val) => {\r\n triggerSignal.update((prev) => {\r\n prev.data = val;\r\n prev.status = \"resolved\";\r\n });\r\n })\r\n .catch((err) => {\r\n triggerSignal.update((prev) => {\r\n prev.error = err;\r\n prev.status = \"rejected\";\r\n });\r\n });\r\n\r\n return {\r\n get value() {\r\n return triggerSignal.value;\r\n },\r\n };\r\n}\r\n\r\nexport class Ref {\r\n current: T | null;\r\n constructor(val: T | null) {\r\n this.current = val;\r\n }\r\n}\r\n\r\nexport function createRef() {\r\n const ref = new Ref(null);\r\n return ref;\r\n}\r\n\r\n// const NonMutatingArrayMethods = [\r\n// \"constructor\",\r\n// \"concat\",\r\n// \"every\",\r\n// \"filter\",\r\n// \"find\",\r\n// \"findIndex\",\r\n// \"flat\",\r\n// \"flatMap\",\r\n// \"forEach\",\r\n// \"includes\",\r\n// \"indexOf\",\r\n// \"join\",\r\n// \"map\",\r\n// \"reduce\",\r\n// \"reduceRight\",\r\n// \"slice\",\r\n// \"some\",\r\n// \"toLocaleString\",\r\n// \"toString\",\r\n// ];\r\nconst MutatingMethods = [\r\n \"push\",\r\n \"pop\",\r\n \"unshift\",\r\n \"shift\",\r\n \"splice\",\r\n \"fill\",\r\n \"copyWithin\",\r\n \"sort\",\r\n \"reverse\",\r\n];\r\n\r\ntype DeepReadonly = {\r\n readonly [K in keyof T]: T[K] extends object ? DeepReadonly : T[K];\r\n};\r\n\r\n/**\r\n *\r\n * Base class for signals.\r\n */\r\nexport abstract class BaseSignal {\r\n protected _val: T;\r\n protected deps: Set;\r\n protected isNotified: boolean = false;\r\n\r\n constructor(val: T) {\r\n this._val = val;\r\n this.deps = new Set();\r\n }\r\n\r\n protected notify() {\r\n if (this.isNotified) return;\r\n\r\n if (this.deps.size !== 0) this.isNotified = true;\r\n\r\n this.deps.forEach((dep) => {\r\n batchUpdate(() => {\r\n // Reset the flag before calling the dependency\r\n this.isNotified = false;\r\n return dep;\r\n });\r\n });\r\n }\r\n\r\n public removeDep(fn: Function) {\r\n this.deps.delete(fn);\r\n }\r\n\r\n public clearDeps() {\r\n this.deps.clear();\r\n }\r\n\r\n abstract get value(): T | DeepReadonly;\r\n\r\n abstract update(val: T | ((prev: T) => T)): void;\r\n}\r\n\r\ntype NormalSignal = boolean | string | number | undefined | null | Error;\r\n/**\r\n * Signal for primitive types.\r\n */\r\nexport class PrimitiveSignal extends BaseSignal {\r\n constructor(val: T) {\r\n if (!isPrimitive(val)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n super(val);\r\n }\r\n\r\n get value(): T {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n\r\n addSignalToReactiveFunction(this);\r\n }\r\n // (Optional) debug logging:\r\n // console.log(this.deps);\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => T)) {\r\n if (typeof val === \"function\") {\r\n const newVal = val(this._val);\r\n if (!isPrimitive(newVal)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n if (newVal === this._val) return;\r\n this._val = newVal;\r\n this.notify();\r\n } else {\r\n if (!isPrimitive(val)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n\r\n this._val = val;\r\n\r\n this.notify();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Signal for arrays.\r\n */\r\nexport class ArraySignal extends BaseSignal {\r\n private updateCalled: boolean = false;\r\n\r\n constructor(val: T) {\r\n if (!Array.isArray(val)) {\r\n throw new Error(\r\n \"Invalid type for ArraySignal; value must be an array\"\r\n );\r\n }\r\n // Call the base constructor with a proxy-wrapped array.\r\n super(val);\r\n this._val = this.createProxy(val);\r\n }\r\n\r\n private createProxy(val: T): T {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n // If a function is accessed, wrap it to trigger notifications on mutation.\r\n\r\n if (typeof value === \"function\") {\r\n if (\r\n MutatingMethods.includes(String(prop)) &&\r\n !this.updateCalled\r\n ) {\r\n throw new Error(\r\n \"Cannot set a value on an array signal, use the update method for updating the array.\"\r\n );\r\n }\r\n\r\n return (...args: any[]) => {\r\n const result = value.apply(target, args);\r\n // Notify if the method is mutating.\r\n if (MutatingMethods.includes(String(prop))) {\r\n this.notify();\r\n }\r\n return result;\r\n };\r\n }\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an array signal, use the update method for updating the array.\"\r\n );\r\n }\r\n target[prop as any] = newValue;\r\n this.notify();\r\n return true;\r\n },\r\n });\r\n }\r\n\r\n get value(): DeepReadonly {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n addSignalToReactiveFunction(this);\r\n }\r\n\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => void)) {\r\n this.updateCalled = true;\r\n if (typeof val === \"function\") {\r\n val(this._val);\r\n } else {\r\n if (!Array.isArray(val)) {\r\n throw new Error(\r\n \"Invalid type for ArraySignal; value must be an array\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n\r\n this._val = this.createProxy(val);\r\n\r\n this.notify();\r\n }\r\n this.updateCalled = false;\r\n }\r\n}\r\n\r\n/**\r\n * Signal for plain objects.\r\n */\r\nexport class ObjectSignal> extends BaseSignal {\r\n private updateCalled: boolean = false;\r\n constructor(val: T) {\r\n if (!isPlainObject(val)) {\r\n throw new Error(\r\n \"Invalid type for ObjectSignal; value must be a plain object\"\r\n );\r\n }\r\n super(val);\r\n this._val = this.createProxy(val);\r\n }\r\n private createInternalArrayProxy(val: A): A {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n // If a function is accessed, wrap it to trigger notifications on mutation.\r\n if (typeof value === \"function\") {\r\n if (\r\n !this.updateCalled &&\r\n MutatingMethods.includes(String(prop))\r\n ) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n\r\n return (...args: any[]) => {\r\n const result = value.apply(target, args);\r\n // Notify if the method is mutating.\r\n if (MutatingMethods.includes(String(prop))) {\r\n this.notify();\r\n }\r\n return result;\r\n };\r\n }\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n target[prop as any] = newValue;\r\n this.notify();\r\n return true;\r\n },\r\n });\r\n }\r\n private createProxy(val: T): T {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n if (Array.isArray(value)) {\r\n // @ts-expect-error\r\n target[prop as any] =\r\n this.createInternalArrayProxy(value);\r\n\r\n return target[prop as any];\r\n }\r\n // console.log(\"get\", target, prop, value);\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n // Do not allow functions to be set as values.\r\n if (typeof newValue === \"function\") return false;\r\n // For nested objects, wrap them as well.\r\n if (typeof newValue === \"object\" && newValue !== null) {\r\n newValue = this.createProxy(newValue);\r\n }\r\n if (newValue === target[prop as any]) return true;\r\n\r\n // @ts-expect-error\r\n target[prop as any] = newValue;\r\n\r\n this.notify();\r\n\r\n return true;\r\n },\r\n deleteProperty: (target, prop) => {\r\n const result = delete target[prop as any];\r\n this.notify();\r\n return result;\r\n },\r\n });\r\n }\r\n\r\n get value(): DeepReadonly {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n addSignalToReactiveFunction(this);\r\n }\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => void)) {\r\n this.updateCalled = true;\r\n if (typeof val === \"function\") {\r\n val(this._val);\r\n } else {\r\n if (!isPlainObject(val)) {\r\n throw new Error(\r\n \"Invalid type for ObjectSignal; value must be a plain object\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n this._val = this.createProxy(val);\r\n this.notify();\r\n }\r\n this.updateCalled = false;\r\n }\r\n}\r\n\r\nexport interface PublicSignal {\r\n readonly value: DeepReadonly;\r\n update(val: T | ((prev: T) => T)): void;\r\n}\r\n\r\nexport interface PublicArraySignal extends PublicSignal {\r\n update(val: T | ((prev: T) => void)): void; // Mutation allowed\r\n}\r\n\r\nexport interface PublicObjectSignal>\r\n extends PublicSignal {\r\n update(val: T | ((prev: T) => void)): void; // Mutation allowed\r\n}\r\n/**\r\n * Overloaded factory function to create a signal.\r\n */\r\nfunction createSignal(val: T): PublicSignal;\r\nfunction createSignal(val: T): PublicArraySignal;\r\nfunction createSignal>(\r\n val: T\r\n): PublicObjectSignal;\r\n\r\nfunction createSignal>(\r\n val: T\r\n) {\r\n if (typeof val === \"function\") {\r\n throw new Error(\"Functions cannot be used as signal value\");\r\n }\r\n\r\n if (typeof val === \"object\" && val !== null) {\r\n if (Array.isArray(val)) {\r\n const signal = new ArraySignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else if (isPlainObject(val)) {\r\n const signal = new ObjectSignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else {\r\n throw new Error(\r\n \"Invalid type for signal initialization: \" + typeof val\r\n );\r\n }\r\n } else if (isPrimitive(val)) {\r\n const signal = new PrimitiveSignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else {\r\n throw new Error(\r\n \"Invalid type for signal initialization: \" + typeof val\r\n );\r\n }\r\n}\r\n\r\nexport { computed, createSignal };\r\n","import { updateDomProp } from \"../rendering/createElements\";\r\nimport { updateFiber } from \"../rendering/render\";\r\nimport { Fiber } from \"../types\";\r\n\r\nlet scheduled = false;\r\nconst batch = new Set();\r\nconst depset = new Set();\r\nconst reactiveFiberMap = new WeakMap();\r\nconst domAttributeMap = new WeakMap();\r\n\r\nexport function batchUpdate(cb: Function) {\r\n batch.add(cb);\r\n if (!scheduled) {\r\n scheduled = true;\r\n queueMicrotask(() => {\r\n // console.log(\"Current batch has: \", batch.size, \" Functions\");\r\n\r\n batch.forEach((fn) => {\r\n const dep = fn();\r\n if (depset.has(dep)) {\r\n return;\r\n }\r\n depset.add(dep);\r\n // effects and reactive nodes\r\n if (dep.__cleanup && typeof dep.__cleanup === \"function\") {\r\n dep.__cleanup();\r\n dep.__cleanup = null;\r\n }\r\n\r\n const val = dep();\r\n\r\n if (typeof val === \"function\") {\r\n dep.__cleanup = val;\r\n }\r\n // console.log(dep, \"dep\");\r\n if (reactiveFiberMap.has(dep)) {\r\n // for updating reactive nodes\r\n const fiber = reactiveFiberMap.get(dep);\r\n if (fiber) {\r\n // console.log(\"dep\", fiber);\r\n updateFiber(fiber, val);\r\n }\r\n }\r\n if (domAttributeMap.has(dep)) {\r\n // for updating reactive nodes\r\n const dom = domAttributeMap.get(dep);\r\n if (dom && dep.__propName) {\r\n updateDomProp(dep.__propName, dom, val);\r\n }\r\n }\r\n });\r\n depset.clear();\r\n batch.clear();\r\n scheduled = false;\r\n });\r\n }\r\n}\r\n\r\nexport function setReactiveFunction(fn: Function, fiber: Fiber) {\r\n reactiveFiberMap.set(fn, fiber);\r\n}\r\nexport function setReactiveAttributes(fn: Function, dom: HTMLElement | Text) {\r\n // console.log(\"reactive attrubite\", fn);\r\n domAttributeMap.set(fn, dom);\r\n}\r\nexport function clearReactiveAttributes(fn: any) {\r\n domAttributeMap.delete(fn);\r\n\r\n const signals = fn.__signals;\r\n if (signals) {\r\n for (const signal of signals) {\r\n signal.removeDep(fn);\r\n }\r\n fn.__signals = null;\r\n }\r\n}\r\n\r\nexport function clearReactiveFunction(fn: Function) {\r\n reactiveFiberMap.delete(fn);\r\n // @ts-expect-error\r\n const signals = fn.__signals;\r\n if (signals) {\r\n for (const signal of signals) {\r\n signal.removeDep(fn);\r\n }\r\n // @ts-expect-error\r\n fn.__signals = null;\r\n }\r\n}\r\n\r\nexport function deleteReactiveFunction(fn: Function) {\r\n reactiveFiberMap.delete(fn);\r\n}\r\n","import { isValidStyle, preprocessStyle, styleObjectToString } from \"../lib\";\r\nimport { setReactiveAttributes } from \"../signals/batch\";\r\nimport { reactive, reactiveAttribute, Ref } from \"../signals/signal\";\r\nimport {\r\n Fiber,\r\n FiberChildren,\r\n NodeType,\r\n Props,\r\n RenderFunction,\r\n} from \"../types\";\r\nimport { isPrimitive } from \"../utils/general\";\r\nimport {\r\n MATH_NAMESPACE,\r\n MATH_TAGS,\r\n SVG_NAMESPACE,\r\n SVG_TAGS,\r\n} from \"./constants\";\r\nimport { setAttribute, setReactiveAttribute } from \"./props\";\r\nexport const FRAGMENT_SYMBOL = Symbol(\"FRAGMENT\");\r\n\r\nexport function createElement(\r\n type: any,\r\n props: object | null,\r\n ...children: any[]\r\n): Fiber | FiberChildren {\r\n if (type === \"FRAGMENT\") {\r\n const fragments = createChildren(children);\r\n fragments[FRAGMENT_SYMBOL] = true;\r\n\r\n return fragments;\r\n }\r\n // @ts-expect-error\r\n return {\r\n type,\r\n props: {\r\n ...props,\r\n children: createChildren(children),\r\n },\r\n };\r\n}\r\n\r\nexport function createChildren(children: FiberChildren): FiberChildren {\r\n // @ts-expect-error\r\n return children\r\n .map((child) => {\r\n if (typeof child === \"object\") {\r\n if (Array.isArray(child)) {\r\n return createChildren(child);\r\n }\r\n if (child === null) {\r\n return createTextChildren(\"\");\r\n }\r\n if (!child.type || !child.props) {\r\n throw new Error(\r\n \"Invalid type for a dom node, found \" + child\r\n );\r\n }\r\n return child;\r\n } else if (typeof child === \"function\") {\r\n const val = reactive(child);\r\n if (isPrimitive(val)) {\r\n return createSignalChild(\r\n \"TEXT_CHILD\",\r\n {\r\n nodeValue:\r\n val !== undefined &&\r\n val !== null &&\r\n val !== false\r\n ? String(val)\r\n : \"\",\r\n children: [],\r\n },\r\n child\r\n );\r\n } else if (Array.isArray(val)) {\r\n // console.log(createChildren(val));\r\n const isFragment = val[FRAGMENT_SYMBOL];\r\n return createSignalChild(\r\n \"FRAGMENT\",\r\n { children: isFragment ? val : createChildren(val) },\r\n child\r\n );\r\n } else if (!val.type || !val.props) {\r\n throw new Error(\r\n \"Invalid type for a dom node, found \" + val\r\n );\r\n }\r\n return createSignalChild(val.type, val.props, child);\r\n } else {\r\n return createTextChildren(child);\r\n }\r\n })\r\n .flat();\r\n}\r\n\r\nexport function createTextChildren(text: any): Fiber {\r\n // @ts-expect-error\r\n return {\r\n type: \"TEXT_CHILD\",\r\n props: {\r\n nodeValue:\r\n text !== null && text !== undefined && text !== false\r\n ? String(text)\r\n : \"\",\r\n children: [],\r\n },\r\n };\r\n}\r\n\r\nfunction createSignalChild(\r\n type: NodeType,\r\n props: Props,\r\n renderFunction: RenderFunction\r\n) {\r\n return {\r\n type,\r\n renderFunction,\r\n props,\r\n };\r\n}\r\n\r\nfunction isProperty(key: string) {\r\n return key !== \"children\" && key !== \"key\" && key !== \"ref\";\r\n}\r\n\r\nexport function createNode(element: Fiber): HTMLElement | Text {\r\n let namespace: string | null = null;\r\n\r\n if (SVG_TAGS.has(element.type as string)) namespace = SVG_NAMESPACE;\r\n else if (MATH_TAGS.has(element.type as string)) namespace = MATH_NAMESPACE;\r\n\r\n const dom =\r\n element.type === \"TEXT_CHILD\"\r\n ? document.createTextNode(\"\")\r\n : namespace\r\n ? document.createElementNS(\r\n namespace,\r\n // @ts-expect-error\r\n element.type,\r\n element.props.is && element.props\r\n )\r\n : // @ts-expect-error\r\n document.createElement(element.type);\r\n\r\n if (!element.props) return dom as HTMLElement | Text;\r\n\r\n if (\r\n element.props.ref &&\r\n element.props.ref instanceof Ref &&\r\n dom instanceof HTMLElement\r\n ) {\r\n element.props.ref.current = dom;\r\n }\r\n\r\n for (const name in element.props) {\r\n if (!isProperty(name)) {\r\n continue;\r\n }\r\n const value = element.props[name];\r\n if (typeof value === \"function\" && name[0] !== \"o\" && name[1] !== \"n\") {\r\n // @ts-expect-error\r\n setReactiveAttribute(value, name, dom, namespace);\r\n } else {\r\n // @ts-expect-error\r\n setAttribute(name, value, dom, namespace);\r\n }\r\n }\r\n\r\n return dom as HTMLElement | Text;\r\n}\r\n\r\nexport function updateDomProp(\r\n prop: string,\r\n dom: HTMLElement | Text,\r\n value: any\r\n) {\r\n if (value == null || prop === \"key\") return;\r\n\r\n // @ts-expect-error\r\n setAttribute(prop, value, dom);\r\n}\r\n\r\nexport const FRAGMENT = \"FRAGMENT\";\r\n","import {\r\n clearReactiveAttributes,\r\n clearReactiveFunction,\r\n setReactiveFunction,\r\n} from \"../signals/batch\";\r\nimport { BaseSignal, Ref } from \"../signals/signal\";\r\nimport { Fiber, FiberChildren } from \"../types\";\r\nimport { isPrimitive } from \"../utils/general\";\r\nimport { CAPTURE_REGEX } from \"./constants\";\r\nimport {\r\n FRAGMENT_SYMBOL,\r\n createChildren,\r\n createNode,\r\n createTextChildren,\r\n} from \"./createElements\";\r\nimport {\r\n cleanUpFC,\r\n clearCurrentFC,\r\n runAllEffects,\r\n setCurrentFC,\r\n} from \"./functionalComponents\";\r\n\r\nexport function render(element: Fiber, container: HTMLElement) {\r\n rootContainer = container;\r\n const fragment = document.createDocumentFragment();\r\n rootFragment = fragment;\r\n const rootFiber: Fiber = {\r\n type: \"div\",\r\n props: {\r\n children: [element],\r\n },\r\n // @ts-expect-error\r\n dom: fragment,\r\n };\r\n // console.log(element.type(element.props));\r\n element.parent = rootFiber;\r\n elements.push(element);\r\n requestIdleCallback(workLoop);\r\n\r\n // container.appendChild(fragment);\r\n}\r\n\r\nfunction commitRootFragment() {\r\n if (rootFragment && rootContainer) {\r\n rootContainer.appendChild(rootFragment);\r\n // const endTime = performance.now();\r\n // console.log(`Render time: ${endTime - startTime}ms`);\r\n }\r\n}\r\n\r\nlet elements: Fiber[] = [];\r\nlet rootContainer: HTMLElement | null = null;\r\nlet rootFragment: DocumentFragment | null = null;\r\n// let startTime = -1;\r\nlet effectQueue: Fiber[] = [];\r\n\r\nfunction processEffectQueue() {\r\n for (let i = 0; i < effectQueue.length; i++) {\r\n const fiber = effectQueue[i];\r\n runAllEffects(fiber);\r\n }\r\n effectQueue.length = 0;\r\n}\r\n\r\nfunction workLoop(deadline: IdleDeadline) {\r\n // if (startTime === -1) startTime = performance.now();\r\n\r\n processEffectQueue();\r\n let shouldYield = false;\r\n while (elements.length > 0 && !shouldYield) {\r\n const element = elements.pop();\r\n renderNode(element!);\r\n shouldYield = deadline.timeRemaining() < 1;\r\n }\r\n\r\n if (elements.length == 0) {\r\n commitRootFragment();\r\n\r\n processEffectQueue();\r\n return;\r\n }\r\n requestIdleCallback(workLoop);\r\n}\r\n\r\nfunction renderNode(fiber: Fiber) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n const isArray = !fiber.props.children[FRAGMENT_SYMBOL];\r\n let noKey = false;\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n fiber.props.children[i].parent = fiber;\r\n\r\n if (\r\n isArray &&\r\n fiber.props.children[i].props.key === undefined &&\r\n fiber.renderFunction\r\n ) {\r\n noKey = true;\r\n }\r\n\r\n elements.push(fiber.props.children[i]);\r\n }\r\n if (noKey) {\r\n console.error(\"Array children must have a key attribute\");\r\n }\r\n // console.log(fiber.props.children);\r\n } else if (typeof fiber.type === \"function\") {\r\n setCurrentFC(fiber);\r\n\r\n const children = fiber.type(fiber.props);\r\n clearCurrentFC();\r\n\r\n if (Array.isArray(children)) {\r\n // which means that the FC returned a fragment\r\n // console.log(children);\r\n for (let i = children.length - 1; i >= 0; i--) {\r\n children[i].parent = fiber;\r\n elements.push(children[i]);\r\n }\r\n fiber.props.children = children;\r\n } else {\r\n children.parent = fiber;\r\n fiber.props.children.push(children);\r\n elements.push(children);\r\n }\r\n // queue to run its effects\r\n effectQueue.push(fiber);\r\n } else {\r\n if (!fiber.dom) fiber.dom = createNode(fiber);\r\n let fiberParent: Fiber | undefined = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n if (fiberParent) {\r\n fiberParent.dom?.appendChild(fiber.dom);\r\n }\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n fiber.props.children[i].parent = fiber;\r\n elements.push(fiber.props.children[i]);\r\n }\r\n }\r\n // console.log(fiber);\r\n setRenderFunction(fiber);\r\n}\r\n\r\nfunction createFiber(fiber: Fiber) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n const isFragment = fiber.props.children[FRAGMENT_SYMBOL];\r\n if (isFragment) {\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n createFiber(child);\r\n }\r\n } else {\r\n let noKey = false;\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n if (child.props.key === undefined) {\r\n noKey = true;\r\n }\r\n createFiber(child);\r\n }\r\n if (noKey) {\r\n console.error(\"Array children must have a key attribute\");\r\n }\r\n }\r\n } else if (typeof fiber.type !== \"function\") {\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n createFiber(child);\r\n }\r\n }\r\n // console.log(fiber);\r\n setRenderFunction(fiber);\r\n}\r\nfunction commitFiber(\r\n fiber: Fiber,\r\n referenceNode?: Node,\r\n replace?: boolean,\r\n needCreation?: boolean,\r\n customParent?: Node\r\n) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n for (const child of fiber.props.children) {\r\n if (needCreation) child.parent = fiber;\r\n commitFiber(\r\n child,\r\n referenceNode,\r\n replace,\r\n needCreation,\r\n customParent\r\n );\r\n }\r\n } else if (typeof fiber.type === \"function\") {\r\n setCurrentFC(fiber);\r\n\r\n const children = fiber.type(fiber.props);\r\n clearCurrentFC();\r\n\r\n // console.log(\"commit FC\", children);\r\n if (Array.isArray(children)) {\r\n // which means that the FC returned a fragment\r\n // console.log(children);\r\n for (const child of children) {\r\n child.parent = fiber;\r\n commitFiber(child, referenceNode, replace, true, customParent);\r\n }\r\n fiber.props.children = children;\r\n } else {\r\n children.parent = fiber;\r\n fiber.props.children.push(children);\r\n commitFiber(children, referenceNode, replace, true, customParent);\r\n }\r\n // queue to run its effects at the end of current stack\r\n queueMicrotask(() => {\r\n runAllEffects(fiber);\r\n });\r\n } else {\r\n if (!fiber.dom) fiber.dom = createNode(fiber);\r\n\r\n if (referenceNode) {\r\n if (replace)\r\n referenceNode.parentElement?.replaceChild(\r\n fiber.dom,\r\n referenceNode\r\n );\r\n else\r\n referenceNode.parentElement?.insertBefore(\r\n fiber.dom,\r\n referenceNode\r\n );\r\n } else {\r\n let parentDom: Node | undefined = undefined;\r\n if (customParent) {\r\n parentDom = customParent;\r\n } else {\r\n let fiberParent: Fiber | undefined = fiber.parent;\r\n\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n parentDom = fiberParent?.dom;\r\n }\r\n parentDom?.appendChild(fiber.dom);\r\n }\r\n for (const child of fiber.props.children) {\r\n if (needCreation) child.parent = fiber;\r\n\r\n commitFiber(child, undefined, undefined, needCreation, fiber.dom);\r\n }\r\n }\r\n if (needCreation) {\r\n setRenderFunction(fiber);\r\n }\r\n}\r\n\r\nlet ToCommitDeletion = true;\r\n\r\nfunction commitDeletion(fiber: Fiber, toClearReactiveFunction?: boolean) {\r\n if (!fiber || !ToCommitDeletion) return;\r\n if (fiber.renderFunction) {\r\n if (toClearReactiveFunction)\r\n clearReactiveFunction(fiber.renderFunction);\r\n delete fiber.renderFunction;\r\n }\r\n if (fiber.dom) {\r\n for (const prop in fiber.props) {\r\n if (isEvent(prop)) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(CAPTURE_REGEX, \"$1\"));\r\n\r\n fiber.dom.removeEventListener(\r\n eventName,\r\n fiber.props[prop],\r\n useCapture\r\n );\r\n delete fiber.props[prop];\r\n } else if (typeof fiber.props[prop] === \"function\") {\r\n clearReactiveAttributes(fiber.props[prop]);\r\n } else if (prop === \"ref\" && fiber.props[prop] instanceof Ref) {\r\n fiber.props[prop].current = null;\r\n }\r\n }\r\n\r\n fiber.dom.remove();\r\n }\r\n if (typeof fiber.type === \"function\") {\r\n cleanUpFC(fiber, fiber.props);\r\n // @ts-expect-error\r\n delete fiber.type;\r\n }\r\n fiber.props.children.forEach((child) => commitDeletion(child, true));\r\n}\r\n\r\nfunction setRenderFunction(fiber: Fiber) {\r\n if (!fiber.renderFunction) return;\r\n setReactiveFunction(fiber.renderFunction, fiber);\r\n}\r\n\r\nexport function updateFiber(prevFiber: Fiber, newValue) {\r\n // console.log(\"Prev value\", prevFiber, newValue);\r\n // startTime = performance.now();\r\n if (isPrimitive(newValue)) {\r\n // console.log(fiber, newValue);\r\n const newFragment: Fiber = {\r\n ...createTextChildren(newValue),\r\n parent: prevFiber.parent,\r\n };\r\n createFiber(newFragment);\r\n // console.log(\"New Text Fiber\", newFragment);\r\n\r\n updateNode(prevFiber, newFragment);\r\n } else if (Array.isArray(newValue)) {\r\n const isFragment = newValue[FRAGMENT_SYMBOL];\r\n\r\n const newFragment: Fiber = {\r\n type: \"FRAGMENT\",\r\n props: {\r\n children: isFragment ? newValue : createChildren(newValue),\r\n },\r\n parent: prevFiber.parent,\r\n };\r\n\r\n createFiber(newFragment);\r\n updateNode(prevFiber, newFragment);\r\n } else {\r\n const newFragment = { ...newValue, parent: prevFiber.parent };\r\n createFiber(newFragment);\r\n // console.log(\"New Node Fiber\", newFragment);\r\n updateNode(prevFiber, newFragment);\r\n }\r\n // const endTime = performance.now();\r\n // console.log(\"Update Time:\", (endTime - startTime).toFixed(2), \"ms\");\r\n}\r\n\r\nfunction replaceRenderFunction(prev: Fiber, next: Fiber) {\r\n if (prev.renderFunction) {\r\n next.renderFunction = prev.renderFunction;\r\n // console.log(\"Replace render function\", prev, next);\r\n // deleteReactiveFunction(prev.renderFunction);\r\n setRenderFunction(next);\r\n }\r\n}\r\n\r\nfunction replaceChildFromParent(prev: Fiber, next: Fiber, index?: number) {\r\n if (index !== undefined) {\r\n prev.parent.props.children[index] = next;\r\n return;\r\n }\r\n prev.parent?.props.children.forEach((child, i) => {\r\n if (child === prev) {\r\n prev.parent.props.children[i] = next;\r\n }\r\n });\r\n}\r\n\r\nexport const isEvent = (key: string) =>\r\n key.startsWith(\"on\") || key == \"onFocusOut\" || key == \"onFocusIn\";\r\nexport const isProperty = (key: string) =>\r\n key !== \"children\" && !isEvent(key) && key !== \"key\" && key !== \"ref\";\r\nconst isNew = (prev: any, next: any, key: string) => prev[key] !== next[key];\r\nconst isGone = (prev: any, next: any, key: string) => !(key in next);\r\n\r\nfunction deepCompareFibers(fiberA: any, fiberB: any): boolean {\r\n // Fast path: identical references\r\n if (fiberA === fiberB) {\r\n return true;\r\n }\r\n\r\n // Compare the fiber types (e.g., function for FCs, string for DOM nodes)\r\n if (fiberA.type !== fiberB.type) {\r\n return false;\r\n }\r\n\r\n // Compare keys if they exist\r\n if (fiberA.props?.key !== fiberB.props?.key) {\r\n return false;\r\n }\r\n return deepEqual(fiberA.props, fiberB.props);\r\n}\r\n\r\nfunction deepEqual(objA: any, objB: any): boolean {\r\n if (objA === objB) {\r\n // console.log(\"Signal prop\");\r\n\r\n if (objA instanceof BaseSignal && objB instanceof BaseSignal)\r\n return deepEqual(objA.value, objB.value);\r\n if (Array.isArray(objA) && Array.isArray(objB)) {\r\n if (objA.length !== objB.length) return false;\r\n for (let i = 0; i < objA.length; i++) {\r\n if (!deepEqual(objA[i], objB[i])) return false;\r\n }\r\n }\r\n return true;\r\n } // Same reference or primitive value\r\n\r\n if (isPrimitive(objA) && isPrimitive(objB)) {\r\n return objA === objB; // One is not an object or is null\r\n }\r\n\r\n if (typeof objA !== typeof objB) return false;\r\n\r\n const keysA = Object.keys(objA);\r\n const keysB = Object.keys(objB);\r\n\r\n if (keysA.length !== keysB.length) return false; // Different number of keys\r\n\r\n for (let key of keysA) {\r\n if (key === \"children\") continue;\r\n if (!objB.hasOwnProperty(key)) return false; // Missing key in one of them\r\n if (!deepEqual(objA[key], objB[key])) return false; // Recurse for nested objects/arrays\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction findFirstDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n if (fiber.dom) return fiber.dom;\r\n\r\n for (const child of fiber.props.children) {\r\n const dom = findFirstDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\n// function findFirstChildDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n// if (!fiber) return;\r\n\r\n// for (const child of fiber.props.children) {\r\n// const dom = findFirstDom(child);\r\n// if (dom) return dom;\r\n// }\r\n// }\r\nfunction findLastDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n if (fiber.dom) return fiber.dom;\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n const child = fiber.props.children[i];\r\n const dom = findLastDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\nfunction findLastChildDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n const child = fiber.props.children[i];\r\n const dom = findLastDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\nfunction findParentFiberWithDom(fiber: Fiber): Fiber | undefined {\r\n if (!fiber) return;\r\n let fiberParent = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n return fiberParent;\r\n}\r\nfunction findNearestParentWithDom(fiber: Fiber): Fiber | undefined {\r\n if (!fiber) return;\r\n if (fiber.dom) return fiber;\r\n\r\n let fiberParent = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n return fiberParent;\r\n}\r\n\r\nfunction updateNode(\r\n prev: Fiber | undefined,\r\n next: Fiber | undefined,\r\n index?: number\r\n) {\r\n if (!prev && !next) return;\r\n\r\n if (prev && !next) {\r\n commitDeletion(prev, true);\r\n // console.log(\"to remove\", prev);\r\n prev.parent.props.children = prev.parent.props.children.filter(\r\n (child) => child !== prev\r\n );\r\n } else if (prev && next) {\r\n const prevProps = prev.props;\r\n const nextProps = next.props;\r\n if (prev.type === \"FRAGMENT\" || typeof prev.type === \"function\") {\r\n // PREV IS FRAGMENT\r\n if (next.type === \"FRAGMENT\" || typeof next.type === \"function\") {\r\n // console.log(\"Fragment-Fragment\", prev, next);\r\n if (\r\n typeof prev.type === typeof next.type &&\r\n typeof prev.type === \"function\"\r\n ) {\r\n const areSame = deepCompareFibers(prev, next);\r\n if (!areSame) {\r\n commitFiber(next, findFirstDom(prev), undefined, true);\r\n\r\n replaceRenderFunction(prev, next);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n }\r\n } else {\r\n // console.log(\"fragment-fragment\", { ...prev }, next);\r\n\r\n updateChildren(prev, next);\r\n }\r\n // replaceChildFromParent(prev, next);\r\n } else {\r\n next.parent = prev.parent;\r\n let firstChild: Fiber | undefined = prev.props.children[0];\r\n while (firstChild && !firstChild.dom)\r\n firstChild = firstChild.props.children[0];\r\n commitFiber(next, firstChild?.dom);\r\n\r\n replaceRenderFunction(prev, next);\r\n // removing all nodes of previous fragment\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n }\r\n } else {\r\n // PREV IS NODE\r\n\r\n const node = prev.dom;\r\n if (\r\n prev.type === \"TEXT_CHILD\" &&\r\n next.type === \"TEXT_CHILD\" &&\r\n !next.dom\r\n )\r\n next.dom = prev.dom;\r\n if (node === undefined) {\r\n // console.error(\"no node found\", prev, next);\r\n return;\r\n }\r\n // console.log(prev);\r\n if (next.type === \"FRAGMENT\" || typeof next.type === \"function\") {\r\n // console.log(\"Node-Fragment\");\r\n next.parent = prev.parent;\r\n replaceRenderFunction(prev, next);\r\n\r\n commitFiber(next, node);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n } else {\r\n // console.log(\"Node-Node\");\r\n // remove old properties and event listeners from NODE\r\n for (const prop in prevProps) {\r\n if (\r\n isProperty(prop) &&\r\n isGone(prevProps, nextProps, prop)\r\n ) {\r\n node[prop] = \"\";\r\n // console.log(\"property removed\", prop);\r\n } else if (\r\n isEvent(prop) &&\r\n (!(prop in nextProps) ||\r\n isNew(prevProps, nextProps, prop))\r\n ) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(\r\n CAPTURE_REGEX,\r\n \"$1\"\r\n ));\r\n\r\n node.removeEventListener(\r\n eventName,\r\n prevProps[prop],\r\n useCapture\r\n );\r\n // console.log(\"event listener removed\", prop);\r\n }\r\n }\r\n if (prev.type !== next.type) {\r\n // console.log(\"Different type\", prev, next);\r\n next.parent = prev.parent;\r\n\r\n replaceRenderFunction(prev, next);\r\n\r\n commitFiber(next, node, true);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n\r\n // console.log(prev.parent);\r\n } else {\r\n // add new properties\r\n // console.log(\"same type\", prev, next);\r\n\r\n for (const prop in nextProps) {\r\n if (\r\n isProperty(prop) &&\r\n isNew(prevProps, nextProps, prop)\r\n ) {\r\n node[prop] = nextProps[prop];\r\n // console.log(\r\n // \"property added\",\r\n // prop,\r\n // nextProps[prop]\r\n // );\r\n prevProps[prop] = nextProps[prop];\r\n } else if (\r\n isEvent(prop) &&\r\n isNew(prevProps, nextProps, prop)\r\n ) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(\r\n CAPTURE_REGEX,\r\n \"$1\"\r\n ));\r\n node.addEventListener(\r\n eventName,\r\n nextProps[prop],\r\n useCapture\r\n );\r\n prevProps[prop] = nextProps[prop];\r\n }\r\n }\r\n updateChildren(prev, next);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction reconcileList(prev: Fiber, next: Fiber) {\r\n const oldFibers = prev.props.children;\r\n const newFibers = next.props.children;\r\n\r\n // Create a map from key to fiber for oldFibers.\r\n const oldMap: Record = {};\r\n for (let i = 0; i < oldFibers.length; i++) {\r\n const key = oldFibers[i].props.key;\r\n if (\r\n key === null ||\r\n key === undefined ||\r\n oldMap.hasOwnProperty(String(key))\r\n ) {\r\n // If any fiber is missing a key, we cannot reconcile.\r\n // oldFibers[i].props.key =\r\n return false;\r\n }\r\n oldMap[String(key)] = oldFibers[i];\r\n }\r\n const referenceNode = findLastChildDom(prev)?.nextSibling as\r\n | Node\r\n | undefined;\r\n // Create newChildren array based on newFibers order.\r\n const fiberParent = findParentFiberWithDom(prev);\r\n // const fragment = document.createDocumentFragment();\r\n\r\n if (newFibers.length === 0) {\r\n prev.props.children.length = 0;\r\n if (fiberParent?.dom instanceof HTMLElement)\r\n fiberParent.dom.innerHTML = \"\";\r\n return;\r\n }\r\n const prevLen = prev.props.children.length;\r\n\r\n // const newChildren = new Array(newFibers.length);\r\n for (let i = 0; i < newFibers.length; i++) {\r\n const newFiber = newFibers[i];\r\n const key = newFiber.props.key;\r\n const keyStr = String(key);\r\n // If the fiber exists in the old list, reuse it.\r\n if (oldMap.hasOwnProperty(keyStr)) {\r\n const oldFiber = oldMap[keyStr];\r\n\r\n if (prevLen > i) prev.props.children[i] = oldFiber;\r\n else prev.props.children.push(oldFiber);\r\n\r\n delete oldMap[keyStr];\r\n\r\n const newFiber = next.props.children[i];\r\n\r\n if (newFiber) newFiber.parent = prev;\r\n\r\n updateNode(oldFiber, newFiber, i);\r\n applyFiber(\r\n prev.props.children[i],\r\n fiberParent?.dom!,\r\n referenceNode\r\n );\r\n } else {\r\n // Otherwise, use the new fiber.\r\n // console.log(first)\r\n if (prevLen > i) prev.props.children[i] = newFiber;\r\n else prev.props.children.push(newFiber);\r\n\r\n newFiber.parent = prev;\r\n commitFiber(\r\n newFiber,\r\n referenceNode,\r\n false,\r\n false,\r\n fiberParent?.dom\r\n );\r\n }\r\n }\r\n for (const key in oldMap) {\r\n if (oldMap.hasOwnProperty(key)) {\r\n const fiber = oldMap[key];\r\n commitDeletion(fiber, true);\r\n }\r\n }\r\n while (prev.props.children.length > next.props.children.length) {\r\n prev.props.children.pop();\r\n }\r\n\r\n // fiberParent?.dom?.appendChild(fragment);\r\n}\r\n\r\nfunction applyFiber(fiber: Fiber, parent: Node, referenceNode?: Node) {\r\n if (fiber.dom) {\r\n if (fiber.dom === parent || fiber.dom === referenceNode) return;\r\n if (referenceNode) {\r\n parent.insertBefore(fiber.dom, referenceNode);\r\n } else parent.appendChild(fiber.dom);\r\n } else {\r\n for (const child of fiber.props.children) {\r\n applyFiber(child, parent, referenceNode);\r\n }\r\n }\r\n}\r\n\r\nfunction updateChildren(prev: Fiber, next: Fiber) {\r\n const isList =\r\n next.type === \"FRAGMENT\" && !next.props.children[FRAGMENT_SYMBOL];\r\n\r\n const wasList =\r\n prev.type === \"FRAGMENT\" && !prev.props.children[FRAGMENT_SYMBOL];\r\n\r\n // console.log(isList, wasList);\r\n\r\n if (isList && wasList) {\r\n const result = reconcileList(prev, next);\r\n if (result === false) {\r\n updateNonListChildrenWithKeys(prev, next);\r\n }\r\n } else {\r\n updateNonListChildrenWithKeys(prev, next);\r\n }\r\n if (next.type === \"FRAGMENT\" && next.props.children[FRAGMENT_SYMBOL]) {\r\n prev.props.children[FRAGMENT_SYMBOL] = true;\r\n } else {\r\n prev.props.children[FRAGMENT_SYMBOL] = false;\r\n }\r\n\r\n prev.type = next.type;\r\n}\r\n\r\nfunction updateNonListChildren(prev: Fiber, next: Fiber) {\r\n let len = Math.max(prev.props.children.length, next.props.children.length);\r\n\r\n for (let i = 0; i < len; i++) {\r\n let prevChild = prev.props.children[i];\r\n let nextChild = next.props.children[i];\r\n\r\n if (nextChild) nextChild.parent = prev;\r\n if (!prevChild && nextChild) {\r\n commitFiber(\r\n nextChild,\r\n // @ts-expect-error\r\n findLastDom(prev.props.children.at(-1))?.nextSibling\r\n );\r\n prev.props.children.push(nextChild);\r\n } else if (!nextChild && prevChild) {\r\n commitDeletion(prevChild, true);\r\n prev.props.children.splice(i, 1);\r\n len = prev.props.children.length;\r\n i--;\r\n } else {\r\n updateNode(prevChild, nextChild, i);\r\n const newLen = Math.max(\r\n prev.props.children.length,\r\n next.props.children.length\r\n );\r\n if (newLen < len) {\r\n len = newLen;\r\n i--;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction updateNonListChildrenWithKeys(prev: Fiber, next: Fiber) {\r\n let len = Math.max(prev.props.children.length, next.props.children.length);\r\n const oldMap: Record = {};\r\n let count = 0;\r\n for (let i = 0; i < prev.props.children.length; i++) {\r\n const key = prev.props.children[i].props.key;\r\n if (key === null || key === undefined) {\r\n continue;\r\n }\r\n count++;\r\n if (oldMap.hasOwnProperty(String(key))) {\r\n console.warn(\"Found two children with the same key\", key);\r\n console.warn(\r\n \"When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation\"\r\n );\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n oldMap[String(key)] = { fiber: prev.props.children[i], index: i };\r\n }\r\n if (count == 0) {\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n const newMap: Record<\r\n string,\r\n { fiber: Fiber; newIndex: number; oldIndex: number }\r\n > = {};\r\n\r\n for (let i = 0; i < next.props.children.length; i++) {\r\n const key = next.props.children[i].props.key;\r\n if (key === null || key === undefined) {\r\n continue;\r\n }\r\n const oldFiber = oldMap[String(key)];\r\n if (oldFiber) {\r\n if (newMap.hasOwnProperty(String(key))) {\r\n console.warn(\"Found two children with the same key\", key);\r\n console.warn(\r\n \"When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation\"\r\n );\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n newMap[String(key)] = {\r\n fiber: oldFiber.fiber,\r\n newIndex: i,\r\n oldIndex: oldFiber.index,\r\n };\r\n }\r\n }\r\n // console.log(prev, next);\r\n const parent = findNearestParentWithDom(prev);\r\n\r\n for (let i = 0; i < len; i++) {\r\n let prevChild = prev.props.children[i];\r\n let nextChild = next.props.children[i];\r\n // console.log(prevChild, nextChild);\r\n\r\n const nextKey = nextChild?.props.key ? String(nextChild.props.key) : \"\";\r\n const isReused = newMap.hasOwnProperty(nextKey);\r\n\r\n let prevKey = prevChild?.props.key ? String(prevChild.props.key) : \"\";\r\n\r\n if (prevKey && nextKey && prevKey === nextKey) {\r\n // console.log(\"same\", prevChild, nextChild);\r\n updateNode(prevChild, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n continue;\r\n }\r\n\r\n const isUsedLater =\r\n newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex > i;\r\n const isUsedPreviously =\r\n newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex < i;\r\n\r\n if (isUsedLater || isUsedPreviously) {\r\n ToCommitDeletion = false;\r\n }\r\n\r\n if (nextChild) nextChild.parent = prev;\r\n\r\n if (!prevChild && nextChild) {\r\n if (isReused) {\r\n const { fiber } = newMap[nextKey];\r\n\r\n prev.props.children.push(fiber);\r\n\r\n updateNode(fiber, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n } else {\r\n // needCreation just creates parent child heirarchy\r\n if (parent?.dom)\r\n commitFiber(nextChild, undefined, false, false, parent.dom);\r\n prev.props.children.push(nextChild);\r\n }\r\n } else if (!nextChild && prevChild) {\r\n commitDeletion(prevChild, true);\r\n prev.props.children.splice(i, 1);\r\n len = prev.props.children.length;\r\n i--;\r\n } else {\r\n if (isReused) {\r\n const { fiber } = newMap[nextKey];\r\n\r\n commitDeletion(prevChild, true);\r\n // because updateNode can call commitDeletion internally\r\n ToCommitDeletion = true;\r\n\r\n prev.props.children[i] = fiber;\r\n\r\n updateNode(fiber, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n } else {\r\n // console.log(ToCommitDeletion);\r\n if (isUsedLater || isUsedPreviously) {\r\n if (parent?.dom)\r\n commitFiber(\r\n nextChild,\r\n undefined,\r\n false,\r\n false,\r\n parent.dom\r\n );\r\n prev.props.children[i] = nextChild;\r\n } else {\r\n updateNode(prevChild, nextChild, i);\r\n if (parent?.dom)\r\n applyFiber(prev.props.children[i], parent.dom);\r\n\r\n const newLen = Math.max(\r\n prev.props.children.length,\r\n next.props.children.length\r\n );\r\n if (newLen < len) {\r\n len = newLen;\r\n i--;\r\n }\r\n }\r\n }\r\n }\r\n ToCommitDeletion = true;\r\n }\r\n // console.log(prev.props.children, next.props.children);\r\n}\r\n\r\n// @ts-expect-error\r\nif (typeof process !== \"undefined\" && process.env.NODE_ENV === \"test\") {\r\n // @ts-expect-error\r\n module.exports = {\r\n createFiber,\r\n commitDeletion,\r\n commitFiber,\r\n updateFiber,\r\n deepCompareFibers,\r\n deepEqual,\r\n };\r\n}\r\n","import { BaseSignal, runEffect } from \"../signals/signal\";\r\nimport { Fiber } from \"../types\";\r\n\r\nlet currentFC: Fiber | null = null;\r\nlet fcMap = new WeakMap<\r\n Fiber,\r\n {\r\n signals: Set>;\r\n cleanup: Function[];\r\n effects: Set;\r\n }\r\n>();\r\n\r\nexport function setCurrentFC(fc: Fiber) {\r\n currentFC = fc;\r\n}\r\n\r\nexport function clearCurrentFC() {\r\n currentFC = null;\r\n}\r\nexport function getCurrentFC() {\r\n return currentFC;\r\n}\r\n\r\nexport function runAllEffects(FC: Fiber) {\r\n if (fcMap.has(FC)) {\r\n const fcData = fcMap.get(FC)!;\r\n\r\n for (const effect of fcData.effects) {\r\n runEffect(effect, FC);\r\n }\r\n }\r\n}\r\n\r\nexport function cleanUp(fn: Function) {\r\n if (currentFC) {\r\n // console.log(currentFC, fcMap.has(currentFC));\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n\r\n fcData.cleanup.push(fn);\r\n } else {\r\n fcMap.set(currentFC, {\r\n signals: new Set(),\r\n cleanup: [fn],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\nexport function cleanUpWFiber(fn: Function, fiber: Fiber) {\r\n if (fiber) {\r\n // console.log(currentFC, fcMap.has(currentFC));\r\n if (fcMap.has(fiber)) {\r\n const fcData = fcMap.get(fiber)!;\r\n\r\n fcData.cleanup.push(fn);\r\n } else {\r\n fcMap.set(fiber, {\r\n signals: new Set(),\r\n cleanup: [fn],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function addEffect(fn: Function) {\r\n if (currentFC) {\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n fcData.effects.add(fn);\r\n } else {\r\n const effects = new Set();\r\n effects.add(fn);\r\n fcMap.set(currentFC, {\r\n signals: new Set(),\r\n cleanup: [],\r\n effects: effects,\r\n });\r\n }\r\n }\r\n}\r\nexport function addSignal(signal: BaseSignal) {\r\n if (currentFC) {\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n fcData.signals.add(signal);\r\n } else {\r\n const signals = new Set>();\r\n signals.add(signal);\r\n fcMap.set(currentFC, {\r\n signals: signals,\r\n cleanup: [],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function cleanUpFC(currentFC, props) {\r\n const fcData = fcMap.get(currentFC)!;\r\n if (fcData) {\r\n // console.log(\"Cleaning up FC\", currentFC, fcData);\r\n if (fcData.cleanup) {\r\n for (const fn of fcData.cleanup) {\r\n fn();\r\n }\r\n }\r\n\r\n fcData.cleanup = [];\r\n\r\n for (const effect of fcData.effects) {\r\n // @ts-expect-error\r\n if (effect.__cleanup && typeof effect.__cleanup === \"function\") {\r\n // @ts-expect-error\r\n effect.__cleanup();\r\n }\r\n // @ts-expect-error\r\n if (effect.__signals) {\r\n // @ts-expect-error\r\n for (const signal of effect.__signals) {\r\n signal.removeDep(effect);\r\n }\r\n }\r\n // @ts-expect-error\r\n delete effect.__signals;\r\n // @ts-expect-error\r\n delete effect.__cleanup;\r\n }\r\n\r\n fcData.signals.forEach((signal) => signal.clearDeps());\r\n fcData.signals.clear();\r\n }\r\n fcMap.delete(currentFC);\r\n}\r\n","import { ComponentChildren, createSignal, Fiber, PublicSignal } from \"../index\";\r\n\r\ndeclare const FRAGMENT = \"FRAGMENT\";\r\n\r\n// If the component takes no parameters, treat its props as {}\r\ntype PropsOf any> = Parameters extends []\r\n ? {}\r\n : Parameters[0];\r\n\r\nexport function lazy any>(\r\n importFn: () => Promise<{ default: T }>\r\n): (\r\n props: PropsOf & {\r\n fallback?: ComponentChildren;\r\n errorFallback?:\r\n | ComponentChildren\r\n | ((error: Error) => ComponentChildren);\r\n }\r\n) => ReturnType {\r\n let Component: T | null = null;\r\n\r\n const load = (\r\n loading: PublicSignal,\r\n error: PublicSignal\r\n ) => {\r\n if (!Component) {\r\n importFn()\r\n .then((mod) => {\r\n if (mod.default) {\r\n if (typeof mod.default !== \"function\") {\r\n throw new Error(\r\n \"Lazy-loaded component must be a functional component\"\r\n );\r\n }\r\n Component = mod.default;\r\n\r\n loading.update(false);\r\n error.update(null);\r\n } else {\r\n error.update(\r\n new Error(\r\n \"No default export found from lazy-loaded module\"\r\n )\r\n );\r\n }\r\n })\r\n .catch((err) => {\r\n error.update(err);\r\n loading.update(false);\r\n });\r\n } else {\r\n loading.update(false);\r\n error.update(null);\r\n }\r\n };\r\n\r\n return (\r\n props: PropsOf & {\r\n fallback?: Node;\r\n errorFallback?: Node;\r\n }\r\n ): ReturnType => {\r\n const loading = createSignal(true);\r\n const error = createSignal(null);\r\n\r\n load(loading, error);\r\n // Validate fallback and errorFallback types\r\n const isValidNode = (val: any) =>\r\n typeof val === \"string\" ||\r\n (val && typeof val === \"object\" && \"props\" in val && \"type\" in val);\r\n\r\n if (props.fallback !== undefined && !isValidNode(props.fallback)) {\r\n throw new Error(\r\n \"Invalid fallback: Expected a string or a valid JSX node.\"\r\n );\r\n }\r\n if (\r\n props.errorFallback !== undefined &&\r\n !(\r\n typeof props.errorFallback === \"function\" ||\r\n isValidNode(props.errorFallback)\r\n )\r\n ) {\r\n throw new Error(\r\n \"Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node.\"\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {() =>\r\n loading.value\r\n ? props.fallback\r\n : error.value !== null\r\n ? props.errorFallback\r\n ? typeof props.errorFallback === \"function\"\r\n ? props.errorFallback(error.value)\r\n : props.errorFallback\r\n : \"Unknown error occurred while lazy loading component, use errorFallback prop to override\"\r\n : // @ts-expect-error\r\n Component && \r\n }\r\n \r\n ) as unknown as ReturnType;\r\n };\r\n}\r\n"],"names":["isPlainObject","variable","Array","isArray","Object","prototype","toString","call","isPrimitive","val","includes","Error","SVG_NAMESPACE","SVG_TAGS","Set","MATH_TAGS","CAPTURE_REGEX","IS_NON_DIMENSIONAL","setReactiveAttribute","reactiveFunction","name","dom","namespace","__propName","fn","currentReactiveFunction","retVal","reactiveAttribute","setAttribute","__signals","domAttributeMap","set","setReactiveAttributes","value","useCapture","replace","toLowerCase","slice","addEventListener","tagName","setTimeout","e","style","isValidStyle","processedStyle","key","preprocessStyle","newStyles","cssKey","test","push","join","styleObjectToString","setStyle","FRAGMENT_SYMBOL","Symbol","createElement","type","props","children","fragments","createChildren","map","child","createTextChildren","_a","reactive","createSignalChild","nodeValue","String","flat","text","renderFunction","createNode","element","has","document","createTextNode","createElementNS","is","ref","Ref","HTMLElement","current","elements","rootContainer","rootFragment","effectQueue","processEffectQueue","i","length","runAllEffects","workLoop","deadline","shouldYield","renderNode","pop","timeRemaining","appendChild","requestIdleCallback","fiber","noKey","parent","setCurrentFC","clearCurrentFC","fiberParent","setRenderFunction","createFiber","commitFiber","referenceNode","needCreation","customParent","queueMicrotask","parentElement","replaceChild","_b","insertBefore","parentDom","ToCommitDeletion","commitDeletion","toClearReactiveFunction","reactiveFiberMap","delete","signals","signal","removeDep","clearReactiveFunction","prop","isEvent","eventName","substring","removeEventListener","clearReactiveAttributes","remove","currentFC","fcData","fcMap","get","cleanup","effect","effects","__cleanup","forEach","clearDeps","clear","cleanUpFC","setReactiveFunction","updateFiber","prevFiber","newValue","newFragment","updateNode","replaceRenderFunction","prev","next","replaceChildFromParent","index","startsWith","isProperty","isNew","isGone","deepCompareFibers","fiberA","fiberB","deepEqual","objA","objB","BaseSignal","keysA","keys","keysB","hasOwnProperty","findFirstDom","findLastDom","filter","prevProps","nextProps","updateChildren","firstChild","node","applyFiber","isList","wasList","oldFibers","newFibers","oldMap","findLastChildDom","nextSibling","findParentFiberWithDom","innerHTML","prevLen","newFiber","keyStr","oldFiber","reconcileList","updateNonListChildrenWithKeys","updateNonListChildren","len","Math","max","prevChild","nextChild","at","splice","newLen","count","newMap","newIndex","oldIndex","findNearestParentWithDom","nextKey","isReused","prevKey","isUsedLater","isUsedPreviously","process","env","NODE_ENV","module","exports","scheduled","batch","depset","WeakMap","currentEffect","addSignalToReactiveFunction","add","addSignalToEffect","runEffect","effectCleanup","cleanUpWFiber","cleanUp","constructor","this","MutatingMethods","isNotified","_val","deps","notify","size","dep","cb","updateDomProp","PrimitiveSignal","super","update","newVal","ArraySignal","updateCalled","createProxy","Proxy","target","args","result","apply","ObjectSignal","createInternalArrayProxy","deleteProperty","createSignal","addSignal","bind","fc","getCurrentFC","FC","addEffect","firstRun","promise","Promise","triggerSignal","status","data","error","then","catch","err","importFn","Component","loading","mod","default","load","isValidNode","fallback","errorFallback","container","fragment","createDocumentFragment","rootFiber"],"mappings":"aAAO,SAASA,EAAcC,GAC1B,MACwB,iBAAbA,GACM,OAAbA,IACCC,MAAMC,QAAQF,IAC8B,oBAA7CG,OAAOC,UAAUC,SAASC,KAAKN,EAEvC,CACO,SAASO,EAAYC,GACxB,MACI,CAAC,UAAW,SAAU,SAAU,aAAaC,gBAAgBD,IACrD,OAARA,GACAA,aAAeE,KAEvB,oECdO,MAAMC,EAAgB,6BAChBC,MAAeC,IAAI,CAC5B,MACA,IACA,SACA,WACA,OACA,OACA,UACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,iBACA,eACA,UACA,UACA,UACA,UACA,UACA,iBACA,UACA,UACA,cACA,eACA,WACA,eACA,qBACA,cACA,SACA,eACA,SACA,gBACA,IACA,QACA,OACA,iBACA,SACA,OACA,WACA,OACA,UACA,UACA,WACA,iBACA,OACA,SACA,MACA,OACA,QACA,SACA,SACA,OACA,WACA,QACA,QACA,MACA,SAESC,MAAgBD,IAAI,CAC7B,OACA,UACA,cACA,aACA,WACA,SACA,UACA,QACA,SACA,KACA,aACA,WACA,gBACA,KACA,KACA,QACA,UACA,WACA,QACA,OACA,KACA,YACA,UACA,UACA,SACA,SACA,QACA,QACA,SACA,SACA,OACA,OACA,UACA,SACA,MACA,QACA,MACA,SACA,eAKSE,EAAgB,8BCzGhBC,EACT,oECoBG,SAASC,EACZC,EACAC,EACAC,EACAC,GAEAH,EAAiBI,WAAaH,EAExB,MAAAX,ECeH,SAA2Be,GAC9B,GAAkB,mBAAPA,EACD,MAAA,IAAIb,MAAM,oDAEMc,EAAAD,EAC1B,MAAME,EAASF,IAGR,OAFmBC,EAAA,KAEnBC,CACX,CDxBgBC,CAAkBR,GAC1BV,UAA6C,IAARA,IAI5BmB,EAAAR,EAAMX,EAAKY,EAAKC,GAEzBH,EAAiBU,WEwBT,SAAsBL,EAAcH,GAEhCS,EAAAC,IAAIP,EAAIH,EAC5B,CF1BQW,CAAsBb,EAAkBE,GAChD,CAEA,MAAML,EAAgB,8BAEf,SAASY,EACZR,EACAa,EACAZ,EACAC,GAEA,GAAY,SAARF,EAAJ,CAI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"} \ No newline at end of file diff --git a/build/refract.es.js b/build/refract.es.js index 3644bd0..b857570 100644 --- a/build/refract.es.js +++ b/build/refract.es.js @@ -1,13 +1,14 @@ -function T(e) { - return typeof e == "object" && // Must be an object - e !== null && // Cannot be null - !Array.isArray(e) && // Cannot be an array - Object.prototype.toString.call(e) === "[object Object]"; +function isPlainObject(variable) { + return typeof variable === "object" && // Must be an object + variable !== null && // Cannot be null + !Array.isArray(variable) && // Cannot be an array + Object.prototype.toString.call(variable) === "[object Object]"; } -function _(e) { - return ["boolean", "string", "number", "undefined"].includes(typeof e) || e === null || e instanceof Error; +function isPrimitive(val) { + return ["boolean", "string", "number", "undefined"].includes(typeof val) || val === null || val instanceof Error; } -const ce = "http://www.w3.org/2000/svg", Se = /* @__PURE__ */ new Set([ +const SVG_NAMESPACE = "http://www.w3.org/2000/svg"; +const SVG_TAGS = /* @__PURE__ */ new Set([ "svg", "a", "circle", @@ -67,7 +68,8 @@ const ce = "http://www.w3.org/2000/svg", Se = /* @__PURE__ */ new Set([ "tspan", "use", "view" -]), Fe = /* @__PURE__ */ new Set([ +]); +const MATH_TAGS = /* @__PURE__ */ new Set([ "math", "maction", "maligngroup", @@ -107,789 +109,1094 @@ const ce = "http://www.w3.org/2000/svg", Se = /* @__PURE__ */ new Set([ "mtr", "munder", "munderover" -]), Ce = "http://www.w3.org/1998/Math/MathML", Z = /(PointerCapture)$|Capture$/i, ke = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i; -function Ae(e) { - const t = []; - for (const n in e) { - const r = e[n], o = n.replace(/([A-Z])/g, "-$1").toLowerCase(); - typeof r != "number" || ke.test(o) ? t.push(`${o}: ${r};`) : t.push(`${o}: ${r}px;`); - } - return t.join(" "); -} -function Me(e) { - const t = {}; - for (const n in e) { - const r = e[n]; - if (typeof r == "object" && r !== null) { - console.warn(`Nested styles not allowed for ${n}`); +]); +const MATH_NAMESPACE = "http://www.w3.org/1998/Math/MathML"; +const CAPTURE_REGEX$1 = /(PointerCapture)$|Capture$/i; +const IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i; +function styleObjectToString(style) { + const newStyles = []; + for (const key in style) { + const value = style[key]; + const cssKey = key.replace(/([A-Z])/g, "-$1").toLowerCase(); + if (typeof value != "number" || IS_NON_DIMENSIONAL.test(cssKey)) { + newStyles.push(`${cssKey}: ${value};`); + } else { + newStyles.push(`${cssKey}: ${value}px;`); + } + } + return newStyles.join(" "); +} +function preprocessStyle(style) { + const processedStyle = {}; + for (const key in style) { + const value = style[key]; + if (typeof value === "object" && value !== null) { + console.warn(`Nested styles not allowed for ${key}`); + continue; + } + if (value === null || value === void 0 || value === false || value === "") { continue; } - r == null || r === !1 || r === "" || (t[n] = r); + processedStyle[key] = value; } - return t; + return processedStyle; } -function Pe(e) { - return T(e) || typeof e == "string"; +function isValidStyle(style) { + return isPlainObject(style) || typeof style === "string"; } -function Te(e, t) { - if (!Pe(e)) +function setStyle(style, dom) { + if (!isValidStyle(style)) throw new Error("Style attribute must be a plain object or a string"); - if (typeof e == "string") - t.setAttribute("style", e); - else { - const n = Me(e); - t.setAttribute("style", Ae(n)); - } -} -function Le(e, t, n, r) { - e.__propName = t; - const o = Qe(e); - o == null || o === !1 || (b(t, o, n, r), e.__signals && je(e, n)); -} -const Ne = /(PointerCapture)$|Capture$/i; -function b(e, t, n, r) { - if (e == "style") { - Te(t, n); + if (typeof style === "string") { + dom.setAttribute("style", style); + } else { + const processedStyle = preprocessStyle(style); + dom.setAttribute("style", styleObjectToString(processedStyle)); + } +} +function setReactiveAttribute(reactiveFunction, name, dom, namespace) { + reactiveFunction.__propName = name; + const val = reactiveAttribute(reactiveFunction); + if (val === null || val === void 0 || val === false) { return; } - if (e[0] === "o" && e[1] === "n" && typeof t == "function") { - const o = e != (e = e.replace(Ne, "$1")); - e.toLowerCase() in n || e == "onFocusOut" || e == "onFocusIn" || e === "onGotPointerCapture" || e === "onLostPointerCapture" ? e = e.toLowerCase().slice(2) : e = e.slice(2), n.addEventListener(e, t, o); + setAttribute(name, val, dom, namespace); + if (reactiveFunction.__signals) + setReactiveAttributes(reactiveFunction, dom); +} +const CAPTURE_REGEX = /(PointerCapture)$|Capture$/i; +function setAttribute(name, value, dom, namespace) { + if (name == "style") { + setStyle(value, dom); return; } - if (r === ce) - e = e.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s"); - else if (e !== "width" && e !== "height" && e !== "href" && e !== "list" && e !== "form" && e !== "tabIndex" && e !== "download" && e !== "rowSpan" && e !== "colSpan" && e !== "role" && e !== "popover" && e in n) + if (name[0] === "o" && name[1] === "n" && typeof value === "function") { + const useCapture = name != (name = name.replace(CAPTURE_REGEX, "$1")); + if (name.toLowerCase() in dom || name == "onFocusOut" || name == "onFocusIn" || name === "onGotPointerCapture" || name === "onLostPointerCapture") + name = name.toLowerCase().slice(2); + else name = name.slice(2); + dom.addEventListener(name, value, useCapture); + return; + } + if (namespace === SVG_NAMESPACE) { + name = name.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s"); + } else if (name !== "width" && name !== "height" && name !== "href" && name !== "list" && name !== "form" && name !== "tabIndex" && name !== "download" && name !== "rowSpan" && name !== "colSpan" && name !== "role" && name !== "popover" && name in dom) { try { - e === "value" && n.tagName === "SELECT" ? setTimeout(() => { - n[e] = t ?? ""; - }) : n[e] = t ?? ""; + if (name === "value" && dom.tagName === "SELECT") { + setTimeout(() => { + dom[name] = value == null ? "" : value; + }); + } else { + dom[name] = value == null ? "" : value; + } return; - } catch { + } catch (e) { } - t != null && (t !== !1 || e[4] === "-") && n.setAttribute( - e, - e === "popover" && t === !0 ? "" : t - ); + } + if (value != null && (value !== false || name[4] === "-")) { + dom.setAttribute( + name, + name === "popover" && value === true ? "" : value + ); + } } -const w = Symbol("FRAGMENT"); -function oe(e, t, ...n) { - if (e === "FRAGMENT") { - const r = L(n); - return r[w] = !0, r; +const FRAGMENT_SYMBOL = Symbol("FRAGMENT"); +function createElement(type, props, ...children) { + if (type === "FRAGMENT") { + const fragments = createChildren(children); + fragments[FRAGMENT_SYMBOL] = true; + return fragments; } return { - type: e, + type, props: { - ...t, - children: L(n) + ...props, + children: createChildren(children) } }; } -function L(e) { - return e.map((t) => { - if (typeof t == "object") { - if (Array.isArray(t)) - return L(t); - if (t === null) - return B(""); - if (!t.type || !t.props) +function createChildren(children) { + return children.map((child) => { + if (typeof child === "object") { + if (Array.isArray(child)) { + return createChildren(child); + } + if (child === null) { + return createTextChildren(""); + } + if (!child.type || !child.props) { throw new Error( - "Invalid type for a dom node, found " + t + "Invalid type for a dom node, found " + child ); - return t; - } else if (typeof t == "function") { - const n = Je(t); - if (_(n)) - return j( + } + return child; + } else if (typeof child === "function") { + const val = reactive(child); + if (isPrimitive(val)) { + return createSignalChild( "TEXT_CHILD", { - nodeValue: n != null && n !== !1 ? String(n) : "", + nodeValue: val !== void 0 && val !== null && val !== false ? String(val) : "", children: [] }, - t + child ); - if (Array.isArray(n)) { - const r = n[w]; - return j( + } else if (Array.isArray(val)) { + const isFragment = val[FRAGMENT_SYMBOL]; + return createSignalChild( "FRAGMENT", - { children: r ? n : L(n) }, - t + { children: isFragment ? val : createChildren(val) }, + child ); - } else if (!n.type || !n.props) + } else if (!val.type || !val.props) { throw new Error( - "Invalid type for a dom node, found " + n + "Invalid type for a dom node, found " + val ); - return j(n.type, n.props, t); - } else - return B(t); + } + return createSignalChild(val.type, val.props, child); + } else { + return createTextChildren(child); + } }).flat(); } -function B(e) { +function createTextChildren(text) { return { type: "TEXT_CHILD", props: { - nodeValue: e != null && e !== !1 ? String(e) : "", + nodeValue: text !== null && text !== void 0 && text !== false ? String(text) : "", children: [] } }; } -function j(e, t, n) { +function createSignalChild(type, props, renderFunction) { return { - type: e, - renderFunction: n, - props: t + type, + renderFunction, + props }; } -function Re(e) { - return e !== "children" && e !== "key" && e !== "ref"; +function isProperty$1(key) { + return key !== "children" && key !== "key" && key !== "ref"; } -function ue(e) { - let t = null; - Se.has(e.type) ? t = ce : Fe.has(e.type) && (t = Ce); - const n = e.type === "TEXT_CHILD" ? document.createTextNode("") : t ? document.createElementNS( - t, +function createNode(element) { + let namespace = null; + if (SVG_TAGS.has(element.type)) namespace = SVG_NAMESPACE; + else if (MATH_TAGS.has(element.type)) namespace = MATH_NAMESPACE; + const dom = element.type === "TEXT_CHILD" ? document.createTextNode("") : namespace ? document.createElementNS( + namespace, // @ts-expect-error - e.type, - e.props.is && e.props + element.type, + element.props.is && element.props ) : ( // @ts-expect-error - document.createElement(e.type) + document.createElement(element.type) ); - if (!e.props) return n; - e.props.ref && e.props.ref instanceof re && n instanceof HTMLElement && (e.props.ref.current = n); - for (const r in e.props) { - if (!Re(r)) + if (!element.props) return dom; + if (element.props.ref && element.props.ref instanceof Ref && dom instanceof HTMLElement) { + element.props.ref.current = dom; + } + for (const name in element.props) { + if (!isProperty$1(name)) { continue; - const o = e.props[r]; - typeof o == "function" && r[0] !== "o" && r[1] !== "n" ? Le(o, r, n, t) : b(r, o, n, t); + } + const value = element.props[name]; + if (typeof value === "function" && name[0] !== "o" && name[1] !== "n") { + setReactiveAttribute(value, name, dom, namespace); + } else { + setAttribute(name, value, dom, namespace); + } } - return n; + return dom; } -function De(e, t, n) { - n == null || e === "key" || b(e, n, t); +function updateDomProp(prop, dom, value) { + if (value == null || prop === "key") return; + setAttribute(prop, value, dom); } -function be(e, t) { - x = t; - const n = document.createDocumentFragment(); - v = n; - const r = { +function render(element, container) { + rootContainer = container; + const fragment = document.createDocumentFragment(); + rootFragment = fragment; + const rootFiber = { type: "div", props: { - children: [e] + children: [element] }, // @ts-expect-error - dom: n + dom: fragment }; - e.parent = r, F.push(e), requestIdleCallback(fe); + element.parent = rootFiber; + elements.push(element); + requestIdleCallback(workLoop); } -function Ie() { - v && x && x.appendChild(v); -} -let F = [], x = null, v = null, G = []; -function ie() { - for (let e = 0; e < G.length; e++) { - const t = G[e]; - Ee(t); +function commitRootFragment() { + if (rootFragment && rootContainer) { + rootContainer.appendChild(rootFragment); } - G.length = 0; } -function fe(e) { - ie(); - let t = !1; - for (; F.length > 0 && !t; ) { - const n = F.pop(); - Ge(n), t = e.timeRemaining() < 1; +let elements = []; +let rootContainer = null; +let rootFragment = null; +let effectQueue = []; +function processEffectQueue() { + for (let i = 0; i < effectQueue.length; i++) { + const fiber = effectQueue[i]; + runAllEffects(fiber); + } + effectQueue.length = 0; +} +function workLoop(deadline) { + processEffectQueue(); + let shouldYield = false; + while (elements.length > 0 && !shouldYield) { + const element = elements.pop(); + renderNode(element); + shouldYield = deadline.timeRemaining() < 1; } - if (F.length == 0) { - Ie(), ie(); + if (elements.length == 0) { + commitRootFragment(); + processEffectQueue(); return; } - requestIdleCallback(fe); -} -function Ge(e) { - var t; - if (e.type === "FRAGMENT") { - const n = !e.props.children[w]; - let r = !1; - for (let o = e.props.children.length - 1; o >= 0; o--) - e.props.children[o].parent = e, n && e.props.children[o].props.key === void 0 && e.renderFunction && (r = !0), F.push(e.props.children[o]); - r && console.error("Array children must have a key attribute"); - } else if (typeof e.type == "function") { - ge(e); - const n = e.type(e.props); - if (me(), Array.isArray(n)) { - for (let r = n.length - 1; r >= 0; r--) - n[r].parent = e, F.push(n[r]); - e.props.children = n; - } else - n.parent = e, e.props.children.push(n), F.push(n); - G.push(e); + requestIdleCallback(workLoop); +} +function renderNode(fiber) { + var _a; + if (fiber.type === "FRAGMENT") { + const isArray = !fiber.props.children[FRAGMENT_SYMBOL]; + let noKey = false; + for (let i = fiber.props.children.length - 1; i >= 0; i--) { + fiber.props.children[i].parent = fiber; + if (isArray && fiber.props.children[i].props.key === void 0 && fiber.renderFunction) { + noKey = true; + } + elements.push(fiber.props.children[i]); + } + if (noKey) { + console.error("Array children must have a key attribute"); + } + } else if (typeof fiber.type === "function") { + setCurrentFC(fiber); + const children = fiber.type(fiber.props); + clearCurrentFC(); + if (Array.isArray(children)) { + for (let i = children.length - 1; i >= 0; i--) { + children[i].parent = fiber; + elements.push(children[i]); + } + fiber.props.children = children; + } else { + children.parent = fiber; + fiber.props.children.push(children); + elements.push(children); + } + effectQueue.push(fiber); } else { - e.dom || (e.dom = ue(e)); - let n = e.parent; - for (; n && !n.dom; ) - n = n.parent; - n && ((t = n.dom) == null || t.appendChild(e.dom)); - for (let r = e.props.children.length - 1; r >= 0; r--) - e.props.children[r].parent = e, F.push(e.props.children[r]); - } - z(e); -} -function C(e) { - if (e.type === "FRAGMENT") - if (e.props.children[w]) - for (const n of e.props.children) - n.parent = e, C(n); - else { - let n = !1; - for (const r of e.props.children) - r.parent = e, r.props.key === void 0 && (n = !0), C(r); - n && console.error("Array children must have a key attribute"); - } - else if (typeof e.type != "function") - for (const t of e.props.children) - t.parent = e, C(t); - z(e); -} -function h(e, t, n, r, o) { - var l, i; - if (e.type === "FRAGMENT") - for (const s of e.props.children) - r && (s.parent = e), h( - s, - t, - n, - r, - o + if (!fiber.dom) fiber.dom = createNode(fiber); + let fiberParent = fiber.parent; + while (fiberParent && !fiberParent.dom) { + fiberParent = fiberParent.parent; + } + if (fiberParent) { + (_a = fiberParent.dom) == null ? void 0 : _a.appendChild(fiber.dom); + } + for (let i = fiber.props.children.length - 1; i >= 0; i--) { + fiber.props.children[i].parent = fiber; + elements.push(fiber.props.children[i]); + } + } + setRenderFunction(fiber); +} +function createFiber(fiber) { + if (fiber.type === "FRAGMENT") { + const isFragment = fiber.props.children[FRAGMENT_SYMBOL]; + if (isFragment) { + for (const child of fiber.props.children) { + child.parent = fiber; + createFiber(child); + } + } else { + let noKey = false; + for (const child of fiber.props.children) { + child.parent = fiber; + if (child.props.key === void 0) { + noKey = true; + } + createFiber(child); + } + if (noKey) { + console.error("Array children must have a key attribute"); + } + } + } else if (typeof fiber.type !== "function") { + for (const child of fiber.props.children) { + child.parent = fiber; + createFiber(child); + } + } + setRenderFunction(fiber); +} +function commitFiber(fiber, referenceNode, replace, needCreation, customParent) { + var _a, _b; + if (fiber.type === "FRAGMENT") { + for (const child of fiber.props.children) { + if (needCreation) child.parent = fiber; + commitFiber( + child, + referenceNode, + replace, + needCreation, + customParent ); - else if (typeof e.type == "function") { - ge(e); - const s = e.type(e.props); - if (me(), Array.isArray(s)) { - for (const a of s) - a.parent = e, h(a, t, n, !0, o); - e.props.children = s; - } else - s.parent = e, e.props.children.push(s), h(s, t, n, !0, o); + } + } else if (typeof fiber.type === "function") { + setCurrentFC(fiber); + const children = fiber.type(fiber.props); + clearCurrentFC(); + if (Array.isArray(children)) { + for (const child of children) { + child.parent = fiber; + commitFiber(child, referenceNode, replace, true, customParent); + } + fiber.props.children = children; + } else { + children.parent = fiber; + fiber.props.children.push(children); + commitFiber(children, referenceNode, replace, true, customParent); + } queueMicrotask(() => { - Ee(e); + runAllEffects(fiber); }); } else { - if (e.dom || (e.dom = ue(e)), t) - n ? (l = t.parentElement) == null || l.replaceChild( - e.dom, - t - ) : (i = t.parentElement) == null || i.insertBefore( - e.dom, - t - ); - else { - let s; - if (o) - s = o; - else { - let a = e.parent; - for (; a && !a.dom; ) - a = a.parent; - s = a == null ? void 0 : a.dom; + if (!fiber.dom) fiber.dom = createNode(fiber); + if (referenceNode) { + if (replace) + (_a = referenceNode.parentElement) == null ? void 0 : _a.replaceChild( + fiber.dom, + referenceNode + ); + else + (_b = referenceNode.parentElement) == null ? void 0 : _b.insertBefore( + fiber.dom, + referenceNode + ); + } else { + let parentDom = void 0; + if (customParent) { + parentDom = customParent; + } else { + let fiberParent = fiber.parent; + while (fiberParent && !fiberParent.dom) { + fiberParent = fiberParent.parent; + } + parentDom = fiberParent == null ? void 0 : fiberParent.dom; } - s == null || s.appendChild(e.dom); - } - for (const s of e.props.children) - r && (s.parent = e), h(s, void 0, void 0, r, e.dom); - } - r && z(e); -} -let O = !0; -function g(e, t) { - if (!(!e || !O)) { - if (e.renderFunction && (t && Ke(e.renderFunction), delete e.renderFunction), e.dom) { - for (const n in e.props) - if ($(n)) { - let r = n.toLowerCase().substring(2); - const o = r != (r = r.replace(Z, "$1")); - e.dom.removeEventListener( - r, - e.props[n], - o - ), delete e.props[n]; - } else typeof e.props[n] == "function" ? qe(e.props[n]) : n === "ref" && e.props[n] instanceof re && (e.props[n].current = null); - e.dom.remove(); - } - typeof e.type == "function" && (ve(e, e.props), delete e.type), e.props.children.forEach((n) => g(n, !0)); - } -} -function z(e) { - e.renderFunction && ze(e.renderFunction, e); -} -function pe(e, t) { - if (_(t)) { - const n = { - ...B(t), - parent: e.parent + parentDom == null ? void 0 : parentDom.appendChild(fiber.dom); + } + for (const child of fiber.props.children) { + if (needCreation) child.parent = fiber; + commitFiber(child, void 0, void 0, needCreation, fiber.dom); + } + } + if (needCreation) { + setRenderFunction(fiber); + } +} +let ToCommitDeletion = true; +function commitDeletion(fiber, toClearReactiveFunction) { + if (!fiber || !ToCommitDeletion) return; + if (fiber.renderFunction) { + if (toClearReactiveFunction) + clearReactiveFunction(fiber.renderFunction); + delete fiber.renderFunction; + } + if (fiber.dom) { + for (const prop in fiber.props) { + if (isEvent(prop)) { + let eventName = prop.toLowerCase().substring(2); + const useCapture = eventName != (eventName = eventName.replace(CAPTURE_REGEX$1, "$1")); + fiber.dom.removeEventListener( + eventName, + fiber.props[prop], + useCapture + ); + delete fiber.props[prop]; + } else if (typeof fiber.props[prop] === "function") { + clearReactiveAttributes(fiber.props[prop]); + } else if (prop === "ref" && fiber.props[prop] instanceof Ref) { + fiber.props[prop].current = null; + } + } + fiber.dom.remove(); + } + if (typeof fiber.type === "function") { + cleanUpFC(fiber, fiber.props); + delete fiber.type; + } + fiber.props.children.forEach((child) => commitDeletion(child, true)); +} +function setRenderFunction(fiber) { + if (!fiber.renderFunction) return; + setReactiveFunction(fiber.renderFunction, fiber); +} +function updateFiber(prevFiber, newValue) { + if (isPrimitive(newValue)) { + const newFragment = { + ...createTextChildren(newValue), + parent: prevFiber.parent }; - C(n), E(e, n); - } else if (Array.isArray(t)) { - const r = { + createFiber(newFragment); + updateNode(prevFiber, newFragment); + } else if (Array.isArray(newValue)) { + const isFragment = newValue[FRAGMENT_SYMBOL]; + const newFragment = { type: "FRAGMENT", props: { - children: t[w] ? t : L(t) + children: isFragment ? newValue : createChildren(newValue) }, - parent: e.parent + parent: prevFiber.parent }; - C(r), E(e, r); + createFiber(newFragment); + updateNode(prevFiber, newFragment); } else { - const n = { ...t, parent: e.parent }; - C(n), E(e, n); + const newFragment = { ...newValue, parent: prevFiber.parent }; + createFiber(newFragment); + updateNode(prevFiber, newFragment); } } -function D(e, t) { - e.renderFunction && (t.renderFunction = e.renderFunction, z(t)); +function replaceRenderFunction(prev, next) { + if (prev.renderFunction) { + next.renderFunction = prev.renderFunction; + setRenderFunction(next); + } } -function I(e, t, n) { - var r; - if (n !== void 0) { - e.parent.props.children[n] = t; +function replaceChildFromParent(prev, next, index) { + var _a; + if (index !== void 0) { + prev.parent.props.children[index] = next; return; } - (r = e.parent) == null || r.props.children.forEach((o, l) => { - o === e && (e.parent.props.children[l] = t); + (_a = prev.parent) == null ? void 0 : _a.props.children.forEach((child, i) => { + if (child === prev) { + prev.parent.props.children[i] = next; + } }); } -const $ = (e) => e.startsWith("on") || e == "onFocusOut" || e == "onFocusIn", se = (e) => e !== "children" && !$(e) && e !== "key" && e !== "ref", q = (e, t, n) => e[n] !== t[n], Oe = (e, t, n) => !(n in t); -function de(e, t) { - var n, r; - return e === t ? !0 : e.type !== t.type || ((n = e.props) == null ? void 0 : n.key) !== ((r = t.props) == null ? void 0 : r.key) ? !1 : P(e.props, t.props); -} -function P(e, t) { - if (e === t) { - if (e instanceof N && t instanceof N) - return P(e.value, t.value); - if (Array.isArray(e) && Array.isArray(t)) { - if (e.length !== t.length) return !1; - for (let o = 0; o < e.length; o++) - if (!P(e[o], t[o])) return !1; - } - return !0; - } - if (_(e) && _(t)) - return e === t; - if (typeof e != typeof t) return !1; - const n = Object.keys(e), r = Object.keys(t); - if (n.length !== r.length) return !1; - for (let o of n) - if (o !== "children" && (!t.hasOwnProperty(o) || !P(e[o], t[o]))) - return !1; - return !0; -} -function he(e) { - if (e) { - if (e.dom) return e.dom; - for (const t of e.props.children) { - const n = he(t); - if (n) return n; - } - } -} -function ee(e) { - if (e) { - if (e.dom) return e.dom; - for (let t = e.props.children.length - 1; t >= 0; t--) { - const n = e.props.children[t], r = ee(n); - if (r) return r; - } - } -} -function $e(e) { - if (e) - for (let t = e.props.children.length - 1; t >= 0; t--) { - const n = e.props.children[t], r = ee(n); - if (r) return r; - } -} -function He(e) { - if (!e) return; - let t = e.parent; - for (; t && !t.dom; ) - t = t.parent; - return t; -} -function We(e) { - if (!e) return; - if (e.dom) return e; - let t = e.parent; - for (; t && !t.dom; ) - t = t.parent; - return t; -} -function E(e, t, n) { - if (!(!e && !t)) { - if (e && !t) - g(e, !0), e.parent.props.children = e.parent.props.children.filter( - (r) => r !== e - ); - else if (e && t) { - const r = e.props, o = t.props; - if (e.type === "FRAGMENT" || typeof e.type == "function") - if (t.type === "FRAGMENT" || typeof t.type == "function") - typeof e.type == typeof t.type && typeof e.type == "function" ? de(e, t) || (h(t, he(e), void 0, !0), D(e, t), g(e), I(e, t, n)) : le(e, t); - else { - t.parent = e.parent; - let l = e.props.children[0]; - for (; l && !l.dom; ) - l = l.props.children[0]; - h(t, l == null ? void 0 : l.dom), D(e, t), g(e), I(e, t, n); +const isEvent = (key) => key.startsWith("on") || key == "onFocusOut" || key == "onFocusIn"; +const isProperty = (key) => key !== "children" && !isEvent(key) && key !== "key" && key !== "ref"; +const isNew = (prev, next, key) => prev[key] !== next[key]; +const isGone = (prev, next, key) => !(key in next); +function deepCompareFibers(fiberA, fiberB) { + var _a, _b; + if (fiberA === fiberB) { + return true; + } + if (fiberA.type !== fiberB.type) { + return false; + } + if (((_a = fiberA.props) == null ? void 0 : _a.key) !== ((_b = fiberB.props) == null ? void 0 : _b.key)) { + return false; + } + return deepEqual(fiberA.props, fiberB.props); +} +function deepEqual(objA, objB) { + if (objA === objB) { + if (objA instanceof BaseSignal && objB instanceof BaseSignal) + return deepEqual(objA.value, objB.value); + if (Array.isArray(objA) && Array.isArray(objB)) { + if (objA.length !== objB.length) return false; + for (let i = 0; i < objA.length; i++) { + if (!deepEqual(objA[i], objB[i])) return false; + } + } + return true; + } + if (isPrimitive(objA) && isPrimitive(objB)) { + return objA === objB; + } + if (typeof objA !== typeof objB) return false; + const keysA = Object.keys(objA); + const keysB = Object.keys(objB); + if (keysA.length !== keysB.length) return false; + for (let key of keysA) { + if (key === "children") continue; + if (!objB.hasOwnProperty(key)) return false; + if (!deepEqual(objA[key], objB[key])) return false; + } + return true; +} +function findFirstDom(fiber) { + if (!fiber) return; + if (fiber.dom) return fiber.dom; + for (const child of fiber.props.children) { + const dom = findFirstDom(child); + if (dom) return dom; + } +} +function findLastDom(fiber) { + if (!fiber) return; + if (fiber.dom) return fiber.dom; + for (let i = fiber.props.children.length - 1; i >= 0; i--) { + const child = fiber.props.children[i]; + const dom = findLastDom(child); + if (dom) return dom; + } +} +function findLastChildDom(fiber) { + if (!fiber) return; + for (let i = fiber.props.children.length - 1; i >= 0; i--) { + const child = fiber.props.children[i]; + const dom = findLastDom(child); + if (dom) return dom; + } +} +function findParentFiberWithDom(fiber) { + if (!fiber) return; + let fiberParent = fiber.parent; + while (fiberParent && !fiberParent.dom) { + fiberParent = fiberParent.parent; + } + return fiberParent; +} +function findNearestParentWithDom(fiber) { + if (!fiber) return; + if (fiber.dom) return fiber; + let fiberParent = fiber.parent; + while (fiberParent && !fiberParent.dom) { + fiberParent = fiberParent.parent; + } + return fiberParent; +} +function updateNode(prev, next, index) { + if (!prev && !next) return; + if (prev && !next) { + commitDeletion(prev, true); + prev.parent.props.children = prev.parent.props.children.filter( + (child) => child !== prev + ); + } else if (prev && next) { + const prevProps = prev.props; + const nextProps = next.props; + if (prev.type === "FRAGMENT" || typeof prev.type === "function") { + if (next.type === "FRAGMENT" || typeof next.type === "function") { + if (typeof prev.type === typeof next.type && typeof prev.type === "function") { + const areSame = deepCompareFibers(prev, next); + if (!areSame) { + commitFiber(next, findFirstDom(prev), void 0, true); + replaceRenderFunction(prev, next); + commitDeletion(prev); + replaceChildFromParent(prev, next, index); + } + } else { + updateChildren(prev, next); } - else { - const l = e.dom; - if (e.type === "TEXT_CHILD" && t.type === "TEXT_CHILD" && !t.dom && (t.dom = e.dom), l === void 0) - return; - if (t.type === "FRAGMENT" || typeof t.type == "function") - t.parent = e.parent, D(e, t), h(t, l), g(e), I(e, t, n); - else { - for (const i in r) - if (se(i) && Oe(r, o, i)) - l[i] = ""; - else if ($(i) && (!(i in o) || q(r, o, i))) { - let s = i.toLowerCase().substring(2); - const a = s != (s = s.replace( - Z, + } else { + next.parent = prev.parent; + let firstChild = prev.props.children[0]; + while (firstChild && !firstChild.dom) + firstChild = firstChild.props.children[0]; + commitFiber(next, firstChild == null ? void 0 : firstChild.dom); + replaceRenderFunction(prev, next); + commitDeletion(prev); + replaceChildFromParent(prev, next, index); + } + } else { + const node = prev.dom; + if (prev.type === "TEXT_CHILD" && next.type === "TEXT_CHILD" && !next.dom) + next.dom = prev.dom; + if (node === void 0) { + return; + } + if (next.type === "FRAGMENT" || typeof next.type === "function") { + next.parent = prev.parent; + replaceRenderFunction(prev, next); + commitFiber(next, node); + commitDeletion(prev); + replaceChildFromParent(prev, next, index); + } else { + for (const prop in prevProps) { + if (isProperty(prop) && isGone(prevProps, nextProps, prop)) { + node[prop] = ""; + } else if (isEvent(prop) && (!(prop in nextProps) || isNew(prevProps, nextProps, prop))) { + let eventName = prop.toLowerCase().substring(2); + const useCapture = eventName != (eventName = eventName.replace( + CAPTURE_REGEX$1, + "$1" + )); + node.removeEventListener( + eventName, + prevProps[prop], + useCapture + ); + } + } + if (prev.type !== next.type) { + next.parent = prev.parent; + replaceRenderFunction(prev, next); + commitFiber(next, node, true); + commitDeletion(prev); + replaceChildFromParent(prev, next, index); + } else { + for (const prop in nextProps) { + if (isProperty(prop) && isNew(prevProps, nextProps, prop)) { + node[prop] = nextProps[prop]; + prevProps[prop] = nextProps[prop]; + } else if (isEvent(prop) && isNew(prevProps, nextProps, prop)) { + let eventName = prop.toLowerCase().substring(2); + const useCapture = eventName != (eventName = eventName.replace( + CAPTURE_REGEX$1, "$1" )); - l.removeEventListener( - s, - r[i], - a + node.addEventListener( + eventName, + nextProps[prop], + useCapture ); + prevProps[prop] = nextProps[prop]; } - if (e.type !== t.type) - t.parent = e.parent, D(e, t), h(t, l, !0), g(e), I(e, t, n); - else { - for (const i in o) - if (se(i) && q(r, o, i)) - l[i] = o[i], r[i] = o[i]; - else if ($(i) && q(r, o, i)) { - let s = i.toLowerCase().substring(2); - const a = s != (s = s.replace( - Z, - "$1" - )); - l.addEventListener( - s, - o[i], - a - ), r[i] = o[i]; - } - le(e, t); } + updateChildren(prev, next); } } } } } -function Xe(e, t) { - var a; - const n = e.props.children, r = t.props.children, o = {}; - for (let c = 0; c < n.length; c++) { - const u = n[c].props.key; - if (u == null || o.hasOwnProperty(String(u))) - return !1; - o[String(u)] = n[c]; +function reconcileList(prev, next) { + var _a; + const oldFibers = prev.props.children; + const newFibers = next.props.children; + const oldMap = {}; + for (let i = 0; i < oldFibers.length; i++) { + const key = oldFibers[i].props.key; + if (key === null || key === void 0 || oldMap.hasOwnProperty(String(key))) { + return false; + } + oldMap[String(key)] = oldFibers[i]; } - const l = (a = $e(e)) == null ? void 0 : a.nextSibling, i = He(e); - if (r.length === 0) { - e.props.children.length = 0, (i == null ? void 0 : i.dom) instanceof HTMLElement && (i.dom.innerHTML = ""); + const referenceNode = (_a = findLastChildDom(prev)) == null ? void 0 : _a.nextSibling; + const fiberParent = findParentFiberWithDom(prev); + if (newFibers.length === 0) { + prev.props.children.length = 0; + if ((fiberParent == null ? void 0 : fiberParent.dom) instanceof HTMLElement) + fiberParent.dom.innerHTML = ""; return; } - const s = e.props.children.length; - for (let c = 0; c < r.length; c++) { - const u = r[c], R = u.props.key, m = String(R); - if (o.hasOwnProperty(m)) { - const k = o[m]; - s > c ? e.props.children[c] = k : e.props.children.push(k), delete o[m]; - const A = t.props.children[c]; - A && (A.parent = e), E(k, A, c), M( - e.props.children[c], - i == null ? void 0 : i.dom, - l + const prevLen = prev.props.children.length; + for (let i = 0; i < newFibers.length; i++) { + const newFiber = newFibers[i]; + const key = newFiber.props.key; + const keyStr = String(key); + if (oldMap.hasOwnProperty(keyStr)) { + const oldFiber = oldMap[keyStr]; + if (prevLen > i) prev.props.children[i] = oldFiber; + else prev.props.children.push(oldFiber); + delete oldMap[keyStr]; + const newFiber2 = next.props.children[i]; + if (newFiber2) newFiber2.parent = prev; + updateNode(oldFiber, newFiber2, i); + applyFiber( + prev.props.children[i], + fiberParent == null ? void 0 : fiberParent.dom, + referenceNode ); - } else - s > c ? e.props.children[c] = u : e.props.children.push(u), u.parent = e, h( - u, - l, - !1, - !1, - i == null ? void 0 : i.dom + } else { + if (prevLen > i) prev.props.children[i] = newFiber; + else prev.props.children.push(newFiber); + newFiber.parent = prev; + commitFiber( + newFiber, + referenceNode, + false, + false, + fiberParent == null ? void 0 : fiberParent.dom ); + } + } + for (const key in oldMap) { + if (oldMap.hasOwnProperty(key)) { + const fiber = oldMap[key]; + commitDeletion(fiber, true); + } + } + while (prev.props.children.length > next.props.children.length) { + prev.props.children.pop(); } - for (const c in o) - if (o.hasOwnProperty(c)) { - const u = o[c]; - g(u, !0); - } - for (; e.props.children.length > t.props.children.length; ) - e.props.children.pop(); -} -function M(e, t, n) { - if (e.dom) { - if (e.dom === t || e.dom === n) return; - n ? t.insertBefore(e.dom, n) : t.appendChild(e.dom); - } else - for (const r of e.props.children) - M(r, t, n); -} -function le(e, t) { - const n = t.type === "FRAGMENT" && !t.props.children[w], r = e.type === "FRAGMENT" && !e.props.children[w]; - n && r ? Xe(e, t) === !1 && ae(e, t) : ae(e, t), t.type === "FRAGMENT" && t.props.children[w] ? e.props.children[w] = !0 : e.props.children[w] = !1, e.type = t.type; -} -function K(e, t) { - var r; - let n = Math.max(e.props.children.length, t.props.children.length); - for (let o = 0; o < n; o++) { - let l = e.props.children[o], i = t.props.children[o]; - if (i && (i.parent = e), !l && i) - h( - i, +} +function applyFiber(fiber, parent, referenceNode) { + if (fiber.dom) { + if (fiber.dom === parent || fiber.dom === referenceNode) return; + if (referenceNode) { + parent.insertBefore(fiber.dom, referenceNode); + } else parent.appendChild(fiber.dom); + } else { + for (const child of fiber.props.children) { + applyFiber(child, parent, referenceNode); + } + } +} +function updateChildren(prev, next) { + const isList = next.type === "FRAGMENT" && !next.props.children[FRAGMENT_SYMBOL]; + const wasList = prev.type === "FRAGMENT" && !prev.props.children[FRAGMENT_SYMBOL]; + if (isList && wasList) { + const result = reconcileList(prev, next); + if (result === false) { + updateNonListChildrenWithKeys(prev, next); + } + } else { + updateNonListChildrenWithKeys(prev, next); + } + if (next.type === "FRAGMENT" && next.props.children[FRAGMENT_SYMBOL]) { + prev.props.children[FRAGMENT_SYMBOL] = true; + } else { + prev.props.children[FRAGMENT_SYMBOL] = false; + } + prev.type = next.type; +} +function updateNonListChildren(prev, next) { + var _a; + let len = Math.max(prev.props.children.length, next.props.children.length); + for (let i = 0; i < len; i++) { + let prevChild = prev.props.children[i]; + let nextChild = next.props.children[i]; + if (nextChild) nextChild.parent = prev; + if (!prevChild && nextChild) { + commitFiber( + nextChild, // @ts-expect-error - (r = ee(e.props.children.at(-1))) == null ? void 0 : r.nextSibling - ), e.props.children.push(i); - else if (!i && l) - g(l, !0), e.props.children.splice(o, 1), n = e.props.children.length, o--; - else { - E(l, i, o); - const s = Math.max( - e.props.children.length, - t.props.children.length + (_a = findLastDom(prev.props.children.at(-1))) == null ? void 0 : _a.nextSibling ); - s < n && (n = s, o--); + prev.props.children.push(nextChild); + } else if (!nextChild && prevChild) { + commitDeletion(prevChild, true); + prev.props.children.splice(i, 1); + len = prev.props.children.length; + i--; + } else { + updateNode(prevChild, nextChild, i); + const newLen = Math.max( + prev.props.children.length, + next.props.children.length + ); + if (newLen < len) { + len = newLen; + i--; + } } } } -function ae(e, t) { - let n = Math.max(e.props.children.length, t.props.children.length); - const r = {}; - let o = 0; - for (let s = 0; s < e.props.children.length; s++) { - const a = e.props.children[s].props.key; - if (a != null) { - if (o++, r.hasOwnProperty(String(a))) { - console.warn("Found two children with the same key", a), console.warn( - "When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation" - ), K(e, t); - return; - } - r[String(a)] = { fiber: e.props.children[s], index: s }; +function updateNonListChildrenWithKeys(prev, next) { + let len = Math.max(prev.props.children.length, next.props.children.length); + const oldMap = {}; + let count = 0; + for (let i = 0; i < prev.props.children.length; i++) { + const key = prev.props.children[i].props.key; + if (key === null || key === void 0) { + continue; } + count++; + if (oldMap.hasOwnProperty(String(key))) { + console.warn("Found two children with the same key", key); + console.warn( + "When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation" + ); + updateNonListChildren(prev, next); + return; + } + oldMap[String(key)] = { fiber: prev.props.children[i], index: i }; } - if (o == 0) { - K(e, t); + if (count == 0) { + updateNonListChildren(prev, next); return; } - const l = {}; - for (let s = 0; s < t.props.children.length; s++) { - const a = t.props.children[s].props.key; - if (a == null) + const newMap = {}; + for (let i = 0; i < next.props.children.length; i++) { + const key = next.props.children[i].props.key; + if (key === null || key === void 0) { continue; - const c = r[String(a)]; - if (c) { - if (l.hasOwnProperty(String(a))) { - console.warn("Found two children with the same key", a), console.warn( + } + const oldFiber = oldMap[String(key)]; + if (oldFiber) { + if (newMap.hasOwnProperty(String(key))) { + console.warn("Found two children with the same key", key); + console.warn( "When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation" - ), K(e, t); + ); + updateNonListChildren(prev, next); return; } - l[String(a)] = { - fiber: c.fiber, - newIndex: s, - oldIndex: c.index + newMap[String(key)] = { + fiber: oldFiber.fiber, + newIndex: i, + oldIndex: oldFiber.index }; } } - const i = We(e); - for (let s = 0; s < n; s++) { - let a = e.props.children[s], c = t.props.children[s]; - const u = c != null && c.props.key ? String(c.props.key) : "", R = l.hasOwnProperty(u); - let m = a != null && a.props.key ? String(a.props.key) : ""; - if (m && u && m === u) { - E(a, c, s), i != null && i.dom && M(e.props.children[s], i.dom); + const parent = findNearestParentWithDom(prev); + for (let i = 0; i < len; i++) { + let prevChild = prev.props.children[i]; + let nextChild = next.props.children[i]; + const nextKey = (nextChild == null ? void 0 : nextChild.props.key) ? String(nextChild.props.key) : ""; + const isReused = newMap.hasOwnProperty(nextKey); + let prevKey = (prevChild == null ? void 0 : prevChild.props.key) ? String(prevChild.props.key) : ""; + if (prevKey && nextKey && prevKey === nextKey) { + updateNode(prevChild, nextChild, i); + if (parent == null ? void 0 : parent.dom) applyFiber(prev.props.children[i], parent.dom); continue; } - const k = l.hasOwnProperty(m) && l[m].newIndex > s, A = l.hasOwnProperty(m) && l[m].newIndex < s; - if ((k || A) && (O = !1), c && (c.parent = e), !a && c) - if (R) { - const { fiber: S } = l[u]; - e.props.children.push(S), E(S, c, s), i != null && i.dom && M(e.props.children[s], i.dom); - } else - i != null && i.dom && h(c, void 0, !1, !1, i.dom), e.props.children.push(c); - else if (!c && a) - g(a, !0), e.props.children.splice(s, 1), n = e.props.children.length, s--; - else if (R) { - const { fiber: S } = l[u]; - g(a, !0), O = !0, e.props.children[s] = S, E(S, c, s), i != null && i.dom && M(e.props.children[s], i.dom); - } else if (k || A) - i != null && i.dom && h( - c, - void 0, - !1, - !1, - i.dom - ), e.props.children[s] = c; - else { - E(a, c, s), i != null && i.dom && M(e.props.children[s], i.dom); - const S = Math.max( - e.props.children.length, - t.props.children.length - ); - S < n && (n = S, s--); - } - O = !0; - } -} -typeof process < "u" && process.env.NODE_ENV === "test" && (module.exports = { - createFiber: C, - commitDeletion: g, - commitFiber: h, - updateFiber: pe, - deepCompareFibers: de, - deepEqual: P -}); -let J = !1; -const Q = /* @__PURE__ */ new Set(), Y = /* @__PURE__ */ new Set(), H = /* @__PURE__ */ new WeakMap(), W = /* @__PURE__ */ new WeakMap(); -function Ue(e) { - Q.add(e), J || (J = !0, queueMicrotask(() => { - Q.forEach((t) => { - const n = t(); - if (Y.has(n)) - return; - Y.add(n), n.__cleanup && typeof n.__cleanup == "function" && (n.__cleanup(), n.__cleanup = null); - const r = n(); - if (typeof r == "function" && (n.__cleanup = r), H.has(n)) { - const o = H.get(n); - o && pe(o, r); + const isUsedLater = newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex > i; + const isUsedPreviously = newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex < i; + if (isUsedLater || isUsedPreviously) { + ToCommitDeletion = false; + } + if (nextChild) nextChild.parent = prev; + if (!prevChild && nextChild) { + if (isReused) { + const { fiber } = newMap[nextKey]; + prev.props.children.push(fiber); + updateNode(fiber, nextChild, i); + if (parent == null ? void 0 : parent.dom) applyFiber(prev.props.children[i], parent.dom); + } else { + if (parent == null ? void 0 : parent.dom) + commitFiber(nextChild, void 0, false, false, parent.dom); + prev.props.children.push(nextChild); } - if (W.has(n)) { - const o = W.get(n); - o && n.__propName && De(n.__propName, o, r); + } else if (!nextChild && prevChild) { + commitDeletion(prevChild, true); + prev.props.children.splice(i, 1); + len = prev.props.children.length; + i--; + } else { + if (isReused) { + const { fiber } = newMap[nextKey]; + commitDeletion(prevChild, true); + ToCommitDeletion = true; + prev.props.children[i] = fiber; + updateNode(fiber, nextChild, i); + if (parent == null ? void 0 : parent.dom) applyFiber(prev.props.children[i], parent.dom); + } else { + if (isUsedLater || isUsedPreviously) { + if (parent == null ? void 0 : parent.dom) + commitFiber( + nextChild, + void 0, + false, + false, + parent.dom + ); + prev.props.children[i] = nextChild; + } else { + updateNode(prevChild, nextChild, i); + if (parent == null ? void 0 : parent.dom) + applyFiber(prev.props.children[i], parent.dom); + const newLen = Math.max( + prev.props.children.length, + next.props.children.length + ); + if (newLen < len) { + len = newLen; + i--; + } + } } - }), Y.clear(), Q.clear(), J = !1; - })); + } + ToCommitDeletion = true; + } +} +if (typeof process !== "undefined" && process.env.NODE_ENV === "test") { + module.exports = { + createFiber, + commitDeletion, + commitFiber, + updateFiber, + deepCompareFibers, + deepEqual + }; +} +let scheduled = false; +const batch = /* @__PURE__ */ new Set(); +const depset = /* @__PURE__ */ new Set(); +const reactiveFiberMap = /* @__PURE__ */ new WeakMap(); +const domAttributeMap = /* @__PURE__ */ new WeakMap(); +function batchUpdate(cb) { + batch.add(cb); + if (!scheduled) { + scheduled = true; + queueMicrotask(() => { + batch.forEach((fn) => { + const dep = fn(); + if (depset.has(dep)) { + return; + } + depset.add(dep); + if (dep.__cleanup && typeof dep.__cleanup === "function") { + dep.__cleanup(); + dep.__cleanup = null; + } + const val = dep(); + if (typeof val === "function") { + dep.__cleanup = val; + } + if (reactiveFiberMap.has(dep)) { + const fiber = reactiveFiberMap.get(dep); + if (fiber) { + updateFiber(fiber, val); + } + } + if (domAttributeMap.has(dep)) { + const dom = domAttributeMap.get(dep); + if (dom && dep.__propName) { + updateDomProp(dep.__propName, dom, val); + } + } + }); + depset.clear(); + batch.clear(); + scheduled = false; + }); + } } -function ze(e, t) { - H.set(e, t); +function setReactiveFunction(fn, fiber) { + reactiveFiberMap.set(fn, fiber); } -function je(e, t) { - W.set(e, t); +function setReactiveAttributes(fn, dom) { + domAttributeMap.set(fn, dom); } -function qe(e) { - W.delete(e); - const t = e.__signals; - if (t) { - for (const n of t) - n.removeDep(e); - e.__signals = null; +function clearReactiveAttributes(fn) { + domAttributeMap.delete(fn); + const signals = fn.__signals; + if (signals) { + for (const signal of signals) { + signal.removeDep(fn); + } + fn.__signals = null; } } -function Ke(e) { - H.delete(e); - const t = e.__signals; - if (t) { - for (const n of t) - n.removeDep(e); - e.__signals = null; +function clearReactiveFunction(fn) { + reactiveFiberMap.delete(fn); + const signals = fn.__signals; + if (signals) { + for (const signal of signals) { + signal.removeDep(fn); + } + fn.__signals = null; } } -let y = null, f = null; -function te(e) { - y.__signals || (y.__signals = /* @__PURE__ */ new Set()), y.__signals.add(e); +let currentReactiveFunction = null; +let currentEffect = null; +function addSignalToReactiveFunction(signal) { + if (!currentReactiveFunction.__signals) { + currentReactiveFunction.__signals = /* @__PURE__ */ new Set(); + } + currentReactiveFunction.__signals.add(signal); } -function ne(e) { - f.__signals || (f.__signals = /* @__PURE__ */ new Set()), f.__signals.add(e); +function addSignalToEffect(signal) { + if (!currentEffect.__signals) currentEffect.__signals = /* @__PURE__ */ new Set(); + currentEffect.__signals.add(signal); } -function Je(e) { - var n; - if (typeof e != "function") +function reactive(fn) { + var _a; + if (typeof fn !== "function") throw new Error("reactive takes a render function as the argument"); - y = e; - const t = e(); - if (y = null, !_(t) && T(t) && !t.type && !t.props && !((n = t.props) != null && n.children)) + currentReactiveFunction = fn; + const retVal = fn(); + currentReactiveFunction = null; + if (!isPrimitive(retVal) && isPlainObject(retVal) && !retVal.type && !retVal.props && !((_a = retVal.props) == null ? void 0 : _a.children)) throw new Error( - "Reactive value must be primitive or functional component, got: " + typeof t + "Reactive value must be primitive or functional component, got: " + typeof retVal ); - return t; + return retVal; } -function Qe(e) { - if (typeof e != "function") +function reactiveAttribute(fn) { + if (typeof fn !== "function") throw new Error("reactive takes a render function as the argument"); - y = e; - const t = e(); - return y = null, t; + currentReactiveFunction = fn; + const retVal = fn(); + currentReactiveFunction = null; + return retVal; } -function et(e) { - if (typeof e != "function") +function createEffect(fn) { + if (typeof fn !== "function") throw new Error("createEffect takes a effect function as the argument"); - _e(e), we() || ye(e); -} -function ye(e, t) { - if (typeof e != "function") return; - f = e; - const n = e(); - f.__signals && typeof n == "function" && (f.__cleanup = n), !f.__signals && n && typeof n == "function" && (t ? xe(n, t) : Be(n)), f = null; + addEffect(fn); + if (!getCurrentFC()) runEffect(fn); +} +function runEffect(effect, fiber) { + if (typeof effect !== "function") return; + currentEffect = effect; + const effectCleanup = effect(); + if (currentEffect.__signals && typeof effectCleanup === "function") { + currentEffect.__cleanup = effectCleanup; + } + if (!currentEffect.__signals && effectCleanup && typeof effectCleanup === "function") { + if (!fiber) { + cleanUp(effectCleanup); + } else { + cleanUpWFiber(effectCleanup, fiber); + } + } + currentEffect = null; } -function tt(e) { - if (typeof e != "function") +function computed(fn) { + if (typeof fn !== "function") throw new Error("computed takes a function as the argument"); - let t = we() !== null; - f = () => { - if (t) { - t = !1; + let firstRun = getCurrentFC() !== null; + currentEffect = () => { + if (firstRun) { + firstRun = false; return; } - r.update(e()); - }, _e(f); - const n = e(), r = U(n); - return f = null, { + signal.update(fn()); + }; + addEffect(currentEffect); + const val = fn(); + const signal = createSignal(val); + currentEffect = null; + return { get value() { - return r.value; + return signal.value; } }; } -function nt(e) { - if (typeof e != "function") +function createPromise(fn) { + if (typeof fn !== "function") throw new Error("createPromise takes a function as the argument"); - const t = e(); - if (!(t instanceof Promise)) + const promise = fn(); + if (!(promise instanceof Promise)) { throw new Error( "createPromise takes a function that returns a promise" ); - const n = U({ + } + const triggerSignal = createSignal({ status: "pending", data: null, error: null }); - return t.then((r) => { - n.update((o) => { - o.data = r, o.status = "resolved"; + promise.then((val) => { + triggerSignal.update((prev) => { + prev.data = val; + prev.status = "resolved"; }); - }).catch((r) => { - n.update((o) => { - o.error = r, o.status = "rejected"; + }).catch((err) => { + triggerSignal.update((prev) => { + prev.error = err; + prev.status = "rejected"; }); - }), { + }); + return { get value() { - return n.value; + return triggerSignal.value; } }; } -class re { - constructor(t) { - this.current = t; +class Ref { + constructor(val) { + this.current = val; } } -function rt() { - return new re(null); +function createRef() { + const ref = new Ref(null); + return ref; } -const X = [ +const MutatingMethods = [ "push", "pop", "unshift", @@ -900,328 +1207,454 @@ const X = [ "sort", "reverse" ]; -class N { - constructor(t) { - this.isNotified = !1, this._val = t, this.deps = /* @__PURE__ */ new Set(); +class BaseSignal { + constructor(val) { + this.isNotified = false; + this._val = val; + this.deps = /* @__PURE__ */ new Set(); } notify() { - this.isNotified || (this.deps.size !== 0 && (this.isNotified = !0), this.deps.forEach((t) => { - Ue(() => (this.isNotified = !1, t)); - })); + if (this.isNotified) return; + if (this.deps.size !== 0) this.isNotified = true; + this.deps.forEach((dep) => { + batchUpdate(() => { + this.isNotified = false; + return dep; + }); + }); } - removeDep(t) { - this.deps.delete(t); + removeDep(fn) { + this.deps.delete(fn); } clearDeps() { this.deps.clear(); } } -class Ye extends N { - constructor(t) { - if (!_(t)) +class PrimitiveSignal extends BaseSignal { + constructor(val) { + if (!isPrimitive(val)) { throw new Error( "Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]" ); - super(t); + } + super(val); } get value() { - return f && (this.deps.add(f), ne(this)), y && (this.deps.add(y), te(this)), this._val; + if (currentEffect) { + this.deps.add(currentEffect); + addSignalToEffect(this); + } + if (currentReactiveFunction) { + this.deps.add(currentReactiveFunction); + addSignalToReactiveFunction(this); + } + return this._val; } - update(t) { - if (typeof t == "function") { - const n = t(this._val); - if (!_(n)) + update(val) { + if (typeof val === "function") { + const newVal = val(this._val); + if (!isPrimitive(newVal)) { throw new Error( "Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]" ); - if (n === this._val) return; - this._val = n, this.notify(); + } + if (newVal === this._val) return; + this._val = newVal; + this.notify(); } else { - if (!_(t)) + if (!isPrimitive(val)) { throw new Error( "Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]" ); - if (t === this._val) return; - this._val = t, this.notify(); + } + if (val === this._val) return; + this._val = val; + this.notify(); } } } -class Ve extends N { - constructor(t) { - if (!Array.isArray(t)) +class ArraySignal extends BaseSignal { + constructor(val) { + if (!Array.isArray(val)) { throw new Error( "Invalid type for ArraySignal; value must be an array" ); - super(t), this.updateCalled = !1, this._val = this.createProxy(t); - } - createProxy(t) { - return new Proxy(t, { - get: (n, r) => { - const o = n[r]; - if (typeof o == "function") { - if (X.includes(String(r)) && !this.updateCalled) + } + super(val); + this.updateCalled = false; + this._val = this.createProxy(val); + } + createProxy(val) { + return new Proxy(val, { + get: (target, prop) => { + const value = target[prop]; + if (typeof value === "function") { + if (MutatingMethods.includes(String(prop)) && !this.updateCalled) { throw new Error( "Cannot set a value on an array signal, use the update method for updating the array." ); - return (...l) => { - const i = o.apply(n, l); - return X.includes(String(r)) && this.notify(), i; + } + return (...args) => { + const result = value.apply(target, args); + if (MutatingMethods.includes(String(prop))) { + this.notify(); + } + return result; }; } - return o; + return value; }, - set: (n, r, o) => { - if (!this.updateCalled) + set: (target, prop, newValue) => { + if (!this.updateCalled) { throw new Error( "Cannot set a value on an array signal, use the update method for updating the array." ); - return n[r] = o, this.notify(), !0; + } + target[prop] = newValue; + this.notify(); + return true; } }); } get value() { - return f && (this.deps.add(f), ne(this)), y && (this.deps.add(y), te(this)), this._val; + if (currentEffect) { + this.deps.add(currentEffect); + addSignalToEffect(this); + } + if (currentReactiveFunction) { + this.deps.add(currentReactiveFunction); + addSignalToReactiveFunction(this); + } + return this._val; } - update(t) { - if (this.updateCalled = !0, typeof t == "function") - t(this._val); - else { - if (!Array.isArray(t)) + update(val) { + this.updateCalled = true; + if (typeof val === "function") { + val(this._val); + } else { + if (!Array.isArray(val)) { throw new Error( "Invalid type for ArraySignal; value must be an array" ); - if (t === this._val) return; - this._val = this.createProxy(t), this.notify(); + } + if (val === this._val) return; + this._val = this.createProxy(val); + this.notify(); } - this.updateCalled = !1; + this.updateCalled = false; } } -class Ze extends N { - constructor(t) { - if (!T(t)) +class ObjectSignal extends BaseSignal { + constructor(val) { + if (!isPlainObject(val)) { throw new Error( "Invalid type for ObjectSignal; value must be a plain object" ); - super(t), this.updateCalled = !1, this._val = this.createProxy(t); - } - createInternalArrayProxy(t) { - return new Proxy(t, { - get: (n, r) => { - const o = n[r]; - if (typeof o == "function") { - if (!this.updateCalled && X.includes(String(r))) + } + super(val); + this.updateCalled = false; + this._val = this.createProxy(val); + } + createInternalArrayProxy(val) { + return new Proxy(val, { + get: (target, prop) => { + const value = target[prop]; + if (typeof value === "function") { + if (!this.updateCalled && MutatingMethods.includes(String(prop))) { throw new Error( "Cannot set a value on an object signal, use the update method for updating the object." ); - return (...l) => { - const i = o.apply(n, l); - return X.includes(String(r)) && this.notify(), i; + } + return (...args) => { + const result = value.apply(target, args); + if (MutatingMethods.includes(String(prop))) { + this.notify(); + } + return result; }; } - return o; + return value; }, - set: (n, r, o) => { - if (!this.updateCalled) + set: (target, prop, newValue) => { + if (!this.updateCalled) { throw new Error( "Cannot set a value on an object signal, use the update method for updating the object." ); - return n[r] = o, this.notify(), !0; + } + target[prop] = newValue; + this.notify(); + return true; } }); } - createProxy(t) { - return new Proxy(t, { - get: (n, r) => { - const o = n[r]; - return Array.isArray(o) ? (n[r] = this.createInternalArrayProxy(o), n[r]) : o; + createProxy(val) { + return new Proxy(val, { + get: (target, prop) => { + const value = target[prop]; + if (Array.isArray(value)) { + target[prop] = this.createInternalArrayProxy(value); + return target[prop]; + } + return value; }, - set: (n, r, o) => { - if (!this.updateCalled) + set: (target, prop, newValue) => { + if (!this.updateCalled) { throw new Error( "Cannot set a value on an object signal, use the update method for updating the object." ); - return typeof o == "function" ? !1 : (typeof o == "object" && o !== null && (o = this.createProxy(o)), o === n[r] || (n[r] = o, this.notify()), !0); + } + if (typeof newValue === "function") return false; + if (typeof newValue === "object" && newValue !== null) { + newValue = this.createProxy(newValue); + } + if (newValue === target[prop]) return true; + target[prop] = newValue; + this.notify(); + return true; }, - deleteProperty: (n, r) => { - const o = delete n[r]; - return this.notify(), o; + deleteProperty: (target, prop) => { + const result = delete target[prop]; + this.notify(); + return result; } }); } get value() { - return f && (this.deps.add(f), ne(this)), y && (this.deps.add(y), te(this)), this._val; + if (currentEffect) { + this.deps.add(currentEffect); + addSignalToEffect(this); + } + if (currentReactiveFunction) { + this.deps.add(currentReactiveFunction); + addSignalToReactiveFunction(this); + } + return this._val; } - update(t) { - if (this.updateCalled = !0, typeof t == "function") - t(this._val); - else { - if (!T(t)) + update(val) { + this.updateCalled = true; + if (typeof val === "function") { + val(this._val); + } else { + if (!isPlainObject(val)) { throw new Error( "Invalid type for ObjectSignal; value must be a plain object" ); - if (t === this._val) return; - this._val = this.createProxy(t), this.notify(); + } + if (val === this._val) return; + this._val = this.createProxy(val); + this.notify(); } - this.updateCalled = !1; + this.updateCalled = false; } } -function U(e) { - if (typeof e == "function") +function createSignal(val) { + if (typeof val === "function") { throw new Error("Functions cannot be used as signal value"); - if (typeof e == "object" && e !== null) - if (Array.isArray(e)) { - const t = new Ve(e); - return V(t), { + } + if (typeof val === "object" && val !== null) { + if (Array.isArray(val)) { + const signal = new ArraySignal(val); + addSignal(signal); + return { get value() { - return t.value; + return signal.value; }, - update: t.update.bind(t) + update: signal.update.bind(signal) }; - } else if (T(e)) { - const t = new Ze(e); - return V(t), { + } else if (isPlainObject(val)) { + const signal = new ObjectSignal(val); + addSignal(signal); + return { get value() { - return t.value; + return signal.value; }, - update: t.update.bind(t) + update: signal.update.bind(signal) }; - } else + } else { throw new Error( - "Invalid type for signal initialization: " + typeof e + "Invalid type for signal initialization: " + typeof val ); - else if (_(e)) { - const t = new Ye(e); - return V(t), { + } + } else if (isPrimitive(val)) { + const signal = new PrimitiveSignal(val); + addSignal(signal); + return { get value() { - return t.value; + return signal.value; }, - update: t.update.bind(t) + update: signal.update.bind(signal) }; - } else + } else { throw new Error( - "Invalid type for signal initialization: " + typeof e + "Invalid type for signal initialization: " + typeof val ); + } +} +let currentFC = null; +let fcMap = /* @__PURE__ */ new WeakMap(); +function setCurrentFC(fc) { + currentFC = fc; +} +function clearCurrentFC() { + currentFC = null; +} +function getCurrentFC() { + return currentFC; } -let d = null, p = /* @__PURE__ */ new WeakMap(); -function ge(e) { - d = e; -} -function me() { - d = null; -} -function we() { - return d; -} -function Ee(e) { - if (p.has(e)) { - const t = p.get(e); - for (const n of t.effects) - ye(n, e); - } -} -function Be(e) { - d && (p.has(d) ? p.get(d).cleanup.push(e) : p.set(d, { - signals: /* @__PURE__ */ new Set(), - cleanup: [e], - effects: /* @__PURE__ */ new Set() - })); -} -function xe(e, t) { - t && (p.has(t) ? p.get(t).cleanup.push(e) : p.set(t, { - signals: /* @__PURE__ */ new Set(), - cleanup: [e], - effects: /* @__PURE__ */ new Set() - })); -} -function _e(e) { - if (d) - if (p.has(d)) - p.get(d).effects.add(e); - else { - const t = /* @__PURE__ */ new Set(); - t.add(e), p.set(d, { +function runAllEffects(FC) { + if (fcMap.has(FC)) { + const fcData = fcMap.get(FC); + for (const effect of fcData.effects) { + runEffect(effect, FC); + } + } +} +function cleanUp(fn) { + if (currentFC) { + if (fcMap.has(currentFC)) { + const fcData = fcMap.get(currentFC); + fcData.cleanup.push(fn); + } else { + fcMap.set(currentFC, { + signals: /* @__PURE__ */ new Set(), + cleanup: [fn], + effects: /* @__PURE__ */ new Set() + }); + } + } +} +function cleanUpWFiber(fn, fiber) { + if (fiber) { + if (fcMap.has(fiber)) { + const fcData = fcMap.get(fiber); + fcData.cleanup.push(fn); + } else { + fcMap.set(fiber, { + signals: /* @__PURE__ */ new Set(), + cleanup: [fn], + effects: /* @__PURE__ */ new Set() + }); + } + } +} +function addEffect(fn) { + if (currentFC) { + if (fcMap.has(currentFC)) { + const fcData = fcMap.get(currentFC); + fcData.effects.add(fn); + } else { + const effects = /* @__PURE__ */ new Set(); + effects.add(fn); + fcMap.set(currentFC, { signals: /* @__PURE__ */ new Set(), cleanup: [], - effects: t + effects }); } + } } -function V(e) { - if (d) - if (p.has(d)) - p.get(d).signals.add(e); - else { - const t = /* @__PURE__ */ new Set(); - t.add(e), p.set(d, { - signals: t, +function addSignal(signal) { + if (currentFC) { + if (fcMap.has(currentFC)) { + const fcData = fcMap.get(currentFC); + fcData.signals.add(signal); + } else { + const signals = /* @__PURE__ */ new Set(); + signals.add(signal); + fcMap.set(currentFC, { + signals, cleanup: [], effects: /* @__PURE__ */ new Set() }); } + } } -function ve(e, t) { - const n = p.get(e); - if (n) { - if (n.cleanup) - for (const r of n.cleanup) - r(); - n.cleanup = []; - for (const r of n.effects) { - if (r.__cleanup && typeof r.__cleanup == "function" && r.__cleanup(), r.__signals) - for (const o of r.__signals) - o.removeDep(r); - delete r.__signals, delete r.__cleanup; - } - n.signals.forEach((r) => r.clearDeps()), n.signals.clear(); - } - p.delete(e); -} -function ot(e) { - let t = null; - const n = (r, o) => { - t ? (r.update(!1), o.update(null)) : e().then((l) => { - if (l.default) { - if (typeof l.default != "function") - throw new Error( - "Lazy-loaded component must be a functional component" +function cleanUpFC(currentFC2, props) { + const fcData = fcMap.get(currentFC2); + if (fcData) { + if (fcData.cleanup) { + for (const fn of fcData.cleanup) { + fn(); + } + } + fcData.cleanup = []; + for (const effect of fcData.effects) { + if (effect.__cleanup && typeof effect.__cleanup === "function") { + effect.__cleanup(); + } + if (effect.__signals) { + for (const signal of effect.__signals) { + signal.removeDep(effect); + } + } + delete effect.__signals; + delete effect.__cleanup; + } + fcData.signals.forEach((signal) => signal.clearDeps()); + fcData.signals.clear(); + } + fcMap.delete(currentFC2); +} +function lazy(importFn) { + let Component = null; + const load = (loading, error) => { + if (!Component) { + importFn().then((mod) => { + if (mod.default) { + if (typeof mod.default !== "function") { + throw new Error( + "Lazy-loaded component must be a functional component" + ); + } + Component = mod.default; + loading.update(false); + error.update(null); + } else { + error.update( + new Error( + "No default export found from lazy-loaded module" + ) ); - t = l.default, r.update(!1), o.update(null); - } else - o.update( - new Error( - "No default export found from lazy-loaded module" - ) - ); - }).catch((l) => { - o.update(l), r.update(!1); - }); + } + }).catch((err) => { + error.update(err); + loading.update(false); + }); + } else { + loading.update(false); + error.update(null); + } }; - return (r) => { - const o = U(!0), l = U(null); - n(o, l); - const i = (s) => typeof s == "string" || s && typeof s == "object" && "props" in s && "type" in s; - if (r.fallback !== void 0 && !i(r.fallback)) + return (props) => { + const loading = createSignal(true); + const error = createSignal(null); + load(loading, error); + const isValidNode = (val) => typeof val === "string" || val && typeof val === "object" && "props" in val && "type" in val; + if (props.fallback !== void 0 && !isValidNode(props.fallback)) { throw new Error( "Invalid fallback: Expected a string or a valid JSX node." ); - if (r.errorFallback !== void 0 && !(typeof r.errorFallback == "function" || i(r.errorFallback))) + } + if (props.errorFallback !== void 0 && !(typeof props.errorFallback === "function" || isValidNode(props.errorFallback))) { throw new Error( "Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node." ); - return /* @__PURE__ */ oe("FRAGMENT", null, () => o.value ? r.fallback : l.value !== null ? r.errorFallback ? typeof r.errorFallback == "function" ? r.errorFallback(l.value) : r.errorFallback : "Unknown error occurred while lazy loading component, use errorFallback prop to override" : ( + } + return /* @__PURE__ */ createElement("FRAGMENT", null, () => loading.value ? props.fallback : error.value !== null ? props.errorFallback ? typeof props.errorFallback === "function" ? props.errorFallback(error.value) : props.errorFallback : "Unknown error occurred while lazy loading component, use errorFallback prop to override" : ( // @ts-expect-error - t && /* @__PURE__ */ oe(t, { ...r }) + Component && /* @__PURE__ */ createElement(Component, { ...props }) )); }; } export { - Be as cleanUp, - tt as computed, - et as createEffect, - oe as createElement, - nt as createPromise, - rt as createRef, - U as createSignal, - ot as lazy, - be as render + cleanUp, + computed, + createEffect, + createElement, + createPromise, + createRef, + createSignal, + lazy, + render }; +//# sourceMappingURL=refract.es.js.map diff --git a/build/refract.es.js.map b/build/refract.es.js.map new file mode 100644 index 0000000..db12c44 --- /dev/null +++ b/build/refract.es.js.map @@ -0,0 +1 @@ +{"version":3,"file":"refract.es.js","sources":["../src/utils/general.ts","../src/rendering/constants.ts","../src/lib.ts","../src/rendering/props.ts","../src/rendering/createElements.ts","../src/rendering/render.ts","../src/signals/batch.ts","../src/signals/signal.ts","../src/rendering/functionalComponents.ts","../src/lazy/Lazyloading.tsx"],"sourcesContent":["export function isPlainObject(variable: any) {\r\n return (\r\n typeof variable === \"object\" && // Must be an object\r\n variable !== null && // Cannot be null\r\n !Array.isArray(variable) && // Cannot be an array\r\n Object.prototype.toString.call(variable) === \"[object Object]\" // Must be a plain object\r\n );\r\n}\r\nexport function isPrimitive(val: any) {\r\n return (\r\n [\"boolean\", \"string\", \"number\", \"undefined\"].includes(typeof val) ||\r\n val === null ||\r\n val instanceof Error\r\n );\r\n}\r\n\r\nexport function swap(arr: any[], i: number, j: number) {\r\n const temp = arr[i];\r\n arr[i] = arr[j];\r\n arr[j] = temp;\r\n}\r\n","export const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\r\nexport const SVG_TAGS = new Set([\r\n \"svg\",\r\n \"a\",\r\n \"circle\",\r\n \"clipPath\",\r\n \"defs\",\r\n \"desc\",\r\n \"ellipse\",\r\n \"feBlend\",\r\n \"feColorMatrix\",\r\n \"feComponentTransfer\",\r\n \"feComposite\",\r\n \"feConvolveMatrix\",\r\n \"feDiffuseLighting\",\r\n \"feDisplacementMap\",\r\n \"feDistantLight\",\r\n \"feDropShadow\",\r\n \"feFlood\",\r\n \"feFuncA\",\r\n \"feFuncB\",\r\n \"feFuncG\",\r\n \"feFuncR\",\r\n \"feGaussianBlur\",\r\n \"feImage\",\r\n \"feMerge\",\r\n \"feMergeNode\",\r\n \"feMorphology\",\r\n \"feOffset\",\r\n \"fePointLight\",\r\n \"feSpecularLighting\",\r\n \"feSpotLight\",\r\n \"feTile\",\r\n \"feTurbulence\",\r\n \"filter\",\r\n \"foreignObject\",\r\n \"g\",\r\n \"image\",\r\n \"line\",\r\n \"linearGradient\",\r\n \"marker\",\r\n \"mask\",\r\n \"metadata\",\r\n \"path\",\r\n \"pattern\",\r\n \"polygon\",\r\n \"polyline\",\r\n \"radialGradient\",\r\n \"rect\",\r\n \"script\",\r\n \"set\",\r\n \"stop\",\r\n \"style\",\r\n \"switch\",\r\n \"symbol\",\r\n \"text\",\r\n \"textPath\",\r\n \"title\",\r\n \"tspan\",\r\n \"use\",\r\n \"view\",\r\n]);\r\nexport const MATH_TAGS = new Set([\r\n \"math\",\r\n \"maction\",\r\n \"maligngroup\",\r\n \"malignmark\",\r\n \"menclose\",\r\n \"merror\",\r\n \"mfenced\",\r\n \"mfrac\",\r\n \"mglyph\",\r\n \"mi\",\r\n \"mlabeledtr\",\r\n \"mlongdiv\",\r\n \"mmultiscripts\",\r\n \"mn\",\r\n \"mo\",\r\n \"mover\",\r\n \"mpadded\",\r\n \"mphantom\",\r\n \"mroot\",\r\n \"mrow\",\r\n \"ms\",\r\n \"mscarries\",\r\n \"mscarry\",\r\n \"msgroup\",\r\n \"msline\",\r\n \"mspace\",\r\n \"msqrt\",\r\n \"msrow\",\r\n \"mstack\",\r\n \"mstyle\",\r\n \"msub\",\r\n \"msup\",\r\n \"msubsup\",\r\n \"mtable\",\r\n \"mtd\",\r\n \"mtext\",\r\n \"mtr\",\r\n \"munder\",\r\n \"munderover\",\r\n]);\r\n\r\nexport const MATH_NAMESPACE = \"http://www.w3.org/1998/Math/MathML\";\r\n\r\nexport const CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\r\n","import { isPlainObject } from \"./utils/general\";\r\nexport const IS_NON_DIMENSIONAL =\r\n /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\r\n\r\nexport function styleObjectToString(\r\n style: Record\r\n): string {\r\n const newStyles: string[] = [];\r\n\r\n for (const key in style) {\r\n const value = style[key];\r\n const cssKey = key.replace(/([A-Z])/g, \"-$1\").toLowerCase(); // CamelCase to kebab-case\r\n\r\n if (typeof value != \"number\" || IS_NON_DIMENSIONAL.test(cssKey)) {\r\n newStyles.push(`${cssKey}: ${value};`); // Convert numbers to strings with px suffix\r\n } else {\r\n newStyles.push(`${cssKey}: ${value}px;`); // Convert numbers to strings with px suffix\r\n }\r\n }\r\n return newStyles.join(\" \");\r\n}\r\n\r\nexport function preprocessStyle(\r\n style: Record\r\n): Record {\r\n const processedStyle: Record = {};\r\n\r\n for (const key in style) {\r\n const value = style[key];\r\n // Handle nested styles\r\n if (typeof value === \"object\" && value !== null) {\r\n console.warn(`Nested styles not allowed for ${key}`);\r\n continue; // Skip nested styles\r\n }\r\n\r\n // Remove falsy values\r\n if (\r\n value === null ||\r\n value === undefined ||\r\n value === false ||\r\n value === \"\"\r\n ) {\r\n continue;\r\n }\r\n\r\n // Otherwise, add to processed style\r\n processedStyle[key] = value;\r\n }\r\n\r\n return processedStyle;\r\n}\r\n\r\nexport function isValidStyle(style: any) {\r\n return isPlainObject(style) || typeof style === \"string\";\r\n}\r\n\r\nexport function applyMoves(\r\n arr: T[],\r\n moves: Record\r\n): T[] {\r\n const n = arr.length;\r\n // Create an array for the final result (we use undefined as a marker)\r\n const result: (T | undefined)[] = new Array(n).fill(undefined);\r\n // Keep track of which indices in the original array are moved.\r\n const movedFrom = new Set();\r\n\r\n // First, place all moved elements at their target positions.\r\n // (For a swap both targets will be filled by the respective moves.)\r\n for (const key in moves) {\r\n const { from, to } = moves[key];\r\n // You can optionally ignore moves that are no-ops (from === to)\r\n if (from === to) continue;\r\n result[to] = arr[from];\r\n movedFrom.add(from);\r\n }\r\n\r\n // Next, fill in the \"gaps\" with the unmoved elements,\r\n // preserving their original order.\r\n let fillIndex = 0; // current position in `result` to fill\r\n for (let i = 0; i < n; i++) {\r\n // Skip any element that was moved.\r\n if (movedFrom.has(i)) continue;\r\n\r\n // Advance fillIndex until we find an empty slot in result.\r\n while (fillIndex < n && result[fillIndex] !== undefined) {\r\n fillIndex++;\r\n }\r\n if (fillIndex < n) {\r\n result[fillIndex] = arr[i];\r\n fillIndex++;\r\n }\r\n }\r\n\r\n return result as T[];\r\n}\r\n\r\n/**\r\n * Computes the indices of the longest increasing subsequence in the given array.\r\n * @param arr - An array of numbers.\r\n * @returns An array of indices representing the longest increasing subsequence.\r\n *\r\n * Time Complexity: O(n log n)\r\n */\r\nexport function longestIncreasingSubsequenceIndices(arr: number[]): number[] {\r\n const n = arr.length;\r\n const predecessors = new Array(n).fill(-1); // Track the previous index for each element in the subsequence.\r\n const lisIndices: number[] = []; // Stores indices of the smallest tail for all increasing subsequences of each length.\r\n\r\n for (let i = 0; i < n; i++) {\r\n const x = arr[i];\r\n\r\n // Binary search for the insertion point in lisIndices.\r\n let low = 0;\r\n let high = lisIndices.length;\r\n while (low < high) {\r\n const mid = Math.floor((low + high) / 2);\r\n if (arr[lisIndices[mid]] < x) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n\r\n // If low is at the end, extend lisIndices; otherwise, update the tail value.\r\n if (low === lisIndices.length) {\r\n lisIndices.push(i);\r\n } else {\r\n lisIndices[low] = i;\r\n }\r\n\r\n // Set the predecessor of arr[i] (if low is not the start of a subsequence).\r\n predecessors[i] = low > 0 ? lisIndices[low - 1] : -1;\r\n }\r\n\r\n // Reconstruct the longest increasing subsequence using the predecessors.\r\n const lis: number[] = [];\r\n let k = lisIndices.length > 0 ? lisIndices[lisIndices.length - 1] : -1;\r\n for (let i = lisIndices.length - 1; i >= 0; i--) {\r\n lis[i] = k;\r\n k = predecessors[k];\r\n }\r\n return lis;\r\n}\r\n","import { isValidStyle, preprocessStyle, styleObjectToString } from \"../lib\";\r\nimport { setReactiveAttributes } from \"../signals/batch\";\r\nimport { reactiveAttribute } from \"../signals/signal\";\r\nimport { SVG_NAMESPACE } from \"./constants\";\r\n\r\nexport function setStyle(\r\n style: Record | string,\r\n dom: HTMLElement\r\n) {\r\n if (!isValidStyle(style))\r\n throw new Error(\"Style attribute must be a plain object or a string\");\r\n\r\n if (typeof style === \"string\") {\r\n dom.setAttribute(\"style\", style);\r\n } else {\r\n const processedStyle = preprocessStyle(style);\r\n\r\n dom.setAttribute(\"style\", styleObjectToString(processedStyle));\r\n }\r\n}\r\n\r\n// handles setting the reactive attributes returned from a reactiveFunction\r\nexport function setReactiveAttribute(\r\n reactiveFunction: any,\r\n name: string,\r\n dom: HTMLElement,\r\n namespace?: string\r\n) {\r\n reactiveFunction.__propName = name;\r\n // registers the function in corresponding signal\r\n const val = reactiveAttribute(reactiveFunction);\r\n if (val === null || val === undefined || val === false) {\r\n return;\r\n }\r\n\r\n setAttribute(name, val, dom, namespace);\r\n // track this using signals if the function depended on any signal\r\n if (reactiveFunction.__signals)\r\n setReactiveAttributes(reactiveFunction, dom);\r\n}\r\n\r\nconst CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\r\n\r\nexport function setAttribute(\r\n name: string,\r\n value: any,\r\n dom: HTMLElement,\r\n namespace?: string\r\n) {\r\n if (name == \"style\") {\r\n setStyle(value, dom);\r\n return;\r\n }\r\n if (name[0] === \"o\" && name[1] === \"n\" && typeof value === \"function\") {\r\n const useCapture = name != (name = name.replace(CAPTURE_REGEX, \"$1\"));\r\n\r\n if (\r\n name.toLowerCase() in dom ||\r\n name == \"onFocusOut\" ||\r\n name == \"onFocusIn\" ||\r\n name === \"onGotPointerCapture\" ||\r\n name === \"onLostPointerCapture\"\r\n )\r\n name = name.toLowerCase().slice(2);\r\n else name = name.slice(2);\r\n // handle eventListeners\r\n dom.addEventListener(name, value, useCapture);\r\n return;\r\n }\r\n\r\n if (namespace === SVG_NAMESPACE) {\r\n name = name.replace(/xlink(H|:h)/, \"h\").replace(/sName$/, \"s\");\r\n }\r\n // For certain properties that exist on the dom element,\r\n // attempt to set them directly.\r\n else if (\r\n name !== \"width\" &&\r\n name !== \"height\" &&\r\n name !== \"href\" &&\r\n name !== \"list\" &&\r\n name !== \"form\" &&\r\n name !== \"tabIndex\" &&\r\n name !== \"download\" &&\r\n name !== \"rowSpan\" &&\r\n name !== \"colSpan\" &&\r\n name !== \"role\" &&\r\n name !== \"popover\" &&\r\n name in dom\r\n ) {\r\n try {\r\n // Set the property directly on the DOM element.\r\n if (name === \"value\" && dom.tagName === \"SELECT\") {\r\n setTimeout(() => {\r\n dom[name] = value == null ? \"\" : value;\r\n });\r\n } else {\r\n dom[name] = value == null ? \"\" : value;\r\n }\r\n // console.log(dom[name], dom);\r\n\r\n // We simply return after setting the property.\r\n return;\r\n } catch (e) {\r\n // If setting the property fails, fall through to update attributes.\r\n }\r\n }\r\n\r\n if (value != null && (value !== false || name[4] === \"-\")) {\r\n // For most attributes, if the value is valid, set the attribute.\r\n // Special case: for \"popover\", if value is true, set attribute to an empty string.\r\n\r\n dom.setAttribute(\r\n name,\r\n name === \"popover\" && value === true ? \"\" : value\r\n );\r\n }\r\n}\r\n","import { isValidStyle, preprocessStyle, styleObjectToString } from \"../lib\";\r\nimport { setReactiveAttributes } from \"../signals/batch\";\r\nimport { reactive, reactiveAttribute, Ref } from \"../signals/signal\";\r\nimport {\r\n Fiber,\r\n FiberChildren,\r\n NodeType,\r\n Props,\r\n RenderFunction,\r\n} from \"../types\";\r\nimport { isPrimitive } from \"../utils/general\";\r\nimport {\r\n MATH_NAMESPACE,\r\n MATH_TAGS,\r\n SVG_NAMESPACE,\r\n SVG_TAGS,\r\n} from \"./constants\";\r\nimport { setAttribute, setReactiveAttribute } from \"./props\";\r\nexport const FRAGMENT_SYMBOL = Symbol(\"FRAGMENT\");\r\n\r\nexport function createElement(\r\n type: any,\r\n props: object | null,\r\n ...children: any[]\r\n): Fiber | FiberChildren {\r\n if (type === \"FRAGMENT\") {\r\n const fragments = createChildren(children);\r\n fragments[FRAGMENT_SYMBOL] = true;\r\n\r\n return fragments;\r\n }\r\n // @ts-expect-error\r\n return {\r\n type,\r\n props: {\r\n ...props,\r\n children: createChildren(children),\r\n },\r\n };\r\n}\r\n\r\nexport function createChildren(children: FiberChildren): FiberChildren {\r\n // @ts-expect-error\r\n return children\r\n .map((child) => {\r\n if (typeof child === \"object\") {\r\n if (Array.isArray(child)) {\r\n return createChildren(child);\r\n }\r\n if (child === null) {\r\n return createTextChildren(\"\");\r\n }\r\n if (!child.type || !child.props) {\r\n throw new Error(\r\n \"Invalid type for a dom node, found \" + child\r\n );\r\n }\r\n return child;\r\n } else if (typeof child === \"function\") {\r\n const val = reactive(child);\r\n if (isPrimitive(val)) {\r\n return createSignalChild(\r\n \"TEXT_CHILD\",\r\n {\r\n nodeValue:\r\n val !== undefined &&\r\n val !== null &&\r\n val !== false\r\n ? String(val)\r\n : \"\",\r\n children: [],\r\n },\r\n child\r\n );\r\n } else if (Array.isArray(val)) {\r\n // console.log(createChildren(val));\r\n const isFragment = val[FRAGMENT_SYMBOL];\r\n return createSignalChild(\r\n \"FRAGMENT\",\r\n { children: isFragment ? val : createChildren(val) },\r\n child\r\n );\r\n } else if (!val.type || !val.props) {\r\n throw new Error(\r\n \"Invalid type for a dom node, found \" + val\r\n );\r\n }\r\n return createSignalChild(val.type, val.props, child);\r\n } else {\r\n return createTextChildren(child);\r\n }\r\n })\r\n .flat();\r\n}\r\n\r\nexport function createTextChildren(text: any): Fiber {\r\n // @ts-expect-error\r\n return {\r\n type: \"TEXT_CHILD\",\r\n props: {\r\n nodeValue:\r\n text !== null && text !== undefined && text !== false\r\n ? String(text)\r\n : \"\",\r\n children: [],\r\n },\r\n };\r\n}\r\n\r\nfunction createSignalChild(\r\n type: NodeType,\r\n props: Props,\r\n renderFunction: RenderFunction\r\n) {\r\n return {\r\n type,\r\n renderFunction,\r\n props,\r\n };\r\n}\r\n\r\nfunction isProperty(key: string) {\r\n return key !== \"children\" && key !== \"key\" && key !== \"ref\";\r\n}\r\n\r\nexport function createNode(element: Fiber): HTMLElement | Text {\r\n let namespace: string | null = null;\r\n\r\n if (SVG_TAGS.has(element.type as string)) namespace = SVG_NAMESPACE;\r\n else if (MATH_TAGS.has(element.type as string)) namespace = MATH_NAMESPACE;\r\n\r\n const dom =\r\n element.type === \"TEXT_CHILD\"\r\n ? document.createTextNode(\"\")\r\n : namespace\r\n ? document.createElementNS(\r\n namespace,\r\n // @ts-expect-error\r\n element.type,\r\n element.props.is && element.props\r\n )\r\n : // @ts-expect-error\r\n document.createElement(element.type);\r\n\r\n if (!element.props) return dom as HTMLElement | Text;\r\n\r\n if (\r\n element.props.ref &&\r\n element.props.ref instanceof Ref &&\r\n dom instanceof HTMLElement\r\n ) {\r\n element.props.ref.current = dom;\r\n }\r\n\r\n for (const name in element.props) {\r\n if (!isProperty(name)) {\r\n continue;\r\n }\r\n const value = element.props[name];\r\n if (typeof value === \"function\" && name[0] !== \"o\" && name[1] !== \"n\") {\r\n // @ts-expect-error\r\n setReactiveAttribute(value, name, dom, namespace);\r\n } else {\r\n // @ts-expect-error\r\n setAttribute(name, value, dom, namespace);\r\n }\r\n }\r\n\r\n return dom as HTMLElement | Text;\r\n}\r\n\r\nexport function updateDomProp(\r\n prop: string,\r\n dom: HTMLElement | Text,\r\n value: any\r\n) {\r\n if (value == null || prop === \"key\") return;\r\n\r\n // @ts-expect-error\r\n setAttribute(prop, value, dom);\r\n}\r\n\r\nexport const FRAGMENT = \"FRAGMENT\";\r\n","import {\r\n clearReactiveAttributes,\r\n clearReactiveFunction,\r\n setReactiveFunction,\r\n} from \"../signals/batch\";\r\nimport { BaseSignal, Ref } from \"../signals/signal\";\r\nimport { Fiber, FiberChildren } from \"../types\";\r\nimport { isPrimitive } from \"../utils/general\";\r\nimport { CAPTURE_REGEX } from \"./constants\";\r\nimport {\r\n FRAGMENT_SYMBOL,\r\n createChildren,\r\n createNode,\r\n createTextChildren,\r\n} from \"./createElements\";\r\nimport {\r\n cleanUpFC,\r\n clearCurrentFC,\r\n runAllEffects,\r\n setCurrentFC,\r\n} from \"./functionalComponents\";\r\n\r\nexport function render(element: Fiber, container: HTMLElement) {\r\n rootContainer = container;\r\n const fragment = document.createDocumentFragment();\r\n rootFragment = fragment;\r\n const rootFiber: Fiber = {\r\n type: \"div\",\r\n props: {\r\n children: [element],\r\n },\r\n // @ts-expect-error\r\n dom: fragment,\r\n };\r\n // console.log(element.type(element.props));\r\n element.parent = rootFiber;\r\n elements.push(element);\r\n requestIdleCallback(workLoop);\r\n\r\n // container.appendChild(fragment);\r\n}\r\n\r\nfunction commitRootFragment() {\r\n if (rootFragment && rootContainer) {\r\n rootContainer.appendChild(rootFragment);\r\n // const endTime = performance.now();\r\n // console.log(`Render time: ${endTime - startTime}ms`);\r\n }\r\n}\r\n\r\nlet elements: Fiber[] = [];\r\nlet rootContainer: HTMLElement | null = null;\r\nlet rootFragment: DocumentFragment | null = null;\r\n// let startTime = -1;\r\nlet effectQueue: Fiber[] = [];\r\n\r\nfunction processEffectQueue() {\r\n for (let i = 0; i < effectQueue.length; i++) {\r\n const fiber = effectQueue[i];\r\n runAllEffects(fiber);\r\n }\r\n effectQueue.length = 0;\r\n}\r\n\r\nfunction workLoop(deadline: IdleDeadline) {\r\n // if (startTime === -1) startTime = performance.now();\r\n\r\n processEffectQueue();\r\n let shouldYield = false;\r\n while (elements.length > 0 && !shouldYield) {\r\n const element = elements.pop();\r\n renderNode(element!);\r\n shouldYield = deadline.timeRemaining() < 1;\r\n }\r\n\r\n if (elements.length == 0) {\r\n commitRootFragment();\r\n\r\n processEffectQueue();\r\n return;\r\n }\r\n requestIdleCallback(workLoop);\r\n}\r\n\r\nfunction renderNode(fiber: Fiber) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n const isArray = !fiber.props.children[FRAGMENT_SYMBOL];\r\n let noKey = false;\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n fiber.props.children[i].parent = fiber;\r\n\r\n if (\r\n isArray &&\r\n fiber.props.children[i].props.key === undefined &&\r\n fiber.renderFunction\r\n ) {\r\n noKey = true;\r\n }\r\n\r\n elements.push(fiber.props.children[i]);\r\n }\r\n if (noKey) {\r\n console.error(\"Array children must have a key attribute\");\r\n }\r\n // console.log(fiber.props.children);\r\n } else if (typeof fiber.type === \"function\") {\r\n setCurrentFC(fiber);\r\n\r\n const children = fiber.type(fiber.props);\r\n clearCurrentFC();\r\n\r\n if (Array.isArray(children)) {\r\n // which means that the FC returned a fragment\r\n // console.log(children);\r\n for (let i = children.length - 1; i >= 0; i--) {\r\n children[i].parent = fiber;\r\n elements.push(children[i]);\r\n }\r\n fiber.props.children = children;\r\n } else {\r\n children.parent = fiber;\r\n fiber.props.children.push(children);\r\n elements.push(children);\r\n }\r\n // queue to run its effects\r\n effectQueue.push(fiber);\r\n } else {\r\n if (!fiber.dom) fiber.dom = createNode(fiber);\r\n let fiberParent: Fiber | undefined = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n if (fiberParent) {\r\n fiberParent.dom?.appendChild(fiber.dom);\r\n }\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n fiber.props.children[i].parent = fiber;\r\n elements.push(fiber.props.children[i]);\r\n }\r\n }\r\n // console.log(fiber);\r\n setRenderFunction(fiber);\r\n}\r\n\r\nfunction createFiber(fiber: Fiber) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n const isFragment = fiber.props.children[FRAGMENT_SYMBOL];\r\n if (isFragment) {\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n createFiber(child);\r\n }\r\n } else {\r\n let noKey = false;\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n if (child.props.key === undefined) {\r\n noKey = true;\r\n }\r\n createFiber(child);\r\n }\r\n if (noKey) {\r\n console.error(\"Array children must have a key attribute\");\r\n }\r\n }\r\n } else if (typeof fiber.type !== \"function\") {\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n createFiber(child);\r\n }\r\n }\r\n // console.log(fiber);\r\n setRenderFunction(fiber);\r\n}\r\nfunction commitFiber(\r\n fiber: Fiber,\r\n referenceNode?: Node,\r\n replace?: boolean,\r\n needCreation?: boolean,\r\n customParent?: Node\r\n) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n for (const child of fiber.props.children) {\r\n if (needCreation) child.parent = fiber;\r\n commitFiber(\r\n child,\r\n referenceNode,\r\n replace,\r\n needCreation,\r\n customParent\r\n );\r\n }\r\n } else if (typeof fiber.type === \"function\") {\r\n setCurrentFC(fiber);\r\n\r\n const children = fiber.type(fiber.props);\r\n clearCurrentFC();\r\n\r\n // console.log(\"commit FC\", children);\r\n if (Array.isArray(children)) {\r\n // which means that the FC returned a fragment\r\n // console.log(children);\r\n for (const child of children) {\r\n child.parent = fiber;\r\n commitFiber(child, referenceNode, replace, true, customParent);\r\n }\r\n fiber.props.children = children;\r\n } else {\r\n children.parent = fiber;\r\n fiber.props.children.push(children);\r\n commitFiber(children, referenceNode, replace, true, customParent);\r\n }\r\n // queue to run its effects at the end of current stack\r\n queueMicrotask(() => {\r\n runAllEffects(fiber);\r\n });\r\n } else {\r\n if (!fiber.dom) fiber.dom = createNode(fiber);\r\n\r\n if (referenceNode) {\r\n if (replace)\r\n referenceNode.parentElement?.replaceChild(\r\n fiber.dom,\r\n referenceNode\r\n );\r\n else\r\n referenceNode.parentElement?.insertBefore(\r\n fiber.dom,\r\n referenceNode\r\n );\r\n } else {\r\n let parentDom: Node | undefined = undefined;\r\n if (customParent) {\r\n parentDom = customParent;\r\n } else {\r\n let fiberParent: Fiber | undefined = fiber.parent;\r\n\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n parentDom = fiberParent?.dom;\r\n }\r\n parentDom?.appendChild(fiber.dom);\r\n }\r\n for (const child of fiber.props.children) {\r\n if (needCreation) child.parent = fiber;\r\n\r\n commitFiber(child, undefined, undefined, needCreation, fiber.dom);\r\n }\r\n }\r\n if (needCreation) {\r\n setRenderFunction(fiber);\r\n }\r\n}\r\n\r\nlet ToCommitDeletion = true;\r\n\r\nfunction commitDeletion(fiber: Fiber, toClearReactiveFunction?: boolean) {\r\n if (!fiber || !ToCommitDeletion) return;\r\n if (fiber.renderFunction) {\r\n if (toClearReactiveFunction)\r\n clearReactiveFunction(fiber.renderFunction);\r\n delete fiber.renderFunction;\r\n }\r\n if (fiber.dom) {\r\n for (const prop in fiber.props) {\r\n if (isEvent(prop)) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(CAPTURE_REGEX, \"$1\"));\r\n\r\n fiber.dom.removeEventListener(\r\n eventName,\r\n fiber.props[prop],\r\n useCapture\r\n );\r\n delete fiber.props[prop];\r\n } else if (typeof fiber.props[prop] === \"function\") {\r\n clearReactiveAttributes(fiber.props[prop]);\r\n } else if (prop === \"ref\" && fiber.props[prop] instanceof Ref) {\r\n fiber.props[prop].current = null;\r\n }\r\n }\r\n\r\n fiber.dom.remove();\r\n }\r\n if (typeof fiber.type === \"function\") {\r\n cleanUpFC(fiber, fiber.props);\r\n // @ts-expect-error\r\n delete fiber.type;\r\n }\r\n fiber.props.children.forEach((child) => commitDeletion(child, true));\r\n}\r\n\r\nfunction setRenderFunction(fiber: Fiber) {\r\n if (!fiber.renderFunction) return;\r\n setReactiveFunction(fiber.renderFunction, fiber);\r\n}\r\n\r\nexport function updateFiber(prevFiber: Fiber, newValue) {\r\n // console.log(\"Prev value\", prevFiber, newValue);\r\n // startTime = performance.now();\r\n if (isPrimitive(newValue)) {\r\n // console.log(fiber, newValue);\r\n const newFragment: Fiber = {\r\n ...createTextChildren(newValue),\r\n parent: prevFiber.parent,\r\n };\r\n createFiber(newFragment);\r\n // console.log(\"New Text Fiber\", newFragment);\r\n\r\n updateNode(prevFiber, newFragment);\r\n } else if (Array.isArray(newValue)) {\r\n const isFragment = newValue[FRAGMENT_SYMBOL];\r\n\r\n const newFragment: Fiber = {\r\n type: \"FRAGMENT\",\r\n props: {\r\n children: isFragment ? newValue : createChildren(newValue),\r\n },\r\n parent: prevFiber.parent,\r\n };\r\n\r\n createFiber(newFragment);\r\n updateNode(prevFiber, newFragment);\r\n } else {\r\n const newFragment = { ...newValue, parent: prevFiber.parent };\r\n createFiber(newFragment);\r\n // console.log(\"New Node Fiber\", newFragment);\r\n updateNode(prevFiber, newFragment);\r\n }\r\n // const endTime = performance.now();\r\n // console.log(\"Update Time:\", (endTime - startTime).toFixed(2), \"ms\");\r\n}\r\n\r\nfunction replaceRenderFunction(prev: Fiber, next: Fiber) {\r\n if (prev.renderFunction) {\r\n next.renderFunction = prev.renderFunction;\r\n // console.log(\"Replace render function\", prev, next);\r\n // deleteReactiveFunction(prev.renderFunction);\r\n setRenderFunction(next);\r\n }\r\n}\r\n\r\nfunction replaceChildFromParent(prev: Fiber, next: Fiber, index?: number) {\r\n if (index !== undefined) {\r\n prev.parent.props.children[index] = next;\r\n return;\r\n }\r\n prev.parent?.props.children.forEach((child, i) => {\r\n if (child === prev) {\r\n prev.parent.props.children[i] = next;\r\n }\r\n });\r\n}\r\n\r\nexport const isEvent = (key: string) =>\r\n key.startsWith(\"on\") || key == \"onFocusOut\" || key == \"onFocusIn\";\r\nexport const isProperty = (key: string) =>\r\n key !== \"children\" && !isEvent(key) && key !== \"key\" && key !== \"ref\";\r\nconst isNew = (prev: any, next: any, key: string) => prev[key] !== next[key];\r\nconst isGone = (prev: any, next: any, key: string) => !(key in next);\r\n\r\nfunction deepCompareFibers(fiberA: any, fiberB: any): boolean {\r\n // Fast path: identical references\r\n if (fiberA === fiberB) {\r\n return true;\r\n }\r\n\r\n // Compare the fiber types (e.g., function for FCs, string for DOM nodes)\r\n if (fiberA.type !== fiberB.type) {\r\n return false;\r\n }\r\n\r\n // Compare keys if they exist\r\n if (fiberA.props?.key !== fiberB.props?.key) {\r\n return false;\r\n }\r\n return deepEqual(fiberA.props, fiberB.props);\r\n}\r\n\r\nfunction deepEqual(objA: any, objB: any): boolean {\r\n if (objA === objB) {\r\n // console.log(\"Signal prop\");\r\n\r\n if (objA instanceof BaseSignal && objB instanceof BaseSignal)\r\n return deepEqual(objA.value, objB.value);\r\n if (Array.isArray(objA) && Array.isArray(objB)) {\r\n if (objA.length !== objB.length) return false;\r\n for (let i = 0; i < objA.length; i++) {\r\n if (!deepEqual(objA[i], objB[i])) return false;\r\n }\r\n }\r\n return true;\r\n } // Same reference or primitive value\r\n\r\n if (isPrimitive(objA) && isPrimitive(objB)) {\r\n return objA === objB; // One is not an object or is null\r\n }\r\n\r\n if (typeof objA !== typeof objB) return false;\r\n\r\n const keysA = Object.keys(objA);\r\n const keysB = Object.keys(objB);\r\n\r\n if (keysA.length !== keysB.length) return false; // Different number of keys\r\n\r\n for (let key of keysA) {\r\n if (key === \"children\") continue;\r\n if (!objB.hasOwnProperty(key)) return false; // Missing key in one of them\r\n if (!deepEqual(objA[key], objB[key])) return false; // Recurse for nested objects/arrays\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction findFirstDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n if (fiber.dom) return fiber.dom;\r\n\r\n for (const child of fiber.props.children) {\r\n const dom = findFirstDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\n// function findFirstChildDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n// if (!fiber) return;\r\n\r\n// for (const child of fiber.props.children) {\r\n// const dom = findFirstDom(child);\r\n// if (dom) return dom;\r\n// }\r\n// }\r\nfunction findLastDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n if (fiber.dom) return fiber.dom;\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n const child = fiber.props.children[i];\r\n const dom = findLastDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\nfunction findLastChildDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n const child = fiber.props.children[i];\r\n const dom = findLastDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\nfunction findParentFiberWithDom(fiber: Fiber): Fiber | undefined {\r\n if (!fiber) return;\r\n let fiberParent = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n return fiberParent;\r\n}\r\nfunction findNearestParentWithDom(fiber: Fiber): Fiber | undefined {\r\n if (!fiber) return;\r\n if (fiber.dom) return fiber;\r\n\r\n let fiberParent = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n return fiberParent;\r\n}\r\n\r\nfunction updateNode(\r\n prev: Fiber | undefined,\r\n next: Fiber | undefined,\r\n index?: number\r\n) {\r\n if (!prev && !next) return;\r\n\r\n if (prev && !next) {\r\n commitDeletion(prev, true);\r\n // console.log(\"to remove\", prev);\r\n prev.parent.props.children = prev.parent.props.children.filter(\r\n (child) => child !== prev\r\n );\r\n } else if (prev && next) {\r\n const prevProps = prev.props;\r\n const nextProps = next.props;\r\n if (prev.type === \"FRAGMENT\" || typeof prev.type === \"function\") {\r\n // PREV IS FRAGMENT\r\n if (next.type === \"FRAGMENT\" || typeof next.type === \"function\") {\r\n // console.log(\"Fragment-Fragment\", prev, next);\r\n if (\r\n typeof prev.type === typeof next.type &&\r\n typeof prev.type === \"function\"\r\n ) {\r\n const areSame = deepCompareFibers(prev, next);\r\n if (!areSame) {\r\n commitFiber(next, findFirstDom(prev), undefined, true);\r\n\r\n replaceRenderFunction(prev, next);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n }\r\n } else {\r\n // console.log(\"fragment-fragment\", { ...prev }, next);\r\n\r\n updateChildren(prev, next);\r\n }\r\n // replaceChildFromParent(prev, next);\r\n } else {\r\n next.parent = prev.parent;\r\n let firstChild: Fiber | undefined = prev.props.children[0];\r\n while (firstChild && !firstChild.dom)\r\n firstChild = firstChild.props.children[0];\r\n commitFiber(next, firstChild?.dom);\r\n\r\n replaceRenderFunction(prev, next);\r\n // removing all nodes of previous fragment\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n }\r\n } else {\r\n // PREV IS NODE\r\n\r\n const node = prev.dom;\r\n if (\r\n prev.type === \"TEXT_CHILD\" &&\r\n next.type === \"TEXT_CHILD\" &&\r\n !next.dom\r\n )\r\n next.dom = prev.dom;\r\n if (node === undefined) {\r\n // console.error(\"no node found\", prev, next);\r\n return;\r\n }\r\n // console.log(prev);\r\n if (next.type === \"FRAGMENT\" || typeof next.type === \"function\") {\r\n // console.log(\"Node-Fragment\");\r\n next.parent = prev.parent;\r\n replaceRenderFunction(prev, next);\r\n\r\n commitFiber(next, node);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n } else {\r\n // console.log(\"Node-Node\");\r\n // remove old properties and event listeners from NODE\r\n for (const prop in prevProps) {\r\n if (\r\n isProperty(prop) &&\r\n isGone(prevProps, nextProps, prop)\r\n ) {\r\n node[prop] = \"\";\r\n // console.log(\"property removed\", prop);\r\n } else if (\r\n isEvent(prop) &&\r\n (!(prop in nextProps) ||\r\n isNew(prevProps, nextProps, prop))\r\n ) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(\r\n CAPTURE_REGEX,\r\n \"$1\"\r\n ));\r\n\r\n node.removeEventListener(\r\n eventName,\r\n prevProps[prop],\r\n useCapture\r\n );\r\n // console.log(\"event listener removed\", prop);\r\n }\r\n }\r\n if (prev.type !== next.type) {\r\n // console.log(\"Different type\", prev, next);\r\n next.parent = prev.parent;\r\n\r\n replaceRenderFunction(prev, next);\r\n\r\n commitFiber(next, node, true);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n\r\n // console.log(prev.parent);\r\n } else {\r\n // add new properties\r\n // console.log(\"same type\", prev, next);\r\n\r\n for (const prop in nextProps) {\r\n if (\r\n isProperty(prop) &&\r\n isNew(prevProps, nextProps, prop)\r\n ) {\r\n node[prop] = nextProps[prop];\r\n // console.log(\r\n // \"property added\",\r\n // prop,\r\n // nextProps[prop]\r\n // );\r\n prevProps[prop] = nextProps[prop];\r\n } else if (\r\n isEvent(prop) &&\r\n isNew(prevProps, nextProps, prop)\r\n ) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(\r\n CAPTURE_REGEX,\r\n \"$1\"\r\n ));\r\n node.addEventListener(\r\n eventName,\r\n nextProps[prop],\r\n useCapture\r\n );\r\n prevProps[prop] = nextProps[prop];\r\n }\r\n }\r\n updateChildren(prev, next);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction reconcileList(prev: Fiber, next: Fiber) {\r\n const oldFibers = prev.props.children;\r\n const newFibers = next.props.children;\r\n\r\n // Create a map from key to fiber for oldFibers.\r\n const oldMap: Record = {};\r\n for (let i = 0; i < oldFibers.length; i++) {\r\n const key = oldFibers[i].props.key;\r\n if (\r\n key === null ||\r\n key === undefined ||\r\n oldMap.hasOwnProperty(String(key))\r\n ) {\r\n // If any fiber is missing a key, we cannot reconcile.\r\n // oldFibers[i].props.key =\r\n return false;\r\n }\r\n oldMap[String(key)] = oldFibers[i];\r\n }\r\n const referenceNode = findLastChildDom(prev)?.nextSibling as\r\n | Node\r\n | undefined;\r\n // Create newChildren array based on newFibers order.\r\n const fiberParent = findParentFiberWithDom(prev);\r\n // const fragment = document.createDocumentFragment();\r\n\r\n if (newFibers.length === 0) {\r\n prev.props.children.length = 0;\r\n if (fiberParent?.dom instanceof HTMLElement)\r\n fiberParent.dom.innerHTML = \"\";\r\n return;\r\n }\r\n const prevLen = prev.props.children.length;\r\n\r\n // const newChildren = new Array(newFibers.length);\r\n for (let i = 0; i < newFibers.length; i++) {\r\n const newFiber = newFibers[i];\r\n const key = newFiber.props.key;\r\n const keyStr = String(key);\r\n // If the fiber exists in the old list, reuse it.\r\n if (oldMap.hasOwnProperty(keyStr)) {\r\n const oldFiber = oldMap[keyStr];\r\n\r\n if (prevLen > i) prev.props.children[i] = oldFiber;\r\n else prev.props.children.push(oldFiber);\r\n\r\n delete oldMap[keyStr];\r\n\r\n const newFiber = next.props.children[i];\r\n\r\n if (newFiber) newFiber.parent = prev;\r\n\r\n updateNode(oldFiber, newFiber, i);\r\n applyFiber(\r\n prev.props.children[i],\r\n fiberParent?.dom!,\r\n referenceNode\r\n );\r\n } else {\r\n // Otherwise, use the new fiber.\r\n // console.log(first)\r\n if (prevLen > i) prev.props.children[i] = newFiber;\r\n else prev.props.children.push(newFiber);\r\n\r\n newFiber.parent = prev;\r\n commitFiber(\r\n newFiber,\r\n referenceNode,\r\n false,\r\n false,\r\n fiberParent?.dom\r\n );\r\n }\r\n }\r\n for (const key in oldMap) {\r\n if (oldMap.hasOwnProperty(key)) {\r\n const fiber = oldMap[key];\r\n commitDeletion(fiber, true);\r\n }\r\n }\r\n while (prev.props.children.length > next.props.children.length) {\r\n prev.props.children.pop();\r\n }\r\n\r\n // fiberParent?.dom?.appendChild(fragment);\r\n}\r\n\r\nfunction applyFiber(fiber: Fiber, parent: Node, referenceNode?: Node) {\r\n if (fiber.dom) {\r\n if (fiber.dom === parent || fiber.dom === referenceNode) return;\r\n if (referenceNode) {\r\n parent.insertBefore(fiber.dom, referenceNode);\r\n } else parent.appendChild(fiber.dom);\r\n } else {\r\n for (const child of fiber.props.children) {\r\n applyFiber(child, parent, referenceNode);\r\n }\r\n }\r\n}\r\n\r\nfunction updateChildren(prev: Fiber, next: Fiber) {\r\n const isList =\r\n next.type === \"FRAGMENT\" && !next.props.children[FRAGMENT_SYMBOL];\r\n\r\n const wasList =\r\n prev.type === \"FRAGMENT\" && !prev.props.children[FRAGMENT_SYMBOL];\r\n\r\n // console.log(isList, wasList);\r\n\r\n if (isList && wasList) {\r\n const result = reconcileList(prev, next);\r\n if (result === false) {\r\n updateNonListChildrenWithKeys(prev, next);\r\n }\r\n } else {\r\n updateNonListChildrenWithKeys(prev, next);\r\n }\r\n if (next.type === \"FRAGMENT\" && next.props.children[FRAGMENT_SYMBOL]) {\r\n prev.props.children[FRAGMENT_SYMBOL] = true;\r\n } else {\r\n prev.props.children[FRAGMENT_SYMBOL] = false;\r\n }\r\n\r\n prev.type = next.type;\r\n}\r\n\r\nfunction updateNonListChildren(prev: Fiber, next: Fiber) {\r\n let len = Math.max(prev.props.children.length, next.props.children.length);\r\n\r\n for (let i = 0; i < len; i++) {\r\n let prevChild = prev.props.children[i];\r\n let nextChild = next.props.children[i];\r\n\r\n if (nextChild) nextChild.parent = prev;\r\n if (!prevChild && nextChild) {\r\n commitFiber(\r\n nextChild,\r\n // @ts-expect-error\r\n findLastDom(prev.props.children.at(-1))?.nextSibling\r\n );\r\n prev.props.children.push(nextChild);\r\n } else if (!nextChild && prevChild) {\r\n commitDeletion(prevChild, true);\r\n prev.props.children.splice(i, 1);\r\n len = prev.props.children.length;\r\n i--;\r\n } else {\r\n updateNode(prevChild, nextChild, i);\r\n const newLen = Math.max(\r\n prev.props.children.length,\r\n next.props.children.length\r\n );\r\n if (newLen < len) {\r\n len = newLen;\r\n i--;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction updateNonListChildrenWithKeys(prev: Fiber, next: Fiber) {\r\n let len = Math.max(prev.props.children.length, next.props.children.length);\r\n const oldMap: Record = {};\r\n let count = 0;\r\n for (let i = 0; i < prev.props.children.length; i++) {\r\n const key = prev.props.children[i].props.key;\r\n if (key === null || key === undefined) {\r\n continue;\r\n }\r\n count++;\r\n if (oldMap.hasOwnProperty(String(key))) {\r\n console.warn(\"Found two children with the same key\", key);\r\n console.warn(\r\n \"When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation\"\r\n );\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n oldMap[String(key)] = { fiber: prev.props.children[i], index: i };\r\n }\r\n if (count == 0) {\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n const newMap: Record<\r\n string,\r\n { fiber: Fiber; newIndex: number; oldIndex: number }\r\n > = {};\r\n\r\n for (let i = 0; i < next.props.children.length; i++) {\r\n const key = next.props.children[i].props.key;\r\n if (key === null || key === undefined) {\r\n continue;\r\n }\r\n const oldFiber = oldMap[String(key)];\r\n if (oldFiber) {\r\n if (newMap.hasOwnProperty(String(key))) {\r\n console.warn(\"Found two children with the same key\", key);\r\n console.warn(\r\n \"When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation\"\r\n );\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n newMap[String(key)] = {\r\n fiber: oldFiber.fiber,\r\n newIndex: i,\r\n oldIndex: oldFiber.index,\r\n };\r\n }\r\n }\r\n // console.log(prev, next);\r\n const parent = findNearestParentWithDom(prev);\r\n\r\n for (let i = 0; i < len; i++) {\r\n let prevChild = prev.props.children[i];\r\n let nextChild = next.props.children[i];\r\n // console.log(prevChild, nextChild);\r\n\r\n const nextKey = nextChild?.props.key ? String(nextChild.props.key) : \"\";\r\n const isReused = newMap.hasOwnProperty(nextKey);\r\n\r\n let prevKey = prevChild?.props.key ? String(prevChild.props.key) : \"\";\r\n\r\n if (prevKey && nextKey && prevKey === nextKey) {\r\n // console.log(\"same\", prevChild, nextChild);\r\n updateNode(prevChild, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n continue;\r\n }\r\n\r\n const isUsedLater =\r\n newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex > i;\r\n const isUsedPreviously =\r\n newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex < i;\r\n\r\n if (isUsedLater || isUsedPreviously) {\r\n ToCommitDeletion = false;\r\n }\r\n\r\n if (nextChild) nextChild.parent = prev;\r\n\r\n if (!prevChild && nextChild) {\r\n if (isReused) {\r\n const { fiber } = newMap[nextKey];\r\n\r\n prev.props.children.push(fiber);\r\n\r\n updateNode(fiber, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n } else {\r\n // needCreation just creates parent child heirarchy\r\n if (parent?.dom)\r\n commitFiber(nextChild, undefined, false, false, parent.dom);\r\n prev.props.children.push(nextChild);\r\n }\r\n } else if (!nextChild && prevChild) {\r\n commitDeletion(prevChild, true);\r\n prev.props.children.splice(i, 1);\r\n len = prev.props.children.length;\r\n i--;\r\n } else {\r\n if (isReused) {\r\n const { fiber } = newMap[nextKey];\r\n\r\n commitDeletion(prevChild, true);\r\n // because updateNode can call commitDeletion internally\r\n ToCommitDeletion = true;\r\n\r\n prev.props.children[i] = fiber;\r\n\r\n updateNode(fiber, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n } else {\r\n // console.log(ToCommitDeletion);\r\n if (isUsedLater || isUsedPreviously) {\r\n if (parent?.dom)\r\n commitFiber(\r\n nextChild,\r\n undefined,\r\n false,\r\n false,\r\n parent.dom\r\n );\r\n prev.props.children[i] = nextChild;\r\n } else {\r\n updateNode(prevChild, nextChild, i);\r\n if (parent?.dom)\r\n applyFiber(prev.props.children[i], parent.dom);\r\n\r\n const newLen = Math.max(\r\n prev.props.children.length,\r\n next.props.children.length\r\n );\r\n if (newLen < len) {\r\n len = newLen;\r\n i--;\r\n }\r\n }\r\n }\r\n }\r\n ToCommitDeletion = true;\r\n }\r\n // console.log(prev.props.children, next.props.children);\r\n}\r\n\r\n// @ts-expect-error\r\nif (typeof process !== \"undefined\" && process.env.NODE_ENV === \"test\") {\r\n // @ts-expect-error\r\n module.exports = {\r\n createFiber,\r\n commitDeletion,\r\n commitFiber,\r\n updateFiber,\r\n deepCompareFibers,\r\n deepEqual,\r\n };\r\n}\r\n","import { updateDomProp } from \"../rendering/createElements\";\r\nimport { updateFiber } from \"../rendering/render\";\r\nimport { Fiber } from \"../types\";\r\n\r\nlet scheduled = false;\r\nconst batch = new Set();\r\nconst depset = new Set();\r\nconst reactiveFiberMap = new WeakMap();\r\nconst domAttributeMap = new WeakMap();\r\n\r\nexport function batchUpdate(cb: Function) {\r\n batch.add(cb);\r\n if (!scheduled) {\r\n scheduled = true;\r\n queueMicrotask(() => {\r\n // console.log(\"Current batch has: \", batch.size, \" Functions\");\r\n\r\n batch.forEach((fn) => {\r\n const dep = fn();\r\n if (depset.has(dep)) {\r\n return;\r\n }\r\n depset.add(dep);\r\n // effects and reactive nodes\r\n if (dep.__cleanup && typeof dep.__cleanup === \"function\") {\r\n dep.__cleanup();\r\n dep.__cleanup = null;\r\n }\r\n\r\n const val = dep();\r\n\r\n if (typeof val === \"function\") {\r\n dep.__cleanup = val;\r\n }\r\n // console.log(dep, \"dep\");\r\n if (reactiveFiberMap.has(dep)) {\r\n // for updating reactive nodes\r\n const fiber = reactiveFiberMap.get(dep);\r\n if (fiber) {\r\n // console.log(\"dep\", fiber);\r\n updateFiber(fiber, val);\r\n }\r\n }\r\n if (domAttributeMap.has(dep)) {\r\n // for updating reactive nodes\r\n const dom = domAttributeMap.get(dep);\r\n if (dom && dep.__propName) {\r\n updateDomProp(dep.__propName, dom, val);\r\n }\r\n }\r\n });\r\n depset.clear();\r\n batch.clear();\r\n scheduled = false;\r\n });\r\n }\r\n}\r\n\r\nexport function setReactiveFunction(fn: Function, fiber: Fiber) {\r\n reactiveFiberMap.set(fn, fiber);\r\n}\r\nexport function setReactiveAttributes(fn: Function, dom: HTMLElement | Text) {\r\n // console.log(\"reactive attrubite\", fn);\r\n domAttributeMap.set(fn, dom);\r\n}\r\nexport function clearReactiveAttributes(fn: any) {\r\n domAttributeMap.delete(fn);\r\n\r\n const signals = fn.__signals;\r\n if (signals) {\r\n for (const signal of signals) {\r\n signal.removeDep(fn);\r\n }\r\n fn.__signals = null;\r\n }\r\n}\r\n\r\nexport function clearReactiveFunction(fn: Function) {\r\n reactiveFiberMap.delete(fn);\r\n // @ts-expect-error\r\n const signals = fn.__signals;\r\n if (signals) {\r\n for (const signal of signals) {\r\n signal.removeDep(fn);\r\n }\r\n // @ts-expect-error\r\n fn.__signals = null;\r\n }\r\n}\r\n\r\nexport function deleteReactiveFunction(fn: Function) {\r\n reactiveFiberMap.delete(fn);\r\n}\r\n","import {\r\n addEffect,\r\n addSignal,\r\n cleanUp,\r\n cleanUpWFiber,\r\n getCurrentFC,\r\n} from \"../rendering/functionalComponents\";\r\nimport { Fiber } from \"../types\";\r\nimport { isPlainObject, isPrimitive } from \"../utils/general\";\r\nimport { batchUpdate } from \"./batch\";\r\n\r\nlet currentReactiveFunction: any = null;\r\nlet currentEffect: any = null;\r\n\r\nfunction addSignalToReactiveFunction(signal: any) {\r\n if (!currentReactiveFunction.__signals) {\r\n currentReactiveFunction.__signals = new Set();\r\n }\r\n currentReactiveFunction.__signals.add(signal);\r\n}\r\nfunction addSignalToEffect(signal: any) {\r\n if (!currentEffect.__signals) currentEffect.__signals = new Set();\r\n currentEffect.__signals.add(signal);\r\n}\r\n\r\nexport function reactive(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"reactive takes a render function as the argument\");\r\n\r\n currentReactiveFunction = fn;\r\n const retVal = fn();\r\n currentReactiveFunction = null;\r\n if (\r\n !isPrimitive(retVal) &&\r\n isPlainObject(retVal) &&\r\n !retVal.type &&\r\n !retVal.props &&\r\n !retVal.props?.children\r\n )\r\n throw new Error(\r\n \"Reactive value must be primitive or functional component, got: \" +\r\n typeof retVal\r\n );\r\n return retVal;\r\n}\r\nexport function reactiveAttribute(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"reactive takes a render function as the argument\");\r\n\r\n currentReactiveFunction = fn;\r\n const retVal = fn();\r\n currentReactiveFunction = null;\r\n\r\n return retVal;\r\n}\r\nexport function createEffect(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"createEffect takes a effect function as the argument\");\r\n\r\n addEffect(fn);\r\n if (!getCurrentFC()) runEffect(fn);\r\n}\r\n\r\nexport function runEffect(effect: Function, fiber?: Fiber) {\r\n if (typeof effect !== \"function\") return;\r\n\r\n currentEffect = effect;\r\n\r\n const effectCleanup = effect();\r\n\r\n if (currentEffect.__signals && typeof effectCleanup === \"function\") {\r\n currentEffect.__cleanup = effectCleanup;\r\n }\r\n\r\n if (\r\n !currentEffect.__signals &&\r\n effectCleanup &&\r\n typeof effectCleanup === \"function\"\r\n ) {\r\n // which means this effect does not have any signals associated with so its just a cleanup function that we need to call when the component unmounts\r\n if (!fiber) {\r\n cleanUp(effectCleanup);\r\n } else {\r\n cleanUpWFiber(effectCleanup, fiber);\r\n }\r\n }\r\n\r\n currentEffect = null;\r\n}\r\n\r\nfunction computed>(\r\n fn: () => T\r\n) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"computed takes a function as the argument\");\r\n\r\n let firstRun = getCurrentFC() !== null;\r\n currentEffect = () => {\r\n if (firstRun) {\r\n firstRun = false;\r\n return;\r\n }\r\n signal.update(fn());\r\n };\r\n\r\n addEffect(currentEffect);\r\n\r\n const val = fn();\r\n\r\n // @ts-expect-error - Type assertion for signal\r\n const signal = createSignal(val);\r\n\r\n currentEffect = null;\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n };\r\n}\r\n\r\ntype PromiseOverload =\r\n | { status: \"pending\"; data: null; error: null }\r\n | { status: \"resolved\"; data: T; error: null }\r\n | { status: \"rejected\"; data: null; error: Error };\r\n\r\nexport function createPromise(fn: () => Promise) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"createPromise takes a function as the argument\");\r\n const promise = fn();\r\n\r\n if (!(promise instanceof Promise)) {\r\n throw new Error(\r\n \"createPromise takes a function that returns a promise\"\r\n );\r\n }\r\n const triggerSignal = createSignal>({\r\n status: \"pending\",\r\n data: null,\r\n error: null,\r\n });\r\n\r\n promise\r\n .then((val) => {\r\n triggerSignal.update((prev) => {\r\n prev.data = val;\r\n prev.status = \"resolved\";\r\n });\r\n })\r\n .catch((err) => {\r\n triggerSignal.update((prev) => {\r\n prev.error = err;\r\n prev.status = \"rejected\";\r\n });\r\n });\r\n\r\n return {\r\n get value() {\r\n return triggerSignal.value;\r\n },\r\n };\r\n}\r\n\r\nexport class Ref {\r\n current: T | null;\r\n constructor(val: T | null) {\r\n this.current = val;\r\n }\r\n}\r\n\r\nexport function createRef() {\r\n const ref = new Ref(null);\r\n return ref;\r\n}\r\n\r\n// const NonMutatingArrayMethods = [\r\n// \"constructor\",\r\n// \"concat\",\r\n// \"every\",\r\n// \"filter\",\r\n// \"find\",\r\n// \"findIndex\",\r\n// \"flat\",\r\n// \"flatMap\",\r\n// \"forEach\",\r\n// \"includes\",\r\n// \"indexOf\",\r\n// \"join\",\r\n// \"map\",\r\n// \"reduce\",\r\n// \"reduceRight\",\r\n// \"slice\",\r\n// \"some\",\r\n// \"toLocaleString\",\r\n// \"toString\",\r\n// ];\r\nconst MutatingMethods = [\r\n \"push\",\r\n \"pop\",\r\n \"unshift\",\r\n \"shift\",\r\n \"splice\",\r\n \"fill\",\r\n \"copyWithin\",\r\n \"sort\",\r\n \"reverse\",\r\n];\r\n\r\ntype DeepReadonly = {\r\n readonly [K in keyof T]: T[K] extends object ? DeepReadonly : T[K];\r\n};\r\n\r\n/**\r\n *\r\n * Base class for signals.\r\n */\r\nexport abstract class BaseSignal {\r\n protected _val: T;\r\n protected deps: Set;\r\n protected isNotified: boolean = false;\r\n\r\n constructor(val: T) {\r\n this._val = val;\r\n this.deps = new Set();\r\n }\r\n\r\n protected notify() {\r\n if (this.isNotified) return;\r\n\r\n if (this.deps.size !== 0) this.isNotified = true;\r\n\r\n this.deps.forEach((dep) => {\r\n batchUpdate(() => {\r\n // Reset the flag before calling the dependency\r\n this.isNotified = false;\r\n return dep;\r\n });\r\n });\r\n }\r\n\r\n public removeDep(fn: Function) {\r\n this.deps.delete(fn);\r\n }\r\n\r\n public clearDeps() {\r\n this.deps.clear();\r\n }\r\n\r\n abstract get value(): T | DeepReadonly;\r\n\r\n abstract update(val: T | ((prev: T) => T)): void;\r\n}\r\n\r\ntype NormalSignal = boolean | string | number | undefined | null | Error;\r\n/**\r\n * Signal for primitive types.\r\n */\r\nexport class PrimitiveSignal extends BaseSignal {\r\n constructor(val: T) {\r\n if (!isPrimitive(val)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n super(val);\r\n }\r\n\r\n get value(): T {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n\r\n addSignalToReactiveFunction(this);\r\n }\r\n // (Optional) debug logging:\r\n // console.log(this.deps);\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => T)) {\r\n if (typeof val === \"function\") {\r\n const newVal = val(this._val);\r\n if (!isPrimitive(newVal)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n if (newVal === this._val) return;\r\n this._val = newVal;\r\n this.notify();\r\n } else {\r\n if (!isPrimitive(val)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n\r\n this._val = val;\r\n\r\n this.notify();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Signal for arrays.\r\n */\r\nexport class ArraySignal extends BaseSignal {\r\n private updateCalled: boolean = false;\r\n\r\n constructor(val: T) {\r\n if (!Array.isArray(val)) {\r\n throw new Error(\r\n \"Invalid type for ArraySignal; value must be an array\"\r\n );\r\n }\r\n // Call the base constructor with a proxy-wrapped array.\r\n super(val);\r\n this._val = this.createProxy(val);\r\n }\r\n\r\n private createProxy(val: T): T {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n // If a function is accessed, wrap it to trigger notifications on mutation.\r\n\r\n if (typeof value === \"function\") {\r\n if (\r\n MutatingMethods.includes(String(prop)) &&\r\n !this.updateCalled\r\n ) {\r\n throw new Error(\r\n \"Cannot set a value on an array signal, use the update method for updating the array.\"\r\n );\r\n }\r\n\r\n return (...args: any[]) => {\r\n const result = value.apply(target, args);\r\n // Notify if the method is mutating.\r\n if (MutatingMethods.includes(String(prop))) {\r\n this.notify();\r\n }\r\n return result;\r\n };\r\n }\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an array signal, use the update method for updating the array.\"\r\n );\r\n }\r\n target[prop as any] = newValue;\r\n this.notify();\r\n return true;\r\n },\r\n });\r\n }\r\n\r\n get value(): DeepReadonly {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n addSignalToReactiveFunction(this);\r\n }\r\n\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => void)) {\r\n this.updateCalled = true;\r\n if (typeof val === \"function\") {\r\n val(this._val);\r\n } else {\r\n if (!Array.isArray(val)) {\r\n throw new Error(\r\n \"Invalid type for ArraySignal; value must be an array\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n\r\n this._val = this.createProxy(val);\r\n\r\n this.notify();\r\n }\r\n this.updateCalled = false;\r\n }\r\n}\r\n\r\n/**\r\n * Signal for plain objects.\r\n */\r\nexport class ObjectSignal> extends BaseSignal {\r\n private updateCalled: boolean = false;\r\n constructor(val: T) {\r\n if (!isPlainObject(val)) {\r\n throw new Error(\r\n \"Invalid type for ObjectSignal; value must be a plain object\"\r\n );\r\n }\r\n super(val);\r\n this._val = this.createProxy(val);\r\n }\r\n private createInternalArrayProxy(val: A): A {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n // If a function is accessed, wrap it to trigger notifications on mutation.\r\n if (typeof value === \"function\") {\r\n if (\r\n !this.updateCalled &&\r\n MutatingMethods.includes(String(prop))\r\n ) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n\r\n return (...args: any[]) => {\r\n const result = value.apply(target, args);\r\n // Notify if the method is mutating.\r\n if (MutatingMethods.includes(String(prop))) {\r\n this.notify();\r\n }\r\n return result;\r\n };\r\n }\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n target[prop as any] = newValue;\r\n this.notify();\r\n return true;\r\n },\r\n });\r\n }\r\n private createProxy(val: T): T {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n if (Array.isArray(value)) {\r\n // @ts-expect-error\r\n target[prop as any] =\r\n this.createInternalArrayProxy(value);\r\n\r\n return target[prop as any];\r\n }\r\n // console.log(\"get\", target, prop, value);\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n // Do not allow functions to be set as values.\r\n if (typeof newValue === \"function\") return false;\r\n // For nested objects, wrap them as well.\r\n if (typeof newValue === \"object\" && newValue !== null) {\r\n newValue = this.createProxy(newValue);\r\n }\r\n if (newValue === target[prop as any]) return true;\r\n\r\n // @ts-expect-error\r\n target[prop as any] = newValue;\r\n\r\n this.notify();\r\n\r\n return true;\r\n },\r\n deleteProperty: (target, prop) => {\r\n const result = delete target[prop as any];\r\n this.notify();\r\n return result;\r\n },\r\n });\r\n }\r\n\r\n get value(): DeepReadonly {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n addSignalToReactiveFunction(this);\r\n }\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => void)) {\r\n this.updateCalled = true;\r\n if (typeof val === \"function\") {\r\n val(this._val);\r\n } else {\r\n if (!isPlainObject(val)) {\r\n throw new Error(\r\n \"Invalid type for ObjectSignal; value must be a plain object\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n this._val = this.createProxy(val);\r\n this.notify();\r\n }\r\n this.updateCalled = false;\r\n }\r\n}\r\n\r\nexport interface PublicSignal {\r\n readonly value: DeepReadonly;\r\n update(val: T | ((prev: T) => T)): void;\r\n}\r\n\r\nexport interface PublicArraySignal extends PublicSignal {\r\n update(val: T | ((prev: T) => void)): void; // Mutation allowed\r\n}\r\n\r\nexport interface PublicObjectSignal>\r\n extends PublicSignal {\r\n update(val: T | ((prev: T) => void)): void; // Mutation allowed\r\n}\r\n/**\r\n * Overloaded factory function to create a signal.\r\n */\r\nfunction createSignal(val: T): PublicSignal;\r\nfunction createSignal(val: T): PublicArraySignal;\r\nfunction createSignal>(\r\n val: T\r\n): PublicObjectSignal;\r\n\r\nfunction createSignal>(\r\n val: T\r\n) {\r\n if (typeof val === \"function\") {\r\n throw new Error(\"Functions cannot be used as signal value\");\r\n }\r\n\r\n if (typeof val === \"object\" && val !== null) {\r\n if (Array.isArray(val)) {\r\n const signal = new ArraySignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else if (isPlainObject(val)) {\r\n const signal = new ObjectSignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else {\r\n throw new Error(\r\n \"Invalid type for signal initialization: \" + typeof val\r\n );\r\n }\r\n } else if (isPrimitive(val)) {\r\n const signal = new PrimitiveSignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else {\r\n throw new Error(\r\n \"Invalid type for signal initialization: \" + typeof val\r\n );\r\n }\r\n}\r\n\r\nexport { computed, createSignal };\r\n","import { BaseSignal, runEffect } from \"../signals/signal\";\r\nimport { Fiber } from \"../types\";\r\n\r\nlet currentFC: Fiber | null = null;\r\nlet fcMap = new WeakMap<\r\n Fiber,\r\n {\r\n signals: Set>;\r\n cleanup: Function[];\r\n effects: Set;\r\n }\r\n>();\r\n\r\nexport function setCurrentFC(fc: Fiber) {\r\n currentFC = fc;\r\n}\r\n\r\nexport function clearCurrentFC() {\r\n currentFC = null;\r\n}\r\nexport function getCurrentFC() {\r\n return currentFC;\r\n}\r\n\r\nexport function runAllEffects(FC: Fiber) {\r\n if (fcMap.has(FC)) {\r\n const fcData = fcMap.get(FC)!;\r\n\r\n for (const effect of fcData.effects) {\r\n runEffect(effect, FC);\r\n }\r\n }\r\n}\r\n\r\nexport function cleanUp(fn: Function) {\r\n if (currentFC) {\r\n // console.log(currentFC, fcMap.has(currentFC));\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n\r\n fcData.cleanup.push(fn);\r\n } else {\r\n fcMap.set(currentFC, {\r\n signals: new Set(),\r\n cleanup: [fn],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\nexport function cleanUpWFiber(fn: Function, fiber: Fiber) {\r\n if (fiber) {\r\n // console.log(currentFC, fcMap.has(currentFC));\r\n if (fcMap.has(fiber)) {\r\n const fcData = fcMap.get(fiber)!;\r\n\r\n fcData.cleanup.push(fn);\r\n } else {\r\n fcMap.set(fiber, {\r\n signals: new Set(),\r\n cleanup: [fn],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function addEffect(fn: Function) {\r\n if (currentFC) {\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n fcData.effects.add(fn);\r\n } else {\r\n const effects = new Set();\r\n effects.add(fn);\r\n fcMap.set(currentFC, {\r\n signals: new Set(),\r\n cleanup: [],\r\n effects: effects,\r\n });\r\n }\r\n }\r\n}\r\nexport function addSignal(signal: BaseSignal) {\r\n if (currentFC) {\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n fcData.signals.add(signal);\r\n } else {\r\n const signals = new Set>();\r\n signals.add(signal);\r\n fcMap.set(currentFC, {\r\n signals: signals,\r\n cleanup: [],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function cleanUpFC(currentFC, props) {\r\n const fcData = fcMap.get(currentFC)!;\r\n if (fcData) {\r\n // console.log(\"Cleaning up FC\", currentFC, fcData);\r\n if (fcData.cleanup) {\r\n for (const fn of fcData.cleanup) {\r\n fn();\r\n }\r\n }\r\n\r\n fcData.cleanup = [];\r\n\r\n for (const effect of fcData.effects) {\r\n // @ts-expect-error\r\n if (effect.__cleanup && typeof effect.__cleanup === \"function\") {\r\n // @ts-expect-error\r\n effect.__cleanup();\r\n }\r\n // @ts-expect-error\r\n if (effect.__signals) {\r\n // @ts-expect-error\r\n for (const signal of effect.__signals) {\r\n signal.removeDep(effect);\r\n }\r\n }\r\n // @ts-expect-error\r\n delete effect.__signals;\r\n // @ts-expect-error\r\n delete effect.__cleanup;\r\n }\r\n\r\n fcData.signals.forEach((signal) => signal.clearDeps());\r\n fcData.signals.clear();\r\n }\r\n fcMap.delete(currentFC);\r\n}\r\n","import { ComponentChildren, createSignal, Fiber, PublicSignal } from \"../index\";\r\n\r\ndeclare const FRAGMENT = \"FRAGMENT\";\r\n\r\n// If the component takes no parameters, treat its props as {}\r\ntype PropsOf any> = Parameters extends []\r\n ? {}\r\n : Parameters[0];\r\n\r\nexport function lazy any>(\r\n importFn: () => Promise<{ default: T }>\r\n): (\r\n props: PropsOf & {\r\n fallback?: ComponentChildren;\r\n errorFallback?:\r\n | ComponentChildren\r\n | ((error: Error) => ComponentChildren);\r\n }\r\n) => ReturnType {\r\n let Component: T | null = null;\r\n\r\n const load = (\r\n loading: PublicSignal,\r\n error: PublicSignal\r\n ) => {\r\n if (!Component) {\r\n importFn()\r\n .then((mod) => {\r\n if (mod.default) {\r\n if (typeof mod.default !== \"function\") {\r\n throw new Error(\r\n \"Lazy-loaded component must be a functional component\"\r\n );\r\n }\r\n Component = mod.default;\r\n\r\n loading.update(false);\r\n error.update(null);\r\n } else {\r\n error.update(\r\n new Error(\r\n \"No default export found from lazy-loaded module\"\r\n )\r\n );\r\n }\r\n })\r\n .catch((err) => {\r\n error.update(err);\r\n loading.update(false);\r\n });\r\n } else {\r\n loading.update(false);\r\n error.update(null);\r\n }\r\n };\r\n\r\n return (\r\n props: PropsOf & {\r\n fallback?: Node;\r\n errorFallback?: Node;\r\n }\r\n ): ReturnType => {\r\n const loading = createSignal(true);\r\n const error = createSignal(null);\r\n\r\n load(loading, error);\r\n // Validate fallback and errorFallback types\r\n const isValidNode = (val: any) =>\r\n typeof val === \"string\" ||\r\n (val && typeof val === \"object\" && \"props\" in val && \"type\" in val);\r\n\r\n if (props.fallback !== undefined && !isValidNode(props.fallback)) {\r\n throw new Error(\r\n \"Invalid fallback: Expected a string or a valid JSX node.\"\r\n );\r\n }\r\n if (\r\n props.errorFallback !== undefined &&\r\n !(\r\n typeof props.errorFallback === \"function\" ||\r\n isValidNode(props.errorFallback)\r\n )\r\n ) {\r\n throw new Error(\r\n \"Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node.\"\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {() =>\r\n loading.value\r\n ? props.fallback\r\n : error.value !== null\r\n ? props.errorFallback\r\n ? typeof props.errorFallback === \"function\"\r\n ? props.errorFallback(error.value)\r\n : props.errorFallback\r\n : \"Unknown error occurred while lazy loading component, use errorFallback prop to override\"\r\n : // @ts-expect-error\r\n Component && \r\n }\r\n \r\n ) as unknown as ReturnType;\r\n };\r\n}\r\n"],"names":["CAPTURE_REGEX","isProperty","newFiber","currentFC"],"mappings":"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"} \ No newline at end of file diff --git a/build/refract.umd.js b/build/refract.umd.js deleted file mode 100644 index ee0e0bd..0000000 --- a/build/refract.umd.js +++ /dev/null @@ -1 +0,0 @@ -(function(h,_){typeof exports=="object"&&typeof module<"u"?_(exports):typeof define=="function"&&define.amd?define(["exports"],_):(h=typeof globalThis<"u"?globalThis:h||self,_(h.Refract={}))})(this,function(h){"use strict";function _(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&Object.prototype.toString.call(e)==="[object Object]"}function S(e){return["boolean","string","number","undefined"].includes(typeof e)||e===null||e instanceof Error}const se="http://www.w3.org/2000/svg",Ce=new Set(["svg","a","circle","clipPath","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","foreignObject","g","image","line","linearGradient","marker","mask","metadata","path","pattern","polygon","polyline","radialGradient","rect","script","set","stop","style","switch","symbol","text","textPath","title","tspan","use","view"]),ke=new Set(["math","maction","maligngroup","malignmark","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mlongdiv","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mscarries","mscarry","msgroup","msline","mspace","msqrt","msrow","mstack","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),Ae="http://www.w3.org/1998/Math/MathML",q=/(PointerCapture)$|Capture$/i,Me=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function Te(e){const t=[];for(const n in e){const r=e[n],o=n.replace(/([A-Z])/g,"-$1").toLowerCase();typeof r!="number"||Me.test(o)?t.push(`${o}: ${r};`):t.push(`${o}: ${r}px;`)}return t.join(" ")}function Pe(e){const t={};for(const n in e){const r=e[n];if(typeof r=="object"&&r!==null){console.warn(`Nested styles not allowed for ${n}`);continue}r==null||r===!1||r===""||(t[n]=r)}return t}function Le(e){return _(e)||typeof e=="string"}function Ne(e,t){if(!Le(e))throw new Error("Style attribute must be a plain object or a string");if(typeof e=="string")t.setAttribute("style",e);else{const n=Pe(e);t.setAttribute("style",Te(n))}}function Re(e,t,n,r){e.__propName=t;const o=Ze(e);o==null||o===!1||(K(t,o,n,r),e.__signals&&Je(e,n))}const De=/(PointerCapture)$|Capture$/i;function K(e,t,n,r){if(e=="style"){Ne(t,n);return}if(e[0]==="o"&&e[1]==="n"&&typeof t=="function"){const o=e!=(e=e.replace(De,"$1"));e.toLowerCase()in n||e=="onFocusOut"||e=="onFocusIn"||e==="onGotPointerCapture"||e==="onLostPointerCapture"?e=e.toLowerCase().slice(2):e=e.slice(2),n.addEventListener(e,t,o);return}if(r===se)e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!=="width"&&e!=="height"&&e!=="href"&&e!=="list"&&e!=="form"&&e!=="tabIndex"&&e!=="download"&&e!=="rowSpan"&&e!=="colSpan"&&e!=="role"&&e!=="popover"&&e in n)try{e==="value"&&n.tagName==="SELECT"?setTimeout(()=>{n[e]=t??""}):n[e]=t??"";return}catch{}t!=null&&(t!==!1||e[4]==="-")&&n.setAttribute(e,e==="popover"&&t===!0?"":t)}const w=Symbol("FRAGMENT");function J(e,t,...n){if(e==="FRAGMENT"){const r=L(n);return r[w]=!0,r}return{type:e,props:{...t,children:L(n)}}}function L(e){return e.map(t=>{if(typeof t=="object"){if(Array.isArray(t))return L(t);if(t===null)return Q("");if(!t.type||!t.props)throw new Error("Invalid type for a dom node, found "+t);return t}else if(typeof t=="function"){const n=Ve(t);if(S(n))return Y("TEXT_CHILD",{nodeValue:n!=null&&n!==!1?String(n):"",children:[]},t);if(Array.isArray(n)){const r=n[w];return Y("FRAGMENT",{children:r?n:L(n)},t)}else if(!n.type||!n.props)throw new Error("Invalid type for a dom node, found "+n);return Y(n.type,n.props,t)}else return Q(t)}).flat()}function Q(e){return{type:"TEXT_CHILD",props:{nodeValue:e!=null&&e!==!1?String(e):"",children:[]}}}function Y(e,t,n){return{type:e,renderFunction:n,props:t}}function Ie(e){return e!=="children"&&e!=="key"&&e!=="ref"}function le(e){let t=null;Ce.has(e.type)?t=se:ke.has(e.type)&&(t=Ae);const n=e.type==="TEXT_CHILD"?document.createTextNode(""):t?document.createElementNS(t,e.type,e.props.is&&e.props):document.createElement(e.type);if(!e.props)return n;e.props.ref&&e.props.ref instanceof oe&&n instanceof HTMLElement&&(e.props.ref.current=n);for(const r in e.props){if(!Ie(r))continue;const o=e.props[r];typeof o=="function"&&r[0]!=="o"&&r[1]!=="n"?Re(o,r,n,t):K(r,o,n,t)}return n}function Ge(e,t,n){n==null||e==="key"||K(e,n,t)}function Oe(e,t){V=t;const n=document.createDocumentFragment();Z=n;const r={type:"div",props:{children:[e]},dom:n};e.parent=r,C.push(e),requestIdleCallback(ce)}function $e(){Z&&V&&V.appendChild(Z)}let C=[],V=null,Z=null,I=[];function ae(){for(let e=0;e0&&!t;){const n=C.pop();He(n),t=e.timeRemaining()<1}if(C.length==0){$e(),ae();return}requestIdleCallback(ce)}function He(e){var t;if(e.type==="FRAGMENT"){const n=!e.props.children[w];let r=!1;for(let o=e.props.children.length-1;o>=0;o--)e.props.children[o].parent=e,n&&e.props.children[o].props.key===void 0&&e.renderFunction&&(r=!0),C.push(e.props.children[o]);r&&console.error("Array children must have a key attribute")}else if(typeof e.type=="function"){me(e);const n=e.type(e.props);if(we(),Array.isArray(n)){for(let r=n.length-1;r>=0;r--)n[r].parent=e,C.push(n[r]);e.props.children=n}else n.parent=e,e.props.children.push(n),C.push(n);I.push(e)}else{e.dom||(e.dom=le(e));let n=e.parent;for(;n&&!n.dom;)n=n.parent;n&&((t=n.dom)==null||t.appendChild(e.dom));for(let r=e.props.children.length-1;r>=0;r--)e.props.children[r].parent=e,C.push(e.props.children[r])}O(e)}function A(e){if(e.type==="FRAGMENT")if(e.props.children[w])for(const n of e.props.children)n.parent=e,A(n);else{let n=!1;for(const r of e.props.children)r.parent=e,r.props.key===void 0&&(n=!0),A(r);n&&console.error("Array children must have a key attribute")}else if(typeof e.type!="function")for(const t of e.props.children)t.parent=e,A(t);O(e)}function y(e,t,n,r,o){var l,i;if(e.type==="FRAGMENT")for(const s of e.props.children)r&&(s.parent=e),y(s,t,n,r,o);else if(typeof e.type=="function"){me(e);const s=e.type(e.props);if(we(),Array.isArray(s)){for(const a of s)a.parent=e,y(a,t,n,!0,o);e.props.children=s}else s.parent=e,e.props.children.push(s),y(s,t,n,!0,o);queueMicrotask(()=>{_e(e)})}else{if(e.dom||(e.dom=le(e)),t)n?(l=t.parentElement)==null||l.replaceChild(e.dom,t):(i=t.parentElement)==null||i.insertBefore(e.dom,t);else{let s;if(o)s=o;else{let a=e.parent;for(;a&&!a.dom;)a=a.parent;s=a==null?void 0:a.dom}s==null||s.appendChild(e.dom)}for(const s of e.props.children)r&&(s.parent=e),y(s,void 0,void 0,r,e.dom)}r&&O(e)}let G=!0;function m(e,t){if(!(!e||!G)){if(e.renderFunction&&(t&&Ye(e.renderFunction),delete e.renderFunction),e.dom){for(const n in e.props)if(W(n)){let r=n.toLowerCase().substring(2);const o=r!=(r=r.replace(q,"$1"));e.dom.removeEventListener(r,e.props[n],o),delete e.props[n]}else typeof e.props[n]=="function"?Qe(e.props[n]):n==="ref"&&e.props[n]instanceof oe&&(e.props[n].current=null);e.dom.remove()}typeof e.type=="function"&&(ot(e,e.props),delete e.type),e.props.children.forEach(n=>m(n,!0))}}function O(e){e.renderFunction&&Ke(e.renderFunction,e)}function ue(e,t){if(S(t)){const n={...Q(t),parent:e.parent};A(n),F(e,n)}else if(Array.isArray(t)){const r={type:"FRAGMENT",props:{children:t[w]?t:L(t)},parent:e.parent};A(r),F(e,r)}else{const n={...t,parent:e.parent};A(n),F(e,n)}}function $(e,t){e.renderFunction&&(t.renderFunction=e.renderFunction,O(t))}function H(e,t,n){var r;if(n!==void 0){e.parent.props.children[n]=t;return}(r=e.parent)==null||r.props.children.forEach((o,l)=>{o===e&&(e.parent.props.children[l]=t)})}const W=e=>e.startsWith("on")||e=="onFocusOut"||e=="onFocusIn",fe=e=>e!=="children"&&!W(e)&&e!=="key"&&e!=="ref",B=(e,t,n)=>e[n]!==t[n],We=(e,t,n)=>!(n in t);function pe(e,t){var n,r;return e===t?!0:e.type!==t.type||((n=e.props)==null?void 0:n.key)!==((r=t.props)==null?void 0:r.key)?!1:N(e.props,t.props)}function N(e,t){if(e===t){if(e instanceof R&&t instanceof R)return N(e.value,t.value);if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let o=0;o=0;t--){const n=e.props.children[t],r=v(n);if(r)return r}}}function Ue(e){if(e)for(let t=e.props.children.length-1;t>=0;t--){const n=e.props.children[t],r=v(n);if(r)return r}}function Xe(e){if(!e)return;let t=e.parent;for(;t&&!t.dom;)t=t.parent;return t}function ze(e){if(!e)return;if(e.dom)return e;let t=e.parent;for(;t&&!t.dom;)t=t.parent;return t}function F(e,t,n){if(!(!e&&!t)){if(e&&!t)m(e,!0),e.parent.props.children=e.parent.props.children.filter(r=>r!==e);else if(e&&t){const r=e.props,o=t.props;if(e.type==="FRAGMENT"||typeof e.type=="function")if(t.type==="FRAGMENT"||typeof t.type=="function")typeof e.type==typeof t.type&&typeof e.type=="function"?pe(e,t)||(y(t,de(e),void 0,!0),$(e,t),m(e),H(e,t,n)):he(e,t);else{t.parent=e.parent;let l=e.props.children[0];for(;l&&!l.dom;)l=l.props.children[0];y(t,l==null?void 0:l.dom),$(e,t),m(e),H(e,t,n)}else{const l=e.dom;if(e.type==="TEXT_CHILD"&&t.type==="TEXT_CHILD"&&!t.dom&&(t.dom=e.dom),l===void 0)return;if(t.type==="FRAGMENT"||typeof t.type=="function")t.parent=e.parent,$(e,t),y(t,l),m(e),H(e,t,n);else{for(const i in r)if(fe(i)&&We(r,o,i))l[i]="";else if(W(i)&&(!(i in o)||B(r,o,i))){let s=i.toLowerCase().substring(2);const a=s!=(s=s.replace(q,"$1"));l.removeEventListener(s,r[i],a)}if(e.type!==t.type)t.parent=e.parent,$(e,t),y(t,l,!0),m(e),H(e,t,n);else{for(const i in o)if(fe(i)&&B(r,o,i))l[i]=o[i],r[i]=o[i];else if(W(i)&&B(r,o,i)){let s=i.toLowerCase().substring(2);const a=s!=(s=s.replace(q,"$1"));l.addEventListener(s,o[i],a),r[i]=o[i]}he(e,t)}}}}}}function je(e,t){var a;const n=e.props.children,r=t.props.children,o={};for(let c=0;cc?e.props.children[c]=T:e.props.children.push(T),delete o[E];const P=t.props.children[c];P&&(P.parent=e),F(T,P,c),M(e.props.children[c],i==null?void 0:i.dom,l)}else s>c?e.props.children[c]=u:e.props.children.push(u),u.parent=e,y(u,l,!1,!1,i==null?void 0:i.dom)}for(const c in o)if(o.hasOwnProperty(c)){const u=o[c];m(u,!0)}for(;e.props.children.length>t.props.children.length;)e.props.children.pop()}function M(e,t,n){if(e.dom){if(e.dom===t||e.dom===n)return;n?t.insertBefore(e.dom,n):t.appendChild(e.dom)}else for(const r of e.props.children)M(r,t,n)}function he(e,t){const n=t.type==="FRAGMENT"&&!t.props.children[w],r=e.type==="FRAGMENT"&&!e.props.children[w];n&&r?je(e,t)===!1&&ye(e,t):ye(e,t),t.type==="FRAGMENT"&&t.props.children[w]?e.props.children[w]=!0:e.props.children[w]=!1,e.type=t.type}function b(e,t){var r;let n=Math.max(e.props.children.length,t.props.children.length);for(let o=0;os,P=l.hasOwnProperty(E)&&l[E].newIndex{ee.forEach(t=>{const n=t();if(te.has(n))return;te.add(n),n.__cleanup&&typeof n.__cleanup=="function"&&(n.__cleanup(),n.__cleanup=null);const r=n();if(typeof r=="function"&&(n.__cleanup=r),U.has(n)){const o=U.get(n);o&&ue(o,r)}if(X.has(n)){const o=X.get(n);o&&n.__propName&&Ge(n.__propName,o,r)}}),te.clear(),ee.clear(),x=!1}))}function Ke(e,t){U.set(e,t)}function Je(e,t){X.set(e,t)}function Qe(e){X.delete(e);const t=e.__signals;if(t){for(const n of t)n.removeDep(e);e.__signals=null}}function Ye(e){U.delete(e);const t=e.__signals;if(t){for(const n of t)n.removeDep(e);e.__signals=null}}let g=null,f=null;function ne(e){g.__signals||(g.__signals=new Set),g.__signals.add(e)}function re(e){f.__signals||(f.__signals=new Set),f.__signals.add(e)}function Ve(e){var n;if(typeof e!="function")throw new Error("reactive takes a render function as the argument");g=e;const t=e();if(g=null,!S(t)&&_(t)&&!t.type&&!t.props&&!((n=t.props)!=null&&n.children))throw new Error("Reactive value must be primitive or functional component, got: "+typeof t);return t}function Ze(e){if(typeof e!="function")throw new Error("reactive takes a render function as the argument");g=e;const t=e();return g=null,t}function Be(e){if(typeof e!="function")throw new Error("createEffect takes a effect function as the argument");Fe(e),Ee()||ge(e)}function ge(e,t){if(typeof e!="function")return;f=e;const n=e();f.__signals&&typeof n=="function"&&(f.__cleanup=n),!f.__signals&&n&&typeof n=="function"&&(t?rt(n,t):Se(n)),f=null}function ve(e){if(typeof e!="function")throw new Error("computed takes a function as the argument");let t=Ee()!==null;f=()=>{if(t){t=!1;return}r.update(e())},Fe(f);const n=e(),r=D(n);return f=null,{get value(){return r.value}}}function be(e){if(typeof e!="function")throw new Error("createPromise takes a function as the argument");const t=e();if(!(t instanceof Promise))throw new Error("createPromise takes a function that returns a promise");const n=D({status:"pending",data:null,error:null});return t.then(r=>{n.update(o=>{o.data=r,o.status="resolved"})}).catch(r=>{n.update(o=>{o.error=r,o.status="rejected"})}),{get value(){return n.value}}}class oe{constructor(t){this.current=t}}function xe(){return new oe(null)}const z=["push","pop","unshift","shift","splice","fill","copyWithin","sort","reverse"];class R{constructor(t){this.isNotified=!1,this._val=t,this.deps=new Set}notify(){this.isNotified||(this.deps.size!==0&&(this.isNotified=!0),this.deps.forEach(t=>{qe(()=>(this.isNotified=!1,t))}))}removeDep(t){this.deps.delete(t)}clearDeps(){this.deps.clear()}}class et extends R{constructor(t){if(!S(t))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");super(t)}get value(){return f&&(this.deps.add(f),re(this)),g&&(this.deps.add(g),ne(this)),this._val}update(t){if(typeof t=="function"){const n=t(this._val);if(!S(n))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");if(n===this._val)return;this._val=n,this.notify()}else{if(!S(t))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");if(t===this._val)return;this._val=t,this.notify()}}}class tt extends R{constructor(t){if(!Array.isArray(t))throw new Error("Invalid type for ArraySignal; value must be an array");super(t),this.updateCalled=!1,this._val=this.createProxy(t)}createProxy(t){return new Proxy(t,{get:(n,r)=>{const o=n[r];if(typeof o=="function"){if(z.includes(String(r))&&!this.updateCalled)throw new Error("Cannot set a value on an array signal, use the update method for updating the array.");return(...l)=>{const i=o.apply(n,l);return z.includes(String(r))&&this.notify(),i}}return o},set:(n,r,o)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an array signal, use the update method for updating the array.");return n[r]=o,this.notify(),!0}})}get value(){return f&&(this.deps.add(f),re(this)),g&&(this.deps.add(g),ne(this)),this._val}update(t){if(this.updateCalled=!0,typeof t=="function")t(this._val);else{if(!Array.isArray(t))throw new Error("Invalid type for ArraySignal; value must be an array");if(t===this._val)return;this._val=this.createProxy(t),this.notify()}this.updateCalled=!1}}class nt extends R{constructor(t){if(!_(t))throw new Error("Invalid type for ObjectSignal; value must be a plain object");super(t),this.updateCalled=!1,this._val=this.createProxy(t)}createInternalArrayProxy(t){return new Proxy(t,{get:(n,r)=>{const o=n[r];if(typeof o=="function"){if(!this.updateCalled&&z.includes(String(r)))throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return(...l)=>{const i=o.apply(n,l);return z.includes(String(r))&&this.notify(),i}}return o},set:(n,r,o)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return n[r]=o,this.notify(),!0}})}createProxy(t){return new Proxy(t,{get:(n,r)=>{const o=n[r];return Array.isArray(o)?(n[r]=this.createInternalArrayProxy(o),n[r]):o},set:(n,r,o)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return typeof o=="function"?!1:(typeof o=="object"&&o!==null&&(o=this.createProxy(o)),o===n[r]||(n[r]=o,this.notify()),!0)},deleteProperty:(n,r)=>{const o=delete n[r];return this.notify(),o}})}get value(){return f&&(this.deps.add(f),re(this)),g&&(this.deps.add(g),ne(this)),this._val}update(t){if(this.updateCalled=!0,typeof t=="function")t(this._val);else{if(!_(t))throw new Error("Invalid type for ObjectSignal; value must be a plain object");if(t===this._val)return;this._val=this.createProxy(t),this.notify()}this.updateCalled=!1}}function D(e){if(typeof e=="function")throw new Error("Functions cannot be used as signal value");if(typeof e=="object"&&e!==null)if(Array.isArray(e)){const t=new tt(e);return ie(t),{get value(){return t.value},update:t.update.bind(t)}}else if(_(e)){const t=new nt(e);return ie(t),{get value(){return t.value},update:t.update.bind(t)}}else throw new Error("Invalid type for signal initialization: "+typeof e);else if(S(e)){const t=new et(e);return ie(t),{get value(){return t.value},update:t.update.bind(t)}}else throw new Error("Invalid type for signal initialization: "+typeof e)}let d=null,p=new WeakMap;function me(e){d=e}function we(){d=null}function Ee(){return d}function _e(e){if(p.has(e)){const t=p.get(e);for(const n of t.effects)ge(n,e)}}function Se(e){d&&(p.has(d)?p.get(d).cleanup.push(e):p.set(d,{signals:new Set,cleanup:[e],effects:new Set}))}function rt(e,t){t&&(p.has(t)?p.get(t).cleanup.push(e):p.set(t,{signals:new Set,cleanup:[e],effects:new Set}))}function Fe(e){if(d)if(p.has(d))p.get(d).effects.add(e);else{const t=new Set;t.add(e),p.set(d,{signals:new Set,cleanup:[],effects:t})}}function ie(e){if(d)if(p.has(d))p.get(d).signals.add(e);else{const t=new Set;t.add(e),p.set(d,{signals:t,cleanup:[],effects:new Set})}}function ot(e,t){const n=p.get(e);if(n){if(n.cleanup)for(const r of n.cleanup)r();n.cleanup=[];for(const r of n.effects){if(r.__cleanup&&typeof r.__cleanup=="function"&&r.__cleanup(),r.__signals)for(const o of r.__signals)o.removeDep(r);delete r.__signals,delete r.__cleanup}n.signals.forEach(r=>r.clearDeps()),n.signals.clear()}p.delete(e)}function it(e){let t=null;const n=(r,o)=>{t?(r.update(!1),o.update(null)):e().then(l=>{if(l.default){if(typeof l.default!="function")throw new Error("Lazy-loaded component must be a functional component");t=l.default,r.update(!1),o.update(null)}else o.update(new Error("No default export found from lazy-loaded module"))}).catch(l=>{o.update(l),r.update(!1)})};return r=>{const o=D(!0),l=D(null);n(o,l);const i=s=>typeof s=="string"||s&&typeof s=="object"&&"props"in s&&"type"in s;if(r.fallback!==void 0&&!i(r.fallback))throw new Error("Invalid fallback: Expected a string or a valid JSX node.");if(r.errorFallback!==void 0&&!(typeof r.errorFallback=="function"||i(r.errorFallback)))throw new Error("Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node.");return J("FRAGMENT",null,()=>o.value?r.fallback:l.value!==null?r.errorFallback?typeof r.errorFallback=="function"?r.errorFallback(l.value):r.errorFallback:"Unknown error occurred while lazy loading component, use errorFallback prop to override":t&&J(t,{...r}))}}h.cleanUp=Se,h.computed=ve,h.createEffect=Be,h.createElement=J,h.createPromise=be,h.createRef=xe,h.createSignal=D,h.lazy=it,h.render=Oe,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})}); diff --git a/build/signals/signal.d.ts b/build/signals/signal.d.ts index 7fc5cf7..971ebb2 100644 --- a/build/signals/signal.d.ts +++ b/build/signals/signal.d.ts @@ -30,10 +30,6 @@ export declare function createRef(): Ref; type DeepReadonly = { readonly [K in keyof T]: T[K] extends object ? DeepReadonly : T[K]; }; -/** - * - * Base class for signals. - */ export declare abstract class BaseSignal { protected _val: T; protected deps: Set; @@ -46,17 +42,11 @@ export declare abstract class BaseSignal { abstract update(val: T | ((prev: T) => T)): void; } type NormalSignal = boolean | string | number | undefined | null | Error; -/** - * Signal for primitive types. - */ export declare class PrimitiveSignal extends BaseSignal { constructor(val: T); get value(): T; update(val: T | ((prev: T) => T)): void; } -/** - * Signal for arrays. - */ export declare class ArraySignal extends BaseSignal { private updateCalled; constructor(val: T); @@ -64,9 +54,6 @@ export declare class ArraySignal extends BaseSignal { get value(): DeepReadonly; update(val: T | ((prev: T) => void)): void; } -/** - * Signal for plain objects. - */ export declare class ObjectSignal> extends BaseSignal { private updateCalled; constructor(val: T); @@ -85,9 +72,6 @@ export interface PublicArraySignal extends PublicSignal { export interface PublicObjectSignal> extends PublicSignal { update(val: T | ((prev: T) => void)): void; } -/** - * Overloaded factory function to create a signal. - */ declare function createSignal(val: T): PublicSignal; declare function createSignal(val: T): PublicArraySignal; declare function createSignal>(val: T): PublicObjectSignal; diff --git a/package-lock.json b/package-lock.json index a997200..62137d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,17 @@ { - "name": "refract", - "version": "1.1.1", + "name": "refract-js", + "version": "1.1.3", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "refract", - "version": "1.1.1", + "name": "refract-js", + "version": "1.1.3", "license": "ISC", "devDependencies": { "@testing-library/dom": "^10.4.0", "jsdom": "^26.0.0", + "terser": "^5.39.0", "vite": "^6.2.0", "vite-plugin-dts": "^4.5.0", "vitest": "^3.0.1" @@ -611,12 +612,64 @@ "node": ">=18" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@microsoft/api-extractor": { "version": "7.51.0", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.51.0.tgz", @@ -1483,6 +1536,12 @@ "concat-map": "0.0.1" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -1566,6 +1625,12 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/compare-versions": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", @@ -2421,6 +2486,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -2490,6 +2565,24 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/terser": { + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", diff --git a/package.json b/package.json index e5f2769..ac4511b 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "files": [ "build" ], + "sideEffects": false, "exports": { ".": { "types": "./build/index.d.ts", @@ -37,6 +38,7 @@ "devDependencies": { "@testing-library/dom": "^10.4.0", "jsdom": "^26.0.0", + "terser": "^5.39.0", "vite": "^6.2.0", "vite-plugin-dts": "^4.5.0", "vitest": "^3.0.1" diff --git a/src/signals/signal.ts b/src/signals/signal.ts index c8b3333..473ad59 100644 --- a/src/signals/signal.ts +++ b/src/signals/signal.ts @@ -8,10 +8,30 @@ import { import { Fiber } from "../types"; import { isPlainObject, isPrimitive } from "../utils/general"; import { batchUpdate } from "./batch"; +import { + createArrayProxy, + MutatingMethods, + publicSignal, + throwInvalidSignalType, + throwNonPrimitiveError, +} from "./utils"; let currentReactiveFunction: any = null; let currentEffect: any = null; +function setCurrentEffect(effect: any) { + currentEffect = effect; +} +function clearCurrentEffect() { + currentEffect = null; +} +function setCurrentReactiveFunction(effect: any) { + currentReactiveFunction = effect; +} +function clearCurrentReactiveFunction() { + currentReactiveFunction = null; +} + function addSignalToReactiveFunction(signal: any) { if (!currentReactiveFunction.__signals) { currentReactiveFunction.__signals = new Set(); @@ -27,9 +47,9 @@ export function reactive(fn: Function) { if (typeof fn !== "function") throw new Error("reactive takes a render function as the argument"); - currentReactiveFunction = fn; + setCurrentReactiveFunction(fn); const retVal = fn(); - currentReactiveFunction = null; + clearCurrentReactiveFunction(); if ( !isPrimitive(retVal) && isPlainObject(retVal) && @@ -47,9 +67,10 @@ export function reactiveAttribute(fn: Function) { if (typeof fn !== "function") throw new Error("reactive takes a render function as the argument"); - currentReactiveFunction = fn; + setCurrentReactiveFunction(fn); + const retVal = fn(); - currentReactiveFunction = null; + clearCurrentReactiveFunction(); return retVal; } @@ -64,7 +85,7 @@ export function createEffect(fn: Function) { export function runEffect(effect: Function, fiber?: Fiber) { if (typeof effect !== "function") return; - currentEffect = effect; + setCurrentEffect(effect); const effectCleanup = effect(); @@ -85,7 +106,7 @@ export function runEffect(effect: Function, fiber?: Fiber) { } } - currentEffect = null; + clearCurrentEffect(); } function computed>( @@ -95,13 +116,13 @@ function computed>( throw new Error("computed takes a function as the argument"); let firstRun = getCurrentFC() !== null; - currentEffect = () => { + setCurrentEffect(() => { if (firstRun) { firstRun = false; return; } signal.update(fn()); - }; + }); addEffect(currentEffect); @@ -110,7 +131,7 @@ function computed>( // @ts-expect-error - Type assertion for signal const signal = createSignal(val); - currentEffect = null; + clearCurrentEffect(); return { get value() { return signal.value; @@ -172,39 +193,6 @@ export function createRef() { return ref; } -// const NonMutatingArrayMethods = [ -// "constructor", -// "concat", -// "every", -// "filter", -// "find", -// "findIndex", -// "flat", -// "flatMap", -// "forEach", -// "includes", -// "indexOf", -// "join", -// "map", -// "reduce", -// "reduceRight", -// "slice", -// "some", -// "toLocaleString", -// "toString", -// ]; -const MutatingMethods = [ - "push", - "pop", - "unshift", - "shift", - "splice", - "fill", - "copyWithin", - "sort", - "reverse", -]; - type DeepReadonly = { readonly [K in keyof T]: T[K] extends object ? DeepReadonly : T[K]; }; @@ -213,7 +201,7 @@ type DeepReadonly = { * * Base class for signals. */ -export abstract class BaseSignal { +export abstract class BaseSignal { protected _val: T; protected deps: Set; protected isNotified: boolean = false; @@ -245,7 +233,18 @@ export abstract class BaseSignal { this.deps.clear(); } - abstract get value(): T | DeepReadonly; + get value(): DeepReadonly { + if (currentEffect) { + this.deps.add(currentEffect); + addSignalToEffect(this); + } + if (currentReactiveFunction) { + this.deps.add(currentReactiveFunction); + + addSignalToReactiveFunction(this); + } + return this._val; + } abstract update(val: T | ((prev: T) => T)): void; } @@ -256,45 +255,21 @@ type NormalSignal = boolean | string | number | undefined | null | Error; */ export class PrimitiveSignal extends BaseSignal { constructor(val: T) { - if (!isPrimitive(val)) { - throw new Error( - "Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]" - ); - } super(val); } - get value(): T { - if (currentEffect) { - this.deps.add(currentEffect); - addSignalToEffect(this); - } - if (currentReactiveFunction) { - this.deps.add(currentReactiveFunction); - - addSignalToReactiveFunction(this); - } - // (Optional) debug logging: - // console.log(this.deps); - return this._val; - } - public update(val: T | ((prev: T) => T)) { if (typeof val === "function") { const newVal = val(this._val); if (!isPrimitive(newVal)) { - throw new Error( - "Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]" - ); + throwNonPrimitiveError(); } if (newVal === this._val) return; this._val = newVal; this.notify(); } else { if (!isPrimitive(val)) { - throw new Error( - "Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]" - ); + throwNonPrimitiveError(); } if (val === this._val) return; @@ -323,56 +298,7 @@ export class ArraySignal extends BaseSignal { } private createProxy(val: T): T { - return new Proxy(val, { - get: (target, prop) => { - const value = target[prop as any]; - // If a function is accessed, wrap it to trigger notifications on mutation. - - if (typeof value === "function") { - if ( - MutatingMethods.includes(String(prop)) && - !this.updateCalled - ) { - throw new Error( - "Cannot set a value on an array signal, use the update method for updating the array." - ); - } - - return (...args: any[]) => { - const result = value.apply(target, args); - // Notify if the method is mutating. - if (MutatingMethods.includes(String(prop))) { - this.notify(); - } - return result; - }; - } - return value; - }, - set: (target, prop, newValue) => { - if (!this.updateCalled) { - throw new Error( - "Cannot set a value on an array signal, use the update method for updating the array." - ); - } - target[prop as any] = newValue; - this.notify(); - return true; - }, - }); - } - - get value(): DeepReadonly { - if (currentEffect) { - this.deps.add(currentEffect); - addSignalToEffect(this); - } - if (currentReactiveFunction) { - this.deps.add(currentReactiveFunction); - addSignalToReactiveFunction(this); - } - - return this._val; + return createArrayProxy(val, this) as T; } public update(val: T | ((prev: T) => void)) { @@ -410,42 +336,7 @@ export class ObjectSignal> extends BaseSignal { this._val = this.createProxy(val); } private createInternalArrayProxy(val: A): A { - return new Proxy(val, { - get: (target, prop) => { - const value = target[prop as any]; - // If a function is accessed, wrap it to trigger notifications on mutation. - if (typeof value === "function") { - if ( - !this.updateCalled && - MutatingMethods.includes(String(prop)) - ) { - throw new Error( - "Cannot set a value on an object signal, use the update method for updating the object." - ); - } - - return (...args: any[]) => { - const result = value.apply(target, args); - // Notify if the method is mutating. - if (MutatingMethods.includes(String(prop))) { - this.notify(); - } - return result; - }; - } - return value; - }, - set: (target, prop, newValue) => { - if (!this.updateCalled) { - throw new Error( - "Cannot set a value on an object signal, use the update method for updating the object." - ); - } - target[prop as any] = newValue; - this.notify(); - return true; - }, - }); + return createArrayProxy(val, this) as A; } private createProxy(val: T): T { return new Proxy(val, { @@ -489,19 +380,6 @@ export class ObjectSignal> extends BaseSignal { }, }); } - - get value(): DeepReadonly { - if (currentEffect) { - this.deps.add(currentEffect); - addSignalToEffect(this); - } - if (currentReactiveFunction) { - this.deps.add(currentReactiveFunction); - addSignalToReactiveFunction(this); - } - return this._val; - } - public update(val: T | ((prev: T) => void)) { this.updateCalled = true; if (typeof val === "function") { @@ -553,39 +431,22 @@ function createSignal>( if (Array.isArray(val)) { const signal = new ArraySignal(val); addSignal(signal); - return { - get value() { - return signal.value; - }, - update: signal.update.bind(signal) as typeof signal.update, - }; + return publicSignal(signal); } else if (isPlainObject(val)) { const signal = new ObjectSignal(val); addSignal(signal); - return { - get value() { - return signal.value; - }, - update: signal.update.bind(signal) as typeof signal.update, - }; + return publicSignal(signal); } else { - throw new Error( - "Invalid type for signal initialization: " + typeof val - ); + throwInvalidSignalType(val); } } else if (isPrimitive(val)) { const signal = new PrimitiveSignal(val); + // @ts-expect-error addSignal(signal); - return { - get value() { - return signal.value; - }, - update: signal.update.bind(signal) as typeof signal.update, - }; + // @ts-expect-error + return publicSignal(signal); } else { - throw new Error( - "Invalid type for signal initialization: " + typeof val - ); + throwInvalidSignalType(val); } } diff --git a/src/signals/utils.ts b/src/signals/utils.ts new file mode 100644 index 0000000..fcfce8d --- /dev/null +++ b/src/signals/utils.ts @@ -0,0 +1,73 @@ +import { BaseSignal } from "./signal"; + +export const MutatingMethods = [ + "push", + "pop", + "unshift", + "shift", + "splice", + "fill", + "copyWithin", + "sort", + "reverse", +]; + +function isMutating(prop: any) { + return MutatingMethods.includes(String(prop)); +} + +export function throwNonPrimitiveError() { + throw new Error( + "Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]" + ); +} +export function throwInvalidSignalType(val: any) { + throw new Error("Invalid type for signal initialization: " + typeof val); +} + +export function publicSignal(signal: BaseSignal) { + return { + get value() { + return signal.value; + }, + update: signal.update.bind(signal) as typeof signal.update, + }; +} + +export const createArrayProxy = (arr: any[], signal: any) => { + return new Proxy(arr, { + get: (target, prop) => { + const value = target[prop as any]; + // If a function is accessed, wrap it to trigger notifications on mutation. + + if (typeof value === "function") { + if (isMutating(prop) && !signal.updateCalled) { + throw new Error( + "Cannot set a value on an array signal, use the update method for updating the array." + ); + } + + return (...args: any[]) => { + const result = value.apply(target, args); + // Notify if the method is mutating. + if (isMutating(prop)) { + signal.notify(); + } + return result; + }; + } + return value; + }, + set: (target, prop, newValue) => { + if (!signal.updateCalled) { + throw new Error( + "Cannot set a value on an array signal, use the update method for updating the array." + ); + } + target[prop as any] = newValue; + + signal.notify(); + return true; + }, + }); +}; diff --git a/src/utils/general.ts b/src/utils/general.ts index f1ddd68..506659f 100644 --- a/src/utils/general.ts +++ b/src/utils/general.ts @@ -13,9 +13,3 @@ export function isPrimitive(val: any) { val instanceof Error ); } - -export function swap(arr: any[], i: number, j: number) { - const temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; -} diff --git a/tsconfig.json b/tsconfig.json index 21412ec..03b631a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,11 @@ "jsxFactory": "createElement", // Match your jsxFactory in esbuild "jsxFragmentFactory": "FRAGMENT", "moduleResolution": "bundler", - "strictNullChecks": true + "strictNullChecks": true, + "declaration": true, + "declarationMap": false, + "emitDeclarationOnly": true, + "removeComments": true }, "exclude": ["node_modules", "dist"] // Exclude generated and third-party files } diff --git a/vite.config.ts b/vite.config.ts index eb2bc1c..576918c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -7,19 +7,31 @@ const isProd = process.env.NODE_ENV === "production"; export default defineConfig({ build: { outDir: isProd ? "build" : "dist", - minify: true, - sourcemap: !isProd, + minify: "terser", + sourcemap: true, lib: { entry: "src/index.ts", name: "Refract", fileName: (format) => `refract.${format}.js`, - formats: ["es", "cjs", "umd"], // Supports multiple module formats + formats: ["es", "cjs"], // Supports multiple module formats }, rollupOptions: { output: { preserveModules: false, }, }, + terserOptions: { + compress: { + drop_console: true, + drop_debugger: true, + ecma: 2020, + passes: 3, // Runs multiple passes for more optimization + pure_funcs: ["console.log"], + }, + output: { + comments: false, + }, + }, }, esbuild: { jsxFactory: "createElement", // Your custom JSX factory function From f307c936195bb1b226666017ceae0d9d2b53def3 Mon Sep 17 00:00:00 2001 From: Aditya Date: Mon, 17 Mar 2025 07:57:04 +0530 Subject: [PATCH 3/5] refactored functionalComponents and signals logic a little --- src/rendering/createElements.ts | 4 +- src/rendering/functionalComponents.ts | 60 +++++++++++---------------- src/signals/signal.ts | 28 ++++--------- src/signals/utils.ts | 22 ++++++++++ src/tests/signals/signal.test.ts | 6 +-- 5 files changed, 58 insertions(+), 62 deletions(-) diff --git a/src/rendering/createElements.ts b/src/rendering/createElements.ts index 7798d19..28e8426 100644 --- a/src/rendering/createElements.ts +++ b/src/rendering/createElements.ts @@ -1,6 +1,4 @@ -import { isValidStyle, preprocessStyle, styleObjectToString } from "../lib"; -import { setReactiveAttributes } from "../signals/batch"; -import { reactive, reactiveAttribute, Ref } from "../signals/signal"; +import { reactive, Ref } from "../signals/signal"; import { Fiber, FiberChildren, diff --git a/src/rendering/functionalComponents.ts b/src/rendering/functionalComponents.ts index 46661cd..6af0721 100644 --- a/src/rendering/functionalComponents.ts +++ b/src/rendering/functionalComponents.ts @@ -22,6 +22,14 @@ export function getCurrentFC() { return currentFC; } +function getNewFC(): any { + return { + signals: new Set(), + cleanup: [], + effects: new Set(), + }; +} + export function runAllEffects(FC: Fiber) { if (fcMap.has(FC)) { const fcData = fcMap.get(FC)!; @@ -36,15 +44,11 @@ export function cleanUp(fn: Function) { if (currentFC) { // console.log(currentFC, fcMap.has(currentFC)); if (fcMap.has(currentFC)) { - const fcData = fcMap.get(currentFC)!; - - fcData.cleanup.push(fn); + fcMap.get(currentFC)!.cleanup.push(fn); } else { - fcMap.set(currentFC, { - signals: new Set(), - cleanup: [fn], - effects: new Set(), - }); + let newFC = getNewFC(); + newFC.cleanup.push(fn); + fcMap.set(currentFC, newFC); } } } @@ -52,15 +56,11 @@ export function cleanUpWFiber(fn: Function, fiber: Fiber) { if (fiber) { // console.log(currentFC, fcMap.has(currentFC)); if (fcMap.has(fiber)) { - const fcData = fcMap.get(fiber)!; - - fcData.cleanup.push(fn); + fcMap.get(fiber)!.cleanup.push(fn); } else { - fcMap.set(fiber, { - signals: new Set(), - cleanup: [fn], - effects: new Set(), - }); + let newFC = getNewFC(); + newFC.cleanup.push(fn); + fcMap.set(fiber, newFC); } } } @@ -68,32 +68,22 @@ export function cleanUpWFiber(fn: Function, fiber: Fiber) { export function addEffect(fn: Function) { if (currentFC) { if (fcMap.has(currentFC)) { - const fcData = fcMap.get(currentFC)!; - fcData.effects.add(fn); + fcMap.get(currentFC)!.effects.add(fn); } else { - const effects = new Set(); - effects.add(fn); - fcMap.set(currentFC, { - signals: new Set(), - cleanup: [], - effects: effects, - }); + let newFC = getNewFC(); + newFC.effects.add(fn); + fcMap.set(currentFC, newFC); } } } export function addSignal(signal: BaseSignal) { if (currentFC) { if (fcMap.has(currentFC)) { - const fcData = fcMap.get(currentFC)!; - fcData.signals.add(signal); + fcMap.get(currentFC)!.signals.add(signal); } else { - const signals = new Set>(); - signals.add(signal); - fcMap.set(currentFC, { - signals: signals, - cleanup: [], - effects: new Set(), - }); + let newFC = getNewFC(); + newFC.signals.add(signal); + fcMap.set(currentFC, newFC); } } } @@ -112,7 +102,7 @@ export function cleanUpFC(currentFC, props) { for (const effect of fcData.effects) { // @ts-expect-error - if (effect.__cleanup && typeof effect.__cleanup === "function") { + if (effect.__cleanup) { // @ts-expect-error effect.__cleanup(); } diff --git a/src/signals/signal.ts b/src/signals/signal.ts index 473ad59..89832d9 100644 --- a/src/signals/signal.ts +++ b/src/signals/signal.ts @@ -10,10 +10,12 @@ import { isPlainObject, isPrimitive } from "../utils/general"; import { batchUpdate } from "./batch"; import { createArrayProxy, - MutatingMethods, publicSignal, throwInvalidSignalType, throwNonPrimitiveError, + throwNotArray, + throwNotObject, + throwNotUpdateCalled, } from "./utils"; let currentReactiveFunction: any = null; @@ -288,9 +290,7 @@ export class ArraySignal extends BaseSignal { constructor(val: T) { if (!Array.isArray(val)) { - throw new Error( - "Invalid type for ArraySignal; value must be an array" - ); + throwNotArray(); } // Call the base constructor with a proxy-wrapped array. super(val); @@ -307,9 +307,7 @@ export class ArraySignal extends BaseSignal { val(this._val); } else { if (!Array.isArray(val)) { - throw new Error( - "Invalid type for ArraySignal; value must be an array" - ); + throwNotArray(); } if (val === this._val) return; @@ -328,9 +326,7 @@ export class ObjectSignal> extends BaseSignal { private updateCalled: boolean = false; constructor(val: T) { if (!isPlainObject(val)) { - throw new Error( - "Invalid type for ObjectSignal; value must be a plain object" - ); + throwNotArray(); } super(val); this._val = this.createProxy(val); @@ -354,9 +350,7 @@ export class ObjectSignal> extends BaseSignal { }, set: (target, prop, newValue) => { if (!this.updateCalled) { - throw new Error( - "Cannot set a value on an object signal, use the update method for updating the object." - ); + throwNotUpdateCalled(); } // Do not allow functions to be set as values. if (typeof newValue === "function") return false; @@ -386,9 +380,7 @@ export class ObjectSignal> extends BaseSignal { val(this._val); } else { if (!isPlainObject(val)) { - throw new Error( - "Invalid type for ObjectSignal; value must be a plain object" - ); + throwNotObject(); } if (val === this._val) return; this._val = this.createProxy(val); @@ -423,10 +415,6 @@ function createSignal>( function createSignal>( val: T ) { - if (typeof val === "function") { - throw new Error("Functions cannot be used as signal value"); - } - if (typeof val === "object" && val !== null) { if (Array.isArray(val)) { const signal = new ArraySignal(val); diff --git a/src/signals/utils.ts b/src/signals/utils.ts index fcfce8d..11d3317 100644 --- a/src/signals/utils.ts +++ b/src/signals/utils.ts @@ -16,12 +16,34 @@ function isMutating(prop: any) { return MutatingMethods.includes(String(prop)); } +const isProd = + // @ts-expect-error + process.env.NODE_ENV === "production" || + // @ts-expect-error + import.meta.env.MODE === "production"; + export function throwNonPrimitiveError() { + if (isProd) return; throw new Error( "Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]" ); } +export function throwNotUpdateCalled() { + if (isProd) return; + throw new Error( + "Cannot set a value on a signal, use the update method instead." + ); +} +export function throwNotArray() { + if (isProd) return; + throw new Error("Invalid type for ArraySignal; value must be an array"); +} +export function throwNotObject() { + if (isProd) return; + throw new Error("Invalid type for ObjectSignal; value must be an object"); +} export function throwInvalidSignalType(val: any) { + if (isProd) return; throw new Error("Invalid type for signal initialization: " + typeof val); } diff --git a/src/tests/signals/signal.test.ts b/src/tests/signals/signal.test.ts index 6abbc1e..3880c8d 100644 --- a/src/tests/signals/signal.test.ts +++ b/src/tests/signals/signal.test.ts @@ -25,7 +25,7 @@ describe("Signal", () => { it("should not create a signal with function", () => { expect(() => { createSignal(() => 0); - }).toThrow("Functions cannot be used as signal value"); + }).toThrow(); }); it("should should create Normal Signal for primitive and null values", () => { const values = [0, "", false, null, undefined]; @@ -55,9 +55,7 @@ describe("Signal", () => { objectSignal.update(2); objectSignal.update([1, 2]); }; - expect(assignWrongValue).toThrow( - "Invalid type for ObjectSignal; value must be a plain object" - ); + expect(assignWrongValue).toThrow(); }); it("should throw when creating effect without function", () => { const wrongEffect = () => createEffect(1); From 5f0e606d24d5ccfda47dfe2ccd594d7e16851de0 Mon Sep 17 00:00:00 2001 From: Aditya Date: Mon, 17 Mar 2025 12:36:22 +0530 Subject: [PATCH 4/5] refactoring rendering and lazy loading and performance improvements --- src/components/App.tsx | 24 ++-- src/lazy/Lazyloading.tsx | 29 +---- src/rendering/render.ts | 248 +++++++-------------------------------- src/rendering/utils.ts | 79 +++++++++++++ 4 files changed, 136 insertions(+), 244 deletions(-) create mode 100644 src/rendering/utils.ts diff --git a/src/components/App.tsx b/src/components/App.tsx index 18eae3e..18f846a 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -12,20 +12,20 @@ const App = (props: any) => { // return ; // return ; // return ; - return ( - <> - - {() => (visible.value ? : "Hidden")} - - ); + // return ( + // <> + // + // {() => (visible.value ? : "Hidden")} + // + // ); // return ; // return ; - // return ; + return ; // return ; // return ; }; diff --git a/src/lazy/Lazyloading.tsx b/src/lazy/Lazyloading.tsx index e8de40e..1ef1854 100644 --- a/src/lazy/Lazyloading.tsx +++ b/src/lazy/Lazyloading.tsx @@ -1,4 +1,4 @@ -import { ComponentChildren, createSignal, Fiber, PublicSignal } from "../index"; +import { ComponentChild, createSignal, PublicSignal } from "../index"; declare const FRAGMENT = "FRAGMENT"; @@ -11,10 +11,8 @@ export function lazy any>( importFn: () => Promise<{ default: T }> ): ( props: PropsOf & { - fallback?: ComponentChildren; - errorFallback?: - | ComponentChildren - | ((error: Error) => ComponentChildren); + fallback?: ComponentChild; + errorFallback?: ComponentChild | ((error: Error) => ComponentChild); } ) => ReturnType { let Component: T | null = null; @@ -64,27 +62,6 @@ export function lazy any>( const error = createSignal(null); load(loading, error); - // Validate fallback and errorFallback types - const isValidNode = (val: any) => - typeof val === "string" || - (val && typeof val === "object" && "props" in val && "type" in val); - - if (props.fallback !== undefined && !isValidNode(props.fallback)) { - throw new Error( - "Invalid fallback: Expected a string or a valid JSX node." - ); - } - if ( - props.errorFallback !== undefined && - !( - typeof props.errorFallback === "function" || - isValidNode(props.errorFallback) - ) - ) { - throw new Error( - "Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node." - ); - } return ( <> diff --git a/src/rendering/render.ts b/src/rendering/render.ts index 4f5d725..c8af2ae 100644 --- a/src/rendering/render.ts +++ b/src/rendering/render.ts @@ -3,8 +3,8 @@ import { clearReactiveFunction, setReactiveFunction, } from "../signals/batch"; -import { BaseSignal, Ref } from "../signals/signal"; -import { Fiber, FiberChildren } from "../types"; +import { Ref } from "../signals/signal"; +import { Fiber } from "../types"; import { isPrimitive } from "../utils/general"; import { CAPTURE_REGEX } from "./constants"; import { @@ -19,6 +19,13 @@ import { runAllEffects, setCurrentFC, } from "./functionalComponents"; +import { + deepCompareFibers, + deepEqual, + findFirstDom, + findNearestParentWithDom, + findParentFiberWithDom, +} from "./utils"; export function render(element: Fiber, container: HTMLElement) { rootContainer = container; @@ -102,7 +109,6 @@ function renderNode(fiber: Fiber) { if (noKey) { console.error("Array children must have a key attribute"); } - // console.log(fiber.props.children); } else if (typeof fiber.type === "function") { setCurrentFC(fiber); @@ -111,7 +117,6 @@ function renderNode(fiber: Fiber) { if (Array.isArray(children)) { // which means that the FC returned a fragment - // console.log(children); for (let i = children.length - 1; i >= 0; i--) { children[i].parent = fiber; elements.push(children[i]); @@ -126,10 +131,7 @@ function renderNode(fiber: Fiber) { effectQueue.push(fiber); } else { if (!fiber.dom) fiber.dom = createNode(fiber); - let fiberParent: Fiber | undefined = fiber.parent; - while (fiberParent && !fiberParent.dom) { - fiberParent = fiberParent.parent; - } + let fiberParent = findParentFiberWithDom(fiber); if (fiberParent) { fiberParent.dom?.appendChild(fiber.dom); } @@ -234,11 +236,7 @@ function commitFiber( if (customParent) { parentDom = customParent; } else { - let fiberParent: Fiber | undefined = fiber.parent; - - while (fiberParent && !fiberParent.dom) { - fiberParent = fiberParent.parent; - } + let fiberParent = findParentFiberWithDom(fiber); parentDom = fiberParent?.dom; } parentDom?.appendChild(fiber.dom); @@ -338,8 +336,6 @@ export function updateFiber(prevFiber: Fiber, newValue) { function replaceRenderFunction(prev: Fiber, next: Fiber) { if (prev.renderFunction) { next.renderFunction = prev.renderFunction; - // console.log("Replace render function", prev, next); - // deleteReactiveFunction(prev.renderFunction); setRenderFunction(next); } } @@ -349,11 +345,17 @@ function replaceChildFromParent(prev: Fiber, next: Fiber, index?: number) { prev.parent.props.children[index] = next; return; } - prev.parent?.props.children.forEach((child, i) => { - if (child === prev) { + for (let i = 0; i < prev.parent.props.children.length; i++) { + if (prev.parent.props.children[i] === prev) { prev.parent.props.children[i] = next; } - }); + } +} + +function replaceDeleteFiber(prev: Fiber, next: Fiber, index?: number) { + replaceRenderFunction(prev, next); + commitDeletion(prev); + replaceChildFromParent(prev, next, index); } export const isEvent = (key: string) => @@ -363,116 +365,6 @@ export const isProperty = (key: string) => const isNew = (prev: any, next: any, key: string) => prev[key] !== next[key]; const isGone = (prev: any, next: any, key: string) => !(key in next); -function deepCompareFibers(fiberA: any, fiberB: any): boolean { - // Fast path: identical references - if (fiberA === fiberB) { - return true; - } - - // Compare the fiber types (e.g., function for FCs, string for DOM nodes) - if (fiberA.type !== fiberB.type) { - return false; - } - - // Compare keys if they exist - if (fiberA.props?.key !== fiberB.props?.key) { - return false; - } - return deepEqual(fiberA.props, fiberB.props); -} - -function deepEqual(objA: any, objB: any): boolean { - if (objA === objB) { - // console.log("Signal prop"); - - if (objA instanceof BaseSignal && objB instanceof BaseSignal) - return deepEqual(objA.value, objB.value); - if (Array.isArray(objA) && Array.isArray(objB)) { - if (objA.length !== objB.length) return false; - for (let i = 0; i < objA.length; i++) { - if (!deepEqual(objA[i], objB[i])) return false; - } - } - return true; - } // Same reference or primitive value - - if (isPrimitive(objA) && isPrimitive(objB)) { - return objA === objB; // One is not an object or is null - } - - if (typeof objA !== typeof objB) return false; - - const keysA = Object.keys(objA); - const keysB = Object.keys(objB); - - if (keysA.length !== keysB.length) return false; // Different number of keys - - for (let key of keysA) { - if (key === "children") continue; - if (!objB.hasOwnProperty(key)) return false; // Missing key in one of them - if (!deepEqual(objA[key], objB[key])) return false; // Recurse for nested objects/arrays - } - - return true; -} - -function findFirstDom(fiber: Fiber): HTMLElement | Text | undefined { - if (!fiber) return; - - if (fiber.dom) return fiber.dom; - - for (const child of fiber.props.children) { - const dom = findFirstDom(child); - if (dom) return dom; - } -} -// function findFirstChildDom(fiber: Fiber): HTMLElement | Text | undefined { -// if (!fiber) return; - -// for (const child of fiber.props.children) { -// const dom = findFirstDom(child); -// if (dom) return dom; -// } -// } -function findLastDom(fiber: Fiber): HTMLElement | Text | undefined { - if (!fiber) return; - - if (fiber.dom) return fiber.dom; - - for (let i = fiber.props.children.length - 1; i >= 0; i--) { - const child = fiber.props.children[i]; - const dom = findLastDom(child); - if (dom) return dom; - } -} -function findLastChildDom(fiber: Fiber): HTMLElement | Text | undefined { - if (!fiber) return; - - for (let i = fiber.props.children.length - 1; i >= 0; i--) { - const child = fiber.props.children[i]; - const dom = findLastDom(child); - if (dom) return dom; - } -} -function findParentFiberWithDom(fiber: Fiber): Fiber | undefined { - if (!fiber) return; - let fiberParent = fiber.parent; - while (fiberParent && !fiberParent.dom) { - fiberParent = fiberParent.parent; - } - return fiberParent; -} -function findNearestParentWithDom(fiber: Fiber): Fiber | undefined { - if (!fiber) return; - if (fiber.dom) return fiber; - - let fiberParent = fiber.parent; - while (fiberParent && !fiberParent.dom) { - fiberParent = fiberParent.parent; - } - return fiberParent; -} - function updateNode( prev: Fiber | undefined, next: Fiber | undefined, @@ -482,7 +374,6 @@ function updateNode( if (prev && !next) { commitDeletion(prev, true); - // console.log("to remove", prev); prev.parent.props.children = prev.parent.props.children.filter( (child) => child !== prev ); @@ -492,7 +383,6 @@ function updateNode( if (prev.type === "FRAGMENT" || typeof prev.type === "function") { // PREV IS FRAGMENT if (next.type === "FRAGMENT" || typeof next.type === "function") { - // console.log("Fragment-Fragment", prev, next); if ( typeof prev.type === typeof next.type && typeof prev.type === "function" @@ -501,27 +391,16 @@ function updateNode( if (!areSame) { commitFiber(next, findFirstDom(prev), undefined, true); - replaceRenderFunction(prev, next); - commitDeletion(prev); - replaceChildFromParent(prev, next, index); + replaceDeleteFiber(prev, next, index); } } else { - // console.log("fragment-fragment", { ...prev }, next); - updateChildren(prev, next); } - // replaceChildFromParent(prev, next); } else { next.parent = prev.parent; - let firstChild: Fiber | undefined = prev.props.children[0]; - while (firstChild && !firstChild.dom) - firstChild = firstChild.props.children[0]; - commitFiber(next, firstChild?.dom); - - replaceRenderFunction(prev, next); - // removing all nodes of previous fragment - commitDeletion(prev); - replaceChildFromParent(prev, next, index); + let firstDom = findFirstDom(prev.props.children[0]); + commitFiber(next, firstDom); + replaceDeleteFiber(prev, next, index); } } else { // PREV IS NODE @@ -541,13 +420,10 @@ function updateNode( if (next.type === "FRAGMENT" || typeof next.type === "function") { // console.log("Node-Fragment"); next.parent = prev.parent; - replaceRenderFunction(prev, next); commitFiber(next, node); - commitDeletion(prev); - replaceChildFromParent(prev, next, index); + replaceDeleteFiber(prev, next, index); } else { - // console.log("Node-Node"); // remove old properties and event listeners from NODE for (const prop in prevProps) { if ( @@ -581,28 +457,15 @@ function updateNode( // console.log("Different type", prev, next); next.parent = prev.parent; - replaceRenderFunction(prev, next); - commitFiber(next, node, true); - commitDeletion(prev); - replaceChildFromParent(prev, next, index); - - // console.log(prev.parent); + replaceDeleteFiber(prev, next, index); } else { - // add new properties - // console.log("same type", prev, next); - for (const prop in nextProps) { if ( isProperty(prop) && isNew(prevProps, nextProps, prop) ) { node[prop] = nextProps[prop]; - // console.log( - // "property added", - // prop, - // nextProps[prop] - // ); prevProps[prop] = nextProps[prop]; } else if ( isEvent(prop) && @@ -638,23 +501,15 @@ function reconcileList(prev: Fiber, next: Fiber) { const oldMap: Record = {}; for (let i = 0; i < oldFibers.length; i++) { const key = oldFibers[i].props.key; - if ( - key === null || - key === undefined || - oldMap.hasOwnProperty(String(key)) - ) { + if (key === null || key === undefined || String(key) in oldMap) { // If any fiber is missing a key, we cannot reconcile. - // oldFibers[i].props.key = return false; } oldMap[String(key)] = oldFibers[i]; } - const referenceNode = findLastChildDom(prev)?.nextSibling as - | Node - | undefined; + // Create newChildren array based on newFibers order. const fiberParent = findParentFiberWithDom(prev); - // const fragment = document.createDocumentFragment(); if (newFibers.length === 0) { prev.props.children.length = 0; @@ -662,6 +517,7 @@ function reconcileList(prev: Fiber, next: Fiber) { fiberParent.dom.innerHTML = ""; return; } + const fragment = document.createDocumentFragment(); const prevLen = prev.props.children.length; // const newChildren = new Array(newFibers.length); @@ -670,7 +526,7 @@ function reconcileList(prev: Fiber, next: Fiber) { const key = newFiber.props.key; const keyStr = String(key); // If the fiber exists in the old list, reuse it. - if (oldMap.hasOwnProperty(keyStr)) { + if (keyStr in oldMap) { const oldFiber = oldMap[keyStr]; if (prevLen > i) prev.props.children[i] = oldFiber; @@ -683,11 +539,7 @@ function reconcileList(prev: Fiber, next: Fiber) { if (newFiber) newFiber.parent = prev; updateNode(oldFiber, newFiber, i); - applyFiber( - prev.props.children[i], - fiberParent?.dom!, - referenceNode - ); + applyFiber(prev.props.children[i], fragment); } else { // Otherwise, use the new fiber. // console.log(first) @@ -695,26 +547,18 @@ function reconcileList(prev: Fiber, next: Fiber) { else prev.props.children.push(newFiber); newFiber.parent = prev; - commitFiber( - newFiber, - referenceNode, - false, - false, - fiberParent?.dom - ); + commitFiber(newFiber, undefined, false, false, fragment); } } for (const key in oldMap) { - if (oldMap.hasOwnProperty(key)) { - const fiber = oldMap[key]; - commitDeletion(fiber, true); - } + const fiber = oldMap[key]; + commitDeletion(fiber, true); } while (prev.props.children.length > next.props.children.length) { prev.props.children.pop(); } - // fiberParent?.dom?.appendChild(fragment); + fiberParent?.dom?.appendChild(fragment); } function applyFiber(fiber: Fiber, parent: Node, referenceNode?: Node) { @@ -765,11 +609,7 @@ function updateNonListChildren(prev: Fiber, next: Fiber) { if (nextChild) nextChild.parent = prev; if (!prevChild && nextChild) { - commitFiber( - nextChild, - // @ts-expect-error - findLastDom(prev.props.children.at(-1))?.nextSibling - ); + commitFiber(nextChild); prev.props.children.push(nextChild); } else if (!nextChild && prevChild) { commitDeletion(prevChild, true); @@ -800,7 +640,7 @@ function updateNonListChildrenWithKeys(prev: Fiber, next: Fiber) { continue; } count++; - if (oldMap.hasOwnProperty(String(key))) { + if (String(key) in oldMap) { console.warn("Found two children with the same key", key); console.warn( "When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation" @@ -826,7 +666,7 @@ function updateNonListChildrenWithKeys(prev: Fiber, next: Fiber) { } const oldFiber = oldMap[String(key)]; if (oldFiber) { - if (newMap.hasOwnProperty(String(key))) { + if (String(key) in newMap) { console.warn("Found two children with the same key", key); console.warn( "When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation" @@ -850,7 +690,7 @@ function updateNonListChildrenWithKeys(prev: Fiber, next: Fiber) { // console.log(prevChild, nextChild); const nextKey = nextChild?.props.key ? String(nextChild.props.key) : ""; - const isReused = newMap.hasOwnProperty(nextKey); + const isReused = nextKey in newMap; let prevKey = prevChild?.props.key ? String(prevChild.props.key) : ""; @@ -862,12 +702,9 @@ function updateNonListChildrenWithKeys(prev: Fiber, next: Fiber) { continue; } - const isUsedLater = - newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex > i; - const isUsedPreviously = - newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex < i; + const isUsedAgain = prevKey in newMap && newMap[prevKey].newIndex !== i; - if (isUsedLater || isUsedPreviously) { + if (isUsedAgain) { ToCommitDeletion = false; } @@ -908,7 +745,7 @@ function updateNonListChildrenWithKeys(prev: Fiber, next: Fiber) { if (parent?.dom) applyFiber(prev.props.children[i], parent.dom); } else { // console.log(ToCommitDeletion); - if (isUsedLater || isUsedPreviously) { + if (isUsedAgain) { if (parent?.dom) commitFiber( nextChild, @@ -936,7 +773,6 @@ function updateNonListChildrenWithKeys(prev: Fiber, next: Fiber) { } ToCommitDeletion = true; } - // console.log(prev.props.children, next.props.children); } // @ts-expect-error diff --git a/src/rendering/utils.ts b/src/rendering/utils.ts new file mode 100644 index 0000000..96635ac --- /dev/null +++ b/src/rendering/utils.ts @@ -0,0 +1,79 @@ +import { BaseSignal } from "../signals/signal"; +import { Fiber } from "../types"; +import { isPrimitive } from "../utils/general"; + +export function deepCompareFibers(fiberA: any, fiberB: any): boolean { + // Fast path: identical references + if (fiberA === fiberB) { + return true; + } + + // Compare the fiber types (e.g., function for FCs, string for DOM nodes) + if (fiberA.type !== fiberB.type) { + return false; + } + + // Compare keys if they exist + if (fiberA.props?.key !== fiberB.props?.key) { + return false; + } + return deepEqual(fiberA.props, fiberB.props); +} + +export function deepEqual(objA: any, objB: any): boolean { + if (objA === objB) { + if (objA instanceof BaseSignal && objB instanceof BaseSignal) + return deepEqual(objA.value, objB.value); + if (Array.isArray(objA) && Array.isArray(objB)) { + if (objA.length !== objB.length) return false; + for (let i = 0; i < objA.length; i++) { + if (!deepEqual(objA[i], objB[i])) return false; + } + } + return true; + } // Same reference or primitive value + + if (isPrimitive(objA) && isPrimitive(objB)) { + return objA === objB; // One is not an object or is null + } + + if (typeof objA !== typeof objB) return false; + const vis = {}; + for (let key in objA) { + if (key === "children") continue; + if (!(key in objB)) return false; // Missing key in one of them + if (!deepEqual(objA[key], objB[key])) return false; // Recurse for nested objects/arrays + vis[key] = true; + } + + for (let key in objB) { + if (key === "children") continue; + if (!(key in objA)) return false; // Missing key in one of them + } + + return true; +} + +export function findFirstDom(fiber: Fiber): HTMLElement | Text | undefined { + if (!fiber) return; + + if (fiber.dom) return fiber.dom; + + for (const child of fiber.props.children) { + const dom = findFirstDom(child); + if (dom) return dom; + } +} +export function findParentFiberWithDom(fiber: Fiber): Fiber | undefined { + if (!fiber) return; + let fiberParent = fiber.parent; + while (fiberParent && !fiberParent.dom) { + fiberParent = fiberParent.parent; + } + return fiberParent; +} +export function findNearestParentWithDom(fiber: Fiber): Fiber | undefined { + if (!fiber) return; + if (fiber.dom) return fiber; + return findParentFiberWithDom(fiber); +} From 58a69f389879a891d595ae29d9d940fd49518c7b Mon Sep 17 00:00:00 2001 From: Aditya Date: Mon, 17 Mar 2025 13:05:05 +0530 Subject: [PATCH 5/5] build for new version- performance improvements and smaller bundle size --- build/lazy/Lazyloading.d.ts | 6 +- build/refract.cjs.js | 3 +- build/refract.cjs.js.map | 1 - build/refract.es.js | 2175 +++++++++++++---------------------- build/refract.es.js.map | 1 - build/rendering/utils.d.ts | 6 + build/signals/signal.d.ts | 7 +- build/signals/utils.d.ts | 14 + build/utils/general.d.ts | 1 - package.json | 2 +- vite.config.ts | 18 +- 11 files changed, 844 insertions(+), 1390 deletions(-) delete mode 100644 build/refract.cjs.js.map delete mode 100644 build/refract.es.js.map create mode 100644 build/rendering/utils.d.ts create mode 100644 build/signals/utils.d.ts diff --git a/build/lazy/Lazyloading.d.ts b/build/lazy/Lazyloading.d.ts index 0b99eb4..5211f9e 100644 --- a/build/lazy/Lazyloading.d.ts +++ b/build/lazy/Lazyloading.d.ts @@ -1,9 +1,9 @@ -import { ComponentChildren } from '../index'; +import { ComponentChild } from '../index'; type PropsOf any> = Parameters extends [] ? {} : Parameters[0]; export declare function lazy any>(importFn: () => Promise<{ default: T; }>): (props: PropsOf & { - fallback?: ComponentChildren; - errorFallback?: ComponentChildren | ((error: Error) => ComponentChildren); + fallback?: ComponentChild; + errorFallback?: ComponentChild | ((error: Error) => ComponentChild); }) => ReturnType; export {}; diff --git a/build/refract.cjs.js b/build/refract.cjs.js index d72c5be..9c12cfb 100644 --- a/build/refract.cjs.js +++ b/build/refract.cjs.js @@ -1,2 +1 @@ -"use strict";function e(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)&&"[object Object]"===Object.prototype.toString.call(e)}function t(e){return["boolean","string","number","undefined"].includes(typeof e)||null===e||e instanceof Error}Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n="http://www.w3.org/2000/svg",r=new Set(["svg","a","circle","clipPath","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","foreignObject","g","image","line","linearGradient","marker","mask","metadata","path","pattern","polygon","polyline","radialGradient","rect","script","set","stop","style","switch","symbol","text","textPath","title","tspan","use","view"]),o=new Set(["math","maction","maligngroup","malignmark","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mlongdiv","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mscarries","mscarry","msgroup","msline","mspace","msqrt","msrow","mstack","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),i=/(PointerCapture)$|Capture$/i,s=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function l(e,t,n,r){e.__propName=t;const o=function(e){if("function"!=typeof e)throw new Error("reactive takes a render function as the argument");Z=e;const t=e();return Z=null,t}(e);null!=o&&!1!==o&&(a(t,o,n,r),e.__signals&&function(e,t){J.set(e,t)}(e,n))}const p=/(PointerCapture)$|Capture$/i;function a(t,r,o,i){if("style"!=t){if("o"===t[0]&&"n"===t[1]&&"function"==typeof r){const e=t!=(t=t.replace(p,"$1"));return t=t.toLowerCase()in o||"onFocusOut"==t||"onFocusIn"==t||"onGotPointerCapture"===t||"onLostPointerCapture"===t?t.toLowerCase().slice(2):t.slice(2),void o.addEventListener(t,r,e)}if(i===n)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&"rowSpan"!==t&&"colSpan"!==t&&"role"!==t&&"popover"!==t&&t in o)try{return void("value"===t&&"SELECT"===o.tagName?setTimeout((()=>{o[t]=r??""})):o[t]=r??"")}catch(l){}null==r||!1===r&&"-"!==t[4]||o.setAttribute(t,"popover"===t&&!0===r?"":r)}else!function(t,n){if(!function(t){return e(t)||"string"==typeof t}(t))throw new Error("Style attribute must be a plain object or a string");if("string"==typeof t)n.setAttribute("style",t);else{const e=function(e){const t={};for(const n in e){const r=e[n];"object"==typeof r&&null!==r||null!=r&&!1!==r&&""!==r&&(t[n]=r)}return t}(t);n.setAttribute("style",function(e){const t=[];for(const n in e){const r=e[n],o=n.replace(/([A-Z])/g,"-$1").toLowerCase();"number"!=typeof r||s.test(o)?t.push(`${o}: ${r};`):t.push(`${o}: ${r}px;`)}return t.join(" ")}(e))}}(r,o)}const c=Symbol("FRAGMENT");function u(e,t,...n){if("FRAGMENT"===e){const e=f(n);return e[c]=!0,e}return{type:e,props:{...t,children:f(n)}}}function f(n){return n.map((n=>{if("object"==typeof n){if(Array.isArray(n))return f(n);if(null===n)return d("");if(!n.type||!n.props)throw new Error("Invalid type for a dom node, found "+n);return n}if("function"==typeof n){const r=function(n){var r;if("function"!=typeof n)throw new Error("reactive takes a render function as the argument");Z=n;const o=n();if(Z=null,!t(o)&&e(o)&&!o.type&&!o.props&&!(null==(r=o.props)?void 0:r.children))throw new Error("Reactive value must be primitive or functional component, got: "+typeof o);return o}(n);if(t(r))return h("TEXT_CHILD",{nodeValue:null!=r&&!1!==r?String(r):"",children:[]},n);if(Array.isArray(r))return h("FRAGMENT",{children:r[c]?r:f(r)},n);if(!r.type||!r.props)throw new Error("Invalid type for a dom node, found "+r);return h(r.type,r.props,n)}return d(n)})).flat()}function d(e){return{type:"TEXT_CHILD",props:{nodeValue:null!=e&&!1!==e?String(e):"",children:[]}}}function h(e,t,n){return{type:e,renderFunction:n,props:t}}function y(e){let t=null;r.has(e.type)?t=n:o.has(e.type)&&(t="http://www.w3.org/1998/Math/MathML");const i="TEXT_CHILD"===e.type?document.createTextNode(""):t?document.createElementNS(t,e.type,e.props.is&&e.props):document.createElement(e.type);if(!e.props)return i;e.props.ref&&e.props.ref instanceof te&&i instanceof HTMLElement&&(e.props.ref.current=i);for(const n in e.props){if("children"===(s=n)||"key"===s||"ref"===s)continue;const r=e.props[n];"function"==typeof r&&"o"!==n[0]&&"n"!==n[1]?l(r,n,i,t):a(n,r,i,t)}var s;return i}let m=[],g=null,v=null,w=[];function b(){for(let e=0;e0&&!t;)E(m.pop()),t=e.timeRemaining()<1;if(0==m.length)return v&&g&&g.appendChild(v),void b();requestIdleCallback(_)}function E(e){var t;if("FRAGMENT"===e.type){const t=!e.props.children[c];let n=!1;for(let r=e.props.children.length-1;r>=0;r--)e.props.children[r].parent=e,t&&void 0===e.props.children[r].props.key&&e.renderFunction&&(n=!0),m.push(e.props.children[r])}else if("function"==typeof e.type){ce(e);const t=e.type(e.props);if(ue(),Array.isArray(t)){for(let n=t.length-1;n>=0;n--)t[n].parent=e,m.push(t[n]);e.props.children=t}else t.parent=e,e.props.children.push(t),m.push(t);w.push(e)}else{e.dom||(e.dom=y(e));let n=e.parent;for(;n&&!n.dom;)n=n.parent;n&&(null==(t=n.dom)||t.appendChild(e.dom));for(let t=e.props.children.length-1;t>=0;t--)e.props.children[t].parent=e,m.push(e.props.children[t])}A(e)}function S(e){if("FRAGMENT"===e.type)if(e.props.children[c])for(const t of e.props.children)t.parent=e,S(t);else{let t=!1;for(const n of e.props.children)n.parent=e,void 0===n.props.key&&(t=!0),S(n)}else if("function"!=typeof e.type)for(const t of e.props.children)t.parent=e,S(t);A(e)}function x(e,t,n,r,o){var i,s;if("FRAGMENT"===e.type)for(const l of e.props.children)r&&(l.parent=e),x(l,t,n,r,o);else if("function"==typeof e.type){ce(e);const r=e.type(e.props);if(ue(),Array.isArray(r)){for(const i of r)i.parent=e,x(i,t,n,!0,o);e.props.children=r}else r.parent=e,e.props.children.push(r),x(r,t,n,!0,o);queueMicrotask((()=>{de(e)}))}else{if(e.dom||(e.dom=y(e)),t)n?null==(i=t.parentElement)||i.replaceChild(e.dom,t):null==(s=t.parentElement)||s.insertBefore(e.dom,t);else{let t;if(o)t=o;else{let n=e.parent;for(;n&&!n.dom;)n=n.parent;t=null==n?void 0:n.dom}null==t||t.appendChild(e.dom)}for(const t of e.props.children)r&&(t.parent=e),x(t,void 0,void 0,r,e.dom)}r&&A(e)}let k=!0;function F(e,t){if(e&&k){if(e.renderFunction&&(t&&function(e){W.delete(e);const t=e.__signals;if(t){for(const n of t)n.removeDep(e);e.__signals=null}}(e.renderFunction),delete e.renderFunction),e.dom){for(const t in e.props)if(T(t)){let n=t.toLowerCase().substring(2);const r=n!=(n=n.replace(i,"$1"));e.dom.removeEventListener(n,e.props[t],r),delete e.props[t]}else"function"==typeof e.props[t]?U(e.props[t]):"ref"===t&&e.props[t]instanceof te&&(e.props[t].current=null);e.dom.remove()}"function"==typeof e.type&&(function(e){const t=ae.get(e);if(t){if(t.cleanup)for(const e of t.cleanup)e();t.cleanup=[];for(const e of t.effects){if(e.__cleanup&&"function"==typeof e.__cleanup&&e.__cleanup(),e.__signals)for(const t of e.__signals)t.removeDep(e);delete e.__signals,delete e.__cleanup}t.signals.forEach((e=>e.clearDeps())),t.signals.clear()}ae.delete(e)}(e,e.props),delete e.type),e.props.children.forEach((e=>F(e,!0)))}}function A(e){e.renderFunction&&function(e,t){W.set(e,t)}(e.renderFunction,e)}function C(e,n){if(t(n)){const t={...d(n),parent:e.parent};S(t),R(e,t)}else if(Array.isArray(n)){const t={type:"FRAGMENT",props:{children:n[c]?n:f(n)},parent:e.parent};S(t),R(e,t)}else{const t={...n,parent:e.parent};S(t),R(e,t)}}function P(e,t){e.renderFunction&&(t.renderFunction=e.renderFunction,A(t))}function M(e,t,n){var r;void 0===n?null==(r=e.parent)||r.props.children.forEach(((n,r)=>{n===e&&(e.parent.props.children[r]=t)})):e.parent.props.children[n]=t}const T=e=>e.startsWith("on")||"onFocusOut"==e||"onFocusIn"==e,I=e=>"children"!==e&&!T(e)&&"key"!==e&&"ref"!==e,N=(e,t,n)=>e[n]!==t[n],L=(e,t,n)=>!(n in t);function j(e,t){var n,r;return e===t||e.type===t.type&&(null==(n=e.props)?void 0:n.key)===(null==(r=t.props)?void 0:r.key)&&O(e.props,t.props)}function O(e,n){if(e===n){if(e instanceof re&&n instanceof re)return O(e.value,n.value);if(Array.isArray(e)&&Array.isArray(n)){if(e.length!==n.length)return!1;for(let t=0;t=0;t--){const n=D(e.props.children[t]);if(n)return n}}}function R(e,t,n){if(e||t)if(e&&!t)F(e,!0),e.parent.props.children=e.parent.props.children.filter((t=>t!==e));else if(e&&t){const r=e.props,o=t.props;if("FRAGMENT"===e.type||"function"==typeof e.type)if("FRAGMENT"===t.type||"function"==typeof t.type)typeof e.type==typeof t.type&&"function"==typeof e.type?j(e,t)||(x(t,G(e),void 0,!0),P(e,t),F(e),M(e,t,n)):H(e,t);else{t.parent=e.parent;let r=e.props.children[0];for(;r&&!r.dom;)r=r.props.children[0];x(t,null==r?void 0:r.dom),P(e,t),F(e),M(e,t,n)}else{const s=e.dom;if("TEXT_CHILD"!==e.type||"TEXT_CHILD"!==t.type||t.dom||(t.dom=e.dom),void 0===s)return;if("FRAGMENT"===t.type||"function"==typeof t.type)t.parent=e.parent,P(e,t),x(t,s),F(e),M(e,t,n);else{for(const e in r)if(I(e)&&L(r,o,e))s[e]="";else if(T(e)&&(!(e in o)||N(r,o,e))){let t=e.toLowerCase().substring(2);const n=t!=(t=t.replace(i,"$1"));s.removeEventListener(t,r[e],n)}if(e.type!==t.type)t.parent=e.parent,P(e,t),x(t,s,!0),F(e),M(e,t,n);else{for(const e in o)if(I(e)&&N(r,o,e))s[e]=o[e],r[e]=o[e];else if(T(e)&&N(r,o,e)){let t=e.toLowerCase().substring(2);const n=t!=(t=t.replace(i,"$1"));s.addEventListener(t,o[e],n),r[e]=o[e]}H(e,t)}}}}}function $(e,t,n){if(e.dom){if(e.dom===t||e.dom===n)return;n?t.insertBefore(e.dom,n):t.appendChild(e.dom)}else for(const r of e.props.children)$(r,t,n)}function H(e,t){const n="FRAGMENT"===t.type&&!t.props.children[c],r="FRAGMENT"===e.type&&!e.props.children[c];n&&r?!1===function(e,t){var n;const r=e.props.children,o=t.props.children,i={};for(let a=0;a=0;t--){const n=D(e.props.children[t]);if(n)return n}}(e))?void 0:n.nextSibling,l=function(e){if(!e)return;let t=e.parent;for(;t&&!t.dom;)t=t.parent;return t}(e);if(0===o.length)return e.props.children.length=0,void((null==l?void 0:l.dom)instanceof HTMLElement&&(l.dom.innerHTML=""));const p=e.props.children.length;for(let a=0;aa?e.props.children[a]=n:e.props.children.push(n),delete i[c];const r=t.props.children[a];r&&(r.parent=e),R(n,r,a),$(e.props.children[a],null==l?void 0:l.dom,s)}else p>a?e.props.children[a]=n:e.props.children.push(n),n.parent=e,x(n,s,!1,!1,null==l?void 0:l.dom)}for(const a in i)i.hasOwnProperty(a)&&F(i[a],!0);for(;e.props.children.length>t.props.children.length;)e.props.children.pop()}(e,t)&&X(e,t):X(e,t),"FRAGMENT"===t.type&&t.props.children[c]?e.props.children[c]=!0:e.props.children[c]=!1,e.type=t.type}function z(e,t){var n;let r=Math.max(e.props.children.length,t.props.children.length);for(let o=0;ol,f=i.hasOwnProperty(c)&&i[c].newIndex{var t;t=()=>(this.isNotified=!1,e),V.add(t),q||(q=!0,queueMicrotask((()=>{V.forEach((e=>{const t=e();if(B.has(t))return;B.add(t),t.__cleanup&&"function"==typeof t.__cleanup&&(t.__cleanup(),t.__cleanup=null);const n=t();if("function"==typeof n&&(t.__cleanup=n),W.has(t)){const e=W.get(t);e&&C(e,n)}if(J.has(t)){const e=J.get(t);e&&t.__propName&&function(e,t,n){null!=n&&"key"!==e&&a(e,n,t)}(t.__propName,e,n)}})),B.clear(),V.clear(),q=!1})))})))}removeDep(e){this.deps.delete(e)}clearDeps(){this.deps.clear()}}class oe extends re{constructor(e){if(!t(e))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");super(e)}get value(){return K&&(this.deps.add(K),Y(this)),Z&&(this.deps.add(Z),Q(this)),this._val}update(e){if("function"==typeof e){const n=e(this._val);if(!t(n))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");if(n===this._val)return;this._val=n,this.notify()}else{if(!t(e))throw new Error("Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]");if(e===this._val)return;this._val=e,this.notify()}}}class ie extends re{constructor(e){if(!Array.isArray(e))throw new Error("Invalid type for ArraySignal; value must be an array");super(e),this.updateCalled=!1,this._val=this.createProxy(e)}createProxy(e){return new Proxy(e,{get:(e,t)=>{const n=e[t];if("function"==typeof n){if(ne.includes(String(t))&&!this.updateCalled)throw new Error("Cannot set a value on an array signal, use the update method for updating the array.");return(...r)=>{const o=n.apply(e,r);return ne.includes(String(t))&&this.notify(),o}}return n},set:(e,t,n)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an array signal, use the update method for updating the array.");return e[t]=n,this.notify(),!0}})}get value(){return K&&(this.deps.add(K),Y(this)),Z&&(this.deps.add(Z),Q(this)),this._val}update(e){if(this.updateCalled=!0,"function"==typeof e)e(this._val);else{if(!Array.isArray(e))throw new Error("Invalid type for ArraySignal; value must be an array");if(e===this._val)return;this._val=this.createProxy(e),this.notify()}this.updateCalled=!1}}class se extends re{constructor(t){if(!e(t))throw new Error("Invalid type for ObjectSignal; value must be a plain object");super(t),this.updateCalled=!1,this._val=this.createProxy(t)}createInternalArrayProxy(e){return new Proxy(e,{get:(e,t)=>{const n=e[t];if("function"==typeof n){if(!this.updateCalled&&ne.includes(String(t)))throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return(...r)=>{const o=n.apply(e,r);return ne.includes(String(t))&&this.notify(),o}}return n},set:(e,t,n)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return e[t]=n,this.notify(),!0}})}createProxy(e){return new Proxy(e,{get:(e,t)=>{const n=e[t];return Array.isArray(n)?(e[t]=this.createInternalArrayProxy(n),e[t]):n},set:(e,t,n)=>{if(!this.updateCalled)throw new Error("Cannot set a value on an object signal, use the update method for updating the object.");return"function"!=typeof n&&("object"==typeof n&&null!==n&&(n=this.createProxy(n)),n===e[t]||(e[t]=n,this.notify()),!0)},deleteProperty:(e,t)=>{const n=delete e[t];return this.notify(),n}})}get value(){return K&&(this.deps.add(K),Y(this)),Z&&(this.deps.add(Z),Q(this)),this._val}update(t){if(this.updateCalled=!0,"function"==typeof t)t(this._val);else{if(!e(t))throw new Error("Invalid type for ObjectSignal; value must be a plain object");if(t===this._val)return;this._val=this.createProxy(t),this.notify()}this.updateCalled=!1}}function le(n){if("function"==typeof n)throw new Error("Functions cannot be used as signal value");if("object"==typeof n&&null!==n){if(Array.isArray(n)){const e=new ie(n);return me(e),{get value(){return e.value},update:e.update.bind(e)}}if(e(n)){const e=new se(n);return me(e),{get value(){return e.value},update:e.update.bind(e)}}throw new Error("Invalid type for signal initialization: "+typeof n)}if(t(n)){const e=new oe(n);return me(e),{get value(){return e.value},update:e.update.bind(e)}}throw new Error("Invalid type for signal initialization: "+typeof n)}let pe=null,ae=new WeakMap;function ce(e){pe=e}function ue(){pe=null}function fe(){return pe}function de(e){if(ae.has(e)){const t=ae.get(e);for(const n of t.effects)ee(n,e)}}function he(e){pe&&(ae.has(pe)?ae.get(pe).cleanup.push(e):ae.set(pe,{signals:new Set,cleanup:[e],effects:new Set}))}function ye(e){if(pe)if(ae.has(pe))ae.get(pe).effects.add(e);else{const t=new Set;t.add(e),ae.set(pe,{signals:new Set,cleanup:[],effects:t})}}function me(e){if(pe)if(ae.has(pe))ae.get(pe).signals.add(e);else{const t=new Set;t.add(e),ae.set(pe,{signals:t,cleanup:[],effects:new Set})}}exports.cleanUp=he,exports.computed=function(e){if("function"!=typeof e)throw new Error("computed takes a function as the argument");let t=null!==fe();K=()=>{t?t=!1:n.update(e())},ye(K);const n=le(e());return K=null,{get value(){return n.value}}},exports.createEffect=function(e){if("function"!=typeof e)throw new Error("createEffect takes a effect function as the argument");ye(e),fe()||ee(e)},exports.createElement=u,exports.createPromise=function(e){if("function"!=typeof e)throw new Error("createPromise takes a function as the argument");const t=e();if(!(t instanceof Promise))throw new Error("createPromise takes a function that returns a promise");const n=le({status:"pending",data:null,error:null});return t.then((e=>{n.update((t=>{t.data=e,t.status="resolved"}))})).catch((e=>{n.update((t=>{t.error=e,t.status="rejected"}))})),{get value(){return n.value}}},exports.createRef=function(){return new te(null)},exports.createSignal=le,exports.lazy=function(e){let t=null;return n=>{const r=le(!0),o=le(null);((n,r)=>{t?(n.update(!1),r.update(null)):e().then((e=>{if(e.default){if("function"!=typeof e.default)throw new Error("Lazy-loaded component must be a functional component");t=e.default,n.update(!1),r.update(null)}else r.update(new Error("No default export found from lazy-loaded module"))})).catch((e=>{r.update(e),n.update(!1)}))})(r,o);const i=e=>"string"==typeof e||e&&"object"==typeof e&&"props"in e&&"type"in e;if(void 0!==n.fallback&&!i(n.fallback))throw new Error("Invalid fallback: Expected a string or a valid JSX node.");if(void 0!==n.errorFallback&&"function"!=typeof n.errorFallback&&!i(n.errorFallback))throw new Error("Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node.");return u("FRAGMENT",null,(()=>r.value?n.fallback:null!==o.value?n.errorFallback?"function"==typeof n.errorFallback?n.errorFallback(o.value):n.errorFallback:"Unknown error occurred while lazy loading component, use errorFallback prop to override":t&&u(t,{...n})))}},exports.render=function(e,t){g=t;const n=document.createDocumentFragment();v=n;const r={type:"div",props:{children:[e]},dom:n};e.parent=r,m.push(e),requestIdleCallback(_)}; -//# sourceMappingURL=refract.cjs.js.map +"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function N(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&Object.prototype.toString.call(e)==="[object Object]"}function A(e){return["boolean","string","number","undefined"].includes(typeof e)||e===null||e instanceof Error}const ce="http://www.w3.org/2000/svg",ke=new Set(["svg","a","circle","clipPath","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","foreignObject","g","image","line","linearGradient","marker","mask","metadata","path","pattern","polygon","polyline","radialGradient","rect","script","set","stop","style","switch","symbol","text","textPath","title","tspan","use","view"]),Ae=new Set(["math","maction","maligngroup","malignmark","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mlongdiv","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mscarries","mscarry","msgroup","msline","mspace","msqrt","msrow","mstack","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),Te="http://www.w3.org/1998/Math/MathML",j=/(PointerCapture)$|Capture$/i,Ne=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function Pe(e){const t=[];for(const n in e){const r=e[n],o=n.replace(/([A-Z])/g,"-$1").toLowerCase();typeof r!="number"||Ne.test(o)?t.push(`${o}: ${r};`):t.push(`${o}: ${r}px;`)}return t.join(" ")}function Re(e){const t={};for(const n in e){const r=e[n];if(typeof r=="object"&&r!==null){console.warn(`Nested styles not allowed for ${n}`);continue}r==null||r===!1||r===""||(t[n]=r)}return t}function Le(e){return N(e)||typeof e=="string"}function De(e,t){if(!Le(e))throw new Error("Style attribute must be a plain object or a string");if(typeof e=="string")t.setAttribute("style",e);else{const n=Re(e);t.setAttribute("style",Pe(n))}}function Ge(e,t,n,r){e.__propName=t;const o=et(e);o==null||o===!1||(te(t,o,n,r),e.__signals&&Je(e,n))}const Ie=/(PointerCapture)$|Capture$/i;function te(e,t,n,r){if(e=="style"){De(t,n);return}if(e[0]==="o"&&e[1]==="n"&&typeof t=="function"){const o=e!=(e=e.replace(Ie,"$1"));e.toLowerCase()in n||e=="onFocusOut"||e=="onFocusIn"||e==="onGotPointerCapture"||e==="onLostPointerCapture"?e=e.toLowerCase().slice(2):e=e.slice(2),n.addEventListener(e,t,o);return}if(r===ce)e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(e!=="width"&&e!=="height"&&e!=="href"&&e!=="list"&&e!=="form"&&e!=="tabIndex"&&e!=="download"&&e!=="rowSpan"&&e!=="colSpan"&&e!=="role"&&e!=="popover"&&e in n)try{e==="value"&&n.tagName==="SELECT"?setTimeout(()=>{n[e]=t??""}):n[e]=t??"";return}catch{}t!=null&&(t!==!1||e[4]==="-")&&n.setAttribute(e,e==="popover"&&t===!0?"":t)}const h=Symbol("FRAGMENT");function B(e,t,...n){if(e==="FRAGMENT"){const r=P(n);return r[h]=!0,r}return{type:e,props:{...t,children:P(n)}}}function P(e){return e.map(t=>{if(typeof t=="object"){if(Array.isArray(t))return P(t);if(t===null)return x("");if(!t.type||!t.props)throw new Error("Invalid type for a dom node, found "+t);return t}else if(typeof t=="function"){const n=be(t);if(A(n))return X("TEXT_CHILD",{nodeValue:n!=null&&n!==!1?String(n):"",children:[]},t);if(Array.isArray(n)){const r=n[h];return X("FRAGMENT",{children:r?n:P(n)},t)}else if(!n.type||!n.props)throw new Error("Invalid type for a dom node, found "+n);return X(n.type,n.props,t)}else return x(t)}).flat()}function x(e){return{type:"TEXT_CHILD",props:{nodeValue:e!=null&&e!==!1?String(e):"",children:[]}}}function X(e,t,n){return{type:e,renderFunction:n,props:t}}function $e(e){return e!=="children"&&e!=="key"&&e!=="ref"}function ae(e){let t=null;ke.has(e.type)?t=ce:Ae.has(e.type)&&(t=Te);const n=e.type==="TEXT_CHILD"?document.createTextNode(""):t?document.createElementNS(t,e.type,e.props.is&&e.props):document.createElement(e.type);if(!e.props)return n;e.props.ref&&e.props.ref instanceof ne&&n instanceof HTMLElement&&(e.props.ref.current=n);for(const r in e.props){if(!$e(r))continue;const o=e.props[r];typeof o=="function"&&r[0]!=="o"&&r[1]!=="n"?Ge(o,r,n,t):te(r,o,n,t)}return n}function Oe(e,t,n){n==null||e==="key"||te(e,n,t)}function ue(e,t){return e===t?!0:e.type!==t.type||e.props?.key!==t.props?.key?!1:T(e.props,t.props)}function T(e,t){if(e===t){if(e instanceof R&&t instanceof R)return T(e.value,t.value);if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n0&&!t;){const n=w.pop();ze(n),t=e.timeRemaining()<1}if(w.length==0){Ue(),re();return}requestIdleCallback(fe)}function ze(e){if(e.type==="FRAGMENT"){const t=!e.props.children[h];let n=!1;for(let r=e.props.children.length-1;r>=0;r--)e.props.children[r].parent=e,t&&e.props.children[r].props.key===void 0&&e.renderFunction&&(n=!0),w.push(e.props.children[r]);n&&console.error("Array children must have a key attribute")}else if(typeof e.type=="function"){_e(e);const t=e.type(e.props);if(Ee(),Array.isArray(t)){for(let n=t.length-1;n>=0;n--)t[n].parent=e,w.push(t[n]);e.props.children=t}else t.parent=e,e.props.children.push(t),w.push(t);G.push(e)}else{e.dom||(e.dom=ae(e));let t=W(e);t&&t.dom?.appendChild(e.dom);for(let n=e.props.children.length-1;n>=0;n--)e.props.children[n].parent=e,w.push(e.props.children[n])}U(e)}function F(e){if(e.type==="FRAGMENT")if(e.props.children[h])for(const n of e.props.children)n.parent=e,F(n);else{let n=!1;for(const r of e.props.children)r.parent=e,r.props.key===void 0&&(n=!0),F(r);n&&console.error("Array children must have a key attribute")}else if(typeof e.type!="function")for(const t of e.props.children)t.parent=e,F(t);U(e)}function p(e,t,n,r,o){if(e.type==="FRAGMENT")for(const i of e.props.children)r&&(i.parent=e),p(i,t,n,r,o);else if(typeof e.type=="function"){_e(e);const i=e.type(e.props);if(Ee(),Array.isArray(i)){for(const s of i)s.parent=e,p(s,t,n,!0,o);e.props.children=i}else i.parent=e,e.props.children.push(i),p(i,t,n,!0,o);queueMicrotask(()=>{Ce(e)})}else{if(e.dom||(e.dom=ae(e)),t)n?t.parentElement?.replaceChild(e.dom,t):t.parentElement?.insertBefore(e.dom,t);else{let i;o?i=o:i=W(e)?.dom,i?.appendChild(e.dom)}for(const i of e.props.children)r&&(i.parent=e),p(i,void 0,void 0,r,e.dom)}r&&U(e)}let I=!0;function _(e,t){if(!(!e||!I)){if(e.renderFunction&&(t&&je(e.renderFunction),delete e.renderFunction),e.dom){for(const n in e.props)if($(n)){let r=n.toLowerCase().substring(2);const o=r!=(r=r.replace(j,"$1"));e.dom.removeEventListener(r,e.props[n],o),delete e.props[n]}else typeof e.props[n]=="function"?Ve(e.props[n]):n==="ref"&&e.props[n]instanceof ne&&(e.props[n].current=null);e.dom.remove()}typeof e.type=="function"&&(at(e,e.props),delete e.type),e.props.children.forEach(n=>_(n,!0))}}function U(e){e.renderFunction&&Ze(e.renderFunction,e)}function pe(e,t){if(A(t)){const n={...x(t),parent:e.parent};F(n),y(e,n)}else if(Array.isArray(t)){const r={type:"FRAGMENT",props:{children:t[h]?t:P(t)},parent:e.parent};F(r),y(e,r)}else{const n={...t,parent:e.parent};F(n),y(e,n)}}function Xe(e,t){e.renderFunction&&(t.renderFunction=e.renderFunction,U(t))}function qe(e,t,n){if(n!==void 0){e.parent.props.children[n]=t;return}for(let r=0;re.startsWith("on")||e=="onFocusOut"||e=="onFocusIn",oe=e=>e!=="children"&&!$(e)&&e!=="key"&&e!=="ref",q=(e,t,n)=>e[n]!==t[n],Ke=(e,t,n)=>!(n in t);function y(e,t,n){if(!(!e&&!t)){if(e&&!t)_(e,!0),e.parent.props.children=e.parent.props.children.filter(r=>r!==e);else if(e&&t){const r=e.props,o=t.props;if(e.type==="FRAGMENT"||typeof e.type=="function")if(t.type==="FRAGMENT"||typeof t.type=="function")typeof e.type==typeof t.type&&typeof e.type=="function"?ue(e,t)||(p(t,v(e),void 0,!0),D(e,t,n)):ie(e,t);else{t.parent=e.parent;let i=v(e.props.children[0]);p(t,i),D(e,t,n)}else{const i=e.dom;if(e.type==="TEXT_CHILD"&&t.type==="TEXT_CHILD"&&!t.dom&&(t.dom=e.dom),i===void 0)return;if(t.type==="FRAGMENT"||typeof t.type=="function")t.parent=e.parent,p(t,i),D(e,t,n);else{for(const s in r)if(oe(s)&&Ke(r,o,s))i[s]="";else if($(s)&&(!(s in o)||q(r,o,s))){let c=s.toLowerCase().substring(2);const l=c!=(c=c.replace(j,"$1"));i.removeEventListener(c,r[s],l)}if(e.type!==t.type)t.parent=e.parent,p(t,i,!0),D(e,t,n);else{for(const s in o)if(oe(s)&&q(r,o,s))i[s]=o[s],r[s]=o[s];else if($(s)&&q(r,o,s)){let c=s.toLowerCase().substring(2);const l=c!=(c=c.replace(j,"$1"));i.addEventListener(c,o[s],l),r[s]=o[s]}ie(e,t)}}}}}}function Qe(e,t){const n=e.props.children,r=t.props.children,o={};for(let l=0;ll?e.props.children[l]=g:e.props.children.push(g),delete o[S];const M=t.props.children[l];M&&(M.parent=e),y(g,M,l),k(e.props.children[l],s)}else c>l?e.props.children[l]=a:e.props.children.push(a),a.parent=e,p(a,void 0,!1,!1,s)}for(const l in o){const a=o[l];_(a,!0)}for(;e.props.children.length>t.props.children.length;)e.props.children.pop();i?.dom?.appendChild(s)}function k(e,t,n){if(e.dom){if(e.dom===t||e.dom===n)return;t.appendChild(e.dom)}else for(const r of e.props.children)k(r,t,n)}function ie(e,t){const n=t.type==="FRAGMENT"&&!t.props.children[h],r=e.type==="FRAGMENT"&&!e.props.children[h];n&&r?Qe(e,t)===!1&&se(e,t):se(e,t),t.type==="FRAGMENT"&&t.props.children[h]?e.props.children[h]=!0:e.props.children[h]=!1,e.type=t.type}function K(e,t){let n=Math.max(e.props.children.length,t.props.children.length);for(let r=0;r{Y.forEach(t=>{const n=t();if(Z.has(n))return;Z.add(n),n.__cleanup&&typeof n.__cleanup=="function"&&(n.__cleanup(),n.__cleanup=null);const r=n();if(typeof r=="function"&&(n.__cleanup=r),O.has(n)){const o=O.get(n);o&&pe(o,r)}if(H.has(n)){const o=H.get(n);o&&n.__propName&&Oe(n.__propName,o,r)}}),Z.clear(),Y.clear(),Q=!1}))}function Ze(e,t){O.set(e,t)}function Je(e,t){H.set(e,t)}function Ve(e){H.delete(e);const t=e.__signals;if(t){for(const n of t)n.removeDep(e);e.__signals=null}}function je(e){O.delete(e);const t=e.__signals;if(t){for(const n of t)n.removeDep(e);e.__signals=null}}const Be=["push","pop","unshift","shift","splice","fill","copyWithin","sort","reverse"];function le(e){return Be.includes(String(e))}process.env.NODE_ENV;function J(e){return{get value(){return e.value},update:e.update.bind(e)}}const de=(e,t)=>new Proxy(e,{get:(n,r)=>{const o=n[r];if(typeof o=="function"){if(le(r)&&!t.updateCalled)throw new Error("Cannot set a value on an array signal, use the update method for updating the array.");return(...i)=>{const s=o.apply(n,i);return le(r)&&t.notify(),s}}return o},set:(n,r,o)=>{if(!t.updateCalled)throw new Error("Cannot set a value on an array signal, use the update method for updating the array.");return n[r]=o,t.notify(),!0}});let C=null,d=null;function he(e){d=e}function ye(){d=null}function ge(e){C=e}function me(){C=null}function xe(e){C.__signals||(C.__signals=new Set),C.__signals.add(e)}function ve(e){d.__signals||(d.__signals=new Set),d.__signals.add(e)}function be(e){if(typeof e!="function")throw new Error("reactive takes a render function as the argument");ge(e);const t=e();if(me(),!A(t)&&N(t)&&!t.type&&!t.props&&!t.props?.children)throw new Error("Reactive value must be primitive or functional component, got: "+typeof t);return t}function et(e){if(typeof e!="function")throw new Error("reactive takes a render function as the argument");ge(e);const t=e();return me(),t}function tt(e){if(typeof e!="function")throw new Error("createEffect takes a effect function as the argument");Me(e),Fe()||we(e)}function we(e,t){if(typeof e!="function")return;he(e);const n=e();d.__signals&&typeof n=="function"&&(d.__cleanup=n),!d.__signals&&n&&typeof n=="function"&&(t?ct(n,t):Se(n)),ye()}function nt(e){if(typeof e!="function")throw new Error("computed takes a function as the argument");let t=Fe()!==null;he(()=>{if(t){t=!1;return}r.update(e())}),Me(d);const n=e(),r=L(n);return ye(),{get value(){return r.value}}}function rt(e){if(typeof e!="function")throw new Error("createPromise takes a function as the argument");const t=e();if(!(t instanceof Promise))throw new Error("createPromise takes a function that returns a promise");const n=L({status:"pending",data:null,error:null});return t.then(r=>{n.update(o=>{o.data=r,o.status="resolved"})}).catch(r=>{n.update(o=>{o.error=r,o.status="rejected"})}),{get value(){return n.value}}}class ne{constructor(t){this.current=t}}function ot(){return new ne(null)}class R{constructor(t){this.isNotified=!1,this._val=t,this.deps=new Set}notify(){this.isNotified||(this.deps.size!==0&&(this.isNotified=!0),this.deps.forEach(t=>{Ye(()=>(this.isNotified=!1,t))}))}removeDep(t){this.deps.delete(t)}clearDeps(){this.deps.clear()}get value(){return d&&(this.deps.add(d),ve(this)),C&&(this.deps.add(C),xe(this)),this._val}}class it extends R{constructor(t){super(t)}update(t){if(typeof t=="function"){const n=t(this._val);if(n===this._val)return;this._val=n,this.notify()}else{if(t===this._val)return;this._val=t,this.notify()}}}class st extends R{constructor(t){super(t),this.updateCalled=!1,this._val=this.createProxy(t)}createProxy(t){return de(t,this)}update(t){if(this.updateCalled=!0,typeof t=="function")t(this._val);else{if(t===this._val)return;this._val=this.createProxy(t),this.notify()}this.updateCalled=!1}}class lt extends R{constructor(t){N(t),super(t),this.updateCalled=!1,this._val=this.createProxy(t)}createInternalArrayProxy(t){return de(t,this)}createProxy(t){return new Proxy(t,{get:(n,r)=>{const o=n[r];return Array.isArray(o)?(n[r]=this.createInternalArrayProxy(o),n[r]):o},set:(n,r,o)=>(this.updateCalled,typeof o=="function"?!1:(typeof o=="object"&&o!==null&&(o=this.createProxy(o)),o===n[r]||(n[r]=o,this.notify()),!0)),deleteProperty:(n,r)=>{const o=delete n[r];return this.notify(),o}})}update(t){if(this.updateCalled=!0,typeof t=="function")t(this._val);else{if(N(t),t===this._val)return;this._val=this.createProxy(t),this.notify()}this.updateCalled=!1}}function L(e){if(typeof e=="object"&&e!==null){if(Array.isArray(e)){const t=new st(e);return V(t),J(t)}else if(N(e)){const t=new lt(e);return V(t),J(t)}}else if(A(e)){const t=new it(e);return V(t),J(t)}}let f=null,u=new WeakMap;function _e(e){f=e}function Ee(){f=null}function Fe(){return f}function z(){return{signals:new Set,cleanup:[],effects:new Set}}function Ce(e){if(u.has(e)){const t=u.get(e);for(const n of t.effects)we(n,e)}}function Se(e){if(f)if(u.has(f))u.get(f).cleanup.push(e);else{let t=z();t.cleanup.push(e),u.set(f,t)}}function ct(e,t){if(t)if(u.has(t))u.get(t).cleanup.push(e);else{let n=z();n.cleanup.push(e),u.set(t,n)}}function Me(e){if(f)if(u.has(f))u.get(f).effects.add(e);else{let t=z();t.effects.add(e),u.set(f,t)}}function V(e){if(f)if(u.has(f))u.get(f).signals.add(e);else{let t=z();t.signals.add(e),u.set(f,t)}}function at(e,t){const n=u.get(e);if(n){if(n.cleanup)for(const r of n.cleanup)r();n.cleanup=[];for(const r of n.effects){if(r.__cleanup&&r.__cleanup(),r.__signals)for(const o of r.__signals)o.removeDep(r);delete r.__signals,delete r.__cleanup}n.signals.forEach(r=>r.clearDeps()),n.signals.clear()}u.delete(e)}function ut(e){let t=null;const n=(r,o)=>{t?(r.update(!1),o.update(null)):e().then(i=>{if(i.default){if(typeof i.default!="function")throw new Error("Lazy-loaded component must be a functional component");t=i.default,r.update(!1),o.update(null)}else o.update(new Error("No default export found from lazy-loaded module"))}).catch(i=>{o.update(i),r.update(!1)})};return r=>{const o=L(!0),i=L(null);return n(o,i),B("FRAGMENT",null,()=>o.value?r.fallback:i.value!==null?r.errorFallback?typeof r.errorFallback=="function"?r.errorFallback(i.value):r.errorFallback:"Unknown error occurred while lazy loading component, use errorFallback prop to override":t&&B(t,{...r}))}}exports.cleanUp=Se;exports.computed=nt;exports.createEffect=tt;exports.createElement=B;exports.createPromise=rt;exports.createRef=ot;exports.createSignal=L;exports.lazy=ut;exports.render=We; diff --git a/build/refract.cjs.js.map b/build/refract.cjs.js.map deleted file mode 100644 index cc49275..0000000 --- a/build/refract.cjs.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"refract.cjs.js","sources":["../src/utils/general.ts","../src/rendering/constants.ts","../src/lib.ts","../src/rendering/props.ts","../src/signals/signal.ts","../src/signals/batch.ts","../src/rendering/createElements.ts","../src/rendering/render.ts","../src/rendering/functionalComponents.ts","../src/lazy/Lazyloading.tsx"],"sourcesContent":["export function isPlainObject(variable: any) {\r\n return (\r\n typeof variable === \"object\" && // Must be an object\r\n variable !== null && // Cannot be null\r\n !Array.isArray(variable) && // Cannot be an array\r\n Object.prototype.toString.call(variable) === \"[object Object]\" // Must be a plain object\r\n );\r\n}\r\nexport function isPrimitive(val: any) {\r\n return (\r\n [\"boolean\", \"string\", \"number\", \"undefined\"].includes(typeof val) ||\r\n val === null ||\r\n val instanceof Error\r\n );\r\n}\r\n\r\nexport function swap(arr: any[], i: number, j: number) {\r\n const temp = arr[i];\r\n arr[i] = arr[j];\r\n arr[j] = temp;\r\n}\r\n","export const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\r\nexport const SVG_TAGS = new Set([\r\n \"svg\",\r\n \"a\",\r\n \"circle\",\r\n \"clipPath\",\r\n \"defs\",\r\n \"desc\",\r\n \"ellipse\",\r\n \"feBlend\",\r\n \"feColorMatrix\",\r\n \"feComponentTransfer\",\r\n \"feComposite\",\r\n \"feConvolveMatrix\",\r\n \"feDiffuseLighting\",\r\n \"feDisplacementMap\",\r\n \"feDistantLight\",\r\n \"feDropShadow\",\r\n \"feFlood\",\r\n \"feFuncA\",\r\n \"feFuncB\",\r\n \"feFuncG\",\r\n \"feFuncR\",\r\n \"feGaussianBlur\",\r\n \"feImage\",\r\n \"feMerge\",\r\n \"feMergeNode\",\r\n \"feMorphology\",\r\n \"feOffset\",\r\n \"fePointLight\",\r\n \"feSpecularLighting\",\r\n \"feSpotLight\",\r\n \"feTile\",\r\n \"feTurbulence\",\r\n \"filter\",\r\n \"foreignObject\",\r\n \"g\",\r\n \"image\",\r\n \"line\",\r\n \"linearGradient\",\r\n \"marker\",\r\n \"mask\",\r\n \"metadata\",\r\n \"path\",\r\n \"pattern\",\r\n \"polygon\",\r\n \"polyline\",\r\n \"radialGradient\",\r\n \"rect\",\r\n \"script\",\r\n \"set\",\r\n \"stop\",\r\n \"style\",\r\n \"switch\",\r\n \"symbol\",\r\n \"text\",\r\n \"textPath\",\r\n \"title\",\r\n \"tspan\",\r\n \"use\",\r\n \"view\",\r\n]);\r\nexport const MATH_TAGS = new Set([\r\n \"math\",\r\n \"maction\",\r\n \"maligngroup\",\r\n \"malignmark\",\r\n \"menclose\",\r\n \"merror\",\r\n \"mfenced\",\r\n \"mfrac\",\r\n \"mglyph\",\r\n \"mi\",\r\n \"mlabeledtr\",\r\n \"mlongdiv\",\r\n \"mmultiscripts\",\r\n \"mn\",\r\n \"mo\",\r\n \"mover\",\r\n \"mpadded\",\r\n \"mphantom\",\r\n \"mroot\",\r\n \"mrow\",\r\n \"ms\",\r\n \"mscarries\",\r\n \"mscarry\",\r\n \"msgroup\",\r\n \"msline\",\r\n \"mspace\",\r\n \"msqrt\",\r\n \"msrow\",\r\n \"mstack\",\r\n \"mstyle\",\r\n \"msub\",\r\n \"msup\",\r\n \"msubsup\",\r\n \"mtable\",\r\n \"mtd\",\r\n \"mtext\",\r\n \"mtr\",\r\n \"munder\",\r\n \"munderover\",\r\n]);\r\n\r\nexport const MATH_NAMESPACE = \"http://www.w3.org/1998/Math/MathML\";\r\n\r\nexport const CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\r\n","import { isPlainObject } from \"./utils/general\";\r\nexport const IS_NON_DIMENSIONAL =\r\n /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\r\n\r\nexport function styleObjectToString(\r\n style: Record\r\n): string {\r\n const newStyles: string[] = [];\r\n\r\n for (const key in style) {\r\n const value = style[key];\r\n const cssKey = key.replace(/([A-Z])/g, \"-$1\").toLowerCase(); // CamelCase to kebab-case\r\n\r\n if (typeof value != \"number\" || IS_NON_DIMENSIONAL.test(cssKey)) {\r\n newStyles.push(`${cssKey}: ${value};`); // Convert numbers to strings with px suffix\r\n } else {\r\n newStyles.push(`${cssKey}: ${value}px;`); // Convert numbers to strings with px suffix\r\n }\r\n }\r\n return newStyles.join(\" \");\r\n}\r\n\r\nexport function preprocessStyle(\r\n style: Record\r\n): Record {\r\n const processedStyle: Record = {};\r\n\r\n for (const key in style) {\r\n const value = style[key];\r\n // Handle nested styles\r\n if (typeof value === \"object\" && value !== null) {\r\n console.warn(`Nested styles not allowed for ${key}`);\r\n continue; // Skip nested styles\r\n }\r\n\r\n // Remove falsy values\r\n if (\r\n value === null ||\r\n value === undefined ||\r\n value === false ||\r\n value === \"\"\r\n ) {\r\n continue;\r\n }\r\n\r\n // Otherwise, add to processed style\r\n processedStyle[key] = value;\r\n }\r\n\r\n return processedStyle;\r\n}\r\n\r\nexport function isValidStyle(style: any) {\r\n return isPlainObject(style) || typeof style === \"string\";\r\n}\r\n\r\nexport function applyMoves(\r\n arr: T[],\r\n moves: Record\r\n): T[] {\r\n const n = arr.length;\r\n // Create an array for the final result (we use undefined as a marker)\r\n const result: (T | undefined)[] = new Array(n).fill(undefined);\r\n // Keep track of which indices in the original array are moved.\r\n const movedFrom = new Set();\r\n\r\n // First, place all moved elements at their target positions.\r\n // (For a swap both targets will be filled by the respective moves.)\r\n for (const key in moves) {\r\n const { from, to } = moves[key];\r\n // You can optionally ignore moves that are no-ops (from === to)\r\n if (from === to) continue;\r\n result[to] = arr[from];\r\n movedFrom.add(from);\r\n }\r\n\r\n // Next, fill in the \"gaps\" with the unmoved elements,\r\n // preserving their original order.\r\n let fillIndex = 0; // current position in `result` to fill\r\n for (let i = 0; i < n; i++) {\r\n // Skip any element that was moved.\r\n if (movedFrom.has(i)) continue;\r\n\r\n // Advance fillIndex until we find an empty slot in result.\r\n while (fillIndex < n && result[fillIndex] !== undefined) {\r\n fillIndex++;\r\n }\r\n if (fillIndex < n) {\r\n result[fillIndex] = arr[i];\r\n fillIndex++;\r\n }\r\n }\r\n\r\n return result as T[];\r\n}\r\n\r\n/**\r\n * Computes the indices of the longest increasing subsequence in the given array.\r\n * @param arr - An array of numbers.\r\n * @returns An array of indices representing the longest increasing subsequence.\r\n *\r\n * Time Complexity: O(n log n)\r\n */\r\nexport function longestIncreasingSubsequenceIndices(arr: number[]): number[] {\r\n const n = arr.length;\r\n const predecessors = new Array(n).fill(-1); // Track the previous index for each element in the subsequence.\r\n const lisIndices: number[] = []; // Stores indices of the smallest tail for all increasing subsequences of each length.\r\n\r\n for (let i = 0; i < n; i++) {\r\n const x = arr[i];\r\n\r\n // Binary search for the insertion point in lisIndices.\r\n let low = 0;\r\n let high = lisIndices.length;\r\n while (low < high) {\r\n const mid = Math.floor((low + high) / 2);\r\n if (arr[lisIndices[mid]] < x) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n\r\n // If low is at the end, extend lisIndices; otherwise, update the tail value.\r\n if (low === lisIndices.length) {\r\n lisIndices.push(i);\r\n } else {\r\n lisIndices[low] = i;\r\n }\r\n\r\n // Set the predecessor of arr[i] (if low is not the start of a subsequence).\r\n predecessors[i] = low > 0 ? lisIndices[low - 1] : -1;\r\n }\r\n\r\n // Reconstruct the longest increasing subsequence using the predecessors.\r\n const lis: number[] = [];\r\n let k = lisIndices.length > 0 ? lisIndices[lisIndices.length - 1] : -1;\r\n for (let i = lisIndices.length - 1; i >= 0; i--) {\r\n lis[i] = k;\r\n k = predecessors[k];\r\n }\r\n return lis;\r\n}\r\n","import { isValidStyle, preprocessStyle, styleObjectToString } from \"../lib\";\r\nimport { setReactiveAttributes } from \"../signals/batch\";\r\nimport { reactiveAttribute } from \"../signals/signal\";\r\nimport { SVG_NAMESPACE } from \"./constants\";\r\n\r\nexport function setStyle(\r\n style: Record | string,\r\n dom: HTMLElement\r\n) {\r\n if (!isValidStyle(style))\r\n throw new Error(\"Style attribute must be a plain object or a string\");\r\n\r\n if (typeof style === \"string\") {\r\n dom.setAttribute(\"style\", style);\r\n } else {\r\n const processedStyle = preprocessStyle(style);\r\n\r\n dom.setAttribute(\"style\", styleObjectToString(processedStyle));\r\n }\r\n}\r\n\r\n// handles setting the reactive attributes returned from a reactiveFunction\r\nexport function setReactiveAttribute(\r\n reactiveFunction: any,\r\n name: string,\r\n dom: HTMLElement,\r\n namespace?: string\r\n) {\r\n reactiveFunction.__propName = name;\r\n // registers the function in corresponding signal\r\n const val = reactiveAttribute(reactiveFunction);\r\n if (val === null || val === undefined || val === false) {\r\n return;\r\n }\r\n\r\n setAttribute(name, val, dom, namespace);\r\n // track this using signals if the function depended on any signal\r\n if (reactiveFunction.__signals)\r\n setReactiveAttributes(reactiveFunction, dom);\r\n}\r\n\r\nconst CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\r\n\r\nexport function setAttribute(\r\n name: string,\r\n value: any,\r\n dom: HTMLElement,\r\n namespace?: string\r\n) {\r\n if (name == \"style\") {\r\n setStyle(value, dom);\r\n return;\r\n }\r\n if (name[0] === \"o\" && name[1] === \"n\" && typeof value === \"function\") {\r\n const useCapture = name != (name = name.replace(CAPTURE_REGEX, \"$1\"));\r\n\r\n if (\r\n name.toLowerCase() in dom ||\r\n name == \"onFocusOut\" ||\r\n name == \"onFocusIn\" ||\r\n name === \"onGotPointerCapture\" ||\r\n name === \"onLostPointerCapture\"\r\n )\r\n name = name.toLowerCase().slice(2);\r\n else name = name.slice(2);\r\n // handle eventListeners\r\n dom.addEventListener(name, value, useCapture);\r\n return;\r\n }\r\n\r\n if (namespace === SVG_NAMESPACE) {\r\n name = name.replace(/xlink(H|:h)/, \"h\").replace(/sName$/, \"s\");\r\n }\r\n // For certain properties that exist on the dom element,\r\n // attempt to set them directly.\r\n else if (\r\n name !== \"width\" &&\r\n name !== \"height\" &&\r\n name !== \"href\" &&\r\n name !== \"list\" &&\r\n name !== \"form\" &&\r\n name !== \"tabIndex\" &&\r\n name !== \"download\" &&\r\n name !== \"rowSpan\" &&\r\n name !== \"colSpan\" &&\r\n name !== \"role\" &&\r\n name !== \"popover\" &&\r\n name in dom\r\n ) {\r\n try {\r\n // Set the property directly on the DOM element.\r\n if (name === \"value\" && dom.tagName === \"SELECT\") {\r\n setTimeout(() => {\r\n dom[name] = value == null ? \"\" : value;\r\n });\r\n } else {\r\n dom[name] = value == null ? \"\" : value;\r\n }\r\n // console.log(dom[name], dom);\r\n\r\n // We simply return after setting the property.\r\n return;\r\n } catch (e) {\r\n // If setting the property fails, fall through to update attributes.\r\n }\r\n }\r\n\r\n if (value != null && (value !== false || name[4] === \"-\")) {\r\n // For most attributes, if the value is valid, set the attribute.\r\n // Special case: for \"popover\", if value is true, set attribute to an empty string.\r\n\r\n dom.setAttribute(\r\n name,\r\n name === \"popover\" && value === true ? \"\" : value\r\n );\r\n }\r\n}\r\n","import {\r\n addEffect,\r\n addSignal,\r\n cleanUp,\r\n cleanUpWFiber,\r\n getCurrentFC,\r\n} from \"../rendering/functionalComponents\";\r\nimport { Fiber } from \"../types\";\r\nimport { isPlainObject, isPrimitive } from \"../utils/general\";\r\nimport { batchUpdate } from \"./batch\";\r\n\r\nlet currentReactiveFunction: any = null;\r\nlet currentEffect: any = null;\r\n\r\nfunction addSignalToReactiveFunction(signal: any) {\r\n if (!currentReactiveFunction.__signals) {\r\n currentReactiveFunction.__signals = new Set();\r\n }\r\n currentReactiveFunction.__signals.add(signal);\r\n}\r\nfunction addSignalToEffect(signal: any) {\r\n if (!currentEffect.__signals) currentEffect.__signals = new Set();\r\n currentEffect.__signals.add(signal);\r\n}\r\n\r\nexport function reactive(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"reactive takes a render function as the argument\");\r\n\r\n currentReactiveFunction = fn;\r\n const retVal = fn();\r\n currentReactiveFunction = null;\r\n if (\r\n !isPrimitive(retVal) &&\r\n isPlainObject(retVal) &&\r\n !retVal.type &&\r\n !retVal.props &&\r\n !retVal.props?.children\r\n )\r\n throw new Error(\r\n \"Reactive value must be primitive or functional component, got: \" +\r\n typeof retVal\r\n );\r\n return retVal;\r\n}\r\nexport function reactiveAttribute(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"reactive takes a render function as the argument\");\r\n\r\n currentReactiveFunction = fn;\r\n const retVal = fn();\r\n currentReactiveFunction = null;\r\n\r\n return retVal;\r\n}\r\nexport function createEffect(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"createEffect takes a effect function as the argument\");\r\n\r\n addEffect(fn);\r\n if (!getCurrentFC()) runEffect(fn);\r\n}\r\n\r\nexport function runEffect(effect: Function, fiber?: Fiber) {\r\n if (typeof effect !== \"function\") return;\r\n\r\n currentEffect = effect;\r\n\r\n const effectCleanup = effect();\r\n\r\n if (currentEffect.__signals && typeof effectCleanup === \"function\") {\r\n currentEffect.__cleanup = effectCleanup;\r\n }\r\n\r\n if (\r\n !currentEffect.__signals &&\r\n effectCleanup &&\r\n typeof effectCleanup === \"function\"\r\n ) {\r\n // which means this effect does not have any signals associated with so its just a cleanup function that we need to call when the component unmounts\r\n if (!fiber) {\r\n cleanUp(effectCleanup);\r\n } else {\r\n cleanUpWFiber(effectCleanup, fiber);\r\n }\r\n }\r\n\r\n currentEffect = null;\r\n}\r\n\r\nfunction computed>(\r\n fn: () => T\r\n) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"computed takes a function as the argument\");\r\n\r\n let firstRun = getCurrentFC() !== null;\r\n currentEffect = () => {\r\n if (firstRun) {\r\n firstRun = false;\r\n return;\r\n }\r\n signal.update(fn());\r\n };\r\n\r\n addEffect(currentEffect);\r\n\r\n const val = fn();\r\n\r\n // @ts-expect-error - Type assertion for signal\r\n const signal = createSignal(val);\r\n\r\n currentEffect = null;\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n };\r\n}\r\n\r\ntype PromiseOverload =\r\n | { status: \"pending\"; data: null; error: null }\r\n | { status: \"resolved\"; data: T; error: null }\r\n | { status: \"rejected\"; data: null; error: Error };\r\n\r\nexport function createPromise(fn: () => Promise) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"createPromise takes a function as the argument\");\r\n const promise = fn();\r\n\r\n if (!(promise instanceof Promise)) {\r\n throw new Error(\r\n \"createPromise takes a function that returns a promise\"\r\n );\r\n }\r\n const triggerSignal = createSignal>({\r\n status: \"pending\",\r\n data: null,\r\n error: null,\r\n });\r\n\r\n promise\r\n .then((val) => {\r\n triggerSignal.update((prev) => {\r\n prev.data = val;\r\n prev.status = \"resolved\";\r\n });\r\n })\r\n .catch((err) => {\r\n triggerSignal.update((prev) => {\r\n prev.error = err;\r\n prev.status = \"rejected\";\r\n });\r\n });\r\n\r\n return {\r\n get value() {\r\n return triggerSignal.value;\r\n },\r\n };\r\n}\r\n\r\nexport class Ref {\r\n current: T | null;\r\n constructor(val: T | null) {\r\n this.current = val;\r\n }\r\n}\r\n\r\nexport function createRef() {\r\n const ref = new Ref(null);\r\n return ref;\r\n}\r\n\r\n// const NonMutatingArrayMethods = [\r\n// \"constructor\",\r\n// \"concat\",\r\n// \"every\",\r\n// \"filter\",\r\n// \"find\",\r\n// \"findIndex\",\r\n// \"flat\",\r\n// \"flatMap\",\r\n// \"forEach\",\r\n// \"includes\",\r\n// \"indexOf\",\r\n// \"join\",\r\n// \"map\",\r\n// \"reduce\",\r\n// \"reduceRight\",\r\n// \"slice\",\r\n// \"some\",\r\n// \"toLocaleString\",\r\n// \"toString\",\r\n// ];\r\nconst MutatingMethods = [\r\n \"push\",\r\n \"pop\",\r\n \"unshift\",\r\n \"shift\",\r\n \"splice\",\r\n \"fill\",\r\n \"copyWithin\",\r\n \"sort\",\r\n \"reverse\",\r\n];\r\n\r\ntype DeepReadonly = {\r\n readonly [K in keyof T]: T[K] extends object ? DeepReadonly : T[K];\r\n};\r\n\r\n/**\r\n *\r\n * Base class for signals.\r\n */\r\nexport abstract class BaseSignal {\r\n protected _val: T;\r\n protected deps: Set;\r\n protected isNotified: boolean = false;\r\n\r\n constructor(val: T) {\r\n this._val = val;\r\n this.deps = new Set();\r\n }\r\n\r\n protected notify() {\r\n if (this.isNotified) return;\r\n\r\n if (this.deps.size !== 0) this.isNotified = true;\r\n\r\n this.deps.forEach((dep) => {\r\n batchUpdate(() => {\r\n // Reset the flag before calling the dependency\r\n this.isNotified = false;\r\n return dep;\r\n });\r\n });\r\n }\r\n\r\n public removeDep(fn: Function) {\r\n this.deps.delete(fn);\r\n }\r\n\r\n public clearDeps() {\r\n this.deps.clear();\r\n }\r\n\r\n abstract get value(): T | DeepReadonly;\r\n\r\n abstract update(val: T | ((prev: T) => T)): void;\r\n}\r\n\r\ntype NormalSignal = boolean | string | number | undefined | null | Error;\r\n/**\r\n * Signal for primitive types.\r\n */\r\nexport class PrimitiveSignal extends BaseSignal {\r\n constructor(val: T) {\r\n if (!isPrimitive(val)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n super(val);\r\n }\r\n\r\n get value(): T {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n\r\n addSignalToReactiveFunction(this);\r\n }\r\n // (Optional) debug logging:\r\n // console.log(this.deps);\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => T)) {\r\n if (typeof val === \"function\") {\r\n const newVal = val(this._val);\r\n if (!isPrimitive(newVal)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n if (newVal === this._val) return;\r\n this._val = newVal;\r\n this.notify();\r\n } else {\r\n if (!isPrimitive(val)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n\r\n this._val = val;\r\n\r\n this.notify();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Signal for arrays.\r\n */\r\nexport class ArraySignal extends BaseSignal {\r\n private updateCalled: boolean = false;\r\n\r\n constructor(val: T) {\r\n if (!Array.isArray(val)) {\r\n throw new Error(\r\n \"Invalid type for ArraySignal; value must be an array\"\r\n );\r\n }\r\n // Call the base constructor with a proxy-wrapped array.\r\n super(val);\r\n this._val = this.createProxy(val);\r\n }\r\n\r\n private createProxy(val: T): T {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n // If a function is accessed, wrap it to trigger notifications on mutation.\r\n\r\n if (typeof value === \"function\") {\r\n if (\r\n MutatingMethods.includes(String(prop)) &&\r\n !this.updateCalled\r\n ) {\r\n throw new Error(\r\n \"Cannot set a value on an array signal, use the update method for updating the array.\"\r\n );\r\n }\r\n\r\n return (...args: any[]) => {\r\n const result = value.apply(target, args);\r\n // Notify if the method is mutating.\r\n if (MutatingMethods.includes(String(prop))) {\r\n this.notify();\r\n }\r\n return result;\r\n };\r\n }\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an array signal, use the update method for updating the array.\"\r\n );\r\n }\r\n target[prop as any] = newValue;\r\n this.notify();\r\n return true;\r\n },\r\n });\r\n }\r\n\r\n get value(): DeepReadonly {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n addSignalToReactiveFunction(this);\r\n }\r\n\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => void)) {\r\n this.updateCalled = true;\r\n if (typeof val === \"function\") {\r\n val(this._val);\r\n } else {\r\n if (!Array.isArray(val)) {\r\n throw new Error(\r\n \"Invalid type for ArraySignal; value must be an array\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n\r\n this._val = this.createProxy(val);\r\n\r\n this.notify();\r\n }\r\n this.updateCalled = false;\r\n }\r\n}\r\n\r\n/**\r\n * Signal for plain objects.\r\n */\r\nexport class ObjectSignal> extends BaseSignal {\r\n private updateCalled: boolean = false;\r\n constructor(val: T) {\r\n if (!isPlainObject(val)) {\r\n throw new Error(\r\n \"Invalid type for ObjectSignal; value must be a plain object\"\r\n );\r\n }\r\n super(val);\r\n this._val = this.createProxy(val);\r\n }\r\n private createInternalArrayProxy(val: A): A {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n // If a function is accessed, wrap it to trigger notifications on mutation.\r\n if (typeof value === \"function\") {\r\n if (\r\n !this.updateCalled &&\r\n MutatingMethods.includes(String(prop))\r\n ) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n\r\n return (...args: any[]) => {\r\n const result = value.apply(target, args);\r\n // Notify if the method is mutating.\r\n if (MutatingMethods.includes(String(prop))) {\r\n this.notify();\r\n }\r\n return result;\r\n };\r\n }\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n target[prop as any] = newValue;\r\n this.notify();\r\n return true;\r\n },\r\n });\r\n }\r\n private createProxy(val: T): T {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n if (Array.isArray(value)) {\r\n // @ts-expect-error\r\n target[prop as any] =\r\n this.createInternalArrayProxy(value);\r\n\r\n return target[prop as any];\r\n }\r\n // console.log(\"get\", target, prop, value);\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n // Do not allow functions to be set as values.\r\n if (typeof newValue === \"function\") return false;\r\n // For nested objects, wrap them as well.\r\n if (typeof newValue === \"object\" && newValue !== null) {\r\n newValue = this.createProxy(newValue);\r\n }\r\n if (newValue === target[prop as any]) return true;\r\n\r\n // @ts-expect-error\r\n target[prop as any] = newValue;\r\n\r\n this.notify();\r\n\r\n return true;\r\n },\r\n deleteProperty: (target, prop) => {\r\n const result = delete target[prop as any];\r\n this.notify();\r\n return result;\r\n },\r\n });\r\n }\r\n\r\n get value(): DeepReadonly {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n addSignalToReactiveFunction(this);\r\n }\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => void)) {\r\n this.updateCalled = true;\r\n if (typeof val === \"function\") {\r\n val(this._val);\r\n } else {\r\n if (!isPlainObject(val)) {\r\n throw new Error(\r\n \"Invalid type for ObjectSignal; value must be a plain object\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n this._val = this.createProxy(val);\r\n this.notify();\r\n }\r\n this.updateCalled = false;\r\n }\r\n}\r\n\r\nexport interface PublicSignal {\r\n readonly value: DeepReadonly;\r\n update(val: T | ((prev: T) => T)): void;\r\n}\r\n\r\nexport interface PublicArraySignal extends PublicSignal {\r\n update(val: T | ((prev: T) => void)): void; // Mutation allowed\r\n}\r\n\r\nexport interface PublicObjectSignal>\r\n extends PublicSignal {\r\n update(val: T | ((prev: T) => void)): void; // Mutation allowed\r\n}\r\n/**\r\n * Overloaded factory function to create a signal.\r\n */\r\nfunction createSignal(val: T): PublicSignal;\r\nfunction createSignal(val: T): PublicArraySignal;\r\nfunction createSignal>(\r\n val: T\r\n): PublicObjectSignal;\r\n\r\nfunction createSignal>(\r\n val: T\r\n) {\r\n if (typeof val === \"function\") {\r\n throw new Error(\"Functions cannot be used as signal value\");\r\n }\r\n\r\n if (typeof val === \"object\" && val !== null) {\r\n if (Array.isArray(val)) {\r\n const signal = new ArraySignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else if (isPlainObject(val)) {\r\n const signal = new ObjectSignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else {\r\n throw new Error(\r\n \"Invalid type for signal initialization: \" + typeof val\r\n );\r\n }\r\n } else if (isPrimitive(val)) {\r\n const signal = new PrimitiveSignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else {\r\n throw new Error(\r\n \"Invalid type for signal initialization: \" + typeof val\r\n );\r\n }\r\n}\r\n\r\nexport { computed, createSignal };\r\n","import { updateDomProp } from \"../rendering/createElements\";\r\nimport { updateFiber } from \"../rendering/render\";\r\nimport { Fiber } from \"../types\";\r\n\r\nlet scheduled = false;\r\nconst batch = new Set();\r\nconst depset = new Set();\r\nconst reactiveFiberMap = new WeakMap();\r\nconst domAttributeMap = new WeakMap();\r\n\r\nexport function batchUpdate(cb: Function) {\r\n batch.add(cb);\r\n if (!scheduled) {\r\n scheduled = true;\r\n queueMicrotask(() => {\r\n // console.log(\"Current batch has: \", batch.size, \" Functions\");\r\n\r\n batch.forEach((fn) => {\r\n const dep = fn();\r\n if (depset.has(dep)) {\r\n return;\r\n }\r\n depset.add(dep);\r\n // effects and reactive nodes\r\n if (dep.__cleanup && typeof dep.__cleanup === \"function\") {\r\n dep.__cleanup();\r\n dep.__cleanup = null;\r\n }\r\n\r\n const val = dep();\r\n\r\n if (typeof val === \"function\") {\r\n dep.__cleanup = val;\r\n }\r\n // console.log(dep, \"dep\");\r\n if (reactiveFiberMap.has(dep)) {\r\n // for updating reactive nodes\r\n const fiber = reactiveFiberMap.get(dep);\r\n if (fiber) {\r\n // console.log(\"dep\", fiber);\r\n updateFiber(fiber, val);\r\n }\r\n }\r\n if (domAttributeMap.has(dep)) {\r\n // for updating reactive nodes\r\n const dom = domAttributeMap.get(dep);\r\n if (dom && dep.__propName) {\r\n updateDomProp(dep.__propName, dom, val);\r\n }\r\n }\r\n });\r\n depset.clear();\r\n batch.clear();\r\n scheduled = false;\r\n });\r\n }\r\n}\r\n\r\nexport function setReactiveFunction(fn: Function, fiber: Fiber) {\r\n reactiveFiberMap.set(fn, fiber);\r\n}\r\nexport function setReactiveAttributes(fn: Function, dom: HTMLElement | Text) {\r\n // console.log(\"reactive attrubite\", fn);\r\n domAttributeMap.set(fn, dom);\r\n}\r\nexport function clearReactiveAttributes(fn: any) {\r\n domAttributeMap.delete(fn);\r\n\r\n const signals = fn.__signals;\r\n if (signals) {\r\n for (const signal of signals) {\r\n signal.removeDep(fn);\r\n }\r\n fn.__signals = null;\r\n }\r\n}\r\n\r\nexport function clearReactiveFunction(fn: Function) {\r\n reactiveFiberMap.delete(fn);\r\n // @ts-expect-error\r\n const signals = fn.__signals;\r\n if (signals) {\r\n for (const signal of signals) {\r\n signal.removeDep(fn);\r\n }\r\n // @ts-expect-error\r\n fn.__signals = null;\r\n }\r\n}\r\n\r\nexport function deleteReactiveFunction(fn: Function) {\r\n reactiveFiberMap.delete(fn);\r\n}\r\n","import { isValidStyle, preprocessStyle, styleObjectToString } from \"../lib\";\r\nimport { setReactiveAttributes } from \"../signals/batch\";\r\nimport { reactive, reactiveAttribute, Ref } from \"../signals/signal\";\r\nimport {\r\n Fiber,\r\n FiberChildren,\r\n NodeType,\r\n Props,\r\n RenderFunction,\r\n} from \"../types\";\r\nimport { isPrimitive } from \"../utils/general\";\r\nimport {\r\n MATH_NAMESPACE,\r\n MATH_TAGS,\r\n SVG_NAMESPACE,\r\n SVG_TAGS,\r\n} from \"./constants\";\r\nimport { setAttribute, setReactiveAttribute } from \"./props\";\r\nexport const FRAGMENT_SYMBOL = Symbol(\"FRAGMENT\");\r\n\r\nexport function createElement(\r\n type: any,\r\n props: object | null,\r\n ...children: any[]\r\n): Fiber | FiberChildren {\r\n if (type === \"FRAGMENT\") {\r\n const fragments = createChildren(children);\r\n fragments[FRAGMENT_SYMBOL] = true;\r\n\r\n return fragments;\r\n }\r\n // @ts-expect-error\r\n return {\r\n type,\r\n props: {\r\n ...props,\r\n children: createChildren(children),\r\n },\r\n };\r\n}\r\n\r\nexport function createChildren(children: FiberChildren): FiberChildren {\r\n // @ts-expect-error\r\n return children\r\n .map((child) => {\r\n if (typeof child === \"object\") {\r\n if (Array.isArray(child)) {\r\n return createChildren(child);\r\n }\r\n if (child === null) {\r\n return createTextChildren(\"\");\r\n }\r\n if (!child.type || !child.props) {\r\n throw new Error(\r\n \"Invalid type for a dom node, found \" + child\r\n );\r\n }\r\n return child;\r\n } else if (typeof child === \"function\") {\r\n const val = reactive(child);\r\n if (isPrimitive(val)) {\r\n return createSignalChild(\r\n \"TEXT_CHILD\",\r\n {\r\n nodeValue:\r\n val !== undefined &&\r\n val !== null &&\r\n val !== false\r\n ? String(val)\r\n : \"\",\r\n children: [],\r\n },\r\n child\r\n );\r\n } else if (Array.isArray(val)) {\r\n // console.log(createChildren(val));\r\n const isFragment = val[FRAGMENT_SYMBOL];\r\n return createSignalChild(\r\n \"FRAGMENT\",\r\n { children: isFragment ? val : createChildren(val) },\r\n child\r\n );\r\n } else if (!val.type || !val.props) {\r\n throw new Error(\r\n \"Invalid type for a dom node, found \" + val\r\n );\r\n }\r\n return createSignalChild(val.type, val.props, child);\r\n } else {\r\n return createTextChildren(child);\r\n }\r\n })\r\n .flat();\r\n}\r\n\r\nexport function createTextChildren(text: any): Fiber {\r\n // @ts-expect-error\r\n return {\r\n type: \"TEXT_CHILD\",\r\n props: {\r\n nodeValue:\r\n text !== null && text !== undefined && text !== false\r\n ? String(text)\r\n : \"\",\r\n children: [],\r\n },\r\n };\r\n}\r\n\r\nfunction createSignalChild(\r\n type: NodeType,\r\n props: Props,\r\n renderFunction: RenderFunction\r\n) {\r\n return {\r\n type,\r\n renderFunction,\r\n props,\r\n };\r\n}\r\n\r\nfunction isProperty(key: string) {\r\n return key !== \"children\" && key !== \"key\" && key !== \"ref\";\r\n}\r\n\r\nexport function createNode(element: Fiber): HTMLElement | Text {\r\n let namespace: string | null = null;\r\n\r\n if (SVG_TAGS.has(element.type as string)) namespace = SVG_NAMESPACE;\r\n else if (MATH_TAGS.has(element.type as string)) namespace = MATH_NAMESPACE;\r\n\r\n const dom =\r\n element.type === \"TEXT_CHILD\"\r\n ? document.createTextNode(\"\")\r\n : namespace\r\n ? document.createElementNS(\r\n namespace,\r\n // @ts-expect-error\r\n element.type,\r\n element.props.is && element.props\r\n )\r\n : // @ts-expect-error\r\n document.createElement(element.type);\r\n\r\n if (!element.props) return dom as HTMLElement | Text;\r\n\r\n if (\r\n element.props.ref &&\r\n element.props.ref instanceof Ref &&\r\n dom instanceof HTMLElement\r\n ) {\r\n element.props.ref.current = dom;\r\n }\r\n\r\n for (const name in element.props) {\r\n if (!isProperty(name)) {\r\n continue;\r\n }\r\n const value = element.props[name];\r\n if (typeof value === \"function\" && name[0] !== \"o\" && name[1] !== \"n\") {\r\n // @ts-expect-error\r\n setReactiveAttribute(value, name, dom, namespace);\r\n } else {\r\n // @ts-expect-error\r\n setAttribute(name, value, dom, namespace);\r\n }\r\n }\r\n\r\n return dom as HTMLElement | Text;\r\n}\r\n\r\nexport function updateDomProp(\r\n prop: string,\r\n dom: HTMLElement | Text,\r\n value: any\r\n) {\r\n if (value == null || prop === \"key\") return;\r\n\r\n // @ts-expect-error\r\n setAttribute(prop, value, dom);\r\n}\r\n\r\nexport const FRAGMENT = \"FRAGMENT\";\r\n","import {\r\n clearReactiveAttributes,\r\n clearReactiveFunction,\r\n setReactiveFunction,\r\n} from \"../signals/batch\";\r\nimport { BaseSignal, Ref } from \"../signals/signal\";\r\nimport { Fiber, FiberChildren } from \"../types\";\r\nimport { isPrimitive } from \"../utils/general\";\r\nimport { CAPTURE_REGEX } from \"./constants\";\r\nimport {\r\n FRAGMENT_SYMBOL,\r\n createChildren,\r\n createNode,\r\n createTextChildren,\r\n} from \"./createElements\";\r\nimport {\r\n cleanUpFC,\r\n clearCurrentFC,\r\n runAllEffects,\r\n setCurrentFC,\r\n} from \"./functionalComponents\";\r\n\r\nexport function render(element: Fiber, container: HTMLElement) {\r\n rootContainer = container;\r\n const fragment = document.createDocumentFragment();\r\n rootFragment = fragment;\r\n const rootFiber: Fiber = {\r\n type: \"div\",\r\n props: {\r\n children: [element],\r\n },\r\n // @ts-expect-error\r\n dom: fragment,\r\n };\r\n // console.log(element.type(element.props));\r\n element.parent = rootFiber;\r\n elements.push(element);\r\n requestIdleCallback(workLoop);\r\n\r\n // container.appendChild(fragment);\r\n}\r\n\r\nfunction commitRootFragment() {\r\n if (rootFragment && rootContainer) {\r\n rootContainer.appendChild(rootFragment);\r\n // const endTime = performance.now();\r\n // console.log(`Render time: ${endTime - startTime}ms`);\r\n }\r\n}\r\n\r\nlet elements: Fiber[] = [];\r\nlet rootContainer: HTMLElement | null = null;\r\nlet rootFragment: DocumentFragment | null = null;\r\n// let startTime = -1;\r\nlet effectQueue: Fiber[] = [];\r\n\r\nfunction processEffectQueue() {\r\n for (let i = 0; i < effectQueue.length; i++) {\r\n const fiber = effectQueue[i];\r\n runAllEffects(fiber);\r\n }\r\n effectQueue.length = 0;\r\n}\r\n\r\nfunction workLoop(deadline: IdleDeadline) {\r\n // if (startTime === -1) startTime = performance.now();\r\n\r\n processEffectQueue();\r\n let shouldYield = false;\r\n while (elements.length > 0 && !shouldYield) {\r\n const element = elements.pop();\r\n renderNode(element!);\r\n shouldYield = deadline.timeRemaining() < 1;\r\n }\r\n\r\n if (elements.length == 0) {\r\n commitRootFragment();\r\n\r\n processEffectQueue();\r\n return;\r\n }\r\n requestIdleCallback(workLoop);\r\n}\r\n\r\nfunction renderNode(fiber: Fiber) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n const isArray = !fiber.props.children[FRAGMENT_SYMBOL];\r\n let noKey = false;\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n fiber.props.children[i].parent = fiber;\r\n\r\n if (\r\n isArray &&\r\n fiber.props.children[i].props.key === undefined &&\r\n fiber.renderFunction\r\n ) {\r\n noKey = true;\r\n }\r\n\r\n elements.push(fiber.props.children[i]);\r\n }\r\n if (noKey) {\r\n console.error(\"Array children must have a key attribute\");\r\n }\r\n // console.log(fiber.props.children);\r\n } else if (typeof fiber.type === \"function\") {\r\n setCurrentFC(fiber);\r\n\r\n const children = fiber.type(fiber.props);\r\n clearCurrentFC();\r\n\r\n if (Array.isArray(children)) {\r\n // which means that the FC returned a fragment\r\n // console.log(children);\r\n for (let i = children.length - 1; i >= 0; i--) {\r\n children[i].parent = fiber;\r\n elements.push(children[i]);\r\n }\r\n fiber.props.children = children;\r\n } else {\r\n children.parent = fiber;\r\n fiber.props.children.push(children);\r\n elements.push(children);\r\n }\r\n // queue to run its effects\r\n effectQueue.push(fiber);\r\n } else {\r\n if (!fiber.dom) fiber.dom = createNode(fiber);\r\n let fiberParent: Fiber | undefined = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n if (fiberParent) {\r\n fiberParent.dom?.appendChild(fiber.dom);\r\n }\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n fiber.props.children[i].parent = fiber;\r\n elements.push(fiber.props.children[i]);\r\n }\r\n }\r\n // console.log(fiber);\r\n setRenderFunction(fiber);\r\n}\r\n\r\nfunction createFiber(fiber: Fiber) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n const isFragment = fiber.props.children[FRAGMENT_SYMBOL];\r\n if (isFragment) {\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n createFiber(child);\r\n }\r\n } else {\r\n let noKey = false;\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n if (child.props.key === undefined) {\r\n noKey = true;\r\n }\r\n createFiber(child);\r\n }\r\n if (noKey) {\r\n console.error(\"Array children must have a key attribute\");\r\n }\r\n }\r\n } else if (typeof fiber.type !== \"function\") {\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n createFiber(child);\r\n }\r\n }\r\n // console.log(fiber);\r\n setRenderFunction(fiber);\r\n}\r\nfunction commitFiber(\r\n fiber: Fiber,\r\n referenceNode?: Node,\r\n replace?: boolean,\r\n needCreation?: boolean,\r\n customParent?: Node\r\n) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n for (const child of fiber.props.children) {\r\n if (needCreation) child.parent = fiber;\r\n commitFiber(\r\n child,\r\n referenceNode,\r\n replace,\r\n needCreation,\r\n customParent\r\n );\r\n }\r\n } else if (typeof fiber.type === \"function\") {\r\n setCurrentFC(fiber);\r\n\r\n const children = fiber.type(fiber.props);\r\n clearCurrentFC();\r\n\r\n // console.log(\"commit FC\", children);\r\n if (Array.isArray(children)) {\r\n // which means that the FC returned a fragment\r\n // console.log(children);\r\n for (const child of children) {\r\n child.parent = fiber;\r\n commitFiber(child, referenceNode, replace, true, customParent);\r\n }\r\n fiber.props.children = children;\r\n } else {\r\n children.parent = fiber;\r\n fiber.props.children.push(children);\r\n commitFiber(children, referenceNode, replace, true, customParent);\r\n }\r\n // queue to run its effects at the end of current stack\r\n queueMicrotask(() => {\r\n runAllEffects(fiber);\r\n });\r\n } else {\r\n if (!fiber.dom) fiber.dom = createNode(fiber);\r\n\r\n if (referenceNode) {\r\n if (replace)\r\n referenceNode.parentElement?.replaceChild(\r\n fiber.dom,\r\n referenceNode\r\n );\r\n else\r\n referenceNode.parentElement?.insertBefore(\r\n fiber.dom,\r\n referenceNode\r\n );\r\n } else {\r\n let parentDom: Node | undefined = undefined;\r\n if (customParent) {\r\n parentDom = customParent;\r\n } else {\r\n let fiberParent: Fiber | undefined = fiber.parent;\r\n\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n parentDom = fiberParent?.dom;\r\n }\r\n parentDom?.appendChild(fiber.dom);\r\n }\r\n for (const child of fiber.props.children) {\r\n if (needCreation) child.parent = fiber;\r\n\r\n commitFiber(child, undefined, undefined, needCreation, fiber.dom);\r\n }\r\n }\r\n if (needCreation) {\r\n setRenderFunction(fiber);\r\n }\r\n}\r\n\r\nlet ToCommitDeletion = true;\r\n\r\nfunction commitDeletion(fiber: Fiber, toClearReactiveFunction?: boolean) {\r\n if (!fiber || !ToCommitDeletion) return;\r\n if (fiber.renderFunction) {\r\n if (toClearReactiveFunction)\r\n clearReactiveFunction(fiber.renderFunction);\r\n delete fiber.renderFunction;\r\n }\r\n if (fiber.dom) {\r\n for (const prop in fiber.props) {\r\n if (isEvent(prop)) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(CAPTURE_REGEX, \"$1\"));\r\n\r\n fiber.dom.removeEventListener(\r\n eventName,\r\n fiber.props[prop],\r\n useCapture\r\n );\r\n delete fiber.props[prop];\r\n } else if (typeof fiber.props[prop] === \"function\") {\r\n clearReactiveAttributes(fiber.props[prop]);\r\n } else if (prop === \"ref\" && fiber.props[prop] instanceof Ref) {\r\n fiber.props[prop].current = null;\r\n }\r\n }\r\n\r\n fiber.dom.remove();\r\n }\r\n if (typeof fiber.type === \"function\") {\r\n cleanUpFC(fiber, fiber.props);\r\n // @ts-expect-error\r\n delete fiber.type;\r\n }\r\n fiber.props.children.forEach((child) => commitDeletion(child, true));\r\n}\r\n\r\nfunction setRenderFunction(fiber: Fiber) {\r\n if (!fiber.renderFunction) return;\r\n setReactiveFunction(fiber.renderFunction, fiber);\r\n}\r\n\r\nexport function updateFiber(prevFiber: Fiber, newValue) {\r\n // console.log(\"Prev value\", prevFiber, newValue);\r\n // startTime = performance.now();\r\n if (isPrimitive(newValue)) {\r\n // console.log(fiber, newValue);\r\n const newFragment: Fiber = {\r\n ...createTextChildren(newValue),\r\n parent: prevFiber.parent,\r\n };\r\n createFiber(newFragment);\r\n // console.log(\"New Text Fiber\", newFragment);\r\n\r\n updateNode(prevFiber, newFragment);\r\n } else if (Array.isArray(newValue)) {\r\n const isFragment = newValue[FRAGMENT_SYMBOL];\r\n\r\n const newFragment: Fiber = {\r\n type: \"FRAGMENT\",\r\n props: {\r\n children: isFragment ? newValue : createChildren(newValue),\r\n },\r\n parent: prevFiber.parent,\r\n };\r\n\r\n createFiber(newFragment);\r\n updateNode(prevFiber, newFragment);\r\n } else {\r\n const newFragment = { ...newValue, parent: prevFiber.parent };\r\n createFiber(newFragment);\r\n // console.log(\"New Node Fiber\", newFragment);\r\n updateNode(prevFiber, newFragment);\r\n }\r\n // const endTime = performance.now();\r\n // console.log(\"Update Time:\", (endTime - startTime).toFixed(2), \"ms\");\r\n}\r\n\r\nfunction replaceRenderFunction(prev: Fiber, next: Fiber) {\r\n if (prev.renderFunction) {\r\n next.renderFunction = prev.renderFunction;\r\n // console.log(\"Replace render function\", prev, next);\r\n // deleteReactiveFunction(prev.renderFunction);\r\n setRenderFunction(next);\r\n }\r\n}\r\n\r\nfunction replaceChildFromParent(prev: Fiber, next: Fiber, index?: number) {\r\n if (index !== undefined) {\r\n prev.parent.props.children[index] = next;\r\n return;\r\n }\r\n prev.parent?.props.children.forEach((child, i) => {\r\n if (child === prev) {\r\n prev.parent.props.children[i] = next;\r\n }\r\n });\r\n}\r\n\r\nexport const isEvent = (key: string) =>\r\n key.startsWith(\"on\") || key == \"onFocusOut\" || key == \"onFocusIn\";\r\nexport const isProperty = (key: string) =>\r\n key !== \"children\" && !isEvent(key) && key !== \"key\" && key !== \"ref\";\r\nconst isNew = (prev: any, next: any, key: string) => prev[key] !== next[key];\r\nconst isGone = (prev: any, next: any, key: string) => !(key in next);\r\n\r\nfunction deepCompareFibers(fiberA: any, fiberB: any): boolean {\r\n // Fast path: identical references\r\n if (fiberA === fiberB) {\r\n return true;\r\n }\r\n\r\n // Compare the fiber types (e.g., function for FCs, string for DOM nodes)\r\n if (fiberA.type !== fiberB.type) {\r\n return false;\r\n }\r\n\r\n // Compare keys if they exist\r\n if (fiberA.props?.key !== fiberB.props?.key) {\r\n return false;\r\n }\r\n return deepEqual(fiberA.props, fiberB.props);\r\n}\r\n\r\nfunction deepEqual(objA: any, objB: any): boolean {\r\n if (objA === objB) {\r\n // console.log(\"Signal prop\");\r\n\r\n if (objA instanceof BaseSignal && objB instanceof BaseSignal)\r\n return deepEqual(objA.value, objB.value);\r\n if (Array.isArray(objA) && Array.isArray(objB)) {\r\n if (objA.length !== objB.length) return false;\r\n for (let i = 0; i < objA.length; i++) {\r\n if (!deepEqual(objA[i], objB[i])) return false;\r\n }\r\n }\r\n return true;\r\n } // Same reference or primitive value\r\n\r\n if (isPrimitive(objA) && isPrimitive(objB)) {\r\n return objA === objB; // One is not an object or is null\r\n }\r\n\r\n if (typeof objA !== typeof objB) return false;\r\n\r\n const keysA = Object.keys(objA);\r\n const keysB = Object.keys(objB);\r\n\r\n if (keysA.length !== keysB.length) return false; // Different number of keys\r\n\r\n for (let key of keysA) {\r\n if (key === \"children\") continue;\r\n if (!objB.hasOwnProperty(key)) return false; // Missing key in one of them\r\n if (!deepEqual(objA[key], objB[key])) return false; // Recurse for nested objects/arrays\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction findFirstDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n if (fiber.dom) return fiber.dom;\r\n\r\n for (const child of fiber.props.children) {\r\n const dom = findFirstDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\n// function findFirstChildDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n// if (!fiber) return;\r\n\r\n// for (const child of fiber.props.children) {\r\n// const dom = findFirstDom(child);\r\n// if (dom) return dom;\r\n// }\r\n// }\r\nfunction findLastDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n if (fiber.dom) return fiber.dom;\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n const child = fiber.props.children[i];\r\n const dom = findLastDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\nfunction findLastChildDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n const child = fiber.props.children[i];\r\n const dom = findLastDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\nfunction findParentFiberWithDom(fiber: Fiber): Fiber | undefined {\r\n if (!fiber) return;\r\n let fiberParent = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n return fiberParent;\r\n}\r\nfunction findNearestParentWithDom(fiber: Fiber): Fiber | undefined {\r\n if (!fiber) return;\r\n if (fiber.dom) return fiber;\r\n\r\n let fiberParent = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n return fiberParent;\r\n}\r\n\r\nfunction updateNode(\r\n prev: Fiber | undefined,\r\n next: Fiber | undefined,\r\n index?: number\r\n) {\r\n if (!prev && !next) return;\r\n\r\n if (prev && !next) {\r\n commitDeletion(prev, true);\r\n // console.log(\"to remove\", prev);\r\n prev.parent.props.children = prev.parent.props.children.filter(\r\n (child) => child !== prev\r\n );\r\n } else if (prev && next) {\r\n const prevProps = prev.props;\r\n const nextProps = next.props;\r\n if (prev.type === \"FRAGMENT\" || typeof prev.type === \"function\") {\r\n // PREV IS FRAGMENT\r\n if (next.type === \"FRAGMENT\" || typeof next.type === \"function\") {\r\n // console.log(\"Fragment-Fragment\", prev, next);\r\n if (\r\n typeof prev.type === typeof next.type &&\r\n typeof prev.type === \"function\"\r\n ) {\r\n const areSame = deepCompareFibers(prev, next);\r\n if (!areSame) {\r\n commitFiber(next, findFirstDom(prev), undefined, true);\r\n\r\n replaceRenderFunction(prev, next);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n }\r\n } else {\r\n // console.log(\"fragment-fragment\", { ...prev }, next);\r\n\r\n updateChildren(prev, next);\r\n }\r\n // replaceChildFromParent(prev, next);\r\n } else {\r\n next.parent = prev.parent;\r\n let firstChild: Fiber | undefined = prev.props.children[0];\r\n while (firstChild && !firstChild.dom)\r\n firstChild = firstChild.props.children[0];\r\n commitFiber(next, firstChild?.dom);\r\n\r\n replaceRenderFunction(prev, next);\r\n // removing all nodes of previous fragment\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n }\r\n } else {\r\n // PREV IS NODE\r\n\r\n const node = prev.dom;\r\n if (\r\n prev.type === \"TEXT_CHILD\" &&\r\n next.type === \"TEXT_CHILD\" &&\r\n !next.dom\r\n )\r\n next.dom = prev.dom;\r\n if (node === undefined) {\r\n // console.error(\"no node found\", prev, next);\r\n return;\r\n }\r\n // console.log(prev);\r\n if (next.type === \"FRAGMENT\" || typeof next.type === \"function\") {\r\n // console.log(\"Node-Fragment\");\r\n next.parent = prev.parent;\r\n replaceRenderFunction(prev, next);\r\n\r\n commitFiber(next, node);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n } else {\r\n // console.log(\"Node-Node\");\r\n // remove old properties and event listeners from NODE\r\n for (const prop in prevProps) {\r\n if (\r\n isProperty(prop) &&\r\n isGone(prevProps, nextProps, prop)\r\n ) {\r\n node[prop] = \"\";\r\n // console.log(\"property removed\", prop);\r\n } else if (\r\n isEvent(prop) &&\r\n (!(prop in nextProps) ||\r\n isNew(prevProps, nextProps, prop))\r\n ) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(\r\n CAPTURE_REGEX,\r\n \"$1\"\r\n ));\r\n\r\n node.removeEventListener(\r\n eventName,\r\n prevProps[prop],\r\n useCapture\r\n );\r\n // console.log(\"event listener removed\", prop);\r\n }\r\n }\r\n if (prev.type !== next.type) {\r\n // console.log(\"Different type\", prev, next);\r\n next.parent = prev.parent;\r\n\r\n replaceRenderFunction(prev, next);\r\n\r\n commitFiber(next, node, true);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n\r\n // console.log(prev.parent);\r\n } else {\r\n // add new properties\r\n // console.log(\"same type\", prev, next);\r\n\r\n for (const prop in nextProps) {\r\n if (\r\n isProperty(prop) &&\r\n isNew(prevProps, nextProps, prop)\r\n ) {\r\n node[prop] = nextProps[prop];\r\n // console.log(\r\n // \"property added\",\r\n // prop,\r\n // nextProps[prop]\r\n // );\r\n prevProps[prop] = nextProps[prop];\r\n } else if (\r\n isEvent(prop) &&\r\n isNew(prevProps, nextProps, prop)\r\n ) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(\r\n CAPTURE_REGEX,\r\n \"$1\"\r\n ));\r\n node.addEventListener(\r\n eventName,\r\n nextProps[prop],\r\n useCapture\r\n );\r\n prevProps[prop] = nextProps[prop];\r\n }\r\n }\r\n updateChildren(prev, next);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction reconcileList(prev: Fiber, next: Fiber) {\r\n const oldFibers = prev.props.children;\r\n const newFibers = next.props.children;\r\n\r\n // Create a map from key to fiber for oldFibers.\r\n const oldMap: Record = {};\r\n for (let i = 0; i < oldFibers.length; i++) {\r\n const key = oldFibers[i].props.key;\r\n if (\r\n key === null ||\r\n key === undefined ||\r\n oldMap.hasOwnProperty(String(key))\r\n ) {\r\n // If any fiber is missing a key, we cannot reconcile.\r\n // oldFibers[i].props.key =\r\n return false;\r\n }\r\n oldMap[String(key)] = oldFibers[i];\r\n }\r\n const referenceNode = findLastChildDom(prev)?.nextSibling as\r\n | Node\r\n | undefined;\r\n // Create newChildren array based on newFibers order.\r\n const fiberParent = findParentFiberWithDom(prev);\r\n // const fragment = document.createDocumentFragment();\r\n\r\n if (newFibers.length === 0) {\r\n prev.props.children.length = 0;\r\n if (fiberParent?.dom instanceof HTMLElement)\r\n fiberParent.dom.innerHTML = \"\";\r\n return;\r\n }\r\n const prevLen = prev.props.children.length;\r\n\r\n // const newChildren = new Array(newFibers.length);\r\n for (let i = 0; i < newFibers.length; i++) {\r\n const newFiber = newFibers[i];\r\n const key = newFiber.props.key;\r\n const keyStr = String(key);\r\n // If the fiber exists in the old list, reuse it.\r\n if (oldMap.hasOwnProperty(keyStr)) {\r\n const oldFiber = oldMap[keyStr];\r\n\r\n if (prevLen > i) prev.props.children[i] = oldFiber;\r\n else prev.props.children.push(oldFiber);\r\n\r\n delete oldMap[keyStr];\r\n\r\n const newFiber = next.props.children[i];\r\n\r\n if (newFiber) newFiber.parent = prev;\r\n\r\n updateNode(oldFiber, newFiber, i);\r\n applyFiber(\r\n prev.props.children[i],\r\n fiberParent?.dom!,\r\n referenceNode\r\n );\r\n } else {\r\n // Otherwise, use the new fiber.\r\n // console.log(first)\r\n if (prevLen > i) prev.props.children[i] = newFiber;\r\n else prev.props.children.push(newFiber);\r\n\r\n newFiber.parent = prev;\r\n commitFiber(\r\n newFiber,\r\n referenceNode,\r\n false,\r\n false,\r\n fiberParent?.dom\r\n );\r\n }\r\n }\r\n for (const key in oldMap) {\r\n if (oldMap.hasOwnProperty(key)) {\r\n const fiber = oldMap[key];\r\n commitDeletion(fiber, true);\r\n }\r\n }\r\n while (prev.props.children.length > next.props.children.length) {\r\n prev.props.children.pop();\r\n }\r\n\r\n // fiberParent?.dom?.appendChild(fragment);\r\n}\r\n\r\nfunction applyFiber(fiber: Fiber, parent: Node, referenceNode?: Node) {\r\n if (fiber.dom) {\r\n if (fiber.dom === parent || fiber.dom === referenceNode) return;\r\n if (referenceNode) {\r\n parent.insertBefore(fiber.dom, referenceNode);\r\n } else parent.appendChild(fiber.dom);\r\n } else {\r\n for (const child of fiber.props.children) {\r\n applyFiber(child, parent, referenceNode);\r\n }\r\n }\r\n}\r\n\r\nfunction updateChildren(prev: Fiber, next: Fiber) {\r\n const isList =\r\n next.type === \"FRAGMENT\" && !next.props.children[FRAGMENT_SYMBOL];\r\n\r\n const wasList =\r\n prev.type === \"FRAGMENT\" && !prev.props.children[FRAGMENT_SYMBOL];\r\n\r\n // console.log(isList, wasList);\r\n\r\n if (isList && wasList) {\r\n const result = reconcileList(prev, next);\r\n if (result === false) {\r\n updateNonListChildrenWithKeys(prev, next);\r\n }\r\n } else {\r\n updateNonListChildrenWithKeys(prev, next);\r\n }\r\n if (next.type === \"FRAGMENT\" && next.props.children[FRAGMENT_SYMBOL]) {\r\n prev.props.children[FRAGMENT_SYMBOL] = true;\r\n } else {\r\n prev.props.children[FRAGMENT_SYMBOL] = false;\r\n }\r\n\r\n prev.type = next.type;\r\n}\r\n\r\nfunction updateNonListChildren(prev: Fiber, next: Fiber) {\r\n let len = Math.max(prev.props.children.length, next.props.children.length);\r\n\r\n for (let i = 0; i < len; i++) {\r\n let prevChild = prev.props.children[i];\r\n let nextChild = next.props.children[i];\r\n\r\n if (nextChild) nextChild.parent = prev;\r\n if (!prevChild && nextChild) {\r\n commitFiber(\r\n nextChild,\r\n // @ts-expect-error\r\n findLastDom(prev.props.children.at(-1))?.nextSibling\r\n );\r\n prev.props.children.push(nextChild);\r\n } else if (!nextChild && prevChild) {\r\n commitDeletion(prevChild, true);\r\n prev.props.children.splice(i, 1);\r\n len = prev.props.children.length;\r\n i--;\r\n } else {\r\n updateNode(prevChild, nextChild, i);\r\n const newLen = Math.max(\r\n prev.props.children.length,\r\n next.props.children.length\r\n );\r\n if (newLen < len) {\r\n len = newLen;\r\n i--;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction updateNonListChildrenWithKeys(prev: Fiber, next: Fiber) {\r\n let len = Math.max(prev.props.children.length, next.props.children.length);\r\n const oldMap: Record = {};\r\n let count = 0;\r\n for (let i = 0; i < prev.props.children.length; i++) {\r\n const key = prev.props.children[i].props.key;\r\n if (key === null || key === undefined) {\r\n continue;\r\n }\r\n count++;\r\n if (oldMap.hasOwnProperty(String(key))) {\r\n console.warn(\"Found two children with the same key\", key);\r\n console.warn(\r\n \"When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation\"\r\n );\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n oldMap[String(key)] = { fiber: prev.props.children[i], index: i };\r\n }\r\n if (count == 0) {\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n const newMap: Record<\r\n string,\r\n { fiber: Fiber; newIndex: number; oldIndex: number }\r\n > = {};\r\n\r\n for (let i = 0; i < next.props.children.length; i++) {\r\n const key = next.props.children[i].props.key;\r\n if (key === null || key === undefined) {\r\n continue;\r\n }\r\n const oldFiber = oldMap[String(key)];\r\n if (oldFiber) {\r\n if (newMap.hasOwnProperty(String(key))) {\r\n console.warn(\"Found two children with the same key\", key);\r\n console.warn(\r\n \"When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation\"\r\n );\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n newMap[String(key)] = {\r\n fiber: oldFiber.fiber,\r\n newIndex: i,\r\n oldIndex: oldFiber.index,\r\n };\r\n }\r\n }\r\n // console.log(prev, next);\r\n const parent = findNearestParentWithDom(prev);\r\n\r\n for (let i = 0; i < len; i++) {\r\n let prevChild = prev.props.children[i];\r\n let nextChild = next.props.children[i];\r\n // console.log(prevChild, nextChild);\r\n\r\n const nextKey = nextChild?.props.key ? String(nextChild.props.key) : \"\";\r\n const isReused = newMap.hasOwnProperty(nextKey);\r\n\r\n let prevKey = prevChild?.props.key ? String(prevChild.props.key) : \"\";\r\n\r\n if (prevKey && nextKey && prevKey === nextKey) {\r\n // console.log(\"same\", prevChild, nextChild);\r\n updateNode(prevChild, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n continue;\r\n }\r\n\r\n const isUsedLater =\r\n newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex > i;\r\n const isUsedPreviously =\r\n newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex < i;\r\n\r\n if (isUsedLater || isUsedPreviously) {\r\n ToCommitDeletion = false;\r\n }\r\n\r\n if (nextChild) nextChild.parent = prev;\r\n\r\n if (!prevChild && nextChild) {\r\n if (isReused) {\r\n const { fiber } = newMap[nextKey];\r\n\r\n prev.props.children.push(fiber);\r\n\r\n updateNode(fiber, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n } else {\r\n // needCreation just creates parent child heirarchy\r\n if (parent?.dom)\r\n commitFiber(nextChild, undefined, false, false, parent.dom);\r\n prev.props.children.push(nextChild);\r\n }\r\n } else if (!nextChild && prevChild) {\r\n commitDeletion(prevChild, true);\r\n prev.props.children.splice(i, 1);\r\n len = prev.props.children.length;\r\n i--;\r\n } else {\r\n if (isReused) {\r\n const { fiber } = newMap[nextKey];\r\n\r\n commitDeletion(prevChild, true);\r\n // because updateNode can call commitDeletion internally\r\n ToCommitDeletion = true;\r\n\r\n prev.props.children[i] = fiber;\r\n\r\n updateNode(fiber, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n } else {\r\n // console.log(ToCommitDeletion);\r\n if (isUsedLater || isUsedPreviously) {\r\n if (parent?.dom)\r\n commitFiber(\r\n nextChild,\r\n undefined,\r\n false,\r\n false,\r\n parent.dom\r\n );\r\n prev.props.children[i] = nextChild;\r\n } else {\r\n updateNode(prevChild, nextChild, i);\r\n if (parent?.dom)\r\n applyFiber(prev.props.children[i], parent.dom);\r\n\r\n const newLen = Math.max(\r\n prev.props.children.length,\r\n next.props.children.length\r\n );\r\n if (newLen < len) {\r\n len = newLen;\r\n i--;\r\n }\r\n }\r\n }\r\n }\r\n ToCommitDeletion = true;\r\n }\r\n // console.log(prev.props.children, next.props.children);\r\n}\r\n\r\n// @ts-expect-error\r\nif (typeof process !== \"undefined\" && process.env.NODE_ENV === \"test\") {\r\n // @ts-expect-error\r\n module.exports = {\r\n createFiber,\r\n commitDeletion,\r\n commitFiber,\r\n updateFiber,\r\n deepCompareFibers,\r\n deepEqual,\r\n };\r\n}\r\n","import { BaseSignal, runEffect } from \"../signals/signal\";\r\nimport { Fiber } from \"../types\";\r\n\r\nlet currentFC: Fiber | null = null;\r\nlet fcMap = new WeakMap<\r\n Fiber,\r\n {\r\n signals: Set>;\r\n cleanup: Function[];\r\n effects: Set;\r\n }\r\n>();\r\n\r\nexport function setCurrentFC(fc: Fiber) {\r\n currentFC = fc;\r\n}\r\n\r\nexport function clearCurrentFC() {\r\n currentFC = null;\r\n}\r\nexport function getCurrentFC() {\r\n return currentFC;\r\n}\r\n\r\nexport function runAllEffects(FC: Fiber) {\r\n if (fcMap.has(FC)) {\r\n const fcData = fcMap.get(FC)!;\r\n\r\n for (const effect of fcData.effects) {\r\n runEffect(effect, FC);\r\n }\r\n }\r\n}\r\n\r\nexport function cleanUp(fn: Function) {\r\n if (currentFC) {\r\n // console.log(currentFC, fcMap.has(currentFC));\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n\r\n fcData.cleanup.push(fn);\r\n } else {\r\n fcMap.set(currentFC, {\r\n signals: new Set(),\r\n cleanup: [fn],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\nexport function cleanUpWFiber(fn: Function, fiber: Fiber) {\r\n if (fiber) {\r\n // console.log(currentFC, fcMap.has(currentFC));\r\n if (fcMap.has(fiber)) {\r\n const fcData = fcMap.get(fiber)!;\r\n\r\n fcData.cleanup.push(fn);\r\n } else {\r\n fcMap.set(fiber, {\r\n signals: new Set(),\r\n cleanup: [fn],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function addEffect(fn: Function) {\r\n if (currentFC) {\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n fcData.effects.add(fn);\r\n } else {\r\n const effects = new Set();\r\n effects.add(fn);\r\n fcMap.set(currentFC, {\r\n signals: new Set(),\r\n cleanup: [],\r\n effects: effects,\r\n });\r\n }\r\n }\r\n}\r\nexport function addSignal(signal: BaseSignal) {\r\n if (currentFC) {\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n fcData.signals.add(signal);\r\n } else {\r\n const signals = new Set>();\r\n signals.add(signal);\r\n fcMap.set(currentFC, {\r\n signals: signals,\r\n cleanup: [],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function cleanUpFC(currentFC, props) {\r\n const fcData = fcMap.get(currentFC)!;\r\n if (fcData) {\r\n // console.log(\"Cleaning up FC\", currentFC, fcData);\r\n if (fcData.cleanup) {\r\n for (const fn of fcData.cleanup) {\r\n fn();\r\n }\r\n }\r\n\r\n fcData.cleanup = [];\r\n\r\n for (const effect of fcData.effects) {\r\n // @ts-expect-error\r\n if (effect.__cleanup && typeof effect.__cleanup === \"function\") {\r\n // @ts-expect-error\r\n effect.__cleanup();\r\n }\r\n // @ts-expect-error\r\n if (effect.__signals) {\r\n // @ts-expect-error\r\n for (const signal of effect.__signals) {\r\n signal.removeDep(effect);\r\n }\r\n }\r\n // @ts-expect-error\r\n delete effect.__signals;\r\n // @ts-expect-error\r\n delete effect.__cleanup;\r\n }\r\n\r\n fcData.signals.forEach((signal) => signal.clearDeps());\r\n fcData.signals.clear();\r\n }\r\n fcMap.delete(currentFC);\r\n}\r\n","import { ComponentChildren, createSignal, Fiber, PublicSignal } from \"../index\";\r\n\r\ndeclare const FRAGMENT = \"FRAGMENT\";\r\n\r\n// If the component takes no parameters, treat its props as {}\r\ntype PropsOf any> = Parameters extends []\r\n ? {}\r\n : Parameters[0];\r\n\r\nexport function lazy any>(\r\n importFn: () => Promise<{ default: T }>\r\n): (\r\n props: PropsOf & {\r\n fallback?: ComponentChildren;\r\n errorFallback?:\r\n | ComponentChildren\r\n | ((error: Error) => ComponentChildren);\r\n }\r\n) => ReturnType {\r\n let Component: T | null = null;\r\n\r\n const load = (\r\n loading: PublicSignal,\r\n error: PublicSignal\r\n ) => {\r\n if (!Component) {\r\n importFn()\r\n .then((mod) => {\r\n if (mod.default) {\r\n if (typeof mod.default !== \"function\") {\r\n throw new Error(\r\n \"Lazy-loaded component must be a functional component\"\r\n );\r\n }\r\n Component = mod.default;\r\n\r\n loading.update(false);\r\n error.update(null);\r\n } else {\r\n error.update(\r\n new Error(\r\n \"No default export found from lazy-loaded module\"\r\n )\r\n );\r\n }\r\n })\r\n .catch((err) => {\r\n error.update(err);\r\n loading.update(false);\r\n });\r\n } else {\r\n loading.update(false);\r\n error.update(null);\r\n }\r\n };\r\n\r\n return (\r\n props: PropsOf & {\r\n fallback?: Node;\r\n errorFallback?: Node;\r\n }\r\n ): ReturnType => {\r\n const loading = createSignal(true);\r\n const error = createSignal(null);\r\n\r\n load(loading, error);\r\n // Validate fallback and errorFallback types\r\n const isValidNode = (val: any) =>\r\n typeof val === \"string\" ||\r\n (val && typeof val === \"object\" && \"props\" in val && \"type\" in val);\r\n\r\n if (props.fallback !== undefined && !isValidNode(props.fallback)) {\r\n throw new Error(\r\n \"Invalid fallback: Expected a string or a valid JSX node.\"\r\n );\r\n }\r\n if (\r\n props.errorFallback !== undefined &&\r\n !(\r\n typeof props.errorFallback === \"function\" ||\r\n isValidNode(props.errorFallback)\r\n )\r\n ) {\r\n throw new Error(\r\n \"Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node.\"\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {() =>\r\n loading.value\r\n ? props.fallback\r\n : error.value !== null\r\n ? props.errorFallback\r\n ? typeof props.errorFallback === \"function\"\r\n ? props.errorFallback(error.value)\r\n : props.errorFallback\r\n : \"Unknown error occurred while lazy loading component, use errorFallback prop to override\"\r\n : // @ts-expect-error\r\n Component && \r\n }\r\n \r\n ) as unknown as ReturnType;\r\n };\r\n}\r\n"],"names":["isPlainObject","variable","Array","isArray","Object","prototype","toString","call","isPrimitive","val","includes","Error","SVG_NAMESPACE","SVG_TAGS","Set","MATH_TAGS","CAPTURE_REGEX","IS_NON_DIMENSIONAL","setReactiveAttribute","reactiveFunction","name","dom","namespace","__propName","fn","currentReactiveFunction","retVal","reactiveAttribute","setAttribute","__signals","domAttributeMap","set","setReactiveAttributes","value","useCapture","replace","toLowerCase","slice","addEventListener","tagName","setTimeout","e","style","isValidStyle","processedStyle","key","preprocessStyle","newStyles","cssKey","test","push","join","styleObjectToString","setStyle","FRAGMENT_SYMBOL","Symbol","createElement","type","props","children","fragments","createChildren","map","child","createTextChildren","_a","reactive","createSignalChild","nodeValue","String","flat","text","renderFunction","createNode","element","has","document","createTextNode","createElementNS","is","ref","Ref","HTMLElement","current","elements","rootContainer","rootFragment","effectQueue","processEffectQueue","i","length","runAllEffects","workLoop","deadline","shouldYield","renderNode","pop","timeRemaining","appendChild","requestIdleCallback","fiber","noKey","parent","setCurrentFC","clearCurrentFC","fiberParent","setRenderFunction","createFiber","commitFiber","referenceNode","needCreation","customParent","queueMicrotask","parentElement","replaceChild","_b","insertBefore","parentDom","ToCommitDeletion","commitDeletion","toClearReactiveFunction","reactiveFiberMap","delete","signals","signal","removeDep","clearReactiveFunction","prop","isEvent","eventName","substring","removeEventListener","clearReactiveAttributes","remove","currentFC","fcData","fcMap","get","cleanup","effect","effects","__cleanup","forEach","clearDeps","clear","cleanUpFC","setReactiveFunction","updateFiber","prevFiber","newValue","newFragment","updateNode","replaceRenderFunction","prev","next","replaceChildFromParent","index","startsWith","isProperty","isNew","isGone","deepCompareFibers","fiberA","fiberB","deepEqual","objA","objB","BaseSignal","keysA","keys","keysB","hasOwnProperty","findFirstDom","findLastDom","filter","prevProps","nextProps","updateChildren","firstChild","node","applyFiber","isList","wasList","oldFibers","newFibers","oldMap","findLastChildDom","nextSibling","findParentFiberWithDom","innerHTML","prevLen","newFiber","keyStr","oldFiber","reconcileList","updateNonListChildrenWithKeys","updateNonListChildren","len","Math","max","prevChild","nextChild","at","splice","newLen","count","newMap","newIndex","oldIndex","findNearestParentWithDom","nextKey","isReused","prevKey","isUsedLater","isUsedPreviously","process","env","NODE_ENV","module","exports","scheduled","batch","depset","WeakMap","currentEffect","addSignalToReactiveFunction","add","addSignalToEffect","runEffect","effectCleanup","cleanUpWFiber","cleanUp","constructor","this","MutatingMethods","isNotified","_val","deps","notify","size","dep","cb","updateDomProp","PrimitiveSignal","super","update","newVal","ArraySignal","updateCalled","createProxy","Proxy","target","args","result","apply","ObjectSignal","createInternalArrayProxy","deleteProperty","createSignal","addSignal","bind","fc","getCurrentFC","FC","addEffect","firstRun","promise","Promise","triggerSignal","status","data","error","then","catch","err","importFn","Component","loading","mod","default","load","isValidNode","fallback","errorFallback","container","fragment","createDocumentFragment","rootFiber"],"mappings":"aAAO,SAASA,EAAcC,GAC1B,MACwB,iBAAbA,GACM,OAAbA,IACCC,MAAMC,QAAQF,IAC8B,oBAA7CG,OAAOC,UAAUC,SAASC,KAAKN,EAEvC,CACO,SAASO,EAAYC,GACxB,MACI,CAAC,UAAW,SAAU,SAAU,aAAaC,gBAAgBD,IACrD,OAARA,GACAA,aAAeE,KAEvB,oECdO,MAAMC,EAAgB,6BAChBC,MAAeC,IAAI,CAC5B,MACA,IACA,SACA,WACA,OACA,OACA,UACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,iBACA,eACA,UACA,UACA,UACA,UACA,UACA,iBACA,UACA,UACA,cACA,eACA,WACA,eACA,qBACA,cACA,SACA,eACA,SACA,gBACA,IACA,QACA,OACA,iBACA,SACA,OACA,WACA,OACA,UACA,UACA,WACA,iBACA,OACA,SACA,MACA,OACA,QACA,SACA,SACA,OACA,WACA,QACA,QACA,MACA,SAESC,MAAgBD,IAAI,CAC7B,OACA,UACA,cACA,aACA,WACA,SACA,UACA,QACA,SACA,KACA,aACA,WACA,gBACA,KACA,KACA,QACA,UACA,WACA,QACA,OACA,KACA,YACA,UACA,UACA,SACA,SACA,QACA,QACA,SACA,SACA,OACA,OACA,UACA,SACA,MACA,QACA,MACA,SACA,eAKSE,EAAgB,8BCzGhBC,EACT,oECoBG,SAASC,EACZC,EACAC,EACAC,EACAC,GAEAH,EAAiBI,WAAaH,EAExB,MAAAX,ECeH,SAA2Be,GAC9B,GAAkB,mBAAPA,EACD,MAAA,IAAIb,MAAM,oDAEMc,EAAAD,EAC1B,MAAME,EAASF,IAGR,OAFmBC,EAAA,KAEnBC,CACX,CDxBgBC,CAAkBR,GAC1BV,UAA6C,IAARA,IAI5BmB,EAAAR,EAAMX,EAAKY,EAAKC,GAEzBH,EAAiBU,WEwBT,SAAsBL,EAAcH,GAEhCS,EAAAC,IAAIP,EAAIH,EAC5B,CF1BQW,CAAsBb,EAAkBE,GAChD,CAEA,MAAML,EAAgB,8BAEf,SAASY,EACZR,EACAa,EACAZ,EACAC,GAEA,GAAY,SAARF,EAAJ,CAI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"} \ No newline at end of file diff --git a/build/refract.es.js b/build/refract.es.js index b857570..c9d689b 100644 --- a/build/refract.es.js +++ b/build/refract.es.js @@ -1,14 +1,13 @@ -function isPlainObject(variable) { - return typeof variable === "object" && // Must be an object - variable !== null && // Cannot be null - !Array.isArray(variable) && // Cannot be an array - Object.prototype.toString.call(variable) === "[object Object]"; +function N(e) { + return typeof e == "object" && // Must be an object + e !== null && // Cannot be null + !Array.isArray(e) && // Cannot be an array + Object.prototype.toString.call(e) === "[object Object]"; } -function isPrimitive(val) { - return ["boolean", "string", "number", "undefined"].includes(typeof val) || val === null || val instanceof Error; +function M(e) { + return ["boolean", "string", "number", "undefined"].includes(typeof e) || e === null || e instanceof Error; } -const SVG_NAMESPACE = "http://www.w3.org/2000/svg"; -const SVG_TAGS = /* @__PURE__ */ new Set([ +const ce = "http://www.w3.org/2000/svg", ke = /* @__PURE__ */ new Set([ "svg", "a", "circle", @@ -68,8 +67,7 @@ const SVG_TAGS = /* @__PURE__ */ new Set([ "tspan", "use", "view" -]); -const MATH_TAGS = /* @__PURE__ */ new Set([ +]), Ae = /* @__PURE__ */ new Set([ "math", "maction", "maligngroup", @@ -109,1552 +107,1005 @@ const MATH_TAGS = /* @__PURE__ */ new Set([ "mtr", "munder", "munderover" -]); -const MATH_NAMESPACE = "http://www.w3.org/1998/Math/MathML"; -const CAPTURE_REGEX$1 = /(PointerCapture)$|Capture$/i; -const IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i; -function styleObjectToString(style) { - const newStyles = []; - for (const key in style) { - const value = style[key]; - const cssKey = key.replace(/([A-Z])/g, "-$1").toLowerCase(); - if (typeof value != "number" || IS_NON_DIMENSIONAL.test(cssKey)) { - newStyles.push(`${cssKey}: ${value};`); - } else { - newStyles.push(`${cssKey}: ${value}px;`); - } - } - return newStyles.join(" "); -} -function preprocessStyle(style) { - const processedStyle = {}; - for (const key in style) { - const value = style[key]; - if (typeof value === "object" && value !== null) { - console.warn(`Nested styles not allowed for ${key}`); - continue; - } - if (value === null || value === void 0 || value === false || value === "") { +]), Me = "http://www.w3.org/1998/Math/MathML", j = /(PointerCapture)$|Capture$/i, Te = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i; +function Ne(e) { + const t = []; + for (const n in e) { + const r = e[n], o = n.replace(/([A-Z])/g, "-$1").toLowerCase(); + typeof r != "number" || Te.test(o) ? t.push(`${o}: ${r};`) : t.push(`${o}: ${r}px;`); + } + return t.join(" "); +} +function Pe(e) { + const t = {}; + for (const n in e) { + const r = e[n]; + if (typeof r == "object" && r !== null) { + console.warn(`Nested styles not allowed for ${n}`); continue; } - processedStyle[key] = value; + r == null || r === !1 || r === "" || (t[n] = r); } - return processedStyle; + return t; } -function isValidStyle(style) { - return isPlainObject(style) || typeof style === "string"; +function Le(e) { + return N(e) || typeof e == "string"; } -function setStyle(style, dom) { - if (!isValidStyle(style)) +function Re(e, t) { + if (!Le(e)) throw new Error("Style attribute must be a plain object or a string"); - if (typeof style === "string") { - dom.setAttribute("style", style); - } else { - const processedStyle = preprocessStyle(style); - dom.setAttribute("style", styleObjectToString(processedStyle)); - } -} -function setReactiveAttribute(reactiveFunction, name, dom, namespace) { - reactiveFunction.__propName = name; - const val = reactiveAttribute(reactiveFunction); - if (val === null || val === void 0 || val === false) { - return; - } - setAttribute(name, val, dom, namespace); - if (reactiveFunction.__signals) - setReactiveAttributes(reactiveFunction, dom); -} -const CAPTURE_REGEX = /(PointerCapture)$|Capture$/i; -function setAttribute(name, value, dom, namespace) { - if (name == "style") { - setStyle(value, dom); + if (typeof e == "string") + t.setAttribute("style", e); + else { + const n = Pe(e); + t.setAttribute("style", Ne(n)); + } +} +function De(e, t, n, r) { + e.__propName = t; + const o = ve(e); + o == null || o === !1 || (ee(t, o, n, r), e.__signals && Ye(e, n)); +} +const Ge = /(PointerCapture)$|Capture$/i; +function ee(e, t, n, r) { + if (e == "style") { + Re(t, n); return; } - if (name[0] === "o" && name[1] === "n" && typeof value === "function") { - const useCapture = name != (name = name.replace(CAPTURE_REGEX, "$1")); - if (name.toLowerCase() in dom || name == "onFocusOut" || name == "onFocusIn" || name === "onGotPointerCapture" || name === "onLostPointerCapture") - name = name.toLowerCase().slice(2); - else name = name.slice(2); - dom.addEventListener(name, value, useCapture); + if (e[0] === "o" && e[1] === "n" && typeof t == "function") { + const o = e != (e = e.replace(Ge, "$1")); + e.toLowerCase() in n || e == "onFocusOut" || e == "onFocusIn" || e === "onGotPointerCapture" || e === "onLostPointerCapture" ? e = e.toLowerCase().slice(2) : e = e.slice(2), n.addEventListener(e, t, o); return; } - if (namespace === SVG_NAMESPACE) { - name = name.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s"); - } else if (name !== "width" && name !== "height" && name !== "href" && name !== "list" && name !== "form" && name !== "tabIndex" && name !== "download" && name !== "rowSpan" && name !== "colSpan" && name !== "role" && name !== "popover" && name in dom) { + if (r === ce) + e = e.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s"); + else if (e !== "width" && e !== "height" && e !== "href" && e !== "list" && e !== "form" && e !== "tabIndex" && e !== "download" && e !== "rowSpan" && e !== "colSpan" && e !== "role" && e !== "popover" && e in n) try { - if (name === "value" && dom.tagName === "SELECT") { - setTimeout(() => { - dom[name] = value == null ? "" : value; - }); - } else { - dom[name] = value == null ? "" : value; - } + e === "value" && n.tagName === "SELECT" ? setTimeout(() => { + n[e] = t ?? ""; + }) : n[e] = t ?? ""; return; - } catch (e) { + } catch { } - } - if (value != null && (value !== false || name[4] === "-")) { - dom.setAttribute( - name, - name === "popover" && value === true ? "" : value - ); - } + t != null && (t !== !1 || e[4] === "-") && n.setAttribute( + e, + e === "popover" && t === !0 ? "" : t + ); } -const FRAGMENT_SYMBOL = Symbol("FRAGMENT"); -function createElement(type, props, ...children) { - if (type === "FRAGMENT") { - const fragments = createChildren(children); - fragments[FRAGMENT_SYMBOL] = true; - return fragments; +const h = Symbol("FRAGMENT"); +function ne(e, t, ...n) { + if (e === "FRAGMENT") { + const r = P(n); + return r[h] = !0, r; } return { - type, + type: e, props: { - ...props, - children: createChildren(children) + ...t, + children: P(n) } }; } -function createChildren(children) { - return children.map((child) => { - if (typeof child === "object") { - if (Array.isArray(child)) { - return createChildren(child); - } - if (child === null) { - return createTextChildren(""); - } - if (!child.type || !child.props) { +function P(e) { + return e.map((t) => { + if (typeof t == "object") { + if (Array.isArray(t)) + return P(t); + if (t === null) + return B(""); + if (!t.type || !t.props) throw new Error( - "Invalid type for a dom node, found " + child + "Invalid type for a dom node, found " + t ); - } - return child; - } else if (typeof child === "function") { - const val = reactive(child); - if (isPrimitive(val)) { - return createSignalChild( + return t; + } else if (typeof t == "function") { + const n = xe(t); + if (M(n)) + return q( "TEXT_CHILD", { - nodeValue: val !== void 0 && val !== null && val !== false ? String(val) : "", + nodeValue: n != null && n !== !1 ? String(n) : "", children: [] }, - child + t ); - } else if (Array.isArray(val)) { - const isFragment = val[FRAGMENT_SYMBOL]; - return createSignalChild( + if (Array.isArray(n)) { + const r = n[h]; + return q( "FRAGMENT", - { children: isFragment ? val : createChildren(val) }, - child + { children: r ? n : P(n) }, + t ); - } else if (!val.type || !val.props) { + } else if (!n.type || !n.props) throw new Error( - "Invalid type for a dom node, found " + val + "Invalid type for a dom node, found " + n ); - } - return createSignalChild(val.type, val.props, child); - } else { - return createTextChildren(child); - } + return q(n.type, n.props, t); + } else + return B(t); }).flat(); } -function createTextChildren(text) { +function B(e) { return { type: "TEXT_CHILD", props: { - nodeValue: text !== null && text !== void 0 && text !== false ? String(text) : "", + nodeValue: e != null && e !== !1 ? String(e) : "", children: [] } }; } -function createSignalChild(type, props, renderFunction) { +function q(e, t, n) { return { - type, - renderFunction, - props + type: e, + renderFunction: n, + props: t }; } -function isProperty$1(key) { - return key !== "children" && key !== "key" && key !== "ref"; +function Ie(e) { + return e !== "children" && e !== "key" && e !== "ref"; } -function createNode(element) { - let namespace = null; - if (SVG_TAGS.has(element.type)) namespace = SVG_NAMESPACE; - else if (MATH_TAGS.has(element.type)) namespace = MATH_NAMESPACE; - const dom = element.type === "TEXT_CHILD" ? document.createTextNode("") : namespace ? document.createElementNS( - namespace, +function ue(e) { + let t = null; + ke.has(e.type) ? t = ce : Ae.has(e.type) && (t = Me); + const n = e.type === "TEXT_CHILD" ? document.createTextNode("") : t ? document.createElementNS( + t, // @ts-expect-error - element.type, - element.props.is && element.props + e.type, + e.props.is && e.props ) : ( // @ts-expect-error - document.createElement(element.type) + document.createElement(e.type) ); - if (!element.props) return dom; - if (element.props.ref && element.props.ref instanceof Ref && dom instanceof HTMLElement) { - element.props.ref.current = dom; - } - for (const name in element.props) { - if (!isProperty$1(name)) { + if (!e.props) return n; + e.props.ref && e.props.ref instanceof te && n instanceof HTMLElement && (e.props.ref.current = n); + for (const r in e.props) { + if (!Ie(r)) continue; - } - const value = element.props[name]; - if (typeof value === "function" && name[0] !== "o" && name[1] !== "n") { - setReactiveAttribute(value, name, dom, namespace); - } else { - setAttribute(name, value, dom, namespace); - } - } - return dom; -} -function updateDomProp(prop, dom, value) { - if (value == null || prop === "key") return; - setAttribute(prop, value, dom); -} -function render(element, container) { - rootContainer = container; - const fragment = document.createDocumentFragment(); - rootFragment = fragment; - const rootFiber = { + const o = e.props[r]; + typeof o == "function" && r[0] !== "o" && r[1] !== "n" ? De(o, r, n, t) : ee(r, o, n, t); + } + return n; +} +function $e(e, t, n) { + n == null || e === "key" || ee(e, n, t); +} +function ae(e, t) { + return e === t ? !0 : e.type !== t.type || e.props?.key !== t.props?.key ? !1 : T(e.props, t.props); +} +function T(e, t) { + if (e === t) { + if (e instanceof L && t instanceof L) + return T(e.value, t.value); + if (Array.isArray(e) && Array.isArray(t)) { + if (e.length !== t.length) return !1; + for (let n = 0; n < e.length; n++) + if (!T(e[n], t[n])) return !1; + } + return !0; + } + if (M(e) && M(t)) + return e === t; + if (typeof e != typeof t) return !1; + for (let n in e) + if (n !== "children" && (!(n in t) || !T(e[n], t[n]))) + return !1; + for (let n in t) + if (n !== "children" && !(n in e)) + return !1; + return !0; +} +function x(e) { + if (e) { + if (e.dom) return e.dom; + for (const t of e.props.children) { + const n = x(t); + if (n) return n; + } + } +} +function W(e) { + if (!e) return; + let t = e.parent; + for (; t && !t.dom; ) + t = t.parent; + return t; +} +function Oe(e) { + if (e) + return e.dom ? e : W(e); +} +function it(e, t) { + v = t; + const n = document.createDocumentFragment(); + b = n; + const r = { type: "div", props: { - children: [element] + children: [e] }, // @ts-expect-error - dom: fragment + dom: n }; - element.parent = rootFiber; - elements.push(element); - requestIdleCallback(workLoop); + e.parent = r, w.push(e), requestIdleCallback(fe); } -function commitRootFragment() { - if (rootFragment && rootContainer) { - rootContainer.appendChild(rootFragment); - } +function He() { + b && v && v.appendChild(b); } -let elements = []; -let rootContainer = null; -let rootFragment = null; -let effectQueue = []; -function processEffectQueue() { - for (let i = 0; i < effectQueue.length; i++) { - const fiber = effectQueue[i]; - runAllEffects(fiber); +let w = [], v = null, b = null, D = []; +function re() { + for (let e = 0; e < D.length; e++) { + const t = D[e]; + Ce(t); } - effectQueue.length = 0; -} -function workLoop(deadline) { - processEffectQueue(); - let shouldYield = false; - while (elements.length > 0 && !shouldYield) { - const element = elements.pop(); - renderNode(element); - shouldYield = deadline.timeRemaining() < 1; + D.length = 0; +} +function fe(e) { + re(); + let t = !1; + for (; w.length > 0 && !t; ) { + const n = w.pop(); + We(n), t = e.timeRemaining() < 1; } - if (elements.length == 0) { - commitRootFragment(); - processEffectQueue(); + if (w.length == 0) { + He(), re(); return; } - requestIdleCallback(workLoop); -} -function renderNode(fiber) { - var _a; - if (fiber.type === "FRAGMENT") { - const isArray = !fiber.props.children[FRAGMENT_SYMBOL]; - let noKey = false; - for (let i = fiber.props.children.length - 1; i >= 0; i--) { - fiber.props.children[i].parent = fiber; - if (isArray && fiber.props.children[i].props.key === void 0 && fiber.renderFunction) { - noKey = true; - } - elements.push(fiber.props.children[i]); - } - if (noKey) { - console.error("Array children must have a key attribute"); - } - } else if (typeof fiber.type === "function") { - setCurrentFC(fiber); - const children = fiber.type(fiber.props); - clearCurrentFC(); - if (Array.isArray(children)) { - for (let i = children.length - 1; i >= 0; i--) { - children[i].parent = fiber; - elements.push(children[i]); - } - fiber.props.children = children; - } else { - children.parent = fiber; - fiber.props.children.push(children); - elements.push(children); - } - effectQueue.push(fiber); + requestIdleCallback(fe); +} +function We(e) { + if (e.type === "FRAGMENT") { + const t = !e.props.children[h]; + let n = !1; + for (let r = e.props.children.length - 1; r >= 0; r--) + e.props.children[r].parent = e, t && e.props.children[r].props.key === void 0 && e.renderFunction && (n = !0), w.push(e.props.children[r]); + n && console.error("Array children must have a key attribute"); + } else if (typeof e.type == "function") { + _e(e); + const t = e.type(e.props); + if (Ee(), Array.isArray(t)) { + for (let n = t.length - 1; n >= 0; n--) + t[n].parent = e, w.push(t[n]); + e.props.children = t; + } else + t.parent = e, e.props.children.push(t), w.push(t); + D.push(e); } else { - if (!fiber.dom) fiber.dom = createNode(fiber); - let fiberParent = fiber.parent; - while (fiberParent && !fiberParent.dom) { - fiberParent = fiberParent.parent; - } - if (fiberParent) { - (_a = fiberParent.dom) == null ? void 0 : _a.appendChild(fiber.dom); - } - for (let i = fiber.props.children.length - 1; i >= 0; i--) { - fiber.props.children[i].parent = fiber; - elements.push(fiber.props.children[i]); - } - } - setRenderFunction(fiber); -} -function createFiber(fiber) { - if (fiber.type === "FRAGMENT") { - const isFragment = fiber.props.children[FRAGMENT_SYMBOL]; - if (isFragment) { - for (const child of fiber.props.children) { - child.parent = fiber; - createFiber(child); - } - } else { - let noKey = false; - for (const child of fiber.props.children) { - child.parent = fiber; - if (child.props.key === void 0) { - noKey = true; - } - createFiber(child); - } - if (noKey) { - console.error("Array children must have a key attribute"); - } - } - } else if (typeof fiber.type !== "function") { - for (const child of fiber.props.children) { - child.parent = fiber; - createFiber(child); - } - } - setRenderFunction(fiber); -} -function commitFiber(fiber, referenceNode, replace, needCreation, customParent) { - var _a, _b; - if (fiber.type === "FRAGMENT") { - for (const child of fiber.props.children) { - if (needCreation) child.parent = fiber; - commitFiber( - child, - referenceNode, - replace, - needCreation, - customParent + e.dom || (e.dom = ue(e)); + let t = W(e); + t && t.dom?.appendChild(e.dom); + for (let n = e.props.children.length - 1; n >= 0; n--) + e.props.children[n].parent = e, w.push(e.props.children[n]); + } + U(e); +} +function F(e) { + if (e.type === "FRAGMENT") + if (e.props.children[h]) + for (const n of e.props.children) + n.parent = e, F(n); + else { + let n = !1; + for (const r of e.props.children) + r.parent = e, r.props.key === void 0 && (n = !0), F(r); + n && console.error("Array children must have a key attribute"); + } + else if (typeof e.type != "function") + for (const t of e.props.children) + t.parent = e, F(t); + U(e); +} +function p(e, t, n, r, o) { + if (e.type === "FRAGMENT") + for (const i of e.props.children) + r && (i.parent = e), p( + i, + t, + n, + r, + o ); - } - } else if (typeof fiber.type === "function") { - setCurrentFC(fiber); - const children = fiber.type(fiber.props); - clearCurrentFC(); - if (Array.isArray(children)) { - for (const child of children) { - child.parent = fiber; - commitFiber(child, referenceNode, replace, true, customParent); - } - fiber.props.children = children; - } else { - children.parent = fiber; - fiber.props.children.push(children); - commitFiber(children, referenceNode, replace, true, customParent); - } + else if (typeof e.type == "function") { + _e(e); + const i = e.type(e.props); + if (Ee(), Array.isArray(i)) { + for (const s of i) + s.parent = e, p(s, t, n, !0, o); + e.props.children = i; + } else + i.parent = e, e.props.children.push(i), p(i, t, n, !0, o); queueMicrotask(() => { - runAllEffects(fiber); + Ce(e); }); } else { - if (!fiber.dom) fiber.dom = createNode(fiber); - if (referenceNode) { - if (replace) - (_a = referenceNode.parentElement) == null ? void 0 : _a.replaceChild( - fiber.dom, - referenceNode - ); - else - (_b = referenceNode.parentElement) == null ? void 0 : _b.insertBefore( - fiber.dom, - referenceNode - ); - } else { - let parentDom = void 0; - if (customParent) { - parentDom = customParent; - } else { - let fiberParent = fiber.parent; - while (fiberParent && !fiberParent.dom) { - fiberParent = fiberParent.parent; - } - parentDom = fiberParent == null ? void 0 : fiberParent.dom; - } - parentDom == null ? void 0 : parentDom.appendChild(fiber.dom); - } - for (const child of fiber.props.children) { - if (needCreation) child.parent = fiber; - commitFiber(child, void 0, void 0, needCreation, fiber.dom); - } - } - if (needCreation) { - setRenderFunction(fiber); - } -} -let ToCommitDeletion = true; -function commitDeletion(fiber, toClearReactiveFunction) { - if (!fiber || !ToCommitDeletion) return; - if (fiber.renderFunction) { - if (toClearReactiveFunction) - clearReactiveFunction(fiber.renderFunction); - delete fiber.renderFunction; - } - if (fiber.dom) { - for (const prop in fiber.props) { - if (isEvent(prop)) { - let eventName = prop.toLowerCase().substring(2); - const useCapture = eventName != (eventName = eventName.replace(CAPTURE_REGEX$1, "$1")); - fiber.dom.removeEventListener( - eventName, - fiber.props[prop], - useCapture - ); - delete fiber.props[prop]; - } else if (typeof fiber.props[prop] === "function") { - clearReactiveAttributes(fiber.props[prop]); - } else if (prop === "ref" && fiber.props[prop] instanceof Ref) { - fiber.props[prop].current = null; - } - } - fiber.dom.remove(); - } - if (typeof fiber.type === "function") { - cleanUpFC(fiber, fiber.props); - delete fiber.type; - } - fiber.props.children.forEach((child) => commitDeletion(child, true)); -} -function setRenderFunction(fiber) { - if (!fiber.renderFunction) return; - setReactiveFunction(fiber.renderFunction, fiber); -} -function updateFiber(prevFiber, newValue) { - if (isPrimitive(newValue)) { - const newFragment = { - ...createTextChildren(newValue), - parent: prevFiber.parent + if (e.dom || (e.dom = ue(e)), t) + n ? t.parentElement?.replaceChild( + e.dom, + t + ) : t.parentElement?.insertBefore( + e.dom, + t + ); + else { + let i; + o ? i = o : i = W(e)?.dom, i?.appendChild(e.dom); + } + for (const i of e.props.children) + r && (i.parent = e), p(i, void 0, void 0, r, e.dom); + } + r && U(e); +} +let G = !0; +function _(e, t) { + if (!(!e || !G)) { + if (e.renderFunction && (t && Je(e.renderFunction), delete e.renderFunction), e.dom) { + for (const n in e.props) + if (I(n)) { + let r = n.toLowerCase().substring(2); + const o = r != (r = r.replace(j, "$1")); + e.dom.removeEventListener( + r, + e.props[n], + o + ), delete e.props[n]; + } else typeof e.props[n] == "function" ? Ze(e.props[n]) : n === "ref" && e.props[n] instanceof te && (e.props[n].current = null); + e.dom.remove(); + } + typeof e.type == "function" && (ot(e, e.props), delete e.type), e.props.children.forEach((n) => _(n, !0)); + } +} +function U(e) { + e.renderFunction && Qe(e.renderFunction, e); +} +function pe(e, t) { + if (M(t)) { + const n = { + ...B(t), + parent: e.parent }; - createFiber(newFragment); - updateNode(prevFiber, newFragment); - } else if (Array.isArray(newValue)) { - const isFragment = newValue[FRAGMENT_SYMBOL]; - const newFragment = { + F(n), y(e, n); + } else if (Array.isArray(t)) { + const r = { type: "FRAGMENT", props: { - children: isFragment ? newValue : createChildren(newValue) + children: t[h] ? t : P(t) }, - parent: prevFiber.parent + parent: e.parent }; - createFiber(newFragment); - updateNode(prevFiber, newFragment); + F(r), y(e, r); } else { - const newFragment = { ...newValue, parent: prevFiber.parent }; - createFiber(newFragment); - updateNode(prevFiber, newFragment); + const n = { ...t, parent: e.parent }; + F(n), y(e, n); } } -function replaceRenderFunction(prev, next) { - if (prev.renderFunction) { - next.renderFunction = prev.renderFunction; - setRenderFunction(next); - } +function Ue(e, t) { + e.renderFunction && (t.renderFunction = e.renderFunction, U(t)); } -function replaceChildFromParent(prev, next, index) { - var _a; - if (index !== void 0) { - prev.parent.props.children[index] = next; +function Xe(e, t, n) { + if (n !== void 0) { + e.parent.props.children[n] = t; return; } - (_a = prev.parent) == null ? void 0 : _a.props.children.forEach((child, i) => { - if (child === prev) { - prev.parent.props.children[i] = next; - } - }); -} -const isEvent = (key) => key.startsWith("on") || key == "onFocusOut" || key == "onFocusIn"; -const isProperty = (key) => key !== "children" && !isEvent(key) && key !== "key" && key !== "ref"; -const isNew = (prev, next, key) => prev[key] !== next[key]; -const isGone = (prev, next, key) => !(key in next); -function deepCompareFibers(fiberA, fiberB) { - var _a, _b; - if (fiberA === fiberB) { - return true; - } - if (fiberA.type !== fiberB.type) { - return false; - } - if (((_a = fiberA.props) == null ? void 0 : _a.key) !== ((_b = fiberB.props) == null ? void 0 : _b.key)) { - return false; - } - return deepEqual(fiberA.props, fiberB.props); -} -function deepEqual(objA, objB) { - if (objA === objB) { - if (objA instanceof BaseSignal && objB instanceof BaseSignal) - return deepEqual(objA.value, objB.value); - if (Array.isArray(objA) && Array.isArray(objB)) { - if (objA.length !== objB.length) return false; - for (let i = 0; i < objA.length; i++) { - if (!deepEqual(objA[i], objB[i])) return false; - } - } - return true; - } - if (isPrimitive(objA) && isPrimitive(objB)) { - return objA === objB; - } - if (typeof objA !== typeof objB) return false; - const keysA = Object.keys(objA); - const keysB = Object.keys(objB); - if (keysA.length !== keysB.length) return false; - for (let key of keysA) { - if (key === "children") continue; - if (!objB.hasOwnProperty(key)) return false; - if (!deepEqual(objA[key], objB[key])) return false; - } - return true; -} -function findFirstDom(fiber) { - if (!fiber) return; - if (fiber.dom) return fiber.dom; - for (const child of fiber.props.children) { - const dom = findFirstDom(child); - if (dom) return dom; - } + for (let r = 0; r < e.parent.props.children.length; r++) + e.parent.props.children[r] === e && (e.parent.props.children[r] = t); } -function findLastDom(fiber) { - if (!fiber) return; - if (fiber.dom) return fiber.dom; - for (let i = fiber.props.children.length - 1; i >= 0; i--) { - const child = fiber.props.children[i]; - const dom = findLastDom(child); - if (dom) return dom; - } -} -function findLastChildDom(fiber) { - if (!fiber) return; - for (let i = fiber.props.children.length - 1; i >= 0; i--) { - const child = fiber.props.children[i]; - const dom = findLastDom(child); - if (dom) return dom; - } +function R(e, t, n) { + Ue(e, t), _(e), Xe(e, t, n); } -function findParentFiberWithDom(fiber) { - if (!fiber) return; - let fiberParent = fiber.parent; - while (fiberParent && !fiberParent.dom) { - fiberParent = fiberParent.parent; - } - return fiberParent; -} -function findNearestParentWithDom(fiber) { - if (!fiber) return; - if (fiber.dom) return fiber; - let fiberParent = fiber.parent; - while (fiberParent && !fiberParent.dom) { - fiberParent = fiberParent.parent; - } - return fiberParent; -} -function updateNode(prev, next, index) { - if (!prev && !next) return; - if (prev && !next) { - commitDeletion(prev, true); - prev.parent.props.children = prev.parent.props.children.filter( - (child) => child !== prev - ); - } else if (prev && next) { - const prevProps = prev.props; - const nextProps = next.props; - if (prev.type === "FRAGMENT" || typeof prev.type === "function") { - if (next.type === "FRAGMENT" || typeof next.type === "function") { - if (typeof prev.type === typeof next.type && typeof prev.type === "function") { - const areSame = deepCompareFibers(prev, next); - if (!areSame) { - commitFiber(next, findFirstDom(prev), void 0, true); - replaceRenderFunction(prev, next); - commitDeletion(prev); - replaceChildFromParent(prev, next, index); - } - } else { - updateChildren(prev, next); - } - } else { - next.parent = prev.parent; - let firstChild = prev.props.children[0]; - while (firstChild && !firstChild.dom) - firstChild = firstChild.props.children[0]; - commitFiber(next, firstChild == null ? void 0 : firstChild.dom); - replaceRenderFunction(prev, next); - commitDeletion(prev); - replaceChildFromParent(prev, next, index); - } - } else { - const node = prev.dom; - if (prev.type === "TEXT_CHILD" && next.type === "TEXT_CHILD" && !next.dom) - next.dom = prev.dom; - if (node === void 0) { - return; - } - if (next.type === "FRAGMENT" || typeof next.type === "function") { - next.parent = prev.parent; - replaceRenderFunction(prev, next); - commitFiber(next, node); - commitDeletion(prev); - replaceChildFromParent(prev, next, index); - } else { - for (const prop in prevProps) { - if (isProperty(prop) && isGone(prevProps, nextProps, prop)) { - node[prop] = ""; - } else if (isEvent(prop) && (!(prop in nextProps) || isNew(prevProps, nextProps, prop))) { - let eventName = prop.toLowerCase().substring(2); - const useCapture = eventName != (eventName = eventName.replace( - CAPTURE_REGEX$1, - "$1" - )); - node.removeEventListener( - eventName, - prevProps[prop], - useCapture - ); - } +const I = (e) => e.startsWith("on") || e == "onFocusOut" || e == "onFocusIn", oe = (e) => e !== "children" && !I(e) && e !== "key" && e !== "ref", z = (e, t, n) => e[n] !== t[n], qe = (e, t, n) => !(n in t); +function y(e, t, n) { + if (!(!e && !t)) { + if (e && !t) + _(e, !0), e.parent.props.children = e.parent.props.children.filter( + (r) => r !== e + ); + else if (e && t) { + const r = e.props, o = t.props; + if (e.type === "FRAGMENT" || typeof e.type == "function") + if (t.type === "FRAGMENT" || typeof t.type == "function") + typeof e.type == typeof t.type && typeof e.type == "function" ? ae(e, t) || (p(t, x(e), void 0, !0), R(e, t, n)) : ie(e, t); + else { + t.parent = e.parent; + let i = x(e.props.children[0]); + p(t, i), R(e, t, n); } - if (prev.type !== next.type) { - next.parent = prev.parent; - replaceRenderFunction(prev, next); - commitFiber(next, node, true); - commitDeletion(prev); - replaceChildFromParent(prev, next, index); - } else { - for (const prop in nextProps) { - if (isProperty(prop) && isNew(prevProps, nextProps, prop)) { - node[prop] = nextProps[prop]; - prevProps[prop] = nextProps[prop]; - } else if (isEvent(prop) && isNew(prevProps, nextProps, prop)) { - let eventName = prop.toLowerCase().substring(2); - const useCapture = eventName != (eventName = eventName.replace( - CAPTURE_REGEX$1, + else { + const i = e.dom; + if (e.type === "TEXT_CHILD" && t.type === "TEXT_CHILD" && !t.dom && (t.dom = e.dom), i === void 0) + return; + if (t.type === "FRAGMENT" || typeof t.type == "function") + t.parent = e.parent, p(t, i), R(e, t, n); + else { + for (const s in r) + if (oe(s) && qe(r, o, s)) + i[s] = ""; + else if (I(s) && (!(s in o) || z(r, o, s))) { + let c = s.toLowerCase().substring(2); + const l = c != (c = c.replace( + j, "$1" )); - node.addEventListener( - eventName, - nextProps[prop], - useCapture + i.removeEventListener( + c, + r[s], + l ); - prevProps[prop] = nextProps[prop]; } + if (e.type !== t.type) + t.parent = e.parent, p(t, i, !0), R(e, t, n); + else { + for (const s in o) + if (oe(s) && z(r, o, s)) + i[s] = o[s], r[s] = o[s]; + else if (I(s) && z(r, o, s)) { + let c = s.toLowerCase().substring(2); + const l = c != (c = c.replace( + j, + "$1" + )); + i.addEventListener( + c, + o[s], + l + ), r[s] = o[s]; + } + ie(e, t); } - updateChildren(prev, next); } } } } } -function reconcileList(prev, next) { - var _a; - const oldFibers = prev.props.children; - const newFibers = next.props.children; - const oldMap = {}; - for (let i = 0; i < oldFibers.length; i++) { - const key = oldFibers[i].props.key; - if (key === null || key === void 0 || oldMap.hasOwnProperty(String(key))) { - return false; - } - oldMap[String(key)] = oldFibers[i]; +function ze(e, t) { + const n = e.props.children, r = t.props.children, o = {}; + for (let l = 0; l < n.length; l++) { + const u = n[l].props.key; + if (u == null || String(u) in o) + return !1; + o[String(u)] = n[l]; } - const referenceNode = (_a = findLastChildDom(prev)) == null ? void 0 : _a.nextSibling; - const fiberParent = findParentFiberWithDom(prev); - if (newFibers.length === 0) { - prev.props.children.length = 0; - if ((fiberParent == null ? void 0 : fiberParent.dom) instanceof HTMLElement) - fiberParent.dom.innerHTML = ""; + const i = W(e); + if (r.length === 0) { + e.props.children.length = 0, i?.dom instanceof HTMLElement && (i.dom.innerHTML = ""); return; } - const prevLen = prev.props.children.length; - for (let i = 0; i < newFibers.length; i++) { - const newFiber = newFibers[i]; - const key = newFiber.props.key; - const keyStr = String(key); - if (oldMap.hasOwnProperty(keyStr)) { - const oldFiber = oldMap[keyStr]; - if (prevLen > i) prev.props.children[i] = oldFiber; - else prev.props.children.push(oldFiber); - delete oldMap[keyStr]; - const newFiber2 = next.props.children[i]; - if (newFiber2) newFiber2.parent = prev; - updateNode(oldFiber, newFiber2, i); - applyFiber( - prev.props.children[i], - fiberParent == null ? void 0 : fiberParent.dom, - referenceNode - ); - } else { - if (prevLen > i) prev.props.children[i] = newFiber; - else prev.props.children.push(newFiber); - newFiber.parent = prev; - commitFiber( - newFiber, - referenceNode, - false, - false, - fiberParent == null ? void 0 : fiberParent.dom + const s = document.createDocumentFragment(), c = e.props.children.length; + for (let l = 0; l < r.length; l++) { + const u = r[l], E = u.props.key, S = String(E); + if (S in o) { + const g = o[S]; + c > l ? e.props.children[l] = g : e.props.children.push(g), delete o[S]; + const k = t.props.children[l]; + k && (k.parent = e), y(g, k, l), A(e.props.children[l], s); + } else + c > l ? e.props.children[l] = u : e.props.children.push(u), u.parent = e, p(u, void 0, !1, !1, s); + } + for (const l in o) { + const u = o[l]; + _(u, !0); + } + for (; e.props.children.length > t.props.children.length; ) + e.props.children.pop(); + i?.dom?.appendChild(s); +} +function A(e, t, n) { + if (e.dom) { + if (e.dom === t || e.dom === n) return; + t.appendChild(e.dom); + } else + for (const r of e.props.children) + A(r, t, n); +} +function ie(e, t) { + const n = t.type === "FRAGMENT" && !t.props.children[h], r = e.type === "FRAGMENT" && !e.props.children[h]; + n && r ? ze(e, t) === !1 && se(e, t) : se(e, t), t.type === "FRAGMENT" && t.props.children[h] ? e.props.children[h] = !0 : e.props.children[h] = !1, e.type = t.type; +} +function K(e, t) { + let n = Math.max(e.props.children.length, t.props.children.length); + for (let r = 0; r < n; r++) { + let o = e.props.children[r], i = t.props.children[r]; + if (i && (i.parent = e), !o && i) + p(i), e.props.children.push(i); + else if (!i && o) + _(o, !0), e.props.children.splice(r, 1), n = e.props.children.length, r--; + else { + y(o, i, r); + const s = Math.max( + e.props.children.length, + t.props.children.length ); + s < n && (n = s, r--); } } - for (const key in oldMap) { - if (oldMap.hasOwnProperty(key)) { - const fiber = oldMap[key]; - commitDeletion(fiber, true); - } - } - while (prev.props.children.length > next.props.children.length) { - prev.props.children.pop(); - } } -function applyFiber(fiber, parent, referenceNode) { - if (fiber.dom) { - if (fiber.dom === parent || fiber.dom === referenceNode) return; - if (referenceNode) { - parent.insertBefore(fiber.dom, referenceNode); - } else parent.appendChild(fiber.dom); - } else { - for (const child of fiber.props.children) { - applyFiber(child, parent, referenceNode); - } - } -} -function updateChildren(prev, next) { - const isList = next.type === "FRAGMENT" && !next.props.children[FRAGMENT_SYMBOL]; - const wasList = prev.type === "FRAGMENT" && !prev.props.children[FRAGMENT_SYMBOL]; - if (isList && wasList) { - const result = reconcileList(prev, next); - if (result === false) { - updateNonListChildrenWithKeys(prev, next); - } - } else { - updateNonListChildrenWithKeys(prev, next); - } - if (next.type === "FRAGMENT" && next.props.children[FRAGMENT_SYMBOL]) { - prev.props.children[FRAGMENT_SYMBOL] = true; - } else { - prev.props.children[FRAGMENT_SYMBOL] = false; - } - prev.type = next.type; -} -function updateNonListChildren(prev, next) { - var _a; - let len = Math.max(prev.props.children.length, next.props.children.length); - for (let i = 0; i < len; i++) { - let prevChild = prev.props.children[i]; - let nextChild = next.props.children[i]; - if (nextChild) nextChild.parent = prev; - if (!prevChild && nextChild) { - commitFiber( - nextChild, - // @ts-expect-error - (_a = findLastDom(prev.props.children.at(-1))) == null ? void 0 : _a.nextSibling - ); - prev.props.children.push(nextChild); - } else if (!nextChild && prevChild) { - commitDeletion(prevChild, true); - prev.props.children.splice(i, 1); - len = prev.props.children.length; - i--; - } else { - updateNode(prevChild, nextChild, i); - const newLen = Math.max( - prev.props.children.length, - next.props.children.length - ); - if (newLen < len) { - len = newLen; - i--; +function se(e, t) { + let n = Math.max(e.props.children.length, t.props.children.length); + const r = {}; + let o = 0; + for (let c = 0; c < e.props.children.length; c++) { + const l = e.props.children[c].props.key; + if (l != null) { + if (o++, String(l) in r) { + console.warn("Found two children with the same key", l), console.warn( + "When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation" + ), K(e, t); + return; } + r[String(l)] = { fiber: e.props.children[c], index: c }; } } -} -function updateNonListChildrenWithKeys(prev, next) { - let len = Math.max(prev.props.children.length, next.props.children.length); - const oldMap = {}; - let count = 0; - for (let i = 0; i < prev.props.children.length; i++) { - const key = prev.props.children[i].props.key; - if (key === null || key === void 0) { - continue; - } - count++; - if (oldMap.hasOwnProperty(String(key))) { - console.warn("Found two children with the same key", key); - console.warn( - "When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation" - ); - updateNonListChildren(prev, next); - return; - } - oldMap[String(key)] = { fiber: prev.props.children[i], index: i }; - } - if (count == 0) { - updateNonListChildren(prev, next); + if (o == 0) { + K(e, t); return; } - const newMap = {}; - for (let i = 0; i < next.props.children.length; i++) { - const key = next.props.children[i].props.key; - if (key === null || key === void 0) { + const i = {}; + for (let c = 0; c < t.props.children.length; c++) { + const l = t.props.children[c].props.key; + if (l == null) continue; - } - const oldFiber = oldMap[String(key)]; - if (oldFiber) { - if (newMap.hasOwnProperty(String(key))) { - console.warn("Found two children with the same key", key); - console.warn( + const u = r[String(l)]; + if (u) { + if (String(l) in i) { + console.warn("Found two children with the same key", l), console.warn( "When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation" - ); - updateNonListChildren(prev, next); + ), K(e, t); return; } - newMap[String(key)] = { - fiber: oldFiber.fiber, - newIndex: i, - oldIndex: oldFiber.index + i[String(l)] = { + fiber: u.fiber, + newIndex: c, + oldIndex: u.index }; } } - const parent = findNearestParentWithDom(prev); - for (let i = 0; i < len; i++) { - let prevChild = prev.props.children[i]; - let nextChild = next.props.children[i]; - const nextKey = (nextChild == null ? void 0 : nextChild.props.key) ? String(nextChild.props.key) : ""; - const isReused = newMap.hasOwnProperty(nextKey); - let prevKey = (prevChild == null ? void 0 : prevChild.props.key) ? String(prevChild.props.key) : ""; - if (prevKey && nextKey && prevKey === nextKey) { - updateNode(prevChild, nextChild, i); - if (parent == null ? void 0 : parent.dom) applyFiber(prev.props.children[i], parent.dom); + const s = Oe(e); + for (let c = 0; c < n; c++) { + let l = e.props.children[c], u = t.props.children[c]; + const E = u?.props.key ? String(u.props.key) : "", S = E in i; + let g = l?.props.key ? String(l.props.key) : ""; + if (g && E && g === E) { + y(l, u, c), s?.dom && A(e.props.children[c], s.dom); continue; } - const isUsedLater = newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex > i; - const isUsedPreviously = newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex < i; - if (isUsedLater || isUsedPreviously) { - ToCommitDeletion = false; - } - if (nextChild) nextChild.parent = prev; - if (!prevChild && nextChild) { - if (isReused) { - const { fiber } = newMap[nextKey]; - prev.props.children.push(fiber); - updateNode(fiber, nextChild, i); - if (parent == null ? void 0 : parent.dom) applyFiber(prev.props.children[i], parent.dom); - } else { - if (parent == null ? void 0 : parent.dom) - commitFiber(nextChild, void 0, false, false, parent.dom); - prev.props.children.push(nextChild); + const k = g in i && i[g].newIndex !== c; + if (k && (G = !1), u && (u.parent = e), !l && u) + if (S) { + const { fiber: m } = i[E]; + e.props.children.push(m), y(m, u, c), s?.dom && A(e.props.children[c], s.dom); + } else + s?.dom && p(u, void 0, !1, !1, s.dom), e.props.children.push(u); + else if (!u && l) + _(l, !0), e.props.children.splice(c, 1), n = e.props.children.length, c--; + else if (S) { + const { fiber: m } = i[E]; + _(l, !0), G = !0, e.props.children[c] = m, y(m, u, c), s?.dom && A(e.props.children[c], s.dom); + } else if (k) + s?.dom && p( + u, + void 0, + !1, + !1, + s.dom + ), e.props.children[c] = u; + else { + y(l, u, c), s?.dom && A(e.props.children[c], s.dom); + const m = Math.max( + e.props.children.length, + t.props.children.length + ); + m < n && (n = m, c--); + } + G = !0; + } +} +typeof process < "u" && process.env.NODE_ENV === "test" && (module.exports = { + createFiber: F, + commitDeletion: _, + commitFiber: p, + updateFiber: pe, + deepCompareFibers: ae, + deepEqual: T +}); +let Q = !1; +const Y = /* @__PURE__ */ new Set(), Z = /* @__PURE__ */ new Set(), $ = /* @__PURE__ */ new WeakMap(), O = /* @__PURE__ */ new WeakMap(); +function Ke(e) { + Y.add(e), Q || (Q = !0, queueMicrotask(() => { + Y.forEach((t) => { + const n = t(); + if (Z.has(n)) + return; + Z.add(n), n.__cleanup && typeof n.__cleanup == "function" && (n.__cleanup(), n.__cleanup = null); + const r = n(); + if (typeof r == "function" && (n.__cleanup = r), $.has(n)) { + const o = $.get(n); + o && pe(o, r); } - } else if (!nextChild && prevChild) { - commitDeletion(prevChild, true); - prev.props.children.splice(i, 1); - len = prev.props.children.length; - i--; - } else { - if (isReused) { - const { fiber } = newMap[nextKey]; - commitDeletion(prevChild, true); - ToCommitDeletion = true; - prev.props.children[i] = fiber; - updateNode(fiber, nextChild, i); - if (parent == null ? void 0 : parent.dom) applyFiber(prev.props.children[i], parent.dom); - } else { - if (isUsedLater || isUsedPreviously) { - if (parent == null ? void 0 : parent.dom) - commitFiber( - nextChild, - void 0, - false, - false, - parent.dom - ); - prev.props.children[i] = nextChild; - } else { - updateNode(prevChild, nextChild, i); - if (parent == null ? void 0 : parent.dom) - applyFiber(prev.props.children[i], parent.dom); - const newLen = Math.max( - prev.props.children.length, - next.props.children.length - ); - if (newLen < len) { - len = newLen; - i--; - } - } + if (O.has(n)) { + const o = O.get(n); + o && n.__propName && $e(n.__propName, o, r); } - } - ToCommitDeletion = true; - } + }), Z.clear(), Y.clear(), Q = !1; + })); } -if (typeof process !== "undefined" && process.env.NODE_ENV === "test") { - module.exports = { - createFiber, - commitDeletion, - commitFiber, - updateFiber, - deepCompareFibers, - deepEqual - }; +function Qe(e, t) { + $.set(e, t); } -let scheduled = false; -const batch = /* @__PURE__ */ new Set(); -const depset = /* @__PURE__ */ new Set(); -const reactiveFiberMap = /* @__PURE__ */ new WeakMap(); -const domAttributeMap = /* @__PURE__ */ new WeakMap(); -function batchUpdate(cb) { - batch.add(cb); - if (!scheduled) { - scheduled = true; - queueMicrotask(() => { - batch.forEach((fn) => { - const dep = fn(); - if (depset.has(dep)) { - return; - } - depset.add(dep); - if (dep.__cleanup && typeof dep.__cleanup === "function") { - dep.__cleanup(); - dep.__cleanup = null; - } - const val = dep(); - if (typeof val === "function") { - dep.__cleanup = val; - } - if (reactiveFiberMap.has(dep)) { - const fiber = reactiveFiberMap.get(dep); - if (fiber) { - updateFiber(fiber, val); - } - } - if (domAttributeMap.has(dep)) { - const dom = domAttributeMap.get(dep); - if (dom && dep.__propName) { - updateDomProp(dep.__propName, dom, val); - } - } - }); - depset.clear(); - batch.clear(); - scheduled = false; - }); +function Ye(e, t) { + O.set(e, t); +} +function Ze(e) { + O.delete(e); + const t = e.__signals; + if (t) { + for (const n of t) + n.removeDep(e); + e.__signals = null; } } -function setReactiveFunction(fn, fiber) { - reactiveFiberMap.set(fn, fiber); +function Je(e) { + $.delete(e); + const t = e.__signals; + if (t) { + for (const n of t) + n.removeDep(e); + e.__signals = null; + } +} +const Ve = [ + "push", + "pop", + "unshift", + "shift", + "splice", + "fill", + "copyWithin", + "sort", + "reverse" +]; +function le(e) { + return Ve.includes(String(e)); } -function setReactiveAttributes(fn, dom) { - domAttributeMap.set(fn, dom); +// @ts-expect-error +process.env.NODE_ENV; +function J(e) { + return { + get value() { + return e.value; + }, + update: e.update.bind(e) + }; } -function clearReactiveAttributes(fn) { - domAttributeMap.delete(fn); - const signals = fn.__signals; - if (signals) { - for (const signal of signals) { - signal.removeDep(fn); +const de = (e, t) => new Proxy(e, { + get: (n, r) => { + const o = n[r]; + if (typeof o == "function") { + if (le(r) && !t.updateCalled) + throw new Error( + "Cannot set a value on an array signal, use the update method for updating the array." + ); + return (...i) => { + const s = o.apply(n, i); + return le(r) && t.notify(), s; + }; } - fn.__signals = null; + return o; + }, + set: (n, r, o) => { + if (!t.updateCalled) + throw new Error( + "Cannot set a value on an array signal, use the update method for updating the array." + ); + return n[r] = o, t.notify(), !0; } +}); +let C = null, d = null; +function he(e) { + d = e; } -function clearReactiveFunction(fn) { - reactiveFiberMap.delete(fn); - const signals = fn.__signals; - if (signals) { - for (const signal of signals) { - signal.removeDep(fn); - } - fn.__signals = null; - } +function ye() { + d = null; } -let currentReactiveFunction = null; -let currentEffect = null; -function addSignalToReactiveFunction(signal) { - if (!currentReactiveFunction.__signals) { - currentReactiveFunction.__signals = /* @__PURE__ */ new Set(); - } - currentReactiveFunction.__signals.add(signal); +function ge(e) { + C = e; +} +function me() { + C = null; } -function addSignalToEffect(signal) { - if (!currentEffect.__signals) currentEffect.__signals = /* @__PURE__ */ new Set(); - currentEffect.__signals.add(signal); +function je(e) { + C.__signals || (C.__signals = /* @__PURE__ */ new Set()), C.__signals.add(e); } -function reactive(fn) { - var _a; - if (typeof fn !== "function") +function Be(e) { + d.__signals || (d.__signals = /* @__PURE__ */ new Set()), d.__signals.add(e); +} +function xe(e) { + if (typeof e != "function") throw new Error("reactive takes a render function as the argument"); - currentReactiveFunction = fn; - const retVal = fn(); - currentReactiveFunction = null; - if (!isPrimitive(retVal) && isPlainObject(retVal) && !retVal.type && !retVal.props && !((_a = retVal.props) == null ? void 0 : _a.children)) + ge(e); + const t = e(); + if (me(), !M(t) && N(t) && !t.type && !t.props && !t.props?.children) throw new Error( - "Reactive value must be primitive or functional component, got: " + typeof retVal + "Reactive value must be primitive or functional component, got: " + typeof t ); - return retVal; + return t; } -function reactiveAttribute(fn) { - if (typeof fn !== "function") +function ve(e) { + if (typeof e != "function") throw new Error("reactive takes a render function as the argument"); - currentReactiveFunction = fn; - const retVal = fn(); - currentReactiveFunction = null; - return retVal; + ge(e); + const t = e(); + return me(), t; } -function createEffect(fn) { - if (typeof fn !== "function") +function st(e) { + if (typeof e != "function") throw new Error("createEffect takes a effect function as the argument"); - addEffect(fn); - if (!getCurrentFC()) runEffect(fn); -} -function runEffect(effect, fiber) { - if (typeof effect !== "function") return; - currentEffect = effect; - const effectCleanup = effect(); - if (currentEffect.__signals && typeof effectCleanup === "function") { - currentEffect.__cleanup = effectCleanup; - } - if (!currentEffect.__signals && effectCleanup && typeof effectCleanup === "function") { - if (!fiber) { - cleanUp(effectCleanup); - } else { - cleanUpWFiber(effectCleanup, fiber); - } - } - currentEffect = null; + Se(e), Fe() || we(e); } -function computed(fn) { - if (typeof fn !== "function") +function we(e, t) { + if (typeof e != "function") return; + he(e); + const n = e(); + d.__signals && typeof n == "function" && (d.__cleanup = n), !d.__signals && n && typeof n == "function" && (t ? rt(n, t) : nt(n)), ye(); +} +function lt(e) { + if (typeof e != "function") throw new Error("computed takes a function as the argument"); - let firstRun = getCurrentFC() !== null; - currentEffect = () => { - if (firstRun) { - firstRun = false; + let t = Fe() !== null; + he(() => { + if (t) { + t = !1; return; } - signal.update(fn()); - }; - addEffect(currentEffect); - const val = fn(); - const signal = createSignal(val); - currentEffect = null; - return { + r.update(e()); + }), Se(d); + const n = e(), r = H(n); + return ye(), { get value() { - return signal.value; + return r.value; } }; } -function createPromise(fn) { - if (typeof fn !== "function") +function ct(e) { + if (typeof e != "function") throw new Error("createPromise takes a function as the argument"); - const promise = fn(); - if (!(promise instanceof Promise)) { + const t = e(); + if (!(t instanceof Promise)) throw new Error( "createPromise takes a function that returns a promise" ); - } - const triggerSignal = createSignal({ + const n = H({ status: "pending", data: null, error: null }); - promise.then((val) => { - triggerSignal.update((prev) => { - prev.data = val; - prev.status = "resolved"; + return t.then((r) => { + n.update((o) => { + o.data = r, o.status = "resolved"; }); - }).catch((err) => { - triggerSignal.update((prev) => { - prev.error = err; - prev.status = "rejected"; + }).catch((r) => { + n.update((o) => { + o.error = r, o.status = "rejected"; }); - }); - return { + }), { get value() { - return triggerSignal.value; + return n.value; } }; } -class Ref { - constructor(val) { - this.current = val; +class te { + constructor(t) { + this.current = t; } } -function createRef() { - const ref = new Ref(null); - return ref; +function ut() { + return new te(null); } -const MutatingMethods = [ - "push", - "pop", - "unshift", - "shift", - "splice", - "fill", - "copyWithin", - "sort", - "reverse" -]; -class BaseSignal { - constructor(val) { - this.isNotified = false; - this._val = val; - this.deps = /* @__PURE__ */ new Set(); +class L { + constructor(t) { + this.isNotified = !1, this._val = t, this.deps = /* @__PURE__ */ new Set(); } notify() { - if (this.isNotified) return; - if (this.deps.size !== 0) this.isNotified = true; - this.deps.forEach((dep) => { - batchUpdate(() => { - this.isNotified = false; - return dep; - }); - }); + this.isNotified || (this.deps.size !== 0 && (this.isNotified = !0), this.deps.forEach((t) => { + Ke(() => (this.isNotified = !1, t)); + })); } - removeDep(fn) { - this.deps.delete(fn); + removeDep(t) { + this.deps.delete(t); } clearDeps() { this.deps.clear(); } -} -class PrimitiveSignal extends BaseSignal { - constructor(val) { - if (!isPrimitive(val)) { - throw new Error( - "Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]" - ); - } - super(val); - } get value() { - if (currentEffect) { - this.deps.add(currentEffect); - addSignalToEffect(this); - } - if (currentReactiveFunction) { - this.deps.add(currentReactiveFunction); - addSignalToReactiveFunction(this); - } - return this._val; + return d && (this.deps.add(d), Be(this)), C && (this.deps.add(C), je(this)), this._val; } - update(val) { - if (typeof val === "function") { - const newVal = val(this._val); - if (!isPrimitive(newVal)) { - throw new Error( - "Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]" - ); - } - if (newVal === this._val) return; - this._val = newVal; - this.notify(); +} +class be extends L { + constructor(t) { + super(t); + } + update(t) { + if (typeof t == "function") { + const n = t(this._val); + if (n === this._val) return; + this._val = n, this.notify(); } else { - if (!isPrimitive(val)) { - throw new Error( - "Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]" - ); - } - if (val === this._val) return; - this._val = val; - this.notify(); + if (t === this._val) return; + this._val = t, this.notify(); } } } -class ArraySignal extends BaseSignal { - constructor(val) { - if (!Array.isArray(val)) { - throw new Error( - "Invalid type for ArraySignal; value must be an array" - ); - } - super(val); - this.updateCalled = false; - this._val = this.createProxy(val); +class et extends L { + constructor(t) { + super(t), this.updateCalled = !1, this._val = this.createProxy(t); } - createProxy(val) { - return new Proxy(val, { - get: (target, prop) => { - const value = target[prop]; - if (typeof value === "function") { - if (MutatingMethods.includes(String(prop)) && !this.updateCalled) { - throw new Error( - "Cannot set a value on an array signal, use the update method for updating the array." - ); - } - return (...args) => { - const result = value.apply(target, args); - if (MutatingMethods.includes(String(prop))) { - this.notify(); - } - return result; - }; - } - return value; - }, - set: (target, prop, newValue) => { - if (!this.updateCalled) { - throw new Error( - "Cannot set a value on an array signal, use the update method for updating the array." - ); - } - target[prop] = newValue; - this.notify(); - return true; - } - }); - } - get value() { - if (currentEffect) { - this.deps.add(currentEffect); - addSignalToEffect(this); - } - if (currentReactiveFunction) { - this.deps.add(currentReactiveFunction); - addSignalToReactiveFunction(this); - } - return this._val; + createProxy(t) { + return de(t, this); } - update(val) { - this.updateCalled = true; - if (typeof val === "function") { - val(this._val); - } else { - if (!Array.isArray(val)) { - throw new Error( - "Invalid type for ArraySignal; value must be an array" - ); - } - if (val === this._val) return; - this._val = this.createProxy(val); - this.notify(); + update(t) { + if (this.updateCalled = !0, typeof t == "function") + t(this._val); + else { + if (t === this._val) return; + this._val = this.createProxy(t), this.notify(); } - this.updateCalled = false; + this.updateCalled = !1; } } -class ObjectSignal extends BaseSignal { - constructor(val) { - if (!isPlainObject(val)) { - throw new Error( - "Invalid type for ObjectSignal; value must be a plain object" - ); - } - super(val); - this.updateCalled = false; - this._val = this.createProxy(val); +class tt extends L { + constructor(t) { + N(t), super(t), this.updateCalled = !1, this._val = this.createProxy(t); } - createInternalArrayProxy(val) { - return new Proxy(val, { - get: (target, prop) => { - const value = target[prop]; - if (typeof value === "function") { - if (!this.updateCalled && MutatingMethods.includes(String(prop))) { - throw new Error( - "Cannot set a value on an object signal, use the update method for updating the object." - ); - } - return (...args) => { - const result = value.apply(target, args); - if (MutatingMethods.includes(String(prop))) { - this.notify(); - } - return result; - }; - } - return value; - }, - set: (target, prop, newValue) => { - if (!this.updateCalled) { - throw new Error( - "Cannot set a value on an object signal, use the update method for updating the object." - ); - } - target[prop] = newValue; - this.notify(); - return true; - } - }); + createInternalArrayProxy(t) { + return de(t, this); } - createProxy(val) { - return new Proxy(val, { - get: (target, prop) => { - const value = target[prop]; - if (Array.isArray(value)) { - target[prop] = this.createInternalArrayProxy(value); - return target[prop]; - } - return value; - }, - set: (target, prop, newValue) => { - if (!this.updateCalled) { - throw new Error( - "Cannot set a value on an object signal, use the update method for updating the object." - ); - } - if (typeof newValue === "function") return false; - if (typeof newValue === "object" && newValue !== null) { - newValue = this.createProxy(newValue); - } - if (newValue === target[prop]) return true; - target[prop] = newValue; - this.notify(); - return true; + createProxy(t) { + return new Proxy(t, { + get: (n, r) => { + const o = n[r]; + return Array.isArray(o) ? (n[r] = this.createInternalArrayProxy(o), n[r]) : o; }, - deleteProperty: (target, prop) => { - const result = delete target[prop]; - this.notify(); - return result; + set: (n, r, o) => (this.updateCalled, typeof o == "function" ? !1 : (typeof o == "object" && o !== null && (o = this.createProxy(o)), o === n[r] || (n[r] = o, this.notify()), !0)), + deleteProperty: (n, r) => { + const o = delete n[r]; + return this.notify(), o; } }); } - get value() { - if (currentEffect) { - this.deps.add(currentEffect); - addSignalToEffect(this); - } - if (currentReactiveFunction) { - this.deps.add(currentReactiveFunction); - addSignalToReactiveFunction(this); + update(t) { + if (this.updateCalled = !0, typeof t == "function") + t(this._val); + else { + if (N(t), t === this._val) return; + this._val = this.createProxy(t), this.notify(); } - return this._val; - } - update(val) { - this.updateCalled = true; - if (typeof val === "function") { - val(this._val); - } else { - if (!isPlainObject(val)) { - throw new Error( - "Invalid type for ObjectSignal; value must be a plain object" - ); - } - if (val === this._val) return; - this._val = this.createProxy(val); - this.notify(); - } - this.updateCalled = false; + this.updateCalled = !1; } } -function createSignal(val) { - if (typeof val === "function") { - throw new Error("Functions cannot be used as signal value"); - } - if (typeof val === "object" && val !== null) { - if (Array.isArray(val)) { - const signal = new ArraySignal(val); - addSignal(signal); - return { - get value() { - return signal.value; - }, - update: signal.update.bind(signal) - }; - } else if (isPlainObject(val)) { - const signal = new ObjectSignal(val); - addSignal(signal); - return { - get value() { - return signal.value; - }, - update: signal.update.bind(signal) - }; - } else { - throw new Error( - "Invalid type for signal initialization: " + typeof val - ); +function H(e) { + if (typeof e == "object" && e !== null) { + if (Array.isArray(e)) { + const t = new et(e); + return V(t), J(t); + } else if (N(e)) { + const t = new tt(e); + return V(t), J(t); } - } else if (isPrimitive(val)) { - const signal = new PrimitiveSignal(val); - addSignal(signal); - return { - get value() { - return signal.value; - }, - update: signal.update.bind(signal) - }; - } else { - throw new Error( - "Invalid type for signal initialization: " + typeof val - ); + } else if (M(e)) { + const t = new be(e); + return V(t), J(t); } } -let currentFC = null; -let fcMap = /* @__PURE__ */ new WeakMap(); -function setCurrentFC(fc) { - currentFC = fc; +let f = null, a = /* @__PURE__ */ new WeakMap(); +function _e(e) { + f = e; } -function clearCurrentFC() { - currentFC = null; +function Ee() { + f = null; } -function getCurrentFC() { - return currentFC; +function Fe() { + return f; } -function runAllEffects(FC) { - if (fcMap.has(FC)) { - const fcData = fcMap.get(FC); - for (const effect of fcData.effects) { - runEffect(effect, FC); - } - } -} -function cleanUp(fn) { - if (currentFC) { - if (fcMap.has(currentFC)) { - const fcData = fcMap.get(currentFC); - fcData.cleanup.push(fn); - } else { - fcMap.set(currentFC, { - signals: /* @__PURE__ */ new Set(), - cleanup: [fn], - effects: /* @__PURE__ */ new Set() - }); - } - } -} -function cleanUpWFiber(fn, fiber) { - if (fiber) { - if (fcMap.has(fiber)) { - const fcData = fcMap.get(fiber); - fcData.cleanup.push(fn); - } else { - fcMap.set(fiber, { - signals: /* @__PURE__ */ new Set(), - cleanup: [fn], - effects: /* @__PURE__ */ new Set() - }); - } - } -} -function addEffect(fn) { - if (currentFC) { - if (fcMap.has(currentFC)) { - const fcData = fcMap.get(currentFC); - fcData.effects.add(fn); - } else { - const effects = /* @__PURE__ */ new Set(); - effects.add(fn); - fcMap.set(currentFC, { - signals: /* @__PURE__ */ new Set(), - cleanup: [], - effects - }); - } - } -} -function addSignal(signal) { - if (currentFC) { - if (fcMap.has(currentFC)) { - const fcData = fcMap.get(currentFC); - fcData.signals.add(signal); - } else { - const signals = /* @__PURE__ */ new Set(); - signals.add(signal); - fcMap.set(currentFC, { - signals, - cleanup: [], - effects: /* @__PURE__ */ new Set() - }); - } - } +function X() { + return { + signals: /* @__PURE__ */ new Set(), + cleanup: [], + effects: /* @__PURE__ */ new Set() + }; } -function cleanUpFC(currentFC2, props) { - const fcData = fcMap.get(currentFC2); - if (fcData) { - if (fcData.cleanup) { - for (const fn of fcData.cleanup) { - fn(); - } - } - fcData.cleanup = []; - for (const effect of fcData.effects) { - if (effect.__cleanup && typeof effect.__cleanup === "function") { - effect.__cleanup(); - } - if (effect.__signals) { - for (const signal of effect.__signals) { - signal.removeDep(effect); - } - } - delete effect.__signals; - delete effect.__cleanup; - } - fcData.signals.forEach((signal) => signal.clearDeps()); - fcData.signals.clear(); - } - fcMap.delete(currentFC2); -} -function lazy(importFn) { - let Component = null; - const load = (loading, error) => { - if (!Component) { - importFn().then((mod) => { - if (mod.default) { - if (typeof mod.default !== "function") { - throw new Error( - "Lazy-loaded component must be a functional component" - ); - } - Component = mod.default; - loading.update(false); - error.update(null); - } else { - error.update( - new Error( - "No default export found from lazy-loaded module" - ) +function Ce(e) { + if (a.has(e)) { + const t = a.get(e); + for (const n of t.effects) + we(n, e); + } +} +function nt(e) { + if (f) + if (a.has(f)) + a.get(f).cleanup.push(e); + else { + let t = X(); + t.cleanup.push(e), a.set(f, t); + } +} +function rt(e, t) { + if (t) + if (a.has(t)) + a.get(t).cleanup.push(e); + else { + let n = X(); + n.cleanup.push(e), a.set(t, n); + } +} +function Se(e) { + if (f) + if (a.has(f)) + a.get(f).effects.add(e); + else { + let t = X(); + t.effects.add(e), a.set(f, t); + } +} +function V(e) { + if (f) + if (a.has(f)) + a.get(f).signals.add(e); + else { + let t = X(); + t.signals.add(e), a.set(f, t); + } +} +function ot(e, t) { + const n = a.get(e); + if (n) { + if (n.cleanup) + for (const r of n.cleanup) + r(); + n.cleanup = []; + for (const r of n.effects) { + if (r.__cleanup && r.__cleanup(), r.__signals) + for (const o of r.__signals) + o.removeDep(r); + delete r.__signals, delete r.__cleanup; + } + n.signals.forEach((r) => r.clearDeps()), n.signals.clear(); + } + a.delete(e); +} +function at(e) { + let t = null; + const n = (r, o) => { + t ? (r.update(!1), o.update(null)) : e().then((i) => { + if (i.default) { + if (typeof i.default != "function") + throw new Error( + "Lazy-loaded component must be a functional component" ); - } - }).catch((err) => { - error.update(err); - loading.update(false); - }); - } else { - loading.update(false); - error.update(null); - } + t = i.default, r.update(!1), o.update(null); + } else + o.update( + new Error( + "No default export found from lazy-loaded module" + ) + ); + }).catch((i) => { + o.update(i), r.update(!1); + }); }; - return (props) => { - const loading = createSignal(true); - const error = createSignal(null); - load(loading, error); - const isValidNode = (val) => typeof val === "string" || val && typeof val === "object" && "props" in val && "type" in val; - if (props.fallback !== void 0 && !isValidNode(props.fallback)) { - throw new Error( - "Invalid fallback: Expected a string or a valid JSX node." - ); - } - if (props.errorFallback !== void 0 && !(typeof props.errorFallback === "function" || isValidNode(props.errorFallback))) { - throw new Error( - "Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node." - ); - } - return /* @__PURE__ */ createElement("FRAGMENT", null, () => loading.value ? props.fallback : error.value !== null ? props.errorFallback ? typeof props.errorFallback === "function" ? props.errorFallback(error.value) : props.errorFallback : "Unknown error occurred while lazy loading component, use errorFallback prop to override" : ( + return (r) => { + const o = H(!0), i = H(null); + return n(o, i), /* @__PURE__ */ ne("FRAGMENT", null, () => o.value ? r.fallback : i.value !== null ? r.errorFallback ? typeof r.errorFallback == "function" ? r.errorFallback(i.value) : r.errorFallback : "Unknown error occurred while lazy loading component, use errorFallback prop to override" : ( // @ts-expect-error - Component && /* @__PURE__ */ createElement(Component, { ...props }) + t && /* @__PURE__ */ ne(t, { ...r }) )); }; } export { - cleanUp, - computed, - createEffect, - createElement, - createPromise, - createRef, - createSignal, - lazy, - render + nt as cleanUp, + lt as computed, + st as createEffect, + ne as createElement, + ct as createPromise, + ut as createRef, + H as createSignal, + at as lazy, + it as render }; -//# sourceMappingURL=refract.es.js.map diff --git a/build/refract.es.js.map b/build/refract.es.js.map deleted file mode 100644 index db12c44..0000000 --- a/build/refract.es.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"refract.es.js","sources":["../src/utils/general.ts","../src/rendering/constants.ts","../src/lib.ts","../src/rendering/props.ts","../src/rendering/createElements.ts","../src/rendering/render.ts","../src/signals/batch.ts","../src/signals/signal.ts","../src/rendering/functionalComponents.ts","../src/lazy/Lazyloading.tsx"],"sourcesContent":["export function isPlainObject(variable: any) {\r\n return (\r\n typeof variable === \"object\" && // Must be an object\r\n variable !== null && // Cannot be null\r\n !Array.isArray(variable) && // Cannot be an array\r\n Object.prototype.toString.call(variable) === \"[object Object]\" // Must be a plain object\r\n );\r\n}\r\nexport function isPrimitive(val: any) {\r\n return (\r\n [\"boolean\", \"string\", \"number\", \"undefined\"].includes(typeof val) ||\r\n val === null ||\r\n val instanceof Error\r\n );\r\n}\r\n\r\nexport function swap(arr: any[], i: number, j: number) {\r\n const temp = arr[i];\r\n arr[i] = arr[j];\r\n arr[j] = temp;\r\n}\r\n","export const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\r\nexport const SVG_TAGS = new Set([\r\n \"svg\",\r\n \"a\",\r\n \"circle\",\r\n \"clipPath\",\r\n \"defs\",\r\n \"desc\",\r\n \"ellipse\",\r\n \"feBlend\",\r\n \"feColorMatrix\",\r\n \"feComponentTransfer\",\r\n \"feComposite\",\r\n \"feConvolveMatrix\",\r\n \"feDiffuseLighting\",\r\n \"feDisplacementMap\",\r\n \"feDistantLight\",\r\n \"feDropShadow\",\r\n \"feFlood\",\r\n \"feFuncA\",\r\n \"feFuncB\",\r\n \"feFuncG\",\r\n \"feFuncR\",\r\n \"feGaussianBlur\",\r\n \"feImage\",\r\n \"feMerge\",\r\n \"feMergeNode\",\r\n \"feMorphology\",\r\n \"feOffset\",\r\n \"fePointLight\",\r\n \"feSpecularLighting\",\r\n \"feSpotLight\",\r\n \"feTile\",\r\n \"feTurbulence\",\r\n \"filter\",\r\n \"foreignObject\",\r\n \"g\",\r\n \"image\",\r\n \"line\",\r\n \"linearGradient\",\r\n \"marker\",\r\n \"mask\",\r\n \"metadata\",\r\n \"path\",\r\n \"pattern\",\r\n \"polygon\",\r\n \"polyline\",\r\n \"radialGradient\",\r\n \"rect\",\r\n \"script\",\r\n \"set\",\r\n \"stop\",\r\n \"style\",\r\n \"switch\",\r\n \"symbol\",\r\n \"text\",\r\n \"textPath\",\r\n \"title\",\r\n \"tspan\",\r\n \"use\",\r\n \"view\",\r\n]);\r\nexport const MATH_TAGS = new Set([\r\n \"math\",\r\n \"maction\",\r\n \"maligngroup\",\r\n \"malignmark\",\r\n \"menclose\",\r\n \"merror\",\r\n \"mfenced\",\r\n \"mfrac\",\r\n \"mglyph\",\r\n \"mi\",\r\n \"mlabeledtr\",\r\n \"mlongdiv\",\r\n \"mmultiscripts\",\r\n \"mn\",\r\n \"mo\",\r\n \"mover\",\r\n \"mpadded\",\r\n \"mphantom\",\r\n \"mroot\",\r\n \"mrow\",\r\n \"ms\",\r\n \"mscarries\",\r\n \"mscarry\",\r\n \"msgroup\",\r\n \"msline\",\r\n \"mspace\",\r\n \"msqrt\",\r\n \"msrow\",\r\n \"mstack\",\r\n \"mstyle\",\r\n \"msub\",\r\n \"msup\",\r\n \"msubsup\",\r\n \"mtable\",\r\n \"mtd\",\r\n \"mtext\",\r\n \"mtr\",\r\n \"munder\",\r\n \"munderover\",\r\n]);\r\n\r\nexport const MATH_NAMESPACE = \"http://www.w3.org/1998/Math/MathML\";\r\n\r\nexport const CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\r\n","import { isPlainObject } from \"./utils/general\";\r\nexport const IS_NON_DIMENSIONAL =\r\n /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\r\n\r\nexport function styleObjectToString(\r\n style: Record\r\n): string {\r\n const newStyles: string[] = [];\r\n\r\n for (const key in style) {\r\n const value = style[key];\r\n const cssKey = key.replace(/([A-Z])/g, \"-$1\").toLowerCase(); // CamelCase to kebab-case\r\n\r\n if (typeof value != \"number\" || IS_NON_DIMENSIONAL.test(cssKey)) {\r\n newStyles.push(`${cssKey}: ${value};`); // Convert numbers to strings with px suffix\r\n } else {\r\n newStyles.push(`${cssKey}: ${value}px;`); // Convert numbers to strings with px suffix\r\n }\r\n }\r\n return newStyles.join(\" \");\r\n}\r\n\r\nexport function preprocessStyle(\r\n style: Record\r\n): Record {\r\n const processedStyle: Record = {};\r\n\r\n for (const key in style) {\r\n const value = style[key];\r\n // Handle nested styles\r\n if (typeof value === \"object\" && value !== null) {\r\n console.warn(`Nested styles not allowed for ${key}`);\r\n continue; // Skip nested styles\r\n }\r\n\r\n // Remove falsy values\r\n if (\r\n value === null ||\r\n value === undefined ||\r\n value === false ||\r\n value === \"\"\r\n ) {\r\n continue;\r\n }\r\n\r\n // Otherwise, add to processed style\r\n processedStyle[key] = value;\r\n }\r\n\r\n return processedStyle;\r\n}\r\n\r\nexport function isValidStyle(style: any) {\r\n return isPlainObject(style) || typeof style === \"string\";\r\n}\r\n\r\nexport function applyMoves(\r\n arr: T[],\r\n moves: Record\r\n): T[] {\r\n const n = arr.length;\r\n // Create an array for the final result (we use undefined as a marker)\r\n const result: (T | undefined)[] = new Array(n).fill(undefined);\r\n // Keep track of which indices in the original array are moved.\r\n const movedFrom = new Set();\r\n\r\n // First, place all moved elements at their target positions.\r\n // (For a swap both targets will be filled by the respective moves.)\r\n for (const key in moves) {\r\n const { from, to } = moves[key];\r\n // You can optionally ignore moves that are no-ops (from === to)\r\n if (from === to) continue;\r\n result[to] = arr[from];\r\n movedFrom.add(from);\r\n }\r\n\r\n // Next, fill in the \"gaps\" with the unmoved elements,\r\n // preserving their original order.\r\n let fillIndex = 0; // current position in `result` to fill\r\n for (let i = 0; i < n; i++) {\r\n // Skip any element that was moved.\r\n if (movedFrom.has(i)) continue;\r\n\r\n // Advance fillIndex until we find an empty slot in result.\r\n while (fillIndex < n && result[fillIndex] !== undefined) {\r\n fillIndex++;\r\n }\r\n if (fillIndex < n) {\r\n result[fillIndex] = arr[i];\r\n fillIndex++;\r\n }\r\n }\r\n\r\n return result as T[];\r\n}\r\n\r\n/**\r\n * Computes the indices of the longest increasing subsequence in the given array.\r\n * @param arr - An array of numbers.\r\n * @returns An array of indices representing the longest increasing subsequence.\r\n *\r\n * Time Complexity: O(n log n)\r\n */\r\nexport function longestIncreasingSubsequenceIndices(arr: number[]): number[] {\r\n const n = arr.length;\r\n const predecessors = new Array(n).fill(-1); // Track the previous index for each element in the subsequence.\r\n const lisIndices: number[] = []; // Stores indices of the smallest tail for all increasing subsequences of each length.\r\n\r\n for (let i = 0; i < n; i++) {\r\n const x = arr[i];\r\n\r\n // Binary search for the insertion point in lisIndices.\r\n let low = 0;\r\n let high = lisIndices.length;\r\n while (low < high) {\r\n const mid = Math.floor((low + high) / 2);\r\n if (arr[lisIndices[mid]] < x) {\r\n low = mid + 1;\r\n } else {\r\n high = mid;\r\n }\r\n }\r\n\r\n // If low is at the end, extend lisIndices; otherwise, update the tail value.\r\n if (low === lisIndices.length) {\r\n lisIndices.push(i);\r\n } else {\r\n lisIndices[low] = i;\r\n }\r\n\r\n // Set the predecessor of arr[i] (if low is not the start of a subsequence).\r\n predecessors[i] = low > 0 ? lisIndices[low - 1] : -1;\r\n }\r\n\r\n // Reconstruct the longest increasing subsequence using the predecessors.\r\n const lis: number[] = [];\r\n let k = lisIndices.length > 0 ? lisIndices[lisIndices.length - 1] : -1;\r\n for (let i = lisIndices.length - 1; i >= 0; i--) {\r\n lis[i] = k;\r\n k = predecessors[k];\r\n }\r\n return lis;\r\n}\r\n","import { isValidStyle, preprocessStyle, styleObjectToString } from \"../lib\";\r\nimport { setReactiveAttributes } from \"../signals/batch\";\r\nimport { reactiveAttribute } from \"../signals/signal\";\r\nimport { SVG_NAMESPACE } from \"./constants\";\r\n\r\nexport function setStyle(\r\n style: Record | string,\r\n dom: HTMLElement\r\n) {\r\n if (!isValidStyle(style))\r\n throw new Error(\"Style attribute must be a plain object or a string\");\r\n\r\n if (typeof style === \"string\") {\r\n dom.setAttribute(\"style\", style);\r\n } else {\r\n const processedStyle = preprocessStyle(style);\r\n\r\n dom.setAttribute(\"style\", styleObjectToString(processedStyle));\r\n }\r\n}\r\n\r\n// handles setting the reactive attributes returned from a reactiveFunction\r\nexport function setReactiveAttribute(\r\n reactiveFunction: any,\r\n name: string,\r\n dom: HTMLElement,\r\n namespace?: string\r\n) {\r\n reactiveFunction.__propName = name;\r\n // registers the function in corresponding signal\r\n const val = reactiveAttribute(reactiveFunction);\r\n if (val === null || val === undefined || val === false) {\r\n return;\r\n }\r\n\r\n setAttribute(name, val, dom, namespace);\r\n // track this using signals if the function depended on any signal\r\n if (reactiveFunction.__signals)\r\n setReactiveAttributes(reactiveFunction, dom);\r\n}\r\n\r\nconst CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\r\n\r\nexport function setAttribute(\r\n name: string,\r\n value: any,\r\n dom: HTMLElement,\r\n namespace?: string\r\n) {\r\n if (name == \"style\") {\r\n setStyle(value, dom);\r\n return;\r\n }\r\n if (name[0] === \"o\" && name[1] === \"n\" && typeof value === \"function\") {\r\n const useCapture = name != (name = name.replace(CAPTURE_REGEX, \"$1\"));\r\n\r\n if (\r\n name.toLowerCase() in dom ||\r\n name == \"onFocusOut\" ||\r\n name == \"onFocusIn\" ||\r\n name === \"onGotPointerCapture\" ||\r\n name === \"onLostPointerCapture\"\r\n )\r\n name = name.toLowerCase().slice(2);\r\n else name = name.slice(2);\r\n // handle eventListeners\r\n dom.addEventListener(name, value, useCapture);\r\n return;\r\n }\r\n\r\n if (namespace === SVG_NAMESPACE) {\r\n name = name.replace(/xlink(H|:h)/, \"h\").replace(/sName$/, \"s\");\r\n }\r\n // For certain properties that exist on the dom element,\r\n // attempt to set them directly.\r\n else if (\r\n name !== \"width\" &&\r\n name !== \"height\" &&\r\n name !== \"href\" &&\r\n name !== \"list\" &&\r\n name !== \"form\" &&\r\n name !== \"tabIndex\" &&\r\n name !== \"download\" &&\r\n name !== \"rowSpan\" &&\r\n name !== \"colSpan\" &&\r\n name !== \"role\" &&\r\n name !== \"popover\" &&\r\n name in dom\r\n ) {\r\n try {\r\n // Set the property directly on the DOM element.\r\n if (name === \"value\" && dom.tagName === \"SELECT\") {\r\n setTimeout(() => {\r\n dom[name] = value == null ? \"\" : value;\r\n });\r\n } else {\r\n dom[name] = value == null ? \"\" : value;\r\n }\r\n // console.log(dom[name], dom);\r\n\r\n // We simply return after setting the property.\r\n return;\r\n } catch (e) {\r\n // If setting the property fails, fall through to update attributes.\r\n }\r\n }\r\n\r\n if (value != null && (value !== false || name[4] === \"-\")) {\r\n // For most attributes, if the value is valid, set the attribute.\r\n // Special case: for \"popover\", if value is true, set attribute to an empty string.\r\n\r\n dom.setAttribute(\r\n name,\r\n name === \"popover\" && value === true ? \"\" : value\r\n );\r\n }\r\n}\r\n","import { isValidStyle, preprocessStyle, styleObjectToString } from \"../lib\";\r\nimport { setReactiveAttributes } from \"../signals/batch\";\r\nimport { reactive, reactiveAttribute, Ref } from \"../signals/signal\";\r\nimport {\r\n Fiber,\r\n FiberChildren,\r\n NodeType,\r\n Props,\r\n RenderFunction,\r\n} from \"../types\";\r\nimport { isPrimitive } from \"../utils/general\";\r\nimport {\r\n MATH_NAMESPACE,\r\n MATH_TAGS,\r\n SVG_NAMESPACE,\r\n SVG_TAGS,\r\n} from \"./constants\";\r\nimport { setAttribute, setReactiveAttribute } from \"./props\";\r\nexport const FRAGMENT_SYMBOL = Symbol(\"FRAGMENT\");\r\n\r\nexport function createElement(\r\n type: any,\r\n props: object | null,\r\n ...children: any[]\r\n): Fiber | FiberChildren {\r\n if (type === \"FRAGMENT\") {\r\n const fragments = createChildren(children);\r\n fragments[FRAGMENT_SYMBOL] = true;\r\n\r\n return fragments;\r\n }\r\n // @ts-expect-error\r\n return {\r\n type,\r\n props: {\r\n ...props,\r\n children: createChildren(children),\r\n },\r\n };\r\n}\r\n\r\nexport function createChildren(children: FiberChildren): FiberChildren {\r\n // @ts-expect-error\r\n return children\r\n .map((child) => {\r\n if (typeof child === \"object\") {\r\n if (Array.isArray(child)) {\r\n return createChildren(child);\r\n }\r\n if (child === null) {\r\n return createTextChildren(\"\");\r\n }\r\n if (!child.type || !child.props) {\r\n throw new Error(\r\n \"Invalid type for a dom node, found \" + child\r\n );\r\n }\r\n return child;\r\n } else if (typeof child === \"function\") {\r\n const val = reactive(child);\r\n if (isPrimitive(val)) {\r\n return createSignalChild(\r\n \"TEXT_CHILD\",\r\n {\r\n nodeValue:\r\n val !== undefined &&\r\n val !== null &&\r\n val !== false\r\n ? String(val)\r\n : \"\",\r\n children: [],\r\n },\r\n child\r\n );\r\n } else if (Array.isArray(val)) {\r\n // console.log(createChildren(val));\r\n const isFragment = val[FRAGMENT_SYMBOL];\r\n return createSignalChild(\r\n \"FRAGMENT\",\r\n { children: isFragment ? val : createChildren(val) },\r\n child\r\n );\r\n } else if (!val.type || !val.props) {\r\n throw new Error(\r\n \"Invalid type for a dom node, found \" + val\r\n );\r\n }\r\n return createSignalChild(val.type, val.props, child);\r\n } else {\r\n return createTextChildren(child);\r\n }\r\n })\r\n .flat();\r\n}\r\n\r\nexport function createTextChildren(text: any): Fiber {\r\n // @ts-expect-error\r\n return {\r\n type: \"TEXT_CHILD\",\r\n props: {\r\n nodeValue:\r\n text !== null && text !== undefined && text !== false\r\n ? String(text)\r\n : \"\",\r\n children: [],\r\n },\r\n };\r\n}\r\n\r\nfunction createSignalChild(\r\n type: NodeType,\r\n props: Props,\r\n renderFunction: RenderFunction\r\n) {\r\n return {\r\n type,\r\n renderFunction,\r\n props,\r\n };\r\n}\r\n\r\nfunction isProperty(key: string) {\r\n return key !== \"children\" && key !== \"key\" && key !== \"ref\";\r\n}\r\n\r\nexport function createNode(element: Fiber): HTMLElement | Text {\r\n let namespace: string | null = null;\r\n\r\n if (SVG_TAGS.has(element.type as string)) namespace = SVG_NAMESPACE;\r\n else if (MATH_TAGS.has(element.type as string)) namespace = MATH_NAMESPACE;\r\n\r\n const dom =\r\n element.type === \"TEXT_CHILD\"\r\n ? document.createTextNode(\"\")\r\n : namespace\r\n ? document.createElementNS(\r\n namespace,\r\n // @ts-expect-error\r\n element.type,\r\n element.props.is && element.props\r\n )\r\n : // @ts-expect-error\r\n document.createElement(element.type);\r\n\r\n if (!element.props) return dom as HTMLElement | Text;\r\n\r\n if (\r\n element.props.ref &&\r\n element.props.ref instanceof Ref &&\r\n dom instanceof HTMLElement\r\n ) {\r\n element.props.ref.current = dom;\r\n }\r\n\r\n for (const name in element.props) {\r\n if (!isProperty(name)) {\r\n continue;\r\n }\r\n const value = element.props[name];\r\n if (typeof value === \"function\" && name[0] !== \"o\" && name[1] !== \"n\") {\r\n // @ts-expect-error\r\n setReactiveAttribute(value, name, dom, namespace);\r\n } else {\r\n // @ts-expect-error\r\n setAttribute(name, value, dom, namespace);\r\n }\r\n }\r\n\r\n return dom as HTMLElement | Text;\r\n}\r\n\r\nexport function updateDomProp(\r\n prop: string,\r\n dom: HTMLElement | Text,\r\n value: any\r\n) {\r\n if (value == null || prop === \"key\") return;\r\n\r\n // @ts-expect-error\r\n setAttribute(prop, value, dom);\r\n}\r\n\r\nexport const FRAGMENT = \"FRAGMENT\";\r\n","import {\r\n clearReactiveAttributes,\r\n clearReactiveFunction,\r\n setReactiveFunction,\r\n} from \"../signals/batch\";\r\nimport { BaseSignal, Ref } from \"../signals/signal\";\r\nimport { Fiber, FiberChildren } from \"../types\";\r\nimport { isPrimitive } from \"../utils/general\";\r\nimport { CAPTURE_REGEX } from \"./constants\";\r\nimport {\r\n FRAGMENT_SYMBOL,\r\n createChildren,\r\n createNode,\r\n createTextChildren,\r\n} from \"./createElements\";\r\nimport {\r\n cleanUpFC,\r\n clearCurrentFC,\r\n runAllEffects,\r\n setCurrentFC,\r\n} from \"./functionalComponents\";\r\n\r\nexport function render(element: Fiber, container: HTMLElement) {\r\n rootContainer = container;\r\n const fragment = document.createDocumentFragment();\r\n rootFragment = fragment;\r\n const rootFiber: Fiber = {\r\n type: \"div\",\r\n props: {\r\n children: [element],\r\n },\r\n // @ts-expect-error\r\n dom: fragment,\r\n };\r\n // console.log(element.type(element.props));\r\n element.parent = rootFiber;\r\n elements.push(element);\r\n requestIdleCallback(workLoop);\r\n\r\n // container.appendChild(fragment);\r\n}\r\n\r\nfunction commitRootFragment() {\r\n if (rootFragment && rootContainer) {\r\n rootContainer.appendChild(rootFragment);\r\n // const endTime = performance.now();\r\n // console.log(`Render time: ${endTime - startTime}ms`);\r\n }\r\n}\r\n\r\nlet elements: Fiber[] = [];\r\nlet rootContainer: HTMLElement | null = null;\r\nlet rootFragment: DocumentFragment | null = null;\r\n// let startTime = -1;\r\nlet effectQueue: Fiber[] = [];\r\n\r\nfunction processEffectQueue() {\r\n for (let i = 0; i < effectQueue.length; i++) {\r\n const fiber = effectQueue[i];\r\n runAllEffects(fiber);\r\n }\r\n effectQueue.length = 0;\r\n}\r\n\r\nfunction workLoop(deadline: IdleDeadline) {\r\n // if (startTime === -1) startTime = performance.now();\r\n\r\n processEffectQueue();\r\n let shouldYield = false;\r\n while (elements.length > 0 && !shouldYield) {\r\n const element = elements.pop();\r\n renderNode(element!);\r\n shouldYield = deadline.timeRemaining() < 1;\r\n }\r\n\r\n if (elements.length == 0) {\r\n commitRootFragment();\r\n\r\n processEffectQueue();\r\n return;\r\n }\r\n requestIdleCallback(workLoop);\r\n}\r\n\r\nfunction renderNode(fiber: Fiber) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n const isArray = !fiber.props.children[FRAGMENT_SYMBOL];\r\n let noKey = false;\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n fiber.props.children[i].parent = fiber;\r\n\r\n if (\r\n isArray &&\r\n fiber.props.children[i].props.key === undefined &&\r\n fiber.renderFunction\r\n ) {\r\n noKey = true;\r\n }\r\n\r\n elements.push(fiber.props.children[i]);\r\n }\r\n if (noKey) {\r\n console.error(\"Array children must have a key attribute\");\r\n }\r\n // console.log(fiber.props.children);\r\n } else if (typeof fiber.type === \"function\") {\r\n setCurrentFC(fiber);\r\n\r\n const children = fiber.type(fiber.props);\r\n clearCurrentFC();\r\n\r\n if (Array.isArray(children)) {\r\n // which means that the FC returned a fragment\r\n // console.log(children);\r\n for (let i = children.length - 1; i >= 0; i--) {\r\n children[i].parent = fiber;\r\n elements.push(children[i]);\r\n }\r\n fiber.props.children = children;\r\n } else {\r\n children.parent = fiber;\r\n fiber.props.children.push(children);\r\n elements.push(children);\r\n }\r\n // queue to run its effects\r\n effectQueue.push(fiber);\r\n } else {\r\n if (!fiber.dom) fiber.dom = createNode(fiber);\r\n let fiberParent: Fiber | undefined = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n if (fiberParent) {\r\n fiberParent.dom?.appendChild(fiber.dom);\r\n }\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n fiber.props.children[i].parent = fiber;\r\n elements.push(fiber.props.children[i]);\r\n }\r\n }\r\n // console.log(fiber);\r\n setRenderFunction(fiber);\r\n}\r\n\r\nfunction createFiber(fiber: Fiber) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n const isFragment = fiber.props.children[FRAGMENT_SYMBOL];\r\n if (isFragment) {\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n createFiber(child);\r\n }\r\n } else {\r\n let noKey = false;\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n if (child.props.key === undefined) {\r\n noKey = true;\r\n }\r\n createFiber(child);\r\n }\r\n if (noKey) {\r\n console.error(\"Array children must have a key attribute\");\r\n }\r\n }\r\n } else if (typeof fiber.type !== \"function\") {\r\n for (const child of fiber.props.children) {\r\n child.parent = fiber;\r\n createFiber(child);\r\n }\r\n }\r\n // console.log(fiber);\r\n setRenderFunction(fiber);\r\n}\r\nfunction commitFiber(\r\n fiber: Fiber,\r\n referenceNode?: Node,\r\n replace?: boolean,\r\n needCreation?: boolean,\r\n customParent?: Node\r\n) {\r\n if (fiber.type === \"FRAGMENT\") {\r\n for (const child of fiber.props.children) {\r\n if (needCreation) child.parent = fiber;\r\n commitFiber(\r\n child,\r\n referenceNode,\r\n replace,\r\n needCreation,\r\n customParent\r\n );\r\n }\r\n } else if (typeof fiber.type === \"function\") {\r\n setCurrentFC(fiber);\r\n\r\n const children = fiber.type(fiber.props);\r\n clearCurrentFC();\r\n\r\n // console.log(\"commit FC\", children);\r\n if (Array.isArray(children)) {\r\n // which means that the FC returned a fragment\r\n // console.log(children);\r\n for (const child of children) {\r\n child.parent = fiber;\r\n commitFiber(child, referenceNode, replace, true, customParent);\r\n }\r\n fiber.props.children = children;\r\n } else {\r\n children.parent = fiber;\r\n fiber.props.children.push(children);\r\n commitFiber(children, referenceNode, replace, true, customParent);\r\n }\r\n // queue to run its effects at the end of current stack\r\n queueMicrotask(() => {\r\n runAllEffects(fiber);\r\n });\r\n } else {\r\n if (!fiber.dom) fiber.dom = createNode(fiber);\r\n\r\n if (referenceNode) {\r\n if (replace)\r\n referenceNode.parentElement?.replaceChild(\r\n fiber.dom,\r\n referenceNode\r\n );\r\n else\r\n referenceNode.parentElement?.insertBefore(\r\n fiber.dom,\r\n referenceNode\r\n );\r\n } else {\r\n let parentDom: Node | undefined = undefined;\r\n if (customParent) {\r\n parentDom = customParent;\r\n } else {\r\n let fiberParent: Fiber | undefined = fiber.parent;\r\n\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n parentDom = fiberParent?.dom;\r\n }\r\n parentDom?.appendChild(fiber.dom);\r\n }\r\n for (const child of fiber.props.children) {\r\n if (needCreation) child.parent = fiber;\r\n\r\n commitFiber(child, undefined, undefined, needCreation, fiber.dom);\r\n }\r\n }\r\n if (needCreation) {\r\n setRenderFunction(fiber);\r\n }\r\n}\r\n\r\nlet ToCommitDeletion = true;\r\n\r\nfunction commitDeletion(fiber: Fiber, toClearReactiveFunction?: boolean) {\r\n if (!fiber || !ToCommitDeletion) return;\r\n if (fiber.renderFunction) {\r\n if (toClearReactiveFunction)\r\n clearReactiveFunction(fiber.renderFunction);\r\n delete fiber.renderFunction;\r\n }\r\n if (fiber.dom) {\r\n for (const prop in fiber.props) {\r\n if (isEvent(prop)) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(CAPTURE_REGEX, \"$1\"));\r\n\r\n fiber.dom.removeEventListener(\r\n eventName,\r\n fiber.props[prop],\r\n useCapture\r\n );\r\n delete fiber.props[prop];\r\n } else if (typeof fiber.props[prop] === \"function\") {\r\n clearReactiveAttributes(fiber.props[prop]);\r\n } else if (prop === \"ref\" && fiber.props[prop] instanceof Ref) {\r\n fiber.props[prop].current = null;\r\n }\r\n }\r\n\r\n fiber.dom.remove();\r\n }\r\n if (typeof fiber.type === \"function\") {\r\n cleanUpFC(fiber, fiber.props);\r\n // @ts-expect-error\r\n delete fiber.type;\r\n }\r\n fiber.props.children.forEach((child) => commitDeletion(child, true));\r\n}\r\n\r\nfunction setRenderFunction(fiber: Fiber) {\r\n if (!fiber.renderFunction) return;\r\n setReactiveFunction(fiber.renderFunction, fiber);\r\n}\r\n\r\nexport function updateFiber(prevFiber: Fiber, newValue) {\r\n // console.log(\"Prev value\", prevFiber, newValue);\r\n // startTime = performance.now();\r\n if (isPrimitive(newValue)) {\r\n // console.log(fiber, newValue);\r\n const newFragment: Fiber = {\r\n ...createTextChildren(newValue),\r\n parent: prevFiber.parent,\r\n };\r\n createFiber(newFragment);\r\n // console.log(\"New Text Fiber\", newFragment);\r\n\r\n updateNode(prevFiber, newFragment);\r\n } else if (Array.isArray(newValue)) {\r\n const isFragment = newValue[FRAGMENT_SYMBOL];\r\n\r\n const newFragment: Fiber = {\r\n type: \"FRAGMENT\",\r\n props: {\r\n children: isFragment ? newValue : createChildren(newValue),\r\n },\r\n parent: prevFiber.parent,\r\n };\r\n\r\n createFiber(newFragment);\r\n updateNode(prevFiber, newFragment);\r\n } else {\r\n const newFragment = { ...newValue, parent: prevFiber.parent };\r\n createFiber(newFragment);\r\n // console.log(\"New Node Fiber\", newFragment);\r\n updateNode(prevFiber, newFragment);\r\n }\r\n // const endTime = performance.now();\r\n // console.log(\"Update Time:\", (endTime - startTime).toFixed(2), \"ms\");\r\n}\r\n\r\nfunction replaceRenderFunction(prev: Fiber, next: Fiber) {\r\n if (prev.renderFunction) {\r\n next.renderFunction = prev.renderFunction;\r\n // console.log(\"Replace render function\", prev, next);\r\n // deleteReactiveFunction(prev.renderFunction);\r\n setRenderFunction(next);\r\n }\r\n}\r\n\r\nfunction replaceChildFromParent(prev: Fiber, next: Fiber, index?: number) {\r\n if (index !== undefined) {\r\n prev.parent.props.children[index] = next;\r\n return;\r\n }\r\n prev.parent?.props.children.forEach((child, i) => {\r\n if (child === prev) {\r\n prev.parent.props.children[i] = next;\r\n }\r\n });\r\n}\r\n\r\nexport const isEvent = (key: string) =>\r\n key.startsWith(\"on\") || key == \"onFocusOut\" || key == \"onFocusIn\";\r\nexport const isProperty = (key: string) =>\r\n key !== \"children\" && !isEvent(key) && key !== \"key\" && key !== \"ref\";\r\nconst isNew = (prev: any, next: any, key: string) => prev[key] !== next[key];\r\nconst isGone = (prev: any, next: any, key: string) => !(key in next);\r\n\r\nfunction deepCompareFibers(fiberA: any, fiberB: any): boolean {\r\n // Fast path: identical references\r\n if (fiberA === fiberB) {\r\n return true;\r\n }\r\n\r\n // Compare the fiber types (e.g., function for FCs, string for DOM nodes)\r\n if (fiberA.type !== fiberB.type) {\r\n return false;\r\n }\r\n\r\n // Compare keys if they exist\r\n if (fiberA.props?.key !== fiberB.props?.key) {\r\n return false;\r\n }\r\n return deepEqual(fiberA.props, fiberB.props);\r\n}\r\n\r\nfunction deepEqual(objA: any, objB: any): boolean {\r\n if (objA === objB) {\r\n // console.log(\"Signal prop\");\r\n\r\n if (objA instanceof BaseSignal && objB instanceof BaseSignal)\r\n return deepEqual(objA.value, objB.value);\r\n if (Array.isArray(objA) && Array.isArray(objB)) {\r\n if (objA.length !== objB.length) return false;\r\n for (let i = 0; i < objA.length; i++) {\r\n if (!deepEqual(objA[i], objB[i])) return false;\r\n }\r\n }\r\n return true;\r\n } // Same reference or primitive value\r\n\r\n if (isPrimitive(objA) && isPrimitive(objB)) {\r\n return objA === objB; // One is not an object or is null\r\n }\r\n\r\n if (typeof objA !== typeof objB) return false;\r\n\r\n const keysA = Object.keys(objA);\r\n const keysB = Object.keys(objB);\r\n\r\n if (keysA.length !== keysB.length) return false; // Different number of keys\r\n\r\n for (let key of keysA) {\r\n if (key === \"children\") continue;\r\n if (!objB.hasOwnProperty(key)) return false; // Missing key in one of them\r\n if (!deepEqual(objA[key], objB[key])) return false; // Recurse for nested objects/arrays\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction findFirstDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n if (fiber.dom) return fiber.dom;\r\n\r\n for (const child of fiber.props.children) {\r\n const dom = findFirstDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\n// function findFirstChildDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n// if (!fiber) return;\r\n\r\n// for (const child of fiber.props.children) {\r\n// const dom = findFirstDom(child);\r\n// if (dom) return dom;\r\n// }\r\n// }\r\nfunction findLastDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n if (fiber.dom) return fiber.dom;\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n const child = fiber.props.children[i];\r\n const dom = findLastDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\nfunction findLastChildDom(fiber: Fiber): HTMLElement | Text | undefined {\r\n if (!fiber) return;\r\n\r\n for (let i = fiber.props.children.length - 1; i >= 0; i--) {\r\n const child = fiber.props.children[i];\r\n const dom = findLastDom(child);\r\n if (dom) return dom;\r\n }\r\n}\r\nfunction findParentFiberWithDom(fiber: Fiber): Fiber | undefined {\r\n if (!fiber) return;\r\n let fiberParent = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n return fiberParent;\r\n}\r\nfunction findNearestParentWithDom(fiber: Fiber): Fiber | undefined {\r\n if (!fiber) return;\r\n if (fiber.dom) return fiber;\r\n\r\n let fiberParent = fiber.parent;\r\n while (fiberParent && !fiberParent.dom) {\r\n fiberParent = fiberParent.parent;\r\n }\r\n return fiberParent;\r\n}\r\n\r\nfunction updateNode(\r\n prev: Fiber | undefined,\r\n next: Fiber | undefined,\r\n index?: number\r\n) {\r\n if (!prev && !next) return;\r\n\r\n if (prev && !next) {\r\n commitDeletion(prev, true);\r\n // console.log(\"to remove\", prev);\r\n prev.parent.props.children = prev.parent.props.children.filter(\r\n (child) => child !== prev\r\n );\r\n } else if (prev && next) {\r\n const prevProps = prev.props;\r\n const nextProps = next.props;\r\n if (prev.type === \"FRAGMENT\" || typeof prev.type === \"function\") {\r\n // PREV IS FRAGMENT\r\n if (next.type === \"FRAGMENT\" || typeof next.type === \"function\") {\r\n // console.log(\"Fragment-Fragment\", prev, next);\r\n if (\r\n typeof prev.type === typeof next.type &&\r\n typeof prev.type === \"function\"\r\n ) {\r\n const areSame = deepCompareFibers(prev, next);\r\n if (!areSame) {\r\n commitFiber(next, findFirstDom(prev), undefined, true);\r\n\r\n replaceRenderFunction(prev, next);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n }\r\n } else {\r\n // console.log(\"fragment-fragment\", { ...prev }, next);\r\n\r\n updateChildren(prev, next);\r\n }\r\n // replaceChildFromParent(prev, next);\r\n } else {\r\n next.parent = prev.parent;\r\n let firstChild: Fiber | undefined = prev.props.children[0];\r\n while (firstChild && !firstChild.dom)\r\n firstChild = firstChild.props.children[0];\r\n commitFiber(next, firstChild?.dom);\r\n\r\n replaceRenderFunction(prev, next);\r\n // removing all nodes of previous fragment\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n }\r\n } else {\r\n // PREV IS NODE\r\n\r\n const node = prev.dom;\r\n if (\r\n prev.type === \"TEXT_CHILD\" &&\r\n next.type === \"TEXT_CHILD\" &&\r\n !next.dom\r\n )\r\n next.dom = prev.dom;\r\n if (node === undefined) {\r\n // console.error(\"no node found\", prev, next);\r\n return;\r\n }\r\n // console.log(prev);\r\n if (next.type === \"FRAGMENT\" || typeof next.type === \"function\") {\r\n // console.log(\"Node-Fragment\");\r\n next.parent = prev.parent;\r\n replaceRenderFunction(prev, next);\r\n\r\n commitFiber(next, node);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n } else {\r\n // console.log(\"Node-Node\");\r\n // remove old properties and event listeners from NODE\r\n for (const prop in prevProps) {\r\n if (\r\n isProperty(prop) &&\r\n isGone(prevProps, nextProps, prop)\r\n ) {\r\n node[prop] = \"\";\r\n // console.log(\"property removed\", prop);\r\n } else if (\r\n isEvent(prop) &&\r\n (!(prop in nextProps) ||\r\n isNew(prevProps, nextProps, prop))\r\n ) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(\r\n CAPTURE_REGEX,\r\n \"$1\"\r\n ));\r\n\r\n node.removeEventListener(\r\n eventName,\r\n prevProps[prop],\r\n useCapture\r\n );\r\n // console.log(\"event listener removed\", prop);\r\n }\r\n }\r\n if (prev.type !== next.type) {\r\n // console.log(\"Different type\", prev, next);\r\n next.parent = prev.parent;\r\n\r\n replaceRenderFunction(prev, next);\r\n\r\n commitFiber(next, node, true);\r\n commitDeletion(prev);\r\n replaceChildFromParent(prev, next, index);\r\n\r\n // console.log(prev.parent);\r\n } else {\r\n // add new properties\r\n // console.log(\"same type\", prev, next);\r\n\r\n for (const prop in nextProps) {\r\n if (\r\n isProperty(prop) &&\r\n isNew(prevProps, nextProps, prop)\r\n ) {\r\n node[prop] = nextProps[prop];\r\n // console.log(\r\n // \"property added\",\r\n // prop,\r\n // nextProps[prop]\r\n // );\r\n prevProps[prop] = nextProps[prop];\r\n } else if (\r\n isEvent(prop) &&\r\n isNew(prevProps, nextProps, prop)\r\n ) {\r\n let eventName = prop.toLowerCase().substring(2);\r\n const useCapture =\r\n eventName !=\r\n (eventName = eventName.replace(\r\n CAPTURE_REGEX,\r\n \"$1\"\r\n ));\r\n node.addEventListener(\r\n eventName,\r\n nextProps[prop],\r\n useCapture\r\n );\r\n prevProps[prop] = nextProps[prop];\r\n }\r\n }\r\n updateChildren(prev, next);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction reconcileList(prev: Fiber, next: Fiber) {\r\n const oldFibers = prev.props.children;\r\n const newFibers = next.props.children;\r\n\r\n // Create a map from key to fiber for oldFibers.\r\n const oldMap: Record = {};\r\n for (let i = 0; i < oldFibers.length; i++) {\r\n const key = oldFibers[i].props.key;\r\n if (\r\n key === null ||\r\n key === undefined ||\r\n oldMap.hasOwnProperty(String(key))\r\n ) {\r\n // If any fiber is missing a key, we cannot reconcile.\r\n // oldFibers[i].props.key =\r\n return false;\r\n }\r\n oldMap[String(key)] = oldFibers[i];\r\n }\r\n const referenceNode = findLastChildDom(prev)?.nextSibling as\r\n | Node\r\n | undefined;\r\n // Create newChildren array based on newFibers order.\r\n const fiberParent = findParentFiberWithDom(prev);\r\n // const fragment = document.createDocumentFragment();\r\n\r\n if (newFibers.length === 0) {\r\n prev.props.children.length = 0;\r\n if (fiberParent?.dom instanceof HTMLElement)\r\n fiberParent.dom.innerHTML = \"\";\r\n return;\r\n }\r\n const prevLen = prev.props.children.length;\r\n\r\n // const newChildren = new Array(newFibers.length);\r\n for (let i = 0; i < newFibers.length; i++) {\r\n const newFiber = newFibers[i];\r\n const key = newFiber.props.key;\r\n const keyStr = String(key);\r\n // If the fiber exists in the old list, reuse it.\r\n if (oldMap.hasOwnProperty(keyStr)) {\r\n const oldFiber = oldMap[keyStr];\r\n\r\n if (prevLen > i) prev.props.children[i] = oldFiber;\r\n else prev.props.children.push(oldFiber);\r\n\r\n delete oldMap[keyStr];\r\n\r\n const newFiber = next.props.children[i];\r\n\r\n if (newFiber) newFiber.parent = prev;\r\n\r\n updateNode(oldFiber, newFiber, i);\r\n applyFiber(\r\n prev.props.children[i],\r\n fiberParent?.dom!,\r\n referenceNode\r\n );\r\n } else {\r\n // Otherwise, use the new fiber.\r\n // console.log(first)\r\n if (prevLen > i) prev.props.children[i] = newFiber;\r\n else prev.props.children.push(newFiber);\r\n\r\n newFiber.parent = prev;\r\n commitFiber(\r\n newFiber,\r\n referenceNode,\r\n false,\r\n false,\r\n fiberParent?.dom\r\n );\r\n }\r\n }\r\n for (const key in oldMap) {\r\n if (oldMap.hasOwnProperty(key)) {\r\n const fiber = oldMap[key];\r\n commitDeletion(fiber, true);\r\n }\r\n }\r\n while (prev.props.children.length > next.props.children.length) {\r\n prev.props.children.pop();\r\n }\r\n\r\n // fiberParent?.dom?.appendChild(fragment);\r\n}\r\n\r\nfunction applyFiber(fiber: Fiber, parent: Node, referenceNode?: Node) {\r\n if (fiber.dom) {\r\n if (fiber.dom === parent || fiber.dom === referenceNode) return;\r\n if (referenceNode) {\r\n parent.insertBefore(fiber.dom, referenceNode);\r\n } else parent.appendChild(fiber.dom);\r\n } else {\r\n for (const child of fiber.props.children) {\r\n applyFiber(child, parent, referenceNode);\r\n }\r\n }\r\n}\r\n\r\nfunction updateChildren(prev: Fiber, next: Fiber) {\r\n const isList =\r\n next.type === \"FRAGMENT\" && !next.props.children[FRAGMENT_SYMBOL];\r\n\r\n const wasList =\r\n prev.type === \"FRAGMENT\" && !prev.props.children[FRAGMENT_SYMBOL];\r\n\r\n // console.log(isList, wasList);\r\n\r\n if (isList && wasList) {\r\n const result = reconcileList(prev, next);\r\n if (result === false) {\r\n updateNonListChildrenWithKeys(prev, next);\r\n }\r\n } else {\r\n updateNonListChildrenWithKeys(prev, next);\r\n }\r\n if (next.type === \"FRAGMENT\" && next.props.children[FRAGMENT_SYMBOL]) {\r\n prev.props.children[FRAGMENT_SYMBOL] = true;\r\n } else {\r\n prev.props.children[FRAGMENT_SYMBOL] = false;\r\n }\r\n\r\n prev.type = next.type;\r\n}\r\n\r\nfunction updateNonListChildren(prev: Fiber, next: Fiber) {\r\n let len = Math.max(prev.props.children.length, next.props.children.length);\r\n\r\n for (let i = 0; i < len; i++) {\r\n let prevChild = prev.props.children[i];\r\n let nextChild = next.props.children[i];\r\n\r\n if (nextChild) nextChild.parent = prev;\r\n if (!prevChild && nextChild) {\r\n commitFiber(\r\n nextChild,\r\n // @ts-expect-error\r\n findLastDom(prev.props.children.at(-1))?.nextSibling\r\n );\r\n prev.props.children.push(nextChild);\r\n } else if (!nextChild && prevChild) {\r\n commitDeletion(prevChild, true);\r\n prev.props.children.splice(i, 1);\r\n len = prev.props.children.length;\r\n i--;\r\n } else {\r\n updateNode(prevChild, nextChild, i);\r\n const newLen = Math.max(\r\n prev.props.children.length,\r\n next.props.children.length\r\n );\r\n if (newLen < len) {\r\n len = newLen;\r\n i--;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction updateNonListChildrenWithKeys(prev: Fiber, next: Fiber) {\r\n let len = Math.max(prev.props.children.length, next.props.children.length);\r\n const oldMap: Record = {};\r\n let count = 0;\r\n for (let i = 0; i < prev.props.children.length; i++) {\r\n const key = prev.props.children[i].props.key;\r\n if (key === null || key === undefined) {\r\n continue;\r\n }\r\n count++;\r\n if (oldMap.hasOwnProperty(String(key))) {\r\n console.warn(\"Found two children with the same key\", key);\r\n console.warn(\r\n \"When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation\"\r\n );\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n oldMap[String(key)] = { fiber: prev.props.children[i], index: i };\r\n }\r\n if (count == 0) {\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n const newMap: Record<\r\n string,\r\n { fiber: Fiber; newIndex: number; oldIndex: number }\r\n > = {};\r\n\r\n for (let i = 0; i < next.props.children.length; i++) {\r\n const key = next.props.children[i].props.key;\r\n if (key === null || key === undefined) {\r\n continue;\r\n }\r\n const oldFiber = oldMap[String(key)];\r\n if (oldFiber) {\r\n if (newMap.hasOwnProperty(String(key))) {\r\n console.warn(\"Found two children with the same key\", key);\r\n console.warn(\r\n \"When two fibers are found having same key the whole children will default to manual updates, which can be slower than with key based reconciliation\"\r\n );\r\n updateNonListChildren(prev, next);\r\n return;\r\n }\r\n newMap[String(key)] = {\r\n fiber: oldFiber.fiber,\r\n newIndex: i,\r\n oldIndex: oldFiber.index,\r\n };\r\n }\r\n }\r\n // console.log(prev, next);\r\n const parent = findNearestParentWithDom(prev);\r\n\r\n for (let i = 0; i < len; i++) {\r\n let prevChild = prev.props.children[i];\r\n let nextChild = next.props.children[i];\r\n // console.log(prevChild, nextChild);\r\n\r\n const nextKey = nextChild?.props.key ? String(nextChild.props.key) : \"\";\r\n const isReused = newMap.hasOwnProperty(nextKey);\r\n\r\n let prevKey = prevChild?.props.key ? String(prevChild.props.key) : \"\";\r\n\r\n if (prevKey && nextKey && prevKey === nextKey) {\r\n // console.log(\"same\", prevChild, nextChild);\r\n updateNode(prevChild, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n continue;\r\n }\r\n\r\n const isUsedLater =\r\n newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex > i;\r\n const isUsedPreviously =\r\n newMap.hasOwnProperty(prevKey) && newMap[prevKey].newIndex < i;\r\n\r\n if (isUsedLater || isUsedPreviously) {\r\n ToCommitDeletion = false;\r\n }\r\n\r\n if (nextChild) nextChild.parent = prev;\r\n\r\n if (!prevChild && nextChild) {\r\n if (isReused) {\r\n const { fiber } = newMap[nextKey];\r\n\r\n prev.props.children.push(fiber);\r\n\r\n updateNode(fiber, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n } else {\r\n // needCreation just creates parent child heirarchy\r\n if (parent?.dom)\r\n commitFiber(nextChild, undefined, false, false, parent.dom);\r\n prev.props.children.push(nextChild);\r\n }\r\n } else if (!nextChild && prevChild) {\r\n commitDeletion(prevChild, true);\r\n prev.props.children.splice(i, 1);\r\n len = prev.props.children.length;\r\n i--;\r\n } else {\r\n if (isReused) {\r\n const { fiber } = newMap[nextKey];\r\n\r\n commitDeletion(prevChild, true);\r\n // because updateNode can call commitDeletion internally\r\n ToCommitDeletion = true;\r\n\r\n prev.props.children[i] = fiber;\r\n\r\n updateNode(fiber, nextChild, i);\r\n\r\n if (parent?.dom) applyFiber(prev.props.children[i], parent.dom);\r\n } else {\r\n // console.log(ToCommitDeletion);\r\n if (isUsedLater || isUsedPreviously) {\r\n if (parent?.dom)\r\n commitFiber(\r\n nextChild,\r\n undefined,\r\n false,\r\n false,\r\n parent.dom\r\n );\r\n prev.props.children[i] = nextChild;\r\n } else {\r\n updateNode(prevChild, nextChild, i);\r\n if (parent?.dom)\r\n applyFiber(prev.props.children[i], parent.dom);\r\n\r\n const newLen = Math.max(\r\n prev.props.children.length,\r\n next.props.children.length\r\n );\r\n if (newLen < len) {\r\n len = newLen;\r\n i--;\r\n }\r\n }\r\n }\r\n }\r\n ToCommitDeletion = true;\r\n }\r\n // console.log(prev.props.children, next.props.children);\r\n}\r\n\r\n// @ts-expect-error\r\nif (typeof process !== \"undefined\" && process.env.NODE_ENV === \"test\") {\r\n // @ts-expect-error\r\n module.exports = {\r\n createFiber,\r\n commitDeletion,\r\n commitFiber,\r\n updateFiber,\r\n deepCompareFibers,\r\n deepEqual,\r\n };\r\n}\r\n","import { updateDomProp } from \"../rendering/createElements\";\r\nimport { updateFiber } from \"../rendering/render\";\r\nimport { Fiber } from \"../types\";\r\n\r\nlet scheduled = false;\r\nconst batch = new Set();\r\nconst depset = new Set();\r\nconst reactiveFiberMap = new WeakMap();\r\nconst domAttributeMap = new WeakMap();\r\n\r\nexport function batchUpdate(cb: Function) {\r\n batch.add(cb);\r\n if (!scheduled) {\r\n scheduled = true;\r\n queueMicrotask(() => {\r\n // console.log(\"Current batch has: \", batch.size, \" Functions\");\r\n\r\n batch.forEach((fn) => {\r\n const dep = fn();\r\n if (depset.has(dep)) {\r\n return;\r\n }\r\n depset.add(dep);\r\n // effects and reactive nodes\r\n if (dep.__cleanup && typeof dep.__cleanup === \"function\") {\r\n dep.__cleanup();\r\n dep.__cleanup = null;\r\n }\r\n\r\n const val = dep();\r\n\r\n if (typeof val === \"function\") {\r\n dep.__cleanup = val;\r\n }\r\n // console.log(dep, \"dep\");\r\n if (reactiveFiberMap.has(dep)) {\r\n // for updating reactive nodes\r\n const fiber = reactiveFiberMap.get(dep);\r\n if (fiber) {\r\n // console.log(\"dep\", fiber);\r\n updateFiber(fiber, val);\r\n }\r\n }\r\n if (domAttributeMap.has(dep)) {\r\n // for updating reactive nodes\r\n const dom = domAttributeMap.get(dep);\r\n if (dom && dep.__propName) {\r\n updateDomProp(dep.__propName, dom, val);\r\n }\r\n }\r\n });\r\n depset.clear();\r\n batch.clear();\r\n scheduled = false;\r\n });\r\n }\r\n}\r\n\r\nexport function setReactiveFunction(fn: Function, fiber: Fiber) {\r\n reactiveFiberMap.set(fn, fiber);\r\n}\r\nexport function setReactiveAttributes(fn: Function, dom: HTMLElement | Text) {\r\n // console.log(\"reactive attrubite\", fn);\r\n domAttributeMap.set(fn, dom);\r\n}\r\nexport function clearReactiveAttributes(fn: any) {\r\n domAttributeMap.delete(fn);\r\n\r\n const signals = fn.__signals;\r\n if (signals) {\r\n for (const signal of signals) {\r\n signal.removeDep(fn);\r\n }\r\n fn.__signals = null;\r\n }\r\n}\r\n\r\nexport function clearReactiveFunction(fn: Function) {\r\n reactiveFiberMap.delete(fn);\r\n // @ts-expect-error\r\n const signals = fn.__signals;\r\n if (signals) {\r\n for (const signal of signals) {\r\n signal.removeDep(fn);\r\n }\r\n // @ts-expect-error\r\n fn.__signals = null;\r\n }\r\n}\r\n\r\nexport function deleteReactiveFunction(fn: Function) {\r\n reactiveFiberMap.delete(fn);\r\n}\r\n","import {\r\n addEffect,\r\n addSignal,\r\n cleanUp,\r\n cleanUpWFiber,\r\n getCurrentFC,\r\n} from \"../rendering/functionalComponents\";\r\nimport { Fiber } from \"../types\";\r\nimport { isPlainObject, isPrimitive } from \"../utils/general\";\r\nimport { batchUpdate } from \"./batch\";\r\n\r\nlet currentReactiveFunction: any = null;\r\nlet currentEffect: any = null;\r\n\r\nfunction addSignalToReactiveFunction(signal: any) {\r\n if (!currentReactiveFunction.__signals) {\r\n currentReactiveFunction.__signals = new Set();\r\n }\r\n currentReactiveFunction.__signals.add(signal);\r\n}\r\nfunction addSignalToEffect(signal: any) {\r\n if (!currentEffect.__signals) currentEffect.__signals = new Set();\r\n currentEffect.__signals.add(signal);\r\n}\r\n\r\nexport function reactive(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"reactive takes a render function as the argument\");\r\n\r\n currentReactiveFunction = fn;\r\n const retVal = fn();\r\n currentReactiveFunction = null;\r\n if (\r\n !isPrimitive(retVal) &&\r\n isPlainObject(retVal) &&\r\n !retVal.type &&\r\n !retVal.props &&\r\n !retVal.props?.children\r\n )\r\n throw new Error(\r\n \"Reactive value must be primitive or functional component, got: \" +\r\n typeof retVal\r\n );\r\n return retVal;\r\n}\r\nexport function reactiveAttribute(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"reactive takes a render function as the argument\");\r\n\r\n currentReactiveFunction = fn;\r\n const retVal = fn();\r\n currentReactiveFunction = null;\r\n\r\n return retVal;\r\n}\r\nexport function createEffect(fn: Function) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"createEffect takes a effect function as the argument\");\r\n\r\n addEffect(fn);\r\n if (!getCurrentFC()) runEffect(fn);\r\n}\r\n\r\nexport function runEffect(effect: Function, fiber?: Fiber) {\r\n if (typeof effect !== \"function\") return;\r\n\r\n currentEffect = effect;\r\n\r\n const effectCleanup = effect();\r\n\r\n if (currentEffect.__signals && typeof effectCleanup === \"function\") {\r\n currentEffect.__cleanup = effectCleanup;\r\n }\r\n\r\n if (\r\n !currentEffect.__signals &&\r\n effectCleanup &&\r\n typeof effectCleanup === \"function\"\r\n ) {\r\n // which means this effect does not have any signals associated with so its just a cleanup function that we need to call when the component unmounts\r\n if (!fiber) {\r\n cleanUp(effectCleanup);\r\n } else {\r\n cleanUpWFiber(effectCleanup, fiber);\r\n }\r\n }\r\n\r\n currentEffect = null;\r\n}\r\n\r\nfunction computed>(\r\n fn: () => T\r\n) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"computed takes a function as the argument\");\r\n\r\n let firstRun = getCurrentFC() !== null;\r\n currentEffect = () => {\r\n if (firstRun) {\r\n firstRun = false;\r\n return;\r\n }\r\n signal.update(fn());\r\n };\r\n\r\n addEffect(currentEffect);\r\n\r\n const val = fn();\r\n\r\n // @ts-expect-error - Type assertion for signal\r\n const signal = createSignal(val);\r\n\r\n currentEffect = null;\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n };\r\n}\r\n\r\ntype PromiseOverload =\r\n | { status: \"pending\"; data: null; error: null }\r\n | { status: \"resolved\"; data: T; error: null }\r\n | { status: \"rejected\"; data: null; error: Error };\r\n\r\nexport function createPromise(fn: () => Promise) {\r\n if (typeof fn !== \"function\")\r\n throw new Error(\"createPromise takes a function as the argument\");\r\n const promise = fn();\r\n\r\n if (!(promise instanceof Promise)) {\r\n throw new Error(\r\n \"createPromise takes a function that returns a promise\"\r\n );\r\n }\r\n const triggerSignal = createSignal>({\r\n status: \"pending\",\r\n data: null,\r\n error: null,\r\n });\r\n\r\n promise\r\n .then((val) => {\r\n triggerSignal.update((prev) => {\r\n prev.data = val;\r\n prev.status = \"resolved\";\r\n });\r\n })\r\n .catch((err) => {\r\n triggerSignal.update((prev) => {\r\n prev.error = err;\r\n prev.status = \"rejected\";\r\n });\r\n });\r\n\r\n return {\r\n get value() {\r\n return triggerSignal.value;\r\n },\r\n };\r\n}\r\n\r\nexport class Ref {\r\n current: T | null;\r\n constructor(val: T | null) {\r\n this.current = val;\r\n }\r\n}\r\n\r\nexport function createRef() {\r\n const ref = new Ref(null);\r\n return ref;\r\n}\r\n\r\n// const NonMutatingArrayMethods = [\r\n// \"constructor\",\r\n// \"concat\",\r\n// \"every\",\r\n// \"filter\",\r\n// \"find\",\r\n// \"findIndex\",\r\n// \"flat\",\r\n// \"flatMap\",\r\n// \"forEach\",\r\n// \"includes\",\r\n// \"indexOf\",\r\n// \"join\",\r\n// \"map\",\r\n// \"reduce\",\r\n// \"reduceRight\",\r\n// \"slice\",\r\n// \"some\",\r\n// \"toLocaleString\",\r\n// \"toString\",\r\n// ];\r\nconst MutatingMethods = [\r\n \"push\",\r\n \"pop\",\r\n \"unshift\",\r\n \"shift\",\r\n \"splice\",\r\n \"fill\",\r\n \"copyWithin\",\r\n \"sort\",\r\n \"reverse\",\r\n];\r\n\r\ntype DeepReadonly = {\r\n readonly [K in keyof T]: T[K] extends object ? DeepReadonly : T[K];\r\n};\r\n\r\n/**\r\n *\r\n * Base class for signals.\r\n */\r\nexport abstract class BaseSignal {\r\n protected _val: T;\r\n protected deps: Set;\r\n protected isNotified: boolean = false;\r\n\r\n constructor(val: T) {\r\n this._val = val;\r\n this.deps = new Set();\r\n }\r\n\r\n protected notify() {\r\n if (this.isNotified) return;\r\n\r\n if (this.deps.size !== 0) this.isNotified = true;\r\n\r\n this.deps.forEach((dep) => {\r\n batchUpdate(() => {\r\n // Reset the flag before calling the dependency\r\n this.isNotified = false;\r\n return dep;\r\n });\r\n });\r\n }\r\n\r\n public removeDep(fn: Function) {\r\n this.deps.delete(fn);\r\n }\r\n\r\n public clearDeps() {\r\n this.deps.clear();\r\n }\r\n\r\n abstract get value(): T | DeepReadonly;\r\n\r\n abstract update(val: T | ((prev: T) => T)): void;\r\n}\r\n\r\ntype NormalSignal = boolean | string | number | undefined | null | Error;\r\n/**\r\n * Signal for primitive types.\r\n */\r\nexport class PrimitiveSignal extends BaseSignal {\r\n constructor(val: T) {\r\n if (!isPrimitive(val)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n super(val);\r\n }\r\n\r\n get value(): T {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n\r\n addSignalToReactiveFunction(this);\r\n }\r\n // (Optional) debug logging:\r\n // console.log(this.deps);\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => T)) {\r\n if (typeof val === \"function\") {\r\n const newVal = val(this._val);\r\n if (!isPrimitive(newVal)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n if (newVal === this._val) return;\r\n this._val = newVal;\r\n this.notify();\r\n } else {\r\n if (!isPrimitive(val)) {\r\n throw new Error(\r\n \"Invalid type for PrimitiveSignal. Valid types: [boolean, string, number, undefined, null]\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n\r\n this._val = val;\r\n\r\n this.notify();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Signal for arrays.\r\n */\r\nexport class ArraySignal extends BaseSignal {\r\n private updateCalled: boolean = false;\r\n\r\n constructor(val: T) {\r\n if (!Array.isArray(val)) {\r\n throw new Error(\r\n \"Invalid type for ArraySignal; value must be an array\"\r\n );\r\n }\r\n // Call the base constructor with a proxy-wrapped array.\r\n super(val);\r\n this._val = this.createProxy(val);\r\n }\r\n\r\n private createProxy(val: T): T {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n // If a function is accessed, wrap it to trigger notifications on mutation.\r\n\r\n if (typeof value === \"function\") {\r\n if (\r\n MutatingMethods.includes(String(prop)) &&\r\n !this.updateCalled\r\n ) {\r\n throw new Error(\r\n \"Cannot set a value on an array signal, use the update method for updating the array.\"\r\n );\r\n }\r\n\r\n return (...args: any[]) => {\r\n const result = value.apply(target, args);\r\n // Notify if the method is mutating.\r\n if (MutatingMethods.includes(String(prop))) {\r\n this.notify();\r\n }\r\n return result;\r\n };\r\n }\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an array signal, use the update method for updating the array.\"\r\n );\r\n }\r\n target[prop as any] = newValue;\r\n this.notify();\r\n return true;\r\n },\r\n });\r\n }\r\n\r\n get value(): DeepReadonly {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n addSignalToReactiveFunction(this);\r\n }\r\n\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => void)) {\r\n this.updateCalled = true;\r\n if (typeof val === \"function\") {\r\n val(this._val);\r\n } else {\r\n if (!Array.isArray(val)) {\r\n throw new Error(\r\n \"Invalid type for ArraySignal; value must be an array\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n\r\n this._val = this.createProxy(val);\r\n\r\n this.notify();\r\n }\r\n this.updateCalled = false;\r\n }\r\n}\r\n\r\n/**\r\n * Signal for plain objects.\r\n */\r\nexport class ObjectSignal> extends BaseSignal {\r\n private updateCalled: boolean = false;\r\n constructor(val: T) {\r\n if (!isPlainObject(val)) {\r\n throw new Error(\r\n \"Invalid type for ObjectSignal; value must be a plain object\"\r\n );\r\n }\r\n super(val);\r\n this._val = this.createProxy(val);\r\n }\r\n private createInternalArrayProxy(val: A): A {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n // If a function is accessed, wrap it to trigger notifications on mutation.\r\n if (typeof value === \"function\") {\r\n if (\r\n !this.updateCalled &&\r\n MutatingMethods.includes(String(prop))\r\n ) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n\r\n return (...args: any[]) => {\r\n const result = value.apply(target, args);\r\n // Notify if the method is mutating.\r\n if (MutatingMethods.includes(String(prop))) {\r\n this.notify();\r\n }\r\n return result;\r\n };\r\n }\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n target[prop as any] = newValue;\r\n this.notify();\r\n return true;\r\n },\r\n });\r\n }\r\n private createProxy(val: T): T {\r\n return new Proxy(val, {\r\n get: (target, prop) => {\r\n const value = target[prop as any];\r\n if (Array.isArray(value)) {\r\n // @ts-expect-error\r\n target[prop as any] =\r\n this.createInternalArrayProxy(value);\r\n\r\n return target[prop as any];\r\n }\r\n // console.log(\"get\", target, prop, value);\r\n return value;\r\n },\r\n set: (target, prop, newValue) => {\r\n if (!this.updateCalled) {\r\n throw new Error(\r\n \"Cannot set a value on an object signal, use the update method for updating the object.\"\r\n );\r\n }\r\n // Do not allow functions to be set as values.\r\n if (typeof newValue === \"function\") return false;\r\n // For nested objects, wrap them as well.\r\n if (typeof newValue === \"object\" && newValue !== null) {\r\n newValue = this.createProxy(newValue);\r\n }\r\n if (newValue === target[prop as any]) return true;\r\n\r\n // @ts-expect-error\r\n target[prop as any] = newValue;\r\n\r\n this.notify();\r\n\r\n return true;\r\n },\r\n deleteProperty: (target, prop) => {\r\n const result = delete target[prop as any];\r\n this.notify();\r\n return result;\r\n },\r\n });\r\n }\r\n\r\n get value(): DeepReadonly {\r\n if (currentEffect) {\r\n this.deps.add(currentEffect);\r\n addSignalToEffect(this);\r\n }\r\n if (currentReactiveFunction) {\r\n this.deps.add(currentReactiveFunction);\r\n addSignalToReactiveFunction(this);\r\n }\r\n return this._val;\r\n }\r\n\r\n public update(val: T | ((prev: T) => void)) {\r\n this.updateCalled = true;\r\n if (typeof val === \"function\") {\r\n val(this._val);\r\n } else {\r\n if (!isPlainObject(val)) {\r\n throw new Error(\r\n \"Invalid type for ObjectSignal; value must be a plain object\"\r\n );\r\n }\r\n if (val === this._val) return;\r\n this._val = this.createProxy(val);\r\n this.notify();\r\n }\r\n this.updateCalled = false;\r\n }\r\n}\r\n\r\nexport interface PublicSignal {\r\n readonly value: DeepReadonly;\r\n update(val: T | ((prev: T) => T)): void;\r\n}\r\n\r\nexport interface PublicArraySignal extends PublicSignal {\r\n update(val: T | ((prev: T) => void)): void; // Mutation allowed\r\n}\r\n\r\nexport interface PublicObjectSignal>\r\n extends PublicSignal {\r\n update(val: T | ((prev: T) => void)): void; // Mutation allowed\r\n}\r\n/**\r\n * Overloaded factory function to create a signal.\r\n */\r\nfunction createSignal(val: T): PublicSignal;\r\nfunction createSignal(val: T): PublicArraySignal;\r\nfunction createSignal>(\r\n val: T\r\n): PublicObjectSignal;\r\n\r\nfunction createSignal>(\r\n val: T\r\n) {\r\n if (typeof val === \"function\") {\r\n throw new Error(\"Functions cannot be used as signal value\");\r\n }\r\n\r\n if (typeof val === \"object\" && val !== null) {\r\n if (Array.isArray(val)) {\r\n const signal = new ArraySignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else if (isPlainObject(val)) {\r\n const signal = new ObjectSignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else {\r\n throw new Error(\r\n \"Invalid type for signal initialization: \" + typeof val\r\n );\r\n }\r\n } else if (isPrimitive(val)) {\r\n const signal = new PrimitiveSignal(val);\r\n addSignal(signal);\r\n return {\r\n get value() {\r\n return signal.value;\r\n },\r\n update: signal.update.bind(signal) as typeof signal.update,\r\n };\r\n } else {\r\n throw new Error(\r\n \"Invalid type for signal initialization: \" + typeof val\r\n );\r\n }\r\n}\r\n\r\nexport { computed, createSignal };\r\n","import { BaseSignal, runEffect } from \"../signals/signal\";\r\nimport { Fiber } from \"../types\";\r\n\r\nlet currentFC: Fiber | null = null;\r\nlet fcMap = new WeakMap<\r\n Fiber,\r\n {\r\n signals: Set>;\r\n cleanup: Function[];\r\n effects: Set;\r\n }\r\n>();\r\n\r\nexport function setCurrentFC(fc: Fiber) {\r\n currentFC = fc;\r\n}\r\n\r\nexport function clearCurrentFC() {\r\n currentFC = null;\r\n}\r\nexport function getCurrentFC() {\r\n return currentFC;\r\n}\r\n\r\nexport function runAllEffects(FC: Fiber) {\r\n if (fcMap.has(FC)) {\r\n const fcData = fcMap.get(FC)!;\r\n\r\n for (const effect of fcData.effects) {\r\n runEffect(effect, FC);\r\n }\r\n }\r\n}\r\n\r\nexport function cleanUp(fn: Function) {\r\n if (currentFC) {\r\n // console.log(currentFC, fcMap.has(currentFC));\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n\r\n fcData.cleanup.push(fn);\r\n } else {\r\n fcMap.set(currentFC, {\r\n signals: new Set(),\r\n cleanup: [fn],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\nexport function cleanUpWFiber(fn: Function, fiber: Fiber) {\r\n if (fiber) {\r\n // console.log(currentFC, fcMap.has(currentFC));\r\n if (fcMap.has(fiber)) {\r\n const fcData = fcMap.get(fiber)!;\r\n\r\n fcData.cleanup.push(fn);\r\n } else {\r\n fcMap.set(fiber, {\r\n signals: new Set(),\r\n cleanup: [fn],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function addEffect(fn: Function) {\r\n if (currentFC) {\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n fcData.effects.add(fn);\r\n } else {\r\n const effects = new Set();\r\n effects.add(fn);\r\n fcMap.set(currentFC, {\r\n signals: new Set(),\r\n cleanup: [],\r\n effects: effects,\r\n });\r\n }\r\n }\r\n}\r\nexport function addSignal(signal: BaseSignal) {\r\n if (currentFC) {\r\n if (fcMap.has(currentFC)) {\r\n const fcData = fcMap.get(currentFC)!;\r\n fcData.signals.add(signal);\r\n } else {\r\n const signals = new Set>();\r\n signals.add(signal);\r\n fcMap.set(currentFC, {\r\n signals: signals,\r\n cleanup: [],\r\n effects: new Set(),\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function cleanUpFC(currentFC, props) {\r\n const fcData = fcMap.get(currentFC)!;\r\n if (fcData) {\r\n // console.log(\"Cleaning up FC\", currentFC, fcData);\r\n if (fcData.cleanup) {\r\n for (const fn of fcData.cleanup) {\r\n fn();\r\n }\r\n }\r\n\r\n fcData.cleanup = [];\r\n\r\n for (const effect of fcData.effects) {\r\n // @ts-expect-error\r\n if (effect.__cleanup && typeof effect.__cleanup === \"function\") {\r\n // @ts-expect-error\r\n effect.__cleanup();\r\n }\r\n // @ts-expect-error\r\n if (effect.__signals) {\r\n // @ts-expect-error\r\n for (const signal of effect.__signals) {\r\n signal.removeDep(effect);\r\n }\r\n }\r\n // @ts-expect-error\r\n delete effect.__signals;\r\n // @ts-expect-error\r\n delete effect.__cleanup;\r\n }\r\n\r\n fcData.signals.forEach((signal) => signal.clearDeps());\r\n fcData.signals.clear();\r\n }\r\n fcMap.delete(currentFC);\r\n}\r\n","import { ComponentChildren, createSignal, Fiber, PublicSignal } from \"../index\";\r\n\r\ndeclare const FRAGMENT = \"FRAGMENT\";\r\n\r\n// If the component takes no parameters, treat its props as {}\r\ntype PropsOf any> = Parameters extends []\r\n ? {}\r\n : Parameters[0];\r\n\r\nexport function lazy any>(\r\n importFn: () => Promise<{ default: T }>\r\n): (\r\n props: PropsOf & {\r\n fallback?: ComponentChildren;\r\n errorFallback?:\r\n | ComponentChildren\r\n | ((error: Error) => ComponentChildren);\r\n }\r\n) => ReturnType {\r\n let Component: T | null = null;\r\n\r\n const load = (\r\n loading: PublicSignal,\r\n error: PublicSignal\r\n ) => {\r\n if (!Component) {\r\n importFn()\r\n .then((mod) => {\r\n if (mod.default) {\r\n if (typeof mod.default !== \"function\") {\r\n throw new Error(\r\n \"Lazy-loaded component must be a functional component\"\r\n );\r\n }\r\n Component = mod.default;\r\n\r\n loading.update(false);\r\n error.update(null);\r\n } else {\r\n error.update(\r\n new Error(\r\n \"No default export found from lazy-loaded module\"\r\n )\r\n );\r\n }\r\n })\r\n .catch((err) => {\r\n error.update(err);\r\n loading.update(false);\r\n });\r\n } else {\r\n loading.update(false);\r\n error.update(null);\r\n }\r\n };\r\n\r\n return (\r\n props: PropsOf & {\r\n fallback?: Node;\r\n errorFallback?: Node;\r\n }\r\n ): ReturnType => {\r\n const loading = createSignal(true);\r\n const error = createSignal(null);\r\n\r\n load(loading, error);\r\n // Validate fallback and errorFallback types\r\n const isValidNode = (val: any) =>\r\n typeof val === \"string\" ||\r\n (val && typeof val === \"object\" && \"props\" in val && \"type\" in val);\r\n\r\n if (props.fallback !== undefined && !isValidNode(props.fallback)) {\r\n throw new Error(\r\n \"Invalid fallback: Expected a string or a valid JSX node.\"\r\n );\r\n }\r\n if (\r\n props.errorFallback !== undefined &&\r\n !(\r\n typeof props.errorFallback === \"function\" ||\r\n isValidNode(props.errorFallback)\r\n )\r\n ) {\r\n throw new Error(\r\n \"Invalid errorFallback: Expected a string, a valid JSX node, or a function returning a JSX node.\"\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {() =>\r\n loading.value\r\n ? props.fallback\r\n : error.value !== null\r\n ? props.errorFallback\r\n ? typeof props.errorFallback === \"function\"\r\n ? props.errorFallback(error.value)\r\n : props.errorFallback\r\n : \"Unknown error occurred while lazy loading component, use errorFallback prop to override\"\r\n : // @ts-expect-error\r\n Component && \r\n }\r\n \r\n ) as unknown as ReturnType;\r\n };\r\n}\r\n"],"names":["CAPTURE_REGEX","isProperty","newFiber","currentFC"],"mappings":"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"} \ No newline at end of file diff --git a/build/rendering/utils.d.ts b/build/rendering/utils.d.ts new file mode 100644 index 0000000..34dc5e7 --- /dev/null +++ b/build/rendering/utils.d.ts @@ -0,0 +1,6 @@ +import { Fiber } from '../types'; +export declare function deepCompareFibers(fiberA: any, fiberB: any): boolean; +export declare function deepEqual(objA: any, objB: any): boolean; +export declare function findFirstDom(fiber: Fiber): HTMLElement | Text | undefined; +export declare function findParentFiberWithDom(fiber: Fiber): Fiber | undefined; +export declare function findNearestParentWithDom(fiber: Fiber): Fiber | undefined; diff --git a/build/signals/signal.d.ts b/build/signals/signal.d.ts index 971ebb2..c63d330 100644 --- a/build/signals/signal.d.ts +++ b/build/signals/signal.d.ts @@ -30,7 +30,7 @@ export declare function createRef(): Ref; type DeepReadonly = { readonly [K in keyof T]: T[K] extends object ? DeepReadonly : T[K]; }; -export declare abstract class BaseSignal { +export declare abstract class BaseSignal { protected _val: T; protected deps: Set; protected isNotified: boolean; @@ -38,20 +38,18 @@ export declare abstract class BaseSignal { protected notify(): void; removeDep(fn: Function): void; clearDeps(): void; - abstract get value(): T | DeepReadonly; + get value(): DeepReadonly; abstract update(val: T | ((prev: T) => T)): void; } type NormalSignal = boolean | string | number | undefined | null | Error; export declare class PrimitiveSignal extends BaseSignal { constructor(val: T); - get value(): T; update(val: T | ((prev: T) => T)): void; } export declare class ArraySignal extends BaseSignal { private updateCalled; constructor(val: T); private createProxy; - get value(): DeepReadonly; update(val: T | ((prev: T) => void)): void; } export declare class ObjectSignal> extends BaseSignal { @@ -59,7 +57,6 @@ export declare class ObjectSignal> extends BaseSignal constructor(val: T); private createInternalArrayProxy; private createProxy; - get value(): DeepReadonly; update(val: T | ((prev: T) => void)): void; } export interface PublicSignal { diff --git a/build/signals/utils.d.ts b/build/signals/utils.d.ts new file mode 100644 index 0000000..ce6fbb8 --- /dev/null +++ b/build/signals/utils.d.ts @@ -0,0 +1,14 @@ +import { BaseSignal } from './signal'; +export declare const MutatingMethods: string[]; +export declare function throwNonPrimitiveError(): void; +export declare function throwNotUpdateCalled(): void; +export declare function throwNotArray(): void; +export declare function throwNotObject(): void; +export declare function throwInvalidSignalType(val: any): void; +export declare function publicSignal(signal: BaseSignal): { + readonly value: { + readonly [x: string]: any; + }; + update: typeof signal.update; +}; +export declare const createArrayProxy: (arr: any[], signal: any) => any[]; diff --git a/build/utils/general.d.ts b/build/utils/general.d.ts index 345de41..82a873f 100644 --- a/build/utils/general.d.ts +++ b/build/utils/general.d.ts @@ -1,3 +1,2 @@ export declare function isPlainObject(variable: any): boolean; export declare function isPrimitive(val: any): boolean; -export declare function swap(arr: any[], i: number, j: number): void; diff --git a/package.json b/package.json index ac4511b..9841ecf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "refract-js", "type": "module", - "version": "1.1.3", + "version": "1.1.4", "description": "Simpler, Faster and Lighter JSX based rendering for Single-Page Applications", "main": "build/refract.cjs.js", "module": "build/refract.es.js", diff --git a/vite.config.ts b/vite.config.ts index 576918c..0528535 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -7,8 +7,8 @@ const isProd = process.env.NODE_ENV === "production"; export default defineConfig({ build: { outDir: isProd ? "build" : "dist", - minify: "terser", - sourcemap: true, + minify: "esbuild", + sourcemap: false, lib: { entry: "src/index.ts", name: "Refract", @@ -19,19 +19,9 @@ export default defineConfig({ output: { preserveModules: false, }, + treeshake: true, }, - terserOptions: { - compress: { - drop_console: true, - drop_debugger: true, - ecma: 2020, - passes: 3, // Runs multiple passes for more optimization - pure_funcs: ["console.log"], - }, - output: { - comments: false, - }, - }, + target: "esnext", }, esbuild: { jsxFactory: "createElement", // Your custom JSX factory function