veles 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/create-element/parse-children.ts","../src/create-element/assign-attributes.ts","../src/hooks/lifecycle.ts","../src/create-element/parse-component.ts","../src/create-element/create-element.ts","../src/attach-component.ts","../src/create-element/create-text-element.ts","../src/hooks/create-state.ts","../src/hooks/combine-state.ts","../src/create-ref.ts","../src/fragment.ts"],"sourcesContent":["export { attachComponent } from \"./attach-component\";\nexport { createElement } from \"./create-element\";\nexport { createState, combineState, onMount, onUnmount } from \"./hooks\";\nexport { createRef } from \"./create-ref\";\nexport { Fragment } from \"./fragment\";\n\nexport type { State } from \"./hooks/create-state\";\n","import type { VelesComponent, VelesElement, VelesStringElement } from \"./types\";\n\nfunction getComponentVelesNode(\n component: VelesComponent | VelesElement | VelesStringElement\n): {\n velesElementNode: VelesElement | VelesStringElement;\n componentsTree: VelesComponent[];\n} {\n const componentsTree: VelesComponent[] = [];\n\n if (\"velesStringElement\" in component) {\n return {\n velesElementNode: component,\n componentsTree: [],\n };\n }\n\n let childNode: VelesComponent | VelesElement = component;\n // we can have multiple components nested, we need to get\n // to the actual HTML to attach it\n while (\"velesComponent\" in childNode) {\n componentsTree.push(childNode);\n if (\"velesStringElement\" in childNode.tree) {\n return {\n velesElementNode: childNode.tree,\n componentsTree,\n };\n } else {\n childNode = childNode.tree;\n }\n }\n\n return { velesElementNode: childNode, componentsTree };\n}\n\nfunction identity<T>(value1: T, value2: T) {\n return value1 === value2;\n}\n\nexport { getComponentVelesNode, identity };\n","import { getComponentVelesNode } from \"../utils\";\n\nimport type {\n VelesComponent,\n VelesElement,\n VelesStringElement,\n VelesElementProps,\n} from \"../types\";\n\nfunction parseChildren({\n children,\n htmlElement,\n velesNode,\n}: {\n children: VelesElementProps[\"children\"];\n htmlElement: HTMLElement;\n velesNode: VelesElement;\n}) {\n const childComponents: (\n | VelesElement\n | VelesComponent\n | VelesStringElement\n )[] = [];\n\n if (children === undefined || children === null) {\n return childComponents;\n }\n\n (Array.isArray(children) ? children : [children]).forEach(\n (childComponent) => {\n if (typeof childComponent === \"string\") {\n const text = document.createTextNode(childComponent);\n htmlElement.append(text);\n } else if (\n typeof childComponent === \"object\" &&\n childComponent &&\n \"velesNode\" in childComponent &&\n childComponent?.velesNode\n ) {\n if (childComponent.phantom) {\n // we need to get ALL the children of it and attach it to this node\n childComponent.childComponents.forEach((childComponentofPhantom) => {\n if (\"velesNode\" in childComponentofPhantom) {\n htmlElement.append(childComponentofPhantom.html);\n childComponentofPhantom.parentVelesElement = velesNode;\n } else {\n const { componentsTree, velesElementNode } =\n getComponentVelesNode(childComponentofPhantom);\n\n if (!velesElementNode) {\n console.error(\"can't find HTML tree in a component chain\");\n } else {\n htmlElement.append(velesElementNode.html);\n\n // TODO: address the same concern as below\n componentsTree.forEach((component) => {\n component._privateMethods._callMountHandlers();\n });\n\n velesElementNode.parentVelesElement = velesNode;\n }\n }\n });\n childComponent.parentVelesElement = velesNode;\n childComponents.push(childComponent);\n } else {\n // TODO: check that it is a valid DOM Node\n htmlElement.append(childComponent.html);\n childComponent.parentVelesElement = velesNode;\n childComponents.push(childComponent);\n }\n } else if (\n typeof childComponent === \"object\" &&\n childComponent &&\n \"velesComponent\" in childComponent &&\n childComponent?.velesComponent\n ) {\n // we need to save the whole components chain, so that\n // we can trigger `mount` hooks on all of them correctly\n const { componentsTree, velesElementNode } =\n getComponentVelesNode(childComponent);\n\n if (!velesElementNode) {\n console.error(\"can't find HTML tree in a component chain\");\n } else {\n if (\"velesNode\" in velesElementNode && velesElementNode.phantom) {\n // we need to get ALL the children of it and attach it to this node\n velesElementNode.childComponents.forEach(\n (childComponentofPhantom) => {\n if (\"velesNode\" in childComponentofPhantom) {\n htmlElement.append(childComponentofPhantom.html);\n childComponentofPhantom.parentVelesElement = velesNode;\n } else {\n const { componentsTree, velesElementNode } =\n getComponentVelesNode(childComponentofPhantom);\n\n if (!velesElementNode) {\n console.error(\"can't find HTML tree in a component chain\");\n } else {\n htmlElement.append(velesElementNode.html);\n\n // Same explanation as below. Components are mounted synchronously\n setTimeout(() => {\n componentsTree.forEach((component) => {\n component._privateMethods._callMountHandlers();\n });\n }, 0);\n velesElementNode.parentVelesElement = velesNode;\n }\n }\n }\n );\n } else {\n htmlElement.append(velesElementNode.html);\n }\n\n /**\n * Components are mounted synchronously, so we can safely wait for the next\n * CPU tick and be sure that new markup is attached to DOM.\n */\n setTimeout(() => {\n componentsTree.forEach((component) => {\n component._privateMethods._callMountHandlers();\n });\n }, 0);\n velesElementNode.parentVelesElement = velesNode;\n childComponents.push(childComponent);\n }\n } else if (\n typeof childComponent === \"object\" &&\n childComponent &&\n \"velesStringElement\" in childComponent &&\n childComponent?.velesStringElement\n ) {\n // TODO: check that it is a valid DOM Node\n htmlElement.append(childComponent.html);\n childComponent.parentVelesElement = velesNode;\n childComponents.push(childComponent);\n }\n }\n );\n\n return childComponents;\n}\n\nexport { parseChildren };\n","import type { VelesElement } from \"../types\";\n\nfunction assignAttributes({\n props,\n htmlElement,\n velesNode,\n}: {\n props: Record<string, any>;\n htmlElement: HTMLElement;\n velesNode: VelesElement;\n}) {\n Object.entries(props).forEach(([key, value]) => {\n const isFunction = typeof value === \"function\";\n if (isFunction && value.velesAttribute === true) {\n const attributeValue = value(htmlElement, key, velesNode);\n htmlElement.setAttribute(key, attributeValue);\n } else if (\n // basically, any form of `on` handlers, like `onClick`, `onCopy`, etc\n isFunction &&\n key.length > 2 &&\n key.startsWith(\"on\")\n ) {\n // TODO: think if this is robust enough\n htmlElement.addEventListener(\n key[2].toLocaleLowerCase() + key.slice(3),\n value\n );\n } else {\n htmlElement.setAttribute(key, value);\n }\n });\n}\n\nexport { assignAttributes };\n","import { ComponentAPI } from \"../types\";\n\n// lifecycle hooks\n// currently, all components need to be synchronous\n// so we execute them and set background context\n// since components can be nested, we need to keep the array\nconst contextStack: ComponentAPI[] = [];\n// all hooks need to know the current context\n// it should way more convenient this way compared to passing\n// `componentAPI` to every method\nlet currentContext: ComponentAPI | null = null;\n\nfunction addContext(newContext: ComponentAPI) {\n contextStack.push(newContext);\n currentContext = newContext;\n}\n\nfunction popContext() {\n contextStack.pop();\n currentContext = contextStack[contextStack.length - 1];\n}\n\nfunction onMount(cb: Function) {\n if (currentContext) {\n currentContext.onMount(cb);\n } else {\n console.error(\"missing current context\");\n }\n}\n\nfunction onUnmount(cb: Function) {\n if (currentContext) {\n currentContext.onUnmount(cb);\n } else {\n console.error(\"missing current context\");\n }\n}\n\nexport { addContext, popContext, onMount, onUnmount };\n","import { addContext, popContext } from \"../hooks/lifecycle\";\n\nimport type {\n VelesComponent,\n VelesStringElement,\n VelesElementProps,\n ComponentAPI,\n ComponentFunction,\n} from \"../types\";\n\nfunction parseComponent({\n element,\n props,\n}: {\n element: ComponentFunction;\n props: VelesElementProps;\n}) {\n const componentUnmountCbs: Function[] = [];\n const componentMountCbs: Function[] = [];\n const componentAPI: ComponentAPI = {\n onMount: (cb) => {\n componentMountCbs.push(cb);\n },\n onUnmount: (cb) => {\n componentUnmountCbs.push(cb);\n },\n };\n // at this moment we enter new context\n addContext(componentAPI);\n const _componentTree = element(props, componentAPI);\n\n const componentTree =\n typeof _componentTree === \"string\" || !_componentTree\n ? ({\n velesStringElement: true,\n html: document.createTextNode(\n typeof _componentTree === \"string\" ? _componentTree : \"\"\n ),\n } as VelesStringElement)\n : _componentTree;\n\n // here we exit our context\n popContext();\n const velesComponent: VelesComponent = {\n velesComponent: true,\n tree: componentTree,\n _privateMethods: {\n _addUnmountHandler: (cb: Function) => {\n componentAPI.onUnmount(cb);\n },\n _callMountHandlers: () => {\n componentMountCbs.forEach((cb) => cb());\n },\n _callUnmountHandlers: () => {\n componentUnmountCbs.forEach((cb) => cb());\n // this should trigger recursive checks, whether it is a VelesNode or VelesComponent\n // string Nodes don't have lifecycle handlers\n if (\"_privateMethods\" in velesComponent.tree) {\n velesComponent.tree._privateMethods._callUnmountHandlers();\n }\n },\n },\n };\n\n return velesComponent;\n}\n\nexport { parseComponent };\n","import { parseChildren } from \"./parse-children\";\nimport { assignAttributes } from \"./assign-attributes\";\nimport { parseComponent } from \"./parse-component\";\n\nimport type {\n VelesComponent,\n VelesElement,\n VelesElementProps,\n ComponentFunction,\n} from \"../types\";\n\nfunction createElement(\n element: string | ComponentFunction,\n props: VelesElementProps = {}\n): VelesElement | VelesComponent {\n if (typeof element === \"string\") {\n const { children, ref, phantom = false, ...otherProps } = props;\n const newElement = document.createElement(element);\n const velesNode = {} as VelesElement;\n\n if (ref?.velesRef) {\n ref.current = newElement;\n }\n\n const childComponents = parseChildren({\n children,\n htmlElement: newElement,\n velesNode,\n });\n\n // these handlers are attached directly to the DOM element\n // specifically, the top level node which is rendered after\n // using `useValue` function and also listeners from\n // `useAttribute`\n let unmountHandlers: Function[] = [];\n const callUnmountHandlers = () => {\n unmountHandlers.forEach((cb) => cb());\n unmountHandlers = [];\n\n childComponents.forEach((childComponent) => {\n childComponent._privateMethods._callUnmountHandlers();\n });\n };\n\n velesNode.html = newElement;\n velesNode.velesNode = true;\n velesNode.childComponents = childComponents;\n velesNode.phantom = phantom;\n velesNode._privateMethods = {\n _addUnmountHandler: (cb: Function) => {\n unmountHandlers.push(cb);\n },\n _callUnmountHandlers: callUnmountHandlers,\n };\n\n // assign all the DOM attributes, including event listeners\n assignAttributes({ props: otherProps, htmlElement: newElement, velesNode });\n\n return velesNode;\n\n // functions mean that we want to render another component\n } else if (typeof element === \"function\") {\n return parseComponent({ element, props });\n }\n\n // otherwise we use the API wrong, so we throw an error\n throw new Error(\n \"Veles createElement expects a valid DOM string or another component\"\n );\n}\n\nexport { createElement };\n","import { getComponentVelesNode } from \"./utils\";\nimport { createElement } from \"./create-element\";\n\nimport type { VelesElement, VelesComponent } from \"./types\";\n\nfunction attachComponent({\n htmlElement,\n component,\n}: {\n htmlElement: HTMLElement;\n component: VelesElement | VelesComponent;\n}) {\n // we wrap the whole app into an additional <div>. While it is not ideal\n // for the consumers, it greatly simplifies some things, namely, mount callbacks\n // for components or supporting conditional rendering at the top level\n const wrappedApp = createElement(\"div\", { children: [component] });\n const { velesElementNode } = getComponentVelesNode(wrappedApp);\n htmlElement.appendChild(velesElementNode.html);\n\n // TODO: iterate over every child and call their `onUnmout` method\n // and add tests for that\n return () => {\n velesElementNode.html.remove();\n };\n}\n\nexport { attachComponent };\n","/**\n * This is an internal helper function to create Text Nodes\n * which we need to maintain in the component tree\n */\n\nimport type { VelesStringElement } from \"../types\";\n\nexport function createTextElement(\n text: string | undefined | null\n): VelesStringElement {\n const unmountHandlers: Function[] = [];\n return {\n velesStringElement: true,\n // in case there is no text, we create an empty Text node, so we still can\n // have a reference to it, replace it, call lifecycle methods, etc\n html: document.createTextNode(text || \"\"),\n\n _privateMethods: {\n _addUnmountHandler: (cb: Function) => {\n unmountHandlers.push(cb);\n },\n _callUnmountHandlers: () => {\n unmountHandlers.forEach((cb) => cb());\n },\n },\n };\n}\n","import { getComponentVelesNode, identity } from \"../utils\";\nimport { onUnmount, onMount } from \"./lifecycle\";\nimport { createElement } from \"../create-element/create-element\";\nimport { createTextElement } from \"../create-element/create-text-element\";\n\nimport type {\n VelesElement,\n VelesComponent,\n VelesStringElement,\n} from \"../types\";\n\ntype AttributeHelper = {\n (htmlElement: HTMLElement, attributeName: string, node: VelesElement): string;\n velesAttribute: boolean;\n};\n\nexport type State<ValueType> = {\n trackValue(\n cb: (value: ValueType) => void | Function,\n options?: {\n callOnMount?: boolean;\n skipFirstCall?: boolean;\n comparator?: (value1: ValueType, value2: ValueType) => boolean;\n }\n ): void;\n trackValueSelector<SelectorValueType>(\n selector: (value: ValueType) => SelectorValueType,\n cb: (value: SelectorValueType) => void | Function,\n options?: {\n callOnMount?: boolean;\n skipFirstCall?: boolean;\n comparator?: (\n value1: SelectorValueType,\n value2: SelectorValueType\n ) => boolean;\n }\n ): void;\n useValue(\n cb: (\n value: ValueType\n ) => VelesElement | VelesComponent | string | undefined | null,\n comparator?: (value1: ValueType, value2: ValueType) => boolean\n ): VelesElement | VelesComponent | VelesStringElement;\n useValueSelector<SelectorValueType>(\n selector: (value: ValueType) => SelectorValueType,\n cb: (\n value: SelectorValueType\n ) => VelesElement | VelesComponent | string | undefined | null,\n comparator?: (\n value1: SelectorValueType,\n value2: SelectorValueType\n ) => boolean\n ): VelesElement | VelesComponent | VelesStringElement;\n useAttribute(cb: (value: ValueType) => string): AttributeHelper;\n useValueIterator<Element>(\n options: {\n key: string | ((options: { element: Element; index: number }) => string);\n selector?: (value: ValueType) => Element[];\n },\n cb: (props: {\n elementState: State<Element>;\n index: number;\n }) => VelesElement | VelesComponent\n ): VelesComponent | VelesElement | null;\n getValue(): ValueType;\n getPreviousValue(): undefined | ValueType;\n setValue(newValueCB: (currentValue: ValueType) => ValueType): void;\n\n // private method, don't use directly\n // TODO: hide completely in a closure\n _triggerUpdates(): void;\n};\n\ntype TrackingParams = {\n cb: (props: {\n elementState: State<any>;\n index: number;\n }) => VelesElement | VelesComponent;\n selector?: (value: unknown) => any[];\n renderedElements: [VelesElement | VelesComponent, string, State<unknown>][];\n key: string | ((options: { element: unknown; index: number }) => string);\n elementsByKey: {\n [key: string]: {\n elementState: State<unknown>;\n index: number;\n node: VelesElement | VelesComponent;\n };\n };\n wrapperComponent: VelesElement | VelesComponent;\n};\n\nfunction createState<T>(\n initialValue: T,\n subscribeCallback?: (\n setValue: ReturnType<typeof createState<T>>[\"setValue\"]\n ) => Function\n): State<T> {\n let value = initialValue;\n let previousValue: undefined | T = undefined;\n let trackingEffects: {\n cb: (value: any) => void;\n selector?: Function;\n comparator?: (value1: any, value2: any) => boolean;\n selectedValue: any;\n }[] = [];\n\n let trackingSelectorElements: {\n cb: (\n value: any\n ) => VelesElement | VelesComponent | string | undefined | null;\n selector?: Function;\n selectedValue: any;\n comparator: (value1: any, value2: any) => boolean;\n node: VelesElement | VelesComponent | VelesStringElement;\n }[] = [];\n\n let trackingAttributes: {\n cb: Function;\n htmlElement: HTMLElement;\n attributeName: string;\n }[] = [];\n\n let trackingIterators: TrackingParams[] = [];\n\n const result: State<T> = {\n // supposed to be used at the component level\n trackValue: (cb, options = {}) => {\n result.trackValueSelector<T>(undefined, cb, options);\n },\n trackValueSelector<F>(\n selector: ((value: T) => F) | undefined,\n cb: (value: F) => void | Function,\n options: {\n callOnMount?: boolean;\n skipFirstCall?: boolean;\n comparator?: (value1: F, value2: F) => boolean;\n } = {}\n ) {\n // @ts-expect-error\n const trackedValue = selector ? selector(value) : (value as F);\n trackingEffects.push({\n cb,\n selector,\n comparator: options.comparator,\n selectedValue: trackedValue,\n });\n if (!options.skipFirstCall) {\n // trigger the callback first time\n // execute the first callback when the component is mounted\n if (options.callOnMount) {\n onMount(() => {\n cb(trackedValue);\n });\n } else {\n cb(trackedValue);\n }\n }\n // track value is attached at the component level\n onUnmount(() => {\n trackingEffects = trackingEffects.filter(\n (trackingCallback) => trackingCallback.cb !== cb\n );\n });\n },\n useValue: (cb, comparator) => {\n return result.useValueSelector<T>(undefined, cb, comparator);\n },\n useValueSelector<F>(\n selector: ((value: T) => F) | undefined,\n cb: (\n value: F\n ) => VelesElement | VelesComponent | string | undefined | null,\n comparator: (value1: F, value2: F) => boolean = identity\n ): VelesElement | VelesComponent | VelesStringElement {\n // @ts-expect-error\n const selectedValue = selector ? selector(value) : (value as F);\n const returnedNode = cb(selectedValue);\n const node =\n !returnedNode || typeof returnedNode === \"string\"\n ? createTextElement(returnedNode as string)\n : returnedNode;\n\n trackingSelectorElements.push({\n selector,\n selectedValue,\n cb,\n node,\n comparator,\n });\n\n node._privateMethods._addUnmountHandler(() => {\n trackingSelectorElements = trackingSelectorElements.filter(\n (trackingSelectorElement) => trackingSelectorElement.cb !== cb\n );\n });\n return node;\n },\n useValueIterator<Element>(\n options: {\n key: string | ((options: { element: any; index: number }) => string);\n selector?: (value: T) => Element[];\n },\n cb: (props: {\n elementState: State<Element>;\n index: number;\n }) => VelesElement | VelesComponent\n ) {\n const children: [\n VelesElement | VelesComponent,\n string,\n State<Element>\n ][] = [];\n const elementsByKey: {\n [key: string]: {\n elementState: State<Element>;\n index: number;\n node: VelesElement | VelesComponent;\n };\n } = {};\n\n const elements = options.selector ? options.selector(value) : value;\n\n if (!Array.isArray(elements)) {\n console.error(\"useValueIterator received non-array value\");\n return null;\n }\n\n (elements as Element[]).forEach((element, index) => {\n // we calculate a key for each element. This key determines whether we render the element from scratch, or do nothing\n // when the element updates\n let calculatedKey: string = \"\";\n if (\n typeof options.key === \"string\" &&\n typeof element === \"object\" &&\n element !== null &&\n options.key in element\n ) {\n calculatedKey = element[options.key];\n } else if (typeof options.key === \"function\") {\n calculatedKey = options.key({ element, index });\n } else {\n // ignore for now\n }\n\n const elementState = createState(element);\n\n if (!calculatedKey) {\n return;\n }\n\n let node = cb({ elementState, index });\n\n elementsByKey[calculatedKey] = {\n node,\n index,\n elementState,\n };\n\n children.push([node, calculatedKey, elementState]);\n });\n\n const trackingParams = {} as TrackingParams;\n trackingIterators.push(trackingParams);\n\n const wrapperComponent = createElement(() => {\n onUnmount(() => {\n trackingIterators = trackingIterators.filter(\n (currentTrackingParams) => currentTrackingParams !== trackingParams\n );\n });\n return createElement(\"div\", {\n phantom: true,\n children: children.map((child) => child[0]),\n });\n });\n\n trackingParams.cb = cb;\n trackingParams.key = options.key;\n trackingParams.elementsByKey = elementsByKey;\n trackingParams.renderedElements = children;\n trackingParams.wrapperComponent = wrapperComponent;\n\n if (options.selector) {\n trackingParams.selector = options.selector;\n }\n\n return wrapperComponent;\n\n // 1. build a lookup table with existing values\n // 2. build a lookup table with positions\n // 3. if there is a new value, update lookup tables\n // and insert the new component in the right place\n // 4. provide a way to listen to position value.\n // It should be a separate subscription.\n },\n useAttribute: (cb: (value: T) => string) => {\n const attributeValue = cb(value);\n\n const attributeHelper = (\n htmlElement: HTMLElement,\n attributeName: string,\n node: VelesElement\n ) => {\n // save it to the attribute array\n // read that array on `_triggerUpdates`\n // and change inline\n // we need to save the HTML element and the name of the attribute\n\n trackingAttributes.push({ cb, htmlElement, attributeName });\n\n node._privateMethods._addUnmountHandler(() => {\n trackingAttributes = trackingAttributes.filter(\n (trackingAttribute) => trackingAttribute.cb !== cb\n );\n });\n\n return attributeValue;\n };\n attributeHelper.velesAttribute = true;\n\n return attributeHelper;\n },\n // useful for stuff like callbacks\n getValue: () => {\n return value;\n },\n getPreviousValue: () => {\n return previousValue;\n },\n // set up new value only through the callback which\n // gives the latest value to ensure no outdated data\n // can be used for the state\n setValue: (newValueCB: (currentValue: T) => T): void => {\n const newValue = newValueCB(value);\n\n if (newValue !== value) {\n previousValue = value;\n value = newValue;\n result._triggerUpdates();\n }\n },\n // TODO: remove it from this object completely\n // and access it from closure\n _triggerUpdates: () => {\n trackingSelectorElements = trackingSelectorElements.map(\n (selectorTrackingElement) => {\n const { selectedValue, selector, cb, node, comparator } =\n selectorTrackingElement;\n const newSelectedValue = selector ? selector(value) : value;\n\n if (comparator(selectedValue, newSelectedValue)) {\n return selectorTrackingElement;\n }\n\n const returnednewNode = cb(newSelectedValue);\n const newNode =\n !returnednewNode || typeof returnednewNode === \"string\"\n ? createTextElement(returnednewNode as string)\n : returnednewNode;\n\n const { velesElementNode: oldVelesElementNode } =\n getComponentVelesNode(node);\n const { velesElementNode: newVelesElementNode } =\n getComponentVelesNode(newNode);\n\n const parentVelesElement = oldVelesElementNode.parentVelesElement;\n\n if (parentVelesElement) {\n newVelesElementNode.parentVelesElement = parentVelesElement;\n parentVelesElement.html.replaceChild(\n newVelesElementNode.html,\n oldVelesElementNode.html\n );\n // we need to update `childComponents` so that after the update\n // if the parent node is removed from DOM, it calls correct unmount\n // callbacks\n parentVelesElement.childComponents =\n parentVelesElement.childComponents.map((childComponent) =>\n childComponent === node ? newNode : node\n );\n // we call unmount handlers right after we replace it\n node._privateMethods._callUnmountHandlers();\n\n // right after that, we add the callback back\n // the top level node is guaranteed to be rendered again (at least right now)\n // if there were children listening, they should be cleared\n // and added back into their respective unmount listeners if it is still viable\n trackingSelectorElements.push({\n selector,\n selectedValue: newSelectedValue,\n cb,\n node: newNode,\n comparator,\n });\n newNode._privateMethods._addUnmountHandler(() => {\n trackingSelectorElements = trackingSelectorElements.filter(\n (trackingSelectorElement) => trackingSelectorElement.cb !== cb\n );\n });\n } else {\n console.log(\"parent node was not found\");\n }\n\n return {\n selectedValue: newSelectedValue,\n selector,\n cb,\n node: newNode,\n comparator,\n };\n }\n );\n\n // attributes\n // the HTML node does not change, so we don't need to modify the array\n trackingAttributes.forEach(({ cb, htmlElement, attributeName }) => {\n const newAttributeValue = cb(value);\n\n htmlElement.setAttribute(attributeName, newAttributeValue);\n });\n\n // tracked values\n trackingEffects.forEach((trackingEffect) => {\n const { cb, selectedValue, selector, comparator } = trackingEffect;\n\n const newSelectedValue = selector ? selector(value) : value;\n\n if (\n comparator\n ? comparator(selectedValue, newSelectedValue)\n : selectedValue === newSelectedValue\n ) {\n return;\n }\n\n cb(newSelectedValue);\n });\n\n trackingIterators.forEach((trackingIterator) => {\n const {\n cb,\n key,\n renderedElements,\n elementsByKey,\n wrapperComponent,\n selector,\n } = trackingIterator;\n if (!wrapperComponent) {\n console.error(\"there is no wrapper component for the iterator\");\n return;\n }\n\n const { velesElementNode: wrapperVelesElementNode } =\n getComponentVelesNode(wrapperComponent);\n const parentVelesElement = wrapperVelesElementNode.parentVelesElement;\n\n if (!parentVelesElement) {\n console.error(\n \"there is no parent Veles node for the iterator wrapper\"\n );\n return;\n }\n\n const elements = selector ? selector(value) : value;\n\n // if we have any tracking iterators, it means the value is an array\n // but I don't know how to have correct type inferring here\n // so we check manually\n if (Array.isArray(elements)) {\n const newRenderedElements: [\n VelesElement | VelesComponent,\n string,\n State<unknown>\n ][] = [];\n const newElementsByKey: {\n [key: string]: {\n elementState: State<unknown>;\n index: number;\n node: VelesElement | VelesComponent;\n };\n } = {};\n\n const renderedExistingElements: {\n [calculatedKey: string]: boolean;\n } = {};\n\n elements.forEach((element, index) => {\n let calculatedKey: string = \"\";\n if (\n typeof key === \"string\" &&\n typeof element === \"object\" &&\n element !== null &&\n key in element\n ) {\n calculatedKey = element[key];\n } else if (typeof key === \"function\") {\n calculatedKey = key({ element, index });\n } else {\n // ignore for now\n }\n\n if (!calculatedKey) {\n return;\n }\n\n const existingElement = elementsByKey[calculatedKey];\n\n if (existingElement) {\n renderedExistingElements[calculatedKey] = true;\n const currentValue = existingElement.elementState.getValue();\n if (currentValue !== element) {\n existingElement.elementState.setValue(() => element);\n }\n\n newRenderedElements.push([\n existingElement.node,\n calculatedKey,\n existingElement.elementState,\n ]);\n newElementsByKey[calculatedKey] = {\n elementState: existingElement.elementState,\n index,\n node: existingElement.node,\n };\n } else {\n const elementState = createState(element);\n const node = cb({ elementState, index });\n\n newRenderedElements.push([node, calculatedKey, elementState]);\n newElementsByKey[calculatedKey] = {\n elementState,\n index,\n node,\n };\n }\n\n // first, we check if there is a node by this key\n // if there is, we do `getValue()` and compare whether the\n // item is the same.\n // if it is not, we need to do `elementState.setValue()`\n // with the new value\n // if the value is the same, nothing to do.\n //\n // after that, we need to put the new position down\n // (we'll reshuffle items at the end)\n //\n // if there is no node by this key, we need to:\n // 1. create a state for it\n // 2. create a node for it\n // 3. mark the new index for that node\n //\n // at the end, we need to find elements which were rendered, but are\n // not rendered anymore, and remove them from DOM and trigger `onUnmount`\n // for them.\n });\n\n const positioningOffset: { [key: number]: number } = {};\n\n // to avoid iterating over arrays to determine whether there are removed nodes\n let newElementsCount: number = 0;\n // to avoid unnecessary shuffling of the DOM elements\n let offset: number = 0;\n let currentElement: HTMLElement | Text | null = null;\n newRenderedElements.forEach((newRenderedElement, index) => {\n // if we needed to adjust offset until we reach the original position of the item\n // we need to return it back once we reach the position after it\n if (positioningOffset[index]) {\n offset = offset + positioningOffset[index];\n }\n\n const [newNode, calculatedKey, newState] = newRenderedElement;\n\n const existingElement = elementsByKey[calculatedKey];\n if (existingElement) {\n const { velesElementNode: existingElementNode } =\n getComponentVelesNode(existingElement.node);\n // the element is in the same relative position\n if (existingElement.index + offset === index) {\n currentElement = existingElementNode.html;\n return;\n }\n\n if (existingElement.index + offset > index) {\n if (currentElement) {\n currentElement.after(existingElementNode.html);\n // we adjust the offset of the item right after the one\n // we repositioned\n positioningOffset[existingElement.index + 1] = -1;\n } else {\n // this means we at position 0\n const firstRenderedElement = renderedElements[0]?.[0];\n if (firstRenderedElement) {\n const { velesElementNode: firstRenderedVelesNode } =\n getComponentVelesNode(firstRenderedElement);\n firstRenderedVelesNode.html.before(\n existingElementNode.html\n );\n } else {\n // TODO: handle this properly\n }\n }\n\n currentElement = existingElementNode.html;\n offset = offset + 1;\n } else {\n if (currentElement) {\n currentElement.after(existingElementNode.html);\n positioningOffset[existingElement.index + 1] = 1;\n } else {\n // this means we at position 0\n const firstRenderedElement = renderedElements[0]?.[0];\n if (firstRenderedElement) {\n const { velesElementNode: firstRenderedVelesNode } =\n getComponentVelesNode(firstRenderedElement);\n firstRenderedVelesNode.html.before(\n existingElementNode.html\n );\n } else {\n // TODO: handle this properly\n }\n }\n\n currentElement = existingElementNode.html;\n offset = offset - 1;\n }\n } else {\n // we need to insert new element\n const { velesElementNode: newNodeVelesElement } =\n getComponentVelesNode(newNode);\n newNodeVelesElement.parentVelesElement = parentVelesElement;\n\n if (currentElement) {\n currentElement.after(newNodeVelesElement.html);\n } else {\n // this basically means we at the position 0\n const firstRenderedElement = renderedElements[0]?.[0];\n if (firstRenderedElement) {\n const { velesElementNode: firstRenderedVelesNode } =\n getComponentVelesNode(firstRenderedElement);\n firstRenderedVelesNode.html.before(newNodeVelesElement.html);\n } else {\n // TODO: handle the case when there were 0 rendered elements\n // right now this thing assumes there were no\n parentVelesElement.html.prepend(newNodeVelesElement.html);\n }\n }\n\n offset = offset + 1;\n currentElement = newNodeVelesElement.html;\n newElementsCount = newElementsCount + 1;\n }\n });\n\n if (\n renderedElements.length ===\n newRenderedElements.length + newElementsCount\n ) {\n // it means no existing nodes were removed, so we don't need to do anything\n } else {\n // it means something was removed, and we need to remove it from\n // `childComponents` of our `wrapperComponent`, and also from the DOM\n renderedElements.forEach(([oldNode, calculatedKey]) => {\n // the element is still in DOM\n if (renderedExistingElements[calculatedKey] === true) {\n return;\n } else {\n const { velesElementNode: oldRenderedVelesNode } =\n getComponentVelesNode(oldNode);\n\n oldRenderedVelesNode.html.remove();\n oldNode._privateMethods._callUnmountHandlers();\n\n if (\"velesNode\" in wrapperVelesElementNode) {\n wrapperVelesElementNode.childComponents =\n wrapperVelesElementNode.childComponents.filter(\n (childComponent) => childComponent !== oldNode\n );\n } else {\n throw new Error(\"Wrapper iterator element is a string\");\n }\n }\n });\n }\n\n // update the tracking info with new data\n trackingIterator.renderedElements = newRenderedElements;\n trackingIterator.elementsByKey = newElementsByKey;\n }\n });\n },\n };\n\n if (subscribeCallback) {\n const unsubscribe = subscribeCallback(result.setValue);\n\n if (unsubscribe) {\n onUnmount(unsubscribe);\n }\n }\n\n return result;\n}\n\nexport { createState };\n","import { createState } from \"./create-state\";\n\ntype createdState<StateType> = ReturnType<typeof createState<StateType>>;\n\nexport function combineState<A, B>(\n state1: createdState<A>,\n state2: createdState<B>\n): createdState<[A, B]>;\nexport function combineState<A, B, C>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>\n): createdState<[A, B, C]>;\nexport function combineState<A, B, C, D>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>\n): createdState<[A, B, C, D]>;\nexport function combineState<A, B, C, D, E>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>\n): createdState<[A, B, C, D, E]>;\nexport function combineState<A, B, C, D, E, F>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>,\n state6: createdState<F>\n): createdState<[A, B, C, D, E, F]>;\nexport function combineState<A, B, C, D, E, F, G>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>,\n state6: createdState<F>,\n state7: createdState<G>\n): createdState<[A, B, C, D, E, F, G]>;\nexport function combineState<A, B, C, D, E, F, G, H>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>,\n state6: createdState<F>,\n state7: createdState<G>,\n state8: createdState<H>\n): createdState<[A, B, C, D, E, F, G, H]>;\nexport function combineState<A, B, C, D, E, F, G, H, I>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>,\n state6: createdState<F>,\n state7: createdState<G>,\n state8: createdState<H>,\n state9: createdState<I>\n): createdState<[A, B, C, D, E, F, G, H, I]>;\nexport function combineState<A, B, C, D, E, F, G, H, I, J>(\n state1: createdState<A>,\n state2: createdState<B>,\n state3: createdState<C>,\n state4: createdState<D>,\n state5: createdState<E>,\n state6: createdState<F>,\n state7: createdState<G>,\n state8: createdState<H>,\n state9: createdState<I>,\n state10: createdState<J>\n): createdState<[A, B, C, D, E, F, G, H, I, J]>;\nexport function combineState(...states) {\n const initialValue = states.map((state) => state.getValue());\n const combinedState = createState(initialValue);\n\n states.forEach((state) => {\n state.trackValue(() => {\n // by the time trackValue callback is called\n // it is guaranteed that reading `state.getValue` will\n // return the updated value\n const updatedValue = states.map((state) => state.getValue());\n combinedState.setValue(() => updatedValue);\n });\n });\n\n return combinedState;\n}\n","function createRef<T>(initialRefValue: T | null = null): {\n velesRef: true;\n current: T | null;\n} {\n return {\n velesRef: true,\n current: initialRefValue,\n };\n}\n\nexport { createRef };\n","import { createElement } from \"./create-element\";\n\nimport type { VelesChildren } from \"./types\";\n\nfunction Fragment({ children }: { children: VelesChildren }) {\n return createElement(\"div\", {\n phantom: true,\n children,\n });\n}\n\nexport { Fragment };\n"],"mappings":"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","names":["componentsTree","velesElementNode","state"]}
@@ -0,0 +1,63 @@
1
+ import { V as VelesElement, a as VelesComponent, b as VelesStringElement } from './jsx-runtime-vDysOz5d.cjs';
2
+ export { F as Fragment, c as createElement } from './jsx-runtime-vDysOz5d.cjs';
3
+
4
+ declare function attachComponent({ htmlElement, component, }: {
5
+ htmlElement: HTMLElement;
6
+ component: VelesElement | VelesComponent;
7
+ }): () => void;
8
+
9
+ type AttributeHelper = {
10
+ (htmlElement: HTMLElement, attributeName: string, node: VelesElement): string;
11
+ velesAttribute: boolean;
12
+ };
13
+ type State<ValueType> = {
14
+ trackValue(cb: (value: ValueType) => void | Function, options?: {
15
+ callOnMount?: boolean;
16
+ skipFirstCall?: boolean;
17
+ comparator?: (value1: ValueType, value2: ValueType) => boolean;
18
+ }): void;
19
+ trackValueSelector<SelectorValueType>(selector: (value: ValueType) => SelectorValueType, cb: (value: SelectorValueType) => void | Function, options?: {
20
+ callOnMount?: boolean;
21
+ skipFirstCall?: boolean;
22
+ comparator?: (value1: SelectorValueType, value2: SelectorValueType) => boolean;
23
+ }): void;
24
+ useValue(cb: (value: ValueType) => VelesElement | VelesComponent | string | undefined | null, comparator?: (value1: ValueType, value2: ValueType) => boolean): VelesElement | VelesComponent | VelesStringElement;
25
+ useValueSelector<SelectorValueType>(selector: (value: ValueType) => SelectorValueType, cb: (value: SelectorValueType) => VelesElement | VelesComponent | string | undefined | null, comparator?: (value1: SelectorValueType, value2: SelectorValueType) => boolean): VelesElement | VelesComponent | VelesStringElement;
26
+ useAttribute(cb: (value: ValueType) => string): AttributeHelper;
27
+ useValueIterator<Element>(options: {
28
+ key: string | ((options: {
29
+ element: Element;
30
+ index: number;
31
+ }) => string);
32
+ selector?: (value: ValueType) => Element[];
33
+ }, cb: (props: {
34
+ elementState: State<Element>;
35
+ index: number;
36
+ }) => VelesElement | VelesComponent): VelesComponent | VelesElement | null;
37
+ getValue(): ValueType;
38
+ getPreviousValue(): undefined | ValueType;
39
+ setValue(newValueCB: (currentValue: ValueType) => ValueType): void;
40
+ _triggerUpdates(): void;
41
+ };
42
+ declare function createState<T>(initialValue: T, subscribeCallback?: (setValue: ReturnType<typeof createState<T>>["setValue"]) => Function): State<T>;
43
+
44
+ type createdState<StateType> = ReturnType<typeof createState<StateType>>;
45
+ declare function combineState<A, B>(state1: createdState<A>, state2: createdState<B>): createdState<[A, B]>;
46
+ declare function combineState<A, B, C>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>): createdState<[A, B, C]>;
47
+ declare function combineState<A, B, C, D>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>): createdState<[A, B, C, D]>;
48
+ declare function combineState<A, B, C, D, E>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>): createdState<[A, B, C, D, E]>;
49
+ declare function combineState<A, B, C, D, E, F>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>, state6: createdState<F>): createdState<[A, B, C, D, E, F]>;
50
+ declare function combineState<A, B, C, D, E, F, G>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>, state6: createdState<F>, state7: createdState<G>): createdState<[A, B, C, D, E, F, G]>;
51
+ declare function combineState<A, B, C, D, E, F, G, H>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>, state6: createdState<F>, state7: createdState<G>, state8: createdState<H>): createdState<[A, B, C, D, E, F, G, H]>;
52
+ declare function combineState<A, B, C, D, E, F, G, H, I>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>, state6: createdState<F>, state7: createdState<G>, state8: createdState<H>, state9: createdState<I>): createdState<[A, B, C, D, E, F, G, H, I]>;
53
+ declare function combineState<A, B, C, D, E, F, G, H, I, J>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>, state6: createdState<F>, state7: createdState<G>, state8: createdState<H>, state9: createdState<I>, state10: createdState<J>): createdState<[A, B, C, D, E, F, G, H, I, J]>;
54
+
55
+ declare function onMount(cb: Function): void;
56
+ declare function onUnmount(cb: Function): void;
57
+
58
+ declare function createRef<T>(initialRefValue?: T | null): {
59
+ velesRef: true;
60
+ current: T | null;
61
+ };
62
+
63
+ export { type State, attachComponent, combineState, createRef, createState, onMount, onUnmount };
@@ -0,0 +1,63 @@
1
+ import { V as VelesElement, a as VelesComponent, b as VelesStringElement } from './jsx-runtime-vDysOz5d.js';
2
+ export { F as Fragment, c as createElement } from './jsx-runtime-vDysOz5d.js';
3
+
4
+ declare function attachComponent({ htmlElement, component, }: {
5
+ htmlElement: HTMLElement;
6
+ component: VelesElement | VelesComponent;
7
+ }): () => void;
8
+
9
+ type AttributeHelper = {
10
+ (htmlElement: HTMLElement, attributeName: string, node: VelesElement): string;
11
+ velesAttribute: boolean;
12
+ };
13
+ type State<ValueType> = {
14
+ trackValue(cb: (value: ValueType) => void | Function, options?: {
15
+ callOnMount?: boolean;
16
+ skipFirstCall?: boolean;
17
+ comparator?: (value1: ValueType, value2: ValueType) => boolean;
18
+ }): void;
19
+ trackValueSelector<SelectorValueType>(selector: (value: ValueType) => SelectorValueType, cb: (value: SelectorValueType) => void | Function, options?: {
20
+ callOnMount?: boolean;
21
+ skipFirstCall?: boolean;
22
+ comparator?: (value1: SelectorValueType, value2: SelectorValueType) => boolean;
23
+ }): void;
24
+ useValue(cb: (value: ValueType) => VelesElement | VelesComponent | string | undefined | null, comparator?: (value1: ValueType, value2: ValueType) => boolean): VelesElement | VelesComponent | VelesStringElement;
25
+ useValueSelector<SelectorValueType>(selector: (value: ValueType) => SelectorValueType, cb: (value: SelectorValueType) => VelesElement | VelesComponent | string | undefined | null, comparator?: (value1: SelectorValueType, value2: SelectorValueType) => boolean): VelesElement | VelesComponent | VelesStringElement;
26
+ useAttribute(cb: (value: ValueType) => string): AttributeHelper;
27
+ useValueIterator<Element>(options: {
28
+ key: string | ((options: {
29
+ element: Element;
30
+ index: number;
31
+ }) => string);
32
+ selector?: (value: ValueType) => Element[];
33
+ }, cb: (props: {
34
+ elementState: State<Element>;
35
+ index: number;
36
+ }) => VelesElement | VelesComponent): VelesComponent | VelesElement | null;
37
+ getValue(): ValueType;
38
+ getPreviousValue(): undefined | ValueType;
39
+ setValue(newValueCB: (currentValue: ValueType) => ValueType): void;
40
+ _triggerUpdates(): void;
41
+ };
42
+ declare function createState<T>(initialValue: T, subscribeCallback?: (setValue: ReturnType<typeof createState<T>>["setValue"]) => Function): State<T>;
43
+
44
+ type createdState<StateType> = ReturnType<typeof createState<StateType>>;
45
+ declare function combineState<A, B>(state1: createdState<A>, state2: createdState<B>): createdState<[A, B]>;
46
+ declare function combineState<A, B, C>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>): createdState<[A, B, C]>;
47
+ declare function combineState<A, B, C, D>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>): createdState<[A, B, C, D]>;
48
+ declare function combineState<A, B, C, D, E>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>): createdState<[A, B, C, D, E]>;
49
+ declare function combineState<A, B, C, D, E, F>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>, state6: createdState<F>): createdState<[A, B, C, D, E, F]>;
50
+ declare function combineState<A, B, C, D, E, F, G>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>, state6: createdState<F>, state7: createdState<G>): createdState<[A, B, C, D, E, F, G]>;
51
+ declare function combineState<A, B, C, D, E, F, G, H>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>, state6: createdState<F>, state7: createdState<G>, state8: createdState<H>): createdState<[A, B, C, D, E, F, G, H]>;
52
+ declare function combineState<A, B, C, D, E, F, G, H, I>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>, state6: createdState<F>, state7: createdState<G>, state8: createdState<H>, state9: createdState<I>): createdState<[A, B, C, D, E, F, G, H, I]>;
53
+ declare function combineState<A, B, C, D, E, F, G, H, I, J>(state1: createdState<A>, state2: createdState<B>, state3: createdState<C>, state4: createdState<D>, state5: createdState<E>, state6: createdState<F>, state7: createdState<G>, state8: createdState<H>, state9: createdState<I>, state10: createdState<J>): createdState<[A, B, C, D, E, F, G, H, I, J]>;
54
+
55
+ declare function onMount(cb: Function): void;
56
+ declare function onUnmount(cb: Function): void;
57
+
58
+ declare function createRef<T>(initialRefValue?: T | null): {
59
+ velesRef: true;
60
+ current: T | null;
61
+ };
62
+
63
+ export { type State, attachComponent, combineState, createRef, createState, onMount, onUnmount };