diff --git a/.cursor/worktrees.json b/.cursor/worktrees.json new file mode 100644 index 00000000..c81f1214 --- /dev/null +++ b/.cursor/worktrees.json @@ -0,0 +1,3 @@ +{ + "setup-worktree": ["npm install"] +} diff --git a/docs/package.json b/docs/package.json index 71bff339..e3ea3766 100644 --- a/docs/package.json +++ b/docs/package.json @@ -31,8 +31,8 @@ "@qds.dev/tools": "workspace:*", "@qds.dev/ui": "workspace:*", "@qds.dev/utils": "workspace:*", - "@qwik.dev/core": "https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144", - "@qwik.dev/router": "https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8144", + "@qwik.dev/core": "https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957", + "@qwik.dev/router": "https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8ade957", "@qwikest/icons": "^0.0.13", "@tailwindcss/vite": "^4.1.3", "@types/estree-jsx": "1.0.5", diff --git a/libs/components/package.json b/libs/components/package.json index 166eed47..841cb0f7 100644 --- a/libs/components/package.json +++ b/libs/components/package.json @@ -30,7 +30,7 @@ "devDependencies": { "@fluejs/noscroll": "^1.0.0", "@qds.dev/utils": "workspace:*", - "@qwik.dev/core": "https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144", + "@qwik.dev/core": "https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957", "@qds.dev/tools": "workspace:*", "@types/node": "24.9.0", "rolldown": "1.0.0-beta.45", @@ -39,7 +39,7 @@ "vitest-browser-qwik": "0.0.12" }, "peerDependencies": { - "@qwik.dev/core": ">=https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144" + "@qwik.dev/core": ">=https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957" }, "dependencies": { "@oddbird/css-anchor-positioning": "^0.6" diff --git a/libs/components/src/carousel/carousel-scroll-area.tsx b/libs/components/src/carousel/carousel-scroll-area.tsx index 37d85d97..0c5af543 100644 --- a/libs/components/src/carousel/carousel-scroll-area.tsx +++ b/libs/components/src/carousel/carousel-scroll-area.tsx @@ -1,4 +1,3 @@ -import { useResumed$ } from "@qds.dev/utils"; import { $, component$, @@ -7,27 +6,48 @@ import { sync$, useContext, useOnWindow, + useSerializer$, useSignal, useStyles$, - useTask$ + useTask$, + useVisibleTask$ } from "@qwik.dev/core"; -import { isServer } from "@qwik.dev/core/build"; +import { isDev, isServer } from "@qwik.dev/core/build"; import { Render } from "../render/render"; import styles from "./carousel.css?inline"; import { carouselContextId } from "./carousel-root"; import { - getItemPosition, + findClosestItemIndex, + getCachedTransformManager, getValueFromIndex, getVelocityBasedTargetIndex, isSwipeInCorrectDirection, type OrientationProps, resetDragTracking, setBoundaries, - setInitialItemPos, - setTransform, - setTransition, + TransformManager, trackDragStart } from "./carousel-utils"; +import { useResumed$ } from "@qds.dev/utils"; + +const orientationProps: Record<"vertical" | "horizontal", OrientationProps> = { + vertical: { + size: "height", + scroll: "scrollHeight", + client: "clientHeight", + direction: "y", + pagePosition: "pageY", + clientPosition: "clientY" + }, + horizontal: { + size: "width", + scroll: "scrollWidth", + client: "clientWidth", + direction: "x", + pagePosition: "pageX", + clientPosition: "clientX" + } +}; export const CarouselScrollArea = component$((props: PropsOf<"div">) => { useStyles$(styles); @@ -49,6 +69,7 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { const isTouchDevice = useSignal(false); const touchStartX = useSignal(0); const touchStartY = useSignal(0); + const dragTrackingInitialized = useSignal(false); const givenTransition = useSignal(); const isInitialTransition = useSignal(true); @@ -59,32 +80,36 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { context.isScroller.value = true; }); - const orientationProps: Record<"vertical" | "horizontal", OrientationProps> = { - vertical: { - size: "height", - scroll: "scrollHeight", - client: "clientHeight", - direction: "y", - pagePosition: "pageY", - clientPosition: "clientY" - }, - horizontal: { - size: "width", - scroll: "scrollWidth", - client: "clientWidth", - direction: "x", - pagePosition: "pageX", - clientPosition: "clientX" - } - }; - const { direction, pagePosition, clientPosition } = orientationProps[context.orientation.value]; + const transformManager = useSerializer$(() => { + const getManager = () => { + if (!context.scrollAreaRef.value) return null; + const currentOrientation = context.orientation.value; + const currentOrientationProps = orientationProps[currentOrientation]; + return getCachedTransformManager({ + scrollArea: context.scrollAreaRef.value, + direction: currentOrientationProps.direction, + orientationProps: currentOrientationProps, + givenTransition, + isInitialTransition + }); + }; + + return { + deserialize: getManager, + update: getManager, + initial: undefined + }; + }); + const handleMouseMove = $((e: MouseEvent) => { if (!isMouseDown.value || startPos.value === undefined) return; if (!context.scrollAreaRef.value || !boundaries.value) return; + if (!transformManager.value) return; + const pos = e[pagePosition]; const dragSpeed = context.sensitivity.value.mouse; const walk = (startPos.value - pos) * dragSpeed; @@ -92,17 +117,8 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { if (newTransform >= boundaries.value.min && newTransform <= boundaries.value.max) { transform.value[direction] = newTransform; - - setTransition({ - scrollArea: context.scrollAreaRef.value, - isEnabled: false, - givenTransition, - isInitialTransition - }); - setTransform({ - scrollArea: context.scrollAreaRef.value, - transform: transform.value, - direction + transformManager.value.applyTransformWithoutTransition({ + transform: transform.value }); } @@ -134,6 +150,7 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { isMouseMoving.value = false; isTouchMoving.value = false; isTouchStart.value = false; + dragTrackingInitialized.value = false; resetDragTracking({ dragStartPos, dragStartTime @@ -189,49 +206,25 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { } if (targetIndex === currentIndex) { - let closestIndex = 0; - let minDistance = Infinity; - - for (let i = 0; i < items.length; i++) { - const itemPosition = getItemPosition({ - scrollArea: context.scrollAreaRef.value, - index: i, - itemRefsArray: items as Array<{ value: HTMLElement | undefined }>, - gap: context.gap.value, - align: context.align.value, - orientationProps: orientationProps[context.orientation.value] - }); - if (itemPosition === undefined) continue; - - const distance = Math.abs(itemPosition - currentPosition); - if (distance < minDistance) { - closestIndex = i; - minDistance = distance; - } - } - targetIndex = closestIndex; + targetIndex = findClosestItemIndex({ + scrollArea: context.scrollAreaRef.value, + currentPosition, + itemRefsArray: items as Array<{ value: HTMLElement | undefined }>, + gap: context.gap.value, + align: context.align.value, + orientationProps: orientationProps[context.orientation.value] + }); } - const dragSnapPosition = getItemPosition({ - scrollArea: context.scrollAreaRef.value, - index: targetIndex, - itemRefsArray: items as Array<{ value: HTMLElement | undefined }>, - gap: context.gap.value, - align: context.align.value, - orientationProps: orientationProps[context.orientation.value] - }); - setTransition({ - scrollArea: context.scrollAreaRef.value, - isEnabled: true, - givenTransition, - isInitialTransition - }); - transform.value[direction] = -dragSnapPosition; - setTransform({ - scrollArea: context.scrollAreaRef.value, - transform: transform.value, - direction - }); + if (transformManager.value) { + transformManager.value.navigateToItem({ + index: targetIndex, + itemRefsArray: items as Array<{ value: HTMLElement | undefined }>, + gap: context.gap.value, + align: context.align.value, + transform + }); + } isMouseDown.value = false; isMouseMoving.value = false; @@ -252,14 +245,9 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { const handleMouseDown = $((e: MouseEvent) => { if (!context.isDraggable.value || !context.scrollAreaRef.value) return; - const scrollArea = context.scrollAreaRef.value; + if (!transformManager.value) return; - setTransition({ - scrollArea, - isEnabled: false, - givenTransition, - isInitialTransition - }); + transformManager.value.disableTransition(); isMouseDown.value = true; startPos.value = e[pagePosition]; @@ -272,7 +260,7 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { }); boundaries.value = setBoundaries({ - scrollArea, + scrollArea: context.scrollAreaRef.value, orientation: context.orientation.value }); @@ -299,32 +287,22 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { if (!context.scrollAreaRef.value || isServer) return; + if (!transformManager.value) return; + context.scrollStartRef.value?.style.setProperty("--scroll-snap-align", "none"); if (isMouseDown.value) return; const currentIndex = context.currentIndex.value; - const snapPosition = getItemPosition({ - scrollArea: context.scrollAreaRef.value, + + transformManager.value.navigateToItem({ index: currentIndex, itemRefsArray: context.itemRefsArray.value as Array<{ value: HTMLElement | undefined; }>, gap: context.gap.value, align: context.align.value, - orientationProps: orientationProps[context.orientation.value] - }); - setTransition({ - scrollArea: context.scrollAreaRef.value, - isEnabled: true, - givenTransition, - isInitialTransition - }); - transform.value[direction] = -snapPosition; - setTransform({ - scrollArea: context.scrollAreaRef.value, - transform: transform.value, - direction + transform }); window.removeEventListener("mousemove", handleMouseMove); @@ -337,70 +315,45 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { if (!context.scrollAreaRef.value) return; - setTransition({ - scrollArea: context.scrollAreaRef.value, - isEnabled: true, - givenTransition, - isInitialTransition - }); + if (!transformManager.value) return; - if (!context.scrollAreaRef.value) return; + transformManager.value.disableTransition(); - const newPosition = getItemPosition({ - scrollArea: context.scrollAreaRef.value, + transformManager.value.navigateToItem({ index: context.currentIndex.value, itemRefsArray: context.itemRefsArray.value as Array<{ value: HTMLElement | undefined; }>, gap: context.gap.value, align: context.align.value, - orientationProps: orientationProps[context.orientation.value] + transform }); - transform.value[direction] = -newPosition; - setTransform({ - scrollArea: context.scrollAreaRef.value, - transform: transform.value, - direction - }); context.scrollAreaRef.value.style.transition = "none"; }); const handleTouchStart = $((e: TouchEvent) => { if (!context.isDraggable.value || !context.scrollAreaRef.value) return; - const scrollArea = context.scrollAreaRef.value; + if (!transformManager.value) return; + const touch = e.touches[0]; const touchPos = touch[clientPosition]; touchStartX.value = touch.clientX; touchStartY.value = touch.clientY; - setTransition({ - scrollArea, - isEnabled: false, - givenTransition, - isInitialTransition - }); + transformManager.value.disableTransition(); startPos.value = touchPos; isTouchStart.value = true; isTouchMoving.value = false; - - trackDragStart({ - position: touchPos, - dragStartPos, - dragStartTime - }); + dragTrackingInitialized.value = false; boundaries.value = setBoundaries({ - scrollArea, + scrollArea: context.scrollAreaRef.value, orientation: context.orientation.value }); - - if (context.startValue && context.scrollStartRef.value) { - context.scrollStartRef.value.style.setProperty("--scroll-snap-align", "none"); - } }); const handleTouchMove = $((e: TouchEvent) => { @@ -421,6 +374,20 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { return; } + if (!dragTrackingInitialized.value) { + trackDragStart({ + position: startPos.value, + dragStartPos, + dragStartTime + }); + + if (context.startValue && context.scrollStartRef.value) { + context.scrollStartRef.value.style.setProperty("--scroll-snap-align", "none"); + } + + dragTrackingInitialized.value = true; + } + const pos = touch[clientPosition]; const dragSpeed = context.sensitivity.value.touch; @@ -432,13 +399,17 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { rafId.value = undefined; } + // Skip transform application if value unchanged if (newTransform >= boundaries.value.min && newTransform <= boundaries.value.max) { - transform.value[direction] = newTransform; - setTransform({ - scrollArea: context.scrollAreaRef.value, - transform: transform.value, - direction - }); + const currentTransform = transform.value[direction]; + if (newTransform !== currentTransform) { + transform.value[direction] = newTransform; + if (transformManager.value) { + transformManager.value.applyTransformWithoutTransition({ + transform: transform.value + }); + } + } } startPos.value = pos; @@ -477,15 +448,11 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { useResumed$(() => { if (isNewPosOnLoad.value && context.scrollAreaRef.value) { - setInitialItemPos({ - scrollArea: context.scrollAreaRef.value, - transform, - setTransition, - setTransform, - givenTransition, - isInitialTransition, - direction - }); + if (transformManager.value) { + transformManager.value.initializeFromScroll({ + transform + }); + } } }); @@ -497,6 +464,26 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { let preventTouchStartY = 0; let preventIsHorizontal: boolean | null = null; + if (isDev) { + /** + * Dev-only hack: wakes up computed signals in Vite dev mode + * so initial interactions feel fast. + * + * WHY: In unbundled dev mode, Qwik's preloader can't preload computed signals + * because there's no module graph. This forces early runtime initialization. + * + * FUTURE: Vite's Full Bundle Mode (powered by Rolldown) should resolve this. + * See: https://x.com/youyuxi/status/1976944868367700137 + * + * DO NOT REMOVE unless you've verified Full Bundle Mode fixes this issue. + */ + console.warn( + "[QDS Carousel] Dev mode workaround: Pre-warming Qwik runtime for faster initial interactions. " + + "This won't appear in production builds." + ); + useVisibleTask$(() => {}); + } + const preventTouchStart = sync$((e: TouchEvent) => { const touch = e.touches[0]; if (!touch) return; @@ -537,6 +524,8 @@ export const CarouselScrollArea = component$((props: PropsOf<"div">) => { return (
`${value}px, 0, 0`, + y: (value: number) => `0, ${value}px, 0` + }; + + const value = transform[this.direction]; + const transformValue = `translate3d(${transformMap[this.direction](value)})`; + this.scrollArea.style.transform = transformValue; + } + + navigateToItem(params: { + index: number; + itemRefsArray: Array<{ value: HTMLElement | undefined }>; + gap: number; + align: "start" | "center" | "end"; + transform: { value: { x: number; y: number; z: number } }; + }): number { + const { index, itemRefsArray, gap, align, transform } = params; + + const position = getItemPosition({ + scrollArea: this.scrollArea, + index, + itemRefsArray, + gap, + align, + orientationProps: this.orientationProps + }); + + transform.value[this.direction] = -position; + + this.applyTransform({ + transform: transform.value, + enableTransition: true + }); + + return position; + } + + applyTransformWithoutTransition(params: { + transform: { x: number; y: number; z: number }; + }): void { + this.applyTransform({ + transform: params.transform, + enableTransition: false + }); + } + + initializeFromScroll(params: { + transform: { value: { x: number; y: number; z: number } }; + }): void { + const { transform } = params; + + this.scrollArea.style.transform = "none"; + + const scrollLeft = this.scrollArea.scrollLeft; + const scrollTop = this.scrollArea.scrollTop; + + transform.value = { + x: -scrollLeft, + y: -scrollTop, + z: transform.value.z + }; + + this.applyTransformWithoutTransition({ + transform: transform.value + }); + + this.scrollArea.style.overflow = "visible"; + } + + disableTransition(): void { + if (this.isInitialTransition.value) { + this.givenTransition.value = getComputedStyle(this.scrollArea).transition; + this.isInitialTransition.value = false; + } + this.scrollArea.style.transition = "none"; + } +} + +const managerCache = new WeakMap(); + +export function getCachedTransformManager(params: { + scrollArea: HTMLElement | undefined; direction: "x" | "y"; -}) { - const { scrollArea, transform, direction } = params; + orientationProps: OrientationProps; + givenTransition: { value: string | undefined }; + isInitialTransition: { value: boolean }; +}): TransformManager | null { + const { + scrollArea, + direction, + orientationProps, + givenTransition, + isInitialTransition + } = params; - const transformMap = { - x: (value: number) => `${value}px, 0, 0`, - y: (value: number) => `0, ${value}px, 0` - }; + if (!scrollArea) { + return null; + } + + let manager = managerCache.get(scrollArea); + + if (!manager || manager.direction !== direction) { + manager = new TransformManager({ + scrollArea, + direction, + orientationProps, + givenTransition, + isInitialTransition + }); + managerCache.set(scrollArea, manager); + } - const value = transform[direction]; - scrollArea.style.transform = `translate3d(${transformMap[direction](value)})`; + return manager; } export function setBoundaries(params: { @@ -58,22 +194,6 @@ export function setBoundaries(params: { return { min: minTransform, max: maxTransform }; } -export function setTransition(params: { - scrollArea: HTMLElement; - isEnabled: boolean; - givenTransition: { value: string | undefined }; - isInitialTransition: { value: boolean }; -}) { - const { scrollArea, isEnabled, givenTransition, isInitialTransition } = params; - - if (isInitialTransition.value) { - givenTransition.value = getComputedStyle(scrollArea).transition; - isInitialTransition.value = false; - } - - scrollArea.style.transition = isEnabled ? (givenTransition.value ?? "revert") : "none"; -} - export function getItemPosition(params: { scrollArea: HTMLElement; index: number; @@ -81,7 +201,7 @@ export function getItemPosition(params: { gap: number; align: "start" | "center" | "end"; orientationProps: OrientationProps; -}) { +}): number { const { scrollArea, index, itemRefsArray, gap, align, orientationProps } = params; const { size, scroll, client } = orientationProps; let position = 0; @@ -116,57 +236,38 @@ export function getItemPosition(params: { return Math.abs(position); } -export function setInitialItemPos(params: { +export function findClosestItemIndex(params: { scrollArea: HTMLElement; - transform: { value: { x: number; y: number; z: number } }; - setTransition: (params: { - scrollArea: HTMLElement; - isEnabled: boolean; - givenTransition: { value: string | undefined }; - isInitialTransition: { value: boolean }; - }) => void; - setTransform: (params: { - scrollArea: HTMLElement; - transform: { x: number; y: number; z: number }; - direction: "x" | "y"; - }) => void; - givenTransition: { value: string | undefined }; - isInitialTransition: { value: boolean }; - direction: "x" | "y"; -}) { - const { - scrollArea, - transform, - setTransition, - setTransform, - givenTransition, - isInitialTransition, - direction - } = params; - - scrollArea.style.transform = "none"; - - const scrollLeft = scrollArea.scrollLeft; - const scrollTop = scrollArea.scrollTop; - - transform.value = { - x: -scrollLeft, - y: -scrollTop, - z: transform.value.z - }; + currentPosition: number; + itemRefsArray: Array<{ value: HTMLElement | undefined }>; + gap: number; + align: "start" | "center" | "end"; + orientationProps: OrientationProps; +}): number { + const { scrollArea, currentPosition, itemRefsArray, gap, align, orientationProps } = + params; + + let closestIndex = 0; + let minDistance = Infinity; + + for (let i = 0; i < itemRefsArray.length; i++) { + const itemPosition = getItemPosition({ + scrollArea, + index: i, + itemRefsArray, + gap, + align, + orientationProps + }); + + const distance = Math.abs(itemPosition - currentPosition); + if (distance < minDistance) { + closestIndex = i; + minDistance = distance; + } + } - setTransition({ - scrollArea, - isEnabled: false, - givenTransition, - isInitialTransition - }); - setTransform({ - scrollArea, - transform: transform.value, - direction - }); - scrollArea.style.overflow = "visible"; + return closestIndex; } export function trackDragStart(params: { diff --git a/libs/components/src/checkbox/checkbox.browser.tsx b/libs/components/src/checkbox/checkbox.browser.tsx index d9f717e7..c36a0dfa 100644 --- a/libs/components/src/checkbox/checkbox.browser.tsx +++ b/libs/components/src/checkbox/checkbox.browser.tsx @@ -725,6 +725,7 @@ test("checkbox root data-disabled updates dynamically", async () => { await expect.element(Root).toBeVisible(); await expect.element(Root).toHaveAttribute("ui-disabled"); + await expect.element(ToggleDisabledButton).toBeVisible(); await userEvent.click(ToggleDisabledButton); await expect.element(Root).not.toHaveAttribute("ui-disabled"); diff --git a/libs/utils/package.json b/libs/utils/package.json index 29346120..4e2db0de 100644 --- a/libs/utils/package.json +++ b/libs/utils/package.json @@ -30,9 +30,9 @@ "@types/node": "24.9.0", "typescript": "5.4.5", "rolldown": "1.0.0-beta.45", - "@qwik.dev/core": "https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144" + "@qwik.dev/core": "https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957" }, "peerDependencies": { - "@qwik.dev/core": ">=https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144" + "@qwik.dev/core": ">=https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957" } } diff --git a/libs/utils/src/use-unmount.tsx b/libs/utils/src/use-unmount.tsx index 3bd82b18..f4c51818 100644 --- a/libs/utils/src/use-unmount.tsx +++ b/libs/utils/src/use-unmount.tsx @@ -4,59 +4,13 @@ import { isServer, type QRL, type Signal, - sync$, useOnDocument, useSignal, useTask$ } from "@qwik.dev/core"; -/** - * Hook that sets up a global listener for the qsymbol event (fired when Qwik app resumes). - * When qsymbol fires, dispatches a custom "qresumed" event that can be used to clean up - * server-rendered content that shouldn't persist after hydration. - * - * This hook uses globalThis to ensure the qresumed event is only dispatched once per - * application, even if called from multiple component instances. - * - * @example - * // In a component that needs to clean up server-rendered content - * export const MyComponent = component$(() => { - * useResumed(); - * - * // Listen for the resumed event - * useOnDocument("qresumed", sync$(() => { - * // Clean up logic here - * })); - * - * return
...
; - * }); - */ export function useResumedQrl(qrl: QRL<() => void>): void { - const initResumedFn = sync$(() => { - const global = globalThis as typeof globalThis & { - __qds_resumed_dispatched?: boolean; - }; - - if (global.__qds_resumed_dispatched) { - return; - } - - global.__qds_resumed_dispatched = true; - - const event = new CustomEvent("qresumed", { - bubbles: true, - detail: { - timestamp: Date.now() - } - }); - document.dispatchEvent(event); - }); - - if (isServer) { - useOnDocument("qsymbol", initResumedFn); - } - - useOnDocument("qresumed", qrl); + useOnDocument("qresume", qrl); } export const useResumed$ = implicit$FirstArg(useResumedQrl); diff --git a/package.json b/package.json index 9b73e362..0db2d529 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@biomejs/biome": "2.3.0", "@linear/sdk": "^27.0.0", "@qds.dev/tools": "workspace:*", - "@qwik.dev/core": "https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144", + "@qwik.dev/core": "https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957", "@types/node": "24.9.0", "@vitest/browser-playwright": "^4.0.3", "@vitest/ui": "^4.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a427191b..d18bc078 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,8 +32,8 @@ importers: specifier: workspace:* version: link:libs/tools '@qwik.dev/core': - specifier: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144 - version: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@4.0.3(@types/debug@4.1.12)(@types/node@24.9.0)(@vitest/browser-playwright@4.0.3)(@vitest/ui@4.0.3)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) + specifier: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957 + version: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@4.0.3(@types/debug@4.1.12)(@types/node@24.9.0)(@vitest/browser-playwright@4.0.3)(@vitest/ui@4.0.3)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) '@types/node': specifier: 24.9.0 version: 24.9.0 @@ -108,11 +108,11 @@ importers: specifier: workspace:* version: link:../libs/utils '@qwik.dev/core': - specifier: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144 - version: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + specifier: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957 + version: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) '@qwik.dev/router': - specifier: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8144 - version: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8144(@qwik.dev/core@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4))(rollup@4.52.5)(typescript@5.4.5)(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) + specifier: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8ade957 + version: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8ade957(@qwik.dev/core@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4))(rollup@4.52.5)(typescript@5.4.5)(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) '@qwikest/icons': specifier: ^0.0.13 version: 0.0.13(@builder.io/qwik@1.16.1(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))) @@ -166,8 +166,8 @@ importers: specifier: workspace:* version: link:../utils '@qwik.dev/core': - specifier: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144 - version: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@4.0.3(@types/debug@4.1.12)(@types/node@24.9.0)(@vitest/browser-playwright@4.0.3)(@vitest/ui@4.0.3)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) + specifier: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957 + version: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@4.0.3(@types/debug@4.1.12)(@types/node@24.9.0)(@vitest/browser-playwright@4.0.3)(@vitest/ui@4.0.3)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) '@types/node': specifier: 24.9.0 version: 24.9.0 @@ -230,8 +230,8 @@ importers: libs/utils: devDependencies: '@qwik.dev/core': - specifier: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144 - version: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + specifier: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957 + version: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) '@types/node': specifier: 24.9.0 version: 24.9.0 @@ -882,6 +882,18 @@ packages: resolution: {integrity: sha512-ktUb5d58pt1lQGXO5E9S0F1ljM0g+CoQuGTVII0IxBc0apmPq5RI0o3OWLY7U3ZERRiYTg5UfjiMihBEzuZsuw==} engines: {node: ^18.14.0 || >=20} + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + '@oclif/core@4.5.4': resolution: {integrity: sha512-78YYJls8+KG96tReyUsesKKIKqC0qbFSY1peUSrt0P2uGsrgAuU9axQ0iBQdhAlIwZDcTyaj+XXVQkz2kl/O0w==} engines: {node: '>=18.0.0'} @@ -1277,9 +1289,9 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@qwik.dev/core@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144': - resolution: {tarball: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144} - version: 2.0.0-beta.13 + '@qwik.dev/core@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957': + resolution: {tarball: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957} + version: 2.0.0-beta.15 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} hasBin: true peerDependencies: @@ -1292,12 +1304,12 @@ packages: vitest: optional: true - '@qwik.dev/router@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8144': - resolution: {tarball: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8144} - version: 2.0.0-beta.13 + '@qwik.dev/router@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8ade957': + resolution: {tarball: https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8ade957} + version: 2.0.0-beta.15 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} peerDependencies: - '@qwik.dev/core': ^2.0.0-beta.13 + '@qwik.dev/core': ^2.0.0-beta.15 vite: '>=5 <8' '@qwikest/icons@0.0.13': @@ -1747,6 +1759,9 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} + '@ts-morph/common@0.24.0': + resolution: {integrity: sha512-c1xMmNHWpNselmpIqursHeOHHBTIsJLbB+NuovbTTRCNiTLEr/U9dbJ8qy0jd/O2x5pc3seWuOUN5R2IoOTp8A==} + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -2016,6 +2031,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + bumpp@10.3.1: resolution: {integrity: sha512-cOKPRFCWvHcYPJQAHN6V7Jp/wAfnyqQRXQ+2fgWIL6Gao20rpu7xQ1cGGo1APOfmbQmmHngEPg9Fy7nJ3giRkQ==} engines: {node: '>=18'} @@ -2105,6 +2124,9 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} @@ -2381,9 +2403,16 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -2402,6 +2431,10 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + find-up@7.0.0: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} @@ -2471,6 +2504,10 @@ packages: github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} @@ -2607,10 +2644,18 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -2623,6 +2668,10 @@ packages: resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} engines: {node: '>=16'} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -2928,6 +2977,10 @@ packages: merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -3036,6 +3089,10 @@ packages: micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -3064,6 +3121,11 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} @@ -3294,6 +3356,9 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@5.0.0: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3322,6 +3387,10 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -3371,6 +3440,9 @@ packages: quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -3458,6 +3530,10 @@ packages: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rolldown@1.0.0-beta.45: resolution: {integrity: sha512-iMmuD72XXLf26Tqrv1cryNYLX6NNPLhZ3AmNkSf8+xda0H+yijjGJ+wVT9UdBUHOpKzq9RjKtQKRCWoEKQQBZQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3477,6 +3553,9 @@ packages: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -3633,6 +3712,10 @@ packages: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -3646,6 +3729,9 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-morph@23.0.0: + resolution: {integrity: sha512-FcvFx7a9E8TUe6T3ShihXJLiJOiqyafzFKUO4aqIHDUCIvADdGNShcbc2W5PMr3LerXRv7mafvFZ9lRENxJmug==} + tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -4521,6 +4607,18 @@ snapshots: '@netlify/types@2.1.0': {} + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + '@oclif/core@4.5.4': dependencies: ansi-escapes: 4.3.2 @@ -4787,30 +4885,32 @@ snapshots: '@polka/url@1.0.0-next.29': {} - '@qwik.dev/core@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)': + '@qwik.dev/core@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)': dependencies: csstype: 3.1.3 launch-editor: 2.11.1 rollup: 4.52.5 + ts-morph: 23.0.0 vite: 7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) optionalDependencies: vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) - '@qwik.dev/core@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@4.0.3(@types/debug@4.1.12)(@types/node@24.9.0)(@vitest/browser-playwright@4.0.3)(@vitest/ui@4.0.3)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))': + '@qwik.dev/core@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@4.0.3(@types/debug@4.1.12)(@types/node@24.9.0)(@vitest/browser-playwright@4.0.3)(@vitest/ui@4.0.3)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))': dependencies: csstype: 3.1.3 launch-editor: 2.11.1 rollup: 4.52.5 + ts-morph: 23.0.0 vite: 7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) optionalDependencies: vitest: 4.0.3(@types/debug@4.1.12)(@types/node@24.9.0)(@vitest/browser-playwright@4.0.3)(@vitest/ui@4.0.3)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) - '@qwik.dev/router@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8144(@qwik.dev/core@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4))(rollup@4.52.5)(typescript@5.4.5)(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))': + '@qwik.dev/router@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/router@8ade957(@qwik.dev/core@https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4))(rollup@4.52.5)(typescript@5.4.5)(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))': dependencies: '@azure/functions': 3.5.1 '@mdx-js/mdx': 3.1.1 '@netlify/edge-functions': 2.19.0 - '@qwik.dev/core': https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8144(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + '@qwik.dev/core': https://pkg.pr.new/QwikDev/qwik/@qwik.dev/core@8ade957(vite@7.1.5(@types/node@24.9.0)(jiti@2.6.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) '@types/mdx': 2.0.13 estree-util-value-to-estree: 3.4.0 github-slugger: 2.0.0 @@ -5155,6 +5255,13 @@ snapshots: '@trysound/sax@0.2.0': {} + '@ts-morph/common@0.24.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 9.0.5 + mkdirp: 3.0.1 + path-browserify: 1.0.1 + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -5486,6 +5593,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + bumpp@10.3.1: dependencies: ansis: 4.2.0 @@ -5596,6 +5707,8 @@ snapshots: clsx@2.1.1: {} + code-block-writer@13.0.3: {} + collapse-white-space@2.1.0: {} combined-stream@1.0.8: @@ -5909,8 +6022,20 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-uri@3.1.0: {} + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + fault@2.0.1: dependencies: format: 0.2.2 @@ -5925,6 +6050,10 @@ snapshots: dependencies: minimatch: 5.1.6 + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + find-up@7.0.0: dependencies: locate-path: 7.2.0 @@ -6000,6 +6129,10 @@ snapshots: github-slugger@2.0.0: {} + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + globals@15.15.0: {} globrex@0.1.2: {} @@ -6184,8 +6317,14 @@ snapshots: is-docker@3.0.0: {} + is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} is-inside-container@1.0.0: @@ -6194,6 +6333,8 @@ snapshots: is-network-error@1.3.0: {} + is-number@7.0.0: {} + is-plain-obj@4.1.0: {} is-stream@3.0.0: {} @@ -6573,6 +6714,8 @@ snapshots: merge-stream@2.0.0: {} + merge2@1.4.1: {} + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.2.0 @@ -6844,6 +6987,11 @@ snapshots: transitivePeerDependencies: - supports-color + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mime-db@1.52.0: {} mime-types@2.1.35: @@ -6866,6 +7014,8 @@ snapshots: dependencies: minipass: 7.1.2 + mkdirp@3.0.1: {} + mlly@1.8.0: dependencies: acorn: 8.15.0 @@ -7086,6 +7236,8 @@ snapshots: dependencies: entities: 6.0.1 + path-browserify@1.0.1: {} + path-exists@5.0.0: {} path-key@3.1.1: {} @@ -7103,6 +7255,8 @@ snapshots: picocolors@1.1.1: {} + picomatch@2.3.1: {} + picomatch@4.0.3: {} pixelmatch@7.1.0: @@ -7152,6 +7306,8 @@ snapshots: quansync@0.2.11: {} + queue-microtask@1.2.3: {} + rc9@2.1.2: dependencies: defu: 6.1.4 @@ -7310,6 +7466,8 @@ snapshots: retry@0.13.1: {} + reusify@1.1.0: {} + rolldown@1.0.0-beta.45: dependencies: '@oxc-project/types': 0.95.0 @@ -7387,6 +7545,10 @@ snapshots: run-applescript@7.1.0: {} + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + safer-buffer@2.1.2: {} scule@1.3.0: {} @@ -7557,6 +7719,10 @@ snapshots: tmp@0.2.5: {} + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + totalist@3.0.1: {} tr46@0.0.3: {} @@ -7565,6 +7731,11 @@ snapshots: trough@2.2.0: {} + ts-morph@23.0.0: + dependencies: + '@ts-morph/common': 0.24.0 + code-block-writer: 13.0.3 + tsconfck@3.1.6(typescript@5.4.5): optionalDependencies: typescript: 5.4.5