/
githubmirror
/
solid
Обзор
Документация
Войти
/
githubmirror
/
solid
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
packages/solid-element/src/index.ts
82 строки
3 KB
Ryan Carniato
fix: resolve solid-element owner marker lookup
18 май 2026, 20:30
18 май 2026, 20:30
0bc9c4d
Код
Авторство
О чём код?
import { register, ComponentType as mComponentType, ICustomElement, FunctionComponent, ComponentOptions, PropsDefinitionInput } from "component-register"; export { hot, getCurrentElement, noShadowDOM } from "component-register"; export type ComponentType<T> = mComponentType<T>; import { createRoot, createSignal } from "solid-js"; import { insert } from "solid-js/web"; function createProps<T extends object>(raw: T) { const keys = Object.keys(raw) as (keyof T)[]; const props = {}; for (let i = 0; i < keys.length; i++) { const [get, set] = createSignal(raw[keys[i]]); Object.defineProperty(props, keys[i], { get, set(v) { set(() => v); } }); } return props as T; } function lookupContext(el: ICustomElement & { _$owner?: any }) { if (el.assignedSlot && el.assignedSlot._$owner) return el.assignedSlot._$owner; let next: Element & { _$owner?: any } = el.parentNode; while (next) { if (next._$owner) return next._$owner; if (next.assignedSlot && (next.assignedSlot as Element & { _$owner?: any })._$owner) return (next.assignedSlot as Element & { _$owner?: any })._$owner; next = next.parentNode as Element; } return el._$owner; } function withSolid<T extends object>(ComponentType: ComponentType<T>): ComponentType<T> { return (rawProps: T, options: ComponentOptions) => { const { element } = options as { element: ICustomElement & { _$owner?: any }; }; return createRoot((dispose: Function) => { const props = createProps<T>(rawProps); element.addPropertyChangedCallback((key: string, val: any) => (props[key as keyof T] = val)); element.addReleaseCallback(() => { element.renderRoot.textContent = ""; dispose(); }); const comp = (ComponentType as FunctionComponent<T>)(props as T, options); return insert(element.renderRoot, comp); }, lookupContext(element)); }; } function customElement<T extends object>( tag: string, ComponentType: ComponentType<T> ): CustomElementConstructor; function customElement<T extends object>( tag: string, props: PropsDefinitionInput<T>, ComponentType: ComponentType<T> ): CustomElementConstructor; function customElement<T extends object>( tag: string, props: PropsDefinitionInput<T> | ComponentType<T>, ComponentType?: ComponentType<T> ): CustomElementConstructor { if (arguments.length === 2) { ComponentType = props as ComponentType<T>; props = {} as PropsDefinitionInput<T>; } return register<T>(tag, props as PropsDefinitionInput<T>)(withSolid(ComponentType!)); } export { withSolid, customElement };