diff --git a/.changeset/marko-virtual-initial.md b/.changeset/marko-virtual-initial.md new file mode 100644 index 000000000..499f9954f --- /dev/null +++ b/.changeset/marko-virtual-initial.md @@ -0,0 +1,5 @@ +--- +'@tanstack/marko-virtual': minor +--- + +Add `@tanstack/marko-virtual` — a headless virtualisation adapter for Marko 6 using the runtime-tags API. Provides `` and `` tags covering fixed, variable, dynamic, grid, smooth-scroll, infinite-scroll, and window virtualisation patterns. diff --git a/docs/config.json b/docs/config.json index 8b5dd21de..b3c5f87bf 100644 --- a/docs/config.json +++ b/docs/config.json @@ -55,6 +55,15 @@ "to": "framework/vue/vue-virtual" } ] + }, + { + "label": "marko", + "children": [ + { + "label": "Marko Virtual", + "to": "framework/marko/marko-virtual" + } + ] } ] }, @@ -249,6 +258,39 @@ "label": "Dynamic" } ] + }, + { + "label": "marko", + "children": [ + { + "to": "framework/marko/examples/fixed", + "label": "Fixed" + }, + { + "to": "framework/marko/examples/variable", + "label": "Variable" + }, + { + "to": "framework/marko/examples/dynamic", + "label": "Dynamic" + }, + { + "to": "framework/marko/examples/grid", + "label": "Grid" + }, + { + "to": "framework/marko/examples/infinite-scroll", + "label": "Infinite Scroll" + }, + { + "to": "framework/marko/examples/smooth-scroll", + "label": "Smooth Scroll" + }, + { + "to": "framework/marko/examples/window", + "label": "Window" + } + ] } ] } diff --git a/docs/framework/marko/marko-virtual.md b/docs/framework/marko/marko-virtual.md new file mode 100644 index 000000000..e6cf29ccc --- /dev/null +++ b/docs/framework/marko/marko-virtual.md @@ -0,0 +1,248 @@ +# Marko Virtual + +`@tanstack/marko-virtual` is the Marko 6 adapter for TanStack Virtual. It provides +row, column, and grid virtualisation via two auto-discovered Marko tags: + +- **``** — element-based scrolling (rows, columns, grids) +- **``** — full-page/window scrolling + +Tags are discovered automatically by the Marko compiler when the package is +installed. No imports are needed in your `.marko` files. + +## Installation + +```sh +npm install @tanstack/marko-virtual +``` + +## Row virtualisation + +```marko + + + + +
+ 35 + getScrollElement=scrollEl + > +
+ +
+ Row ${item.index} +
+ +
+ +
+ +``` + +## Column virtualisation + +Same tag, `horizontal=true`: + +```marko +
+ 100 + horizontal=true + getScrollElement=scrollEl + > +
+ +
+ Column ${item.index} +
+ +
+ +
+``` + +## Grid virtualisation + +Compose two `` tags — one for rows, one for columns — sharing the +same scroll element: + +```marko +
+ 35 + getScrollElement=scrollEl + > + 100 + horizontal=true + getScrollElement=scrollEl + > +
+ + +
+ Cell ${row.index}, ${col.index} +
+ + +
+ + +
+``` + +## Window virtualisation + +Use `` when the entire page scrolls rather than a container: + +```marko + 35 +> +
+ +
+ Row ${item.index} +
+ +
+
+``` + +## Dynamic / variable item sizes + +For items with unknown heights, use `measureElement` as an effect-driven ref +to measure each element after render: + +```marko +
+ 50 + getScrollElement=scrollEl + > +
+ +
+ + ${data[item.index].text} +
+ +
+ +
+``` + +## Tag variable reference + +Both tags expose the same tag variable shape: + +| Property | Type | Description | +|---|---|---| +| `virtualItems` | `VirtualItem[]` | The currently visible virtual items | +| `totalSize` | `number` | Total scrollable size in px — set as the inner container's `height` (or `width` for columns) | +| `measureElement` | `(el: Element \| null) => void` | Ref callback for dynamic item sizing | +| `scrollToIndex` | `(index: number, options?: ScrollToOptions) => void` | Imperatively scroll to an item by index | +| `scrollToOffset` | `(offset: number, options?: ScrollToOptions) => void` | Imperatively scroll to a pixel offset | + +## `` input reference + +| Prop | Type | Default | Description | +|---|---|---|---| +| `count` | `number` | required | Number of items | +| `getScrollElement` | `() => Element \| null` | required | Returns the scroll container | +| `estimateSize` | `(index: number) => number` | `() => 50` | Estimated item size in px | +| `overscan` | `number` | `5` | Items to render beyond the visible area | +| `horizontal` | `boolean` | `false` | Virtualise horizontally (columns) | +| `paddingStart` | `number` | — | Padding before first item | +| `paddingEnd` | `number` | — | Padding after last item | +| `scrollPaddingStart` | `number` | — | Scroll padding for `scrollToIndex` | +| `scrollPaddingEnd` | `number` | — | Scroll padding for `scrollToIndex` | +| `gap` | `number` | — | Gap between items in px | +| `lanes` | `number` | `1` | Lanes for masonry layouts | +| `initialOffset` | `number \| (() => number)` | — | Initial scroll offset | + +## `` input reference + +Same as `` except `getScrollElement`, `horizontal`, and +`initialOffset` are not accepted. The scroll element is always `window`, +scrolling is always vertical, and the initial offset is read from +`window.scrollY` automatically. + +## SSR note + +`` and `` are client-only tags. The +`` tag inside them never runs during SSR, so the tag variable +will be empty (`virtualItems: []`, `totalSize: 0`) on the server. + +Wrap the tag in `` (where `mounted` is set by ``) to +ensure the scroll container exists in the DOM before the virtualizer attaches: + +```marko + + + + +
+ 35 + getScrollElement=scrollEl + > + ... + +
+ +``` diff --git a/examples/marko/dynamic/marko.json b/examples/marko/dynamic/marko.json new file mode 100644 index 000000000..5fbb58877 --- /dev/null +++ b/examples/marko/dynamic/marko.json @@ -0,0 +1 @@ +{ "taglib-imports": ["../../../packages/marko-virtual/marko.json"] } diff --git a/examples/marko/dynamic/package.json b/examples/marko/dynamic/package.json new file mode 100644 index 000000000..0d2e78947 --- /dev/null +++ b/examples/marko/dynamic/package.json @@ -0,0 +1,19 @@ +{ + "name": "tanstack-marko-virtual-example-dynamic", + "private": true, + "type": "module", + "scripts": { + "dev": "marko-run dev", + "build": "marko-run build", + "preview": "marko-run preview" + }, + "dependencies": { + "@marko/run": "^0.7.0", + "@tanstack/marko-virtual": "workspace:*", + "marko": "^6.0.0" + }, + "devDependencies": { + "typescript": "5.6.3", + "vite": "^6.4.2" + } +} diff --git a/examples/marko/dynamic/src/routes/+page.marko b/examples/marko/dynamic/src/routes/+page.marko new file mode 100644 index 000000000..9402378ef --- /dev/null +++ b/examples/marko/dynamic/src/routes/+page.marko @@ -0,0 +1,57 @@ + + + + + + Dynamic Virtualisation — @tanstack/marko-virtual + + + +

Dynamic Virtualisation

+

Item sizes are unknown at render time. Each rendered item is measured via measureElement.

+ + ({ + id: idx, + text: "Item " + idx + " — " + "lorem ipsum dolor sit amet ".repeat(1 + (idx % 5)), + }))/> + + + + +
+ + 80 + getScrollElement=scrollEl + > +
+ +
+ + ${items[item.index]!.id}. ${items[item.index]!.text} +
+ +
+ + +
+ + diff --git a/examples/marko/dynamic/vite.config.ts b/examples/marko/dynamic/vite.config.ts new file mode 100644 index 000000000..3f5bca43a --- /dev/null +++ b/examples/marko/dynamic/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import marko from '@marko/run/vite' + +export default defineConfig({ + // Cast to any: @marko/run/vite types are built against Vite 6 but this + // workspace uses Vite 5. The plugin works correctly at runtime. + plugins: [marko() as any], +}) diff --git a/examples/marko/fixed/package.json b/examples/marko/fixed/package.json new file mode 100644 index 000000000..53af2f922 --- /dev/null +++ b/examples/marko/fixed/package.json @@ -0,0 +1,19 @@ +{ + "name": "tanstack-marko-virtual-example-fixed", + "private": true, + "type": "module", + "scripts": { + "dev": "marko-run dev", + "build": "marko-run build", + "preview": "marko-run preview" + }, + "dependencies": { + "@marko/run": "^0.7.0", + "@tanstack/marko-virtual": "workspace:*", + "marko": "^6.0.0" + }, + "devDependencies": { + "typescript": "5.6.3", + "vite": "^6.4.2" + } +} diff --git a/examples/marko/fixed/src/routes/+page.marko b/examples/marko/fixed/src/routes/+page.marko new file mode 100644 index 000000000..ce9230313 --- /dev/null +++ b/examples/marko/fixed/src/routes/+page.marko @@ -0,0 +1,114 @@ + + + + + + Fixed Virtualisation — @tanstack/marko-virtual + + + +

Fixed Virtualisation

+

Fixed sizes — every item's dimensions are hard-coded to the same value and never change.

+ + + + +
+

Rows

+
+ + 35 + getScrollElement=rowScroll + > +
+ +
+ Row ${item.index} +
+ +
+ + +
+
+ +
+

Columns

+
+ + 100 + horizontal=true + getScrollElement=colScroll + > +
+ +
+ Col ${item.index} +
+ +
+ + +
+
+ +
+

Grid

+
+ + 35 + getScrollElement=gridScroll + > + 100 + horizontal=true + getScrollElement=gridScroll + > +
+ + +
+ ${row.index},${col.index} +
+ + +
+ + + +
+
+ + diff --git a/examples/marko/fixed/vite.config.ts b/examples/marko/fixed/vite.config.ts new file mode 100644 index 000000000..3f5bca43a --- /dev/null +++ b/examples/marko/fixed/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import marko from '@marko/run/vite' + +export default defineConfig({ + // Cast to any: @marko/run/vite types are built against Vite 6 but this + // workspace uses Vite 5. The plugin works correctly at runtime. + plugins: [marko() as any], +}) diff --git a/examples/marko/grid/marko.json b/examples/marko/grid/marko.json new file mode 100644 index 000000000..5fbb58877 --- /dev/null +++ b/examples/marko/grid/marko.json @@ -0,0 +1 @@ +{ "taglib-imports": ["../../../packages/marko-virtual/marko.json"] } diff --git a/examples/marko/grid/package.json b/examples/marko/grid/package.json new file mode 100644 index 000000000..9a168e2c9 --- /dev/null +++ b/examples/marko/grid/package.json @@ -0,0 +1,19 @@ +{ + "name": "tanstack-marko-virtual-example-grid", + "private": true, + "type": "module", + "scripts": { + "dev": "marko-run dev", + "build": "marko-run build", + "preview": "marko-run preview" + }, + "dependencies": { + "@marko/run": "^0.7.0", + "@tanstack/marko-virtual": "workspace:*", + "marko": "^6.0.0" + }, + "devDependencies": { + "typescript": "5.6.3", + "vite": "^6.4.2" + } +} diff --git a/examples/marko/grid/src/routes/+page.marko b/examples/marko/grid/src/routes/+page.marko new file mode 100644 index 000000000..24ee34741 --- /dev/null +++ b/examples/marko/grid/src/routes/+page.marko @@ -0,0 +1,55 @@ + + + + + + Grid Virtualisation — @tanstack/marko-virtual + + + +

Grid Virtualisation

+

A 1000 × 1000 grid — two <virtualizer> tags sharing the same scroll element.

+ + + + +
+ + 30 + ((i * 7 + 11) % 20) + getScrollElement=gridScroll + > + 80 + ((i * 11 + 17) % 80) + horizontal=true + getScrollElement=gridScroll + > +
+ + +
+ ${row.index},${col.index} +
+ + +
+ + + +
+ + diff --git a/examples/marko/grid/vite.config.ts b/examples/marko/grid/vite.config.ts new file mode 100644 index 000000000..3f5bca43a --- /dev/null +++ b/examples/marko/grid/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import marko from '@marko/run/vite' + +export default defineConfig({ + // Cast to any: @marko/run/vite types are built against Vite 6 but this + // workspace uses Vite 5. The plugin works correctly at runtime. + plugins: [marko() as any], +}) diff --git a/examples/marko/infinite-scroll/marko.json b/examples/marko/infinite-scroll/marko.json new file mode 100644 index 000000000..5fbb58877 --- /dev/null +++ b/examples/marko/infinite-scroll/marko.json @@ -0,0 +1 @@ +{ "taglib-imports": ["../../../packages/marko-virtual/marko.json"] } diff --git a/examples/marko/infinite-scroll/package.json b/examples/marko/infinite-scroll/package.json new file mode 100644 index 000000000..f7ee4d121 --- /dev/null +++ b/examples/marko/infinite-scroll/package.json @@ -0,0 +1,19 @@ +{ + "name": "tanstack-marko-virtual-example-infinite-scroll", + "private": true, + "type": "module", + "scripts": { + "dev": "marko-run dev", + "build": "marko-run build", + "preview": "marko-run preview" + }, + "dependencies": { + "@marko/run": "^0.7.0", + "@tanstack/marko-virtual": "workspace:*", + "marko": "^6.0.0" + }, + "devDependencies": { + "typescript": "5.6.3", + "vite": "^6.4.2" + } +} diff --git a/examples/marko/infinite-scroll/src/routes/+page.marko b/examples/marko/infinite-scroll/src/routes/+page.marko new file mode 100644 index 000000000..0f3375b30 --- /dev/null +++ b/examples/marko/infinite-scroll/src/routes/+page.marko @@ -0,0 +1,91 @@ + + + + + + Infinite Scroll — @tanstack/marko-virtual + + + +

Infinite Scroll Virtualisation

+

500 rows fetched in pages of 20 as you scroll. The virtualizer reserves all 500 slots upfront — unloaded rows show a placeholder.

+ + + + + + + + + + + (r => setTimeout(r, 400)).then(() => { + const n = Math.min(PAGE_SIZE, TOTAL) + rows = Array.from({ length: n }, (_, k) => "Row #" + (k + 1)) + offset = n + hasMore = n < TOTAL + loading = false + }) + }/> + +
+ + 52 + getScrollElement=scrollEl + overscan=5 + > + = rows.length - 1 && !loading && hasMore) { + const off = offset + loading = true + new Promise(r => setTimeout(r, 400)).then(() => { + const n = Math.min(PAGE_SIZE, TOTAL - off) + rows = [...rows, ...Array.from({ length: n }, (_, k) => "Row #" + (off + k + 1))] + offset = off + n + hasMore = offset < TOTAL + loading = false + }) + } + }/> + +
+ +
+ + ${rows[item.index]} + + + + ${loading && item.index === rows.length ? "Loading…" : "—"} + + +
+ +
+ + +
+ + + + diff --git a/examples/marko/infinite-scroll/vite.config.ts b/examples/marko/infinite-scroll/vite.config.ts new file mode 100644 index 000000000..3f5bca43a --- /dev/null +++ b/examples/marko/infinite-scroll/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import marko from '@marko/run/vite' + +export default defineConfig({ + // Cast to any: @marko/run/vite types are built against Vite 6 but this + // workspace uses Vite 5. The plugin works correctly at runtime. + plugins: [marko() as any], +}) diff --git a/examples/marko/smooth-scroll/marko.json b/examples/marko/smooth-scroll/marko.json new file mode 100644 index 000000000..5fbb58877 --- /dev/null +++ b/examples/marko/smooth-scroll/marko.json @@ -0,0 +1 @@ +{ "taglib-imports": ["../../../packages/marko-virtual/marko.json"] } diff --git a/examples/marko/smooth-scroll/package.json b/examples/marko/smooth-scroll/package.json new file mode 100644 index 000000000..a4444352a --- /dev/null +++ b/examples/marko/smooth-scroll/package.json @@ -0,0 +1,19 @@ +{ + "name": "tanstack-marko-virtual-example-smooth-scroll", + "private": true, + "type": "module", + "scripts": { + "dev": "marko-run dev", + "build": "marko-run build", + "preview": "marko-run preview" + }, + "dependencies": { + "@marko/run": "^0.7.0", + "@tanstack/marko-virtual": "workspace:*", + "marko": "^6.0.0" + }, + "devDependencies": { + "typescript": "5.6.3", + "vite": "^6.4.2" + } +} diff --git a/examples/marko/smooth-scroll/src/routes/+page.marko b/examples/marko/smooth-scroll/src/routes/+page.marko new file mode 100644 index 000000000..0770a8249 --- /dev/null +++ b/examples/marko/smooth-scroll/src/routes/+page.marko @@ -0,0 +1,59 @@ + + + + + + Smooth Scroll — @tanstack/marko-virtual + + + +

Smooth Scroll Virtualisation

+

+ Uses scrollToIndex with behavior: 'smooth' for + native CSS smooth scrolling to any item. +

+ + + + +
+ + 35 + getScrollElement=scrollEl + > +
+ +
+ Row ${item.index} +
+ +
+ +
+ + + +
+ + +
+ + diff --git a/examples/marko/smooth-scroll/vite.config.ts b/examples/marko/smooth-scroll/vite.config.ts new file mode 100644 index 000000000..3f5bca43a --- /dev/null +++ b/examples/marko/smooth-scroll/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import marko from '@marko/run/vite' + +export default defineConfig({ + // Cast to any: @marko/run/vite types are built against Vite 6 but this + // workspace uses Vite 5. The plugin works correctly at runtime. + plugins: [marko() as any], +}) diff --git a/examples/marko/variable/marko.json b/examples/marko/variable/marko.json new file mode 100644 index 000000000..5fbb58877 --- /dev/null +++ b/examples/marko/variable/marko.json @@ -0,0 +1 @@ +{ "taglib-imports": ["../../../packages/marko-virtual/marko.json"] } diff --git a/examples/marko/variable/package.json b/examples/marko/variable/package.json new file mode 100644 index 000000000..68d42b832 --- /dev/null +++ b/examples/marko/variable/package.json @@ -0,0 +1,19 @@ +{ + "name": "tanstack-marko-virtual-example-variable", + "private": true, + "type": "module", + "scripts": { + "dev": "marko-run dev", + "build": "marko-run build", + "preview": "marko-run preview" + }, + "dependencies": { + "@marko/run": "^0.7.0", + "@tanstack/marko-virtual": "workspace:*", + "marko": "^6.0.0" + }, + "devDependencies": { + "typescript": "5.6.3", + "vite": "^6.4.2" + } +} diff --git a/examples/marko/variable/src/routes/+page.marko b/examples/marko/variable/src/routes/+page.marko new file mode 100644 index 000000000..c9415a648 --- /dev/null +++ b/examples/marko/variable/src/routes/+page.marko @@ -0,0 +1,106 @@ + + + + + + Variable Virtualisation — @tanstack/marko-virtual + + + +

Variable Virtualisation

+

+ Each item has a variable but knowable size — passed directly via + estimateSize using a deterministic formula so no DOM measurement is needed. +

+ + + + +
+

Rows

+
+ + 25 + ((i * 17 + 31) % 100) + getScrollElement=rowScroll + > +
+ +
+ Row ${item.index} — ${item.size}px +
+ +
+ + +
+
+ +
+

Columns

+
+ + 75 + ((i * 13 + 43) % 100) + horizontal=true + getScrollElement=colScroll + > +
+ +
+ Col ${item.index} +
+ +
+ + +
+
+ +
+

Masonry (vertical, 4 lanes)

+
+ + 25 + ((i * 17 + 31) % 100) + lanes=4 + getScrollElement=masonryScroll + > +
+ +
+ ${item.index} +
+ +
+ + +
+
+ + diff --git a/examples/marko/variable/vite.config.ts b/examples/marko/variable/vite.config.ts new file mode 100644 index 000000000..3f5bca43a --- /dev/null +++ b/examples/marko/variable/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import marko from '@marko/run/vite' + +export default defineConfig({ + // Cast to any: @marko/run/vite types are built against Vite 6 but this + // workspace uses Vite 5. The plugin works correctly at runtime. + plugins: [marko() as any], +}) diff --git a/examples/marko/window/marko.json b/examples/marko/window/marko.json new file mode 100644 index 000000000..5fbb58877 --- /dev/null +++ b/examples/marko/window/marko.json @@ -0,0 +1 @@ +{ "taglib-imports": ["../../../packages/marko-virtual/marko.json"] } diff --git a/examples/marko/window/package.json b/examples/marko/window/package.json new file mode 100644 index 000000000..ab7667637 --- /dev/null +++ b/examples/marko/window/package.json @@ -0,0 +1,19 @@ +{ + "name": "tanstack-marko-virtual-example-window", + "private": true, + "type": "module", + "scripts": { + "dev": "marko-run dev", + "build": "marko-run build", + "preview": "marko-run preview" + }, + "dependencies": { + "@marko/run": "^0.7.0", + "@tanstack/marko-virtual": "workspace:*", + "marko": "^6.0.0" + }, + "devDependencies": { + "typescript": "5.6.3", + "vite": "^6.4.2" + } +} diff --git a/examples/marko/window/src/routes/+page.marko b/examples/marko/window/src/routes/+page.marko new file mode 100644 index 000000000..48cdf44b9 --- /dev/null +++ b/examples/marko/window/src/routes/+page.marko @@ -0,0 +1,43 @@ + + + + + + Window Virtualisation — @tanstack/marko-virtual + + + +

Window Virtualisation

+

Uses <window-virtualizer> — the entire page scrolls. Scroll down to see rows.

+ + + + + + 35 + overscan=5 + > +
+ +
+ Row ${item.index} +
+ +
+
+ + + diff --git a/examples/marko/window/vite.config.ts b/examples/marko/window/vite.config.ts new file mode 100644 index 000000000..3f5bca43a --- /dev/null +++ b/examples/marko/window/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import marko from '@marko/run/vite' + +export default defineConfig({ + // Cast to any: @marko/run/vite types are built against Vite 6 but this + // workspace uses Vite 5. The plugin works correctly at runtime. + plugins: [marko() as any], +}) diff --git a/knip.json b/knip.json index b1d0eaf4f..0c4fb9b89 100644 --- a/knip.json +++ b/knip.json @@ -2,5 +2,12 @@ "$schema": "https://unpkg.com/knip@5/schema.json", "ignoreWorkspaces": ["examples/**", "benchmarks"], "ignoreDependencies": ["@angular/cli", "babel-plugin-react-compiler"], - "ignore": ["packages/react-virtual/e2e/app/**"] + "ignore": ["packages/react-virtual/e2e/app/**"], + "workspaces": { + "packages/marko-virtual": { + "entry": ["src/index.ts", "src/tags/**/*.{ts,marko}", "tests/**/*.ts"], + "project": ["src/**/*.{ts,marko}", "tests/**/*.ts"], + "ignoreDependencies": ["marko"] + } + } } diff --git a/packages/marko-virtual/README.md b/packages/marko-virtual/README.md new file mode 100644 index 000000000..c6ab7a6f2 --- /dev/null +++ b/packages/marko-virtual/README.md @@ -0,0 +1,192 @@ +# @tanstack/marko-virtual + +Headless UI for virtualizing scrollable elements in [Marko 6](https://markojs.com), built on top of [`@tanstack/virtual-core`](https://tanstack.com/virtual). + +Part of the [TanStack Virtual](https://tanstack.com/virtual) family. + +## Installation + +```bash +npm install @tanstack/marko-virtual +# or +pnpm add @tanstack/marko-virtual +``` + +**Peer dependency:** `marko ^6.0.0` + +## Setup + +Add to your project's `marko.json` to make the tags available: + +```json +{ + "taglib-imports": ["@tanstack/marko-virtual/marko.json"] +} +``` + +## Usage + +### `` — scrollable container + +Use when you control the scroll element (a div with `overflow: auto`). + +```marko + + + + + + + +
+ + 35 + getScrollElement=scrollEl + > +
+ +
+ Row ${item.index} +
+ +
+ + +
+ + + +``` + +> **Why `mounted`?** The virtualizer measures the scroll element's dimensions on mount. During SSR the DOM has no layout, so `offsetHeight` is 0 and no items would be calculated. The `` guard ensures the virtualizer only renders after the browser has real dimensions available. + +### `` — full-page scrolling + +Use when the page itself is the scroll container. + +```marko + + + + + 35> +
+ +
+ Row ${item.index} +
+ +
+
+ + + +``` + +## Tag parameters + +Both tags use Marko 6's tag parameters pattern. The body receives virtual state via `|{ ... }|` destructuring: + +```marko + + +
+``` + +## API Reference + +### `` + +| Attribute | Type | Required | Description | +| -------------------- | --------------------------- | -------- | --------------------------------------------------- | +| `count` | `number` | ✅ | Total number of items | +| `getScrollElement` | `() => Element \| null` | ✅ | Returns the scroll container | +| `estimateSize` | `(index: number) => number` | | Estimated item size in px (default: `50`) | +| `overscan` | `number` | | Items to render outside the viewport (default: `5`) | +| `horizontal` | `boolean` | | Enable horizontal scrolling (default: `false`) | +| `paddingStart` | `number` | | Padding before the first item in px | +| `paddingEnd` | `number` | | Padding after the last item in px | +| `scrollPaddingStart` | `number` | | Scroll padding at the start | +| `scrollPaddingEnd` | `number` | | Scroll padding at the end | +| `gap` | `number` | | Gap between items in px | +| `lanes` | `number` | | Number of lanes for grid layouts | +| `initialOffset` | `number \| (() => number)` | | Initial scroll offset | + +**Tag parameters provided to body:** + +| Parameter | Type | Description | +| ---------------- | ----------------------------------------------------- | -------------------------------------------------------- | +| `virtualItems` | `VirtualItem[]` | Items to render, with `index`, `start`, `size`, `key` | +| `totalSize` | `number` | Total scrollable size in px — set on the inner container | +| `measureElement` | `(el: Element \| null) => void` | Pass to `ref` for dynamic size measurement | +| `scrollToIndex` | `(index: number, options?: ScrollToOptions) => void` | Scroll to an item by index | +| `scrollToOffset` | `(offset: number, options?: ScrollToOptions) => void` | Scroll to a px offset | + +### `` + +Same as `` except there is no `getScrollElement`, `horizontal`, or `initialOffset` — the window is always the scroll container. + +## Examples + +All examples use `@marko/run`. Run any with: + +```bash +pnpm --filter tanstack-marko-virtual-example- dev +``` + +| Example | Description | +| ----------------- | ----------------------------------------------- | +| `fixed` | Fixed-size rows, columns, and grid | +| `variable` | Variable sizes via `estimateSize` | +| `dynamic` | Unknown sizes measured via `measureElement` | +| `grid` | Two virtualizers sharing one scroll element | +| `smooth-scroll` | `scrollToIndex` with CSS smooth scrolling | +| `infinite-scroll` | Lazy data loading with a fixed total count | +| `window` | Full-page scrolling with `` | + +## Dynamic sizing + +Use `measureElement` to measure items whose size isn't known upfront: + +```marko + 50 + getScrollElement=scrollEl +> +
+ +
+ ${items[item.index]} +
+ +
+
+``` + +> `data-index` is required on measured elements — the virtualizer uses it to map measurements back to items. + +## TypeScript + +The tags are fully typed. The Marko language server reads the source `.marko` files directly — no `.d.ts` generation is needed. Ensure `@marko/language-tools` is installed in your editor for IDE support. + +## License + +MIT © [Tanner Linsley](https://github.com/tannerlinsley) diff --git a/packages/marko-virtual/eslint.config.js b/packages/marko-virtual/eslint.config.js new file mode 100644 index 000000000..8ce6ad05f --- /dev/null +++ b/packages/marko-virtual/eslint.config.js @@ -0,0 +1,5 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [...rootConfig] diff --git a/packages/marko-virtual/marko.json b/packages/marko-virtual/marko.json new file mode 100644 index 000000000..82bf8ffd5 --- /dev/null +++ b/packages/marko-virtual/marko.json @@ -0,0 +1 @@ +{ "tags-dir": "./src/tags", "script-lang": "ts" } diff --git a/packages/marko-virtual/package.json b/packages/marko-virtual/package.json new file mode 100644 index 000000000..206ec5a4b --- /dev/null +++ b/packages/marko-virtual/package.json @@ -0,0 +1,70 @@ +{ + "name": "@tanstack/marko-virtual", + "version": "3.13.23", + "description": "Headless UI for virtualizing scrollable elements in Marko 6", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/TanStack/virtual.git", + "directory": "packages/marko-virtual" + }, + "homepage": "https://tanstack.com/virtual", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "marko", + "virtual", + "virtual-core", + "virtualizer", + "datagrid" + ], + "type": "module", + "types": "dist/esm/index.d.ts", + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./package.json": "./package.json", + "./marko.json": "./marko.json", + "./src/tags/*": "./src/tags/*" + }, + "sideEffects": false, + "files": [ + "dist", + "src/tags", + "marko.json", + "README.md" + ], + "scripts": { + "clean": "premove ./dist ./coverage", + "test:eslint": "eslint ./src", + "test:types": "tsc", + "test:lib": "vitest", + "test:lib:dev": "pnpm run test:lib --watch", + "test:build": "publint --strict", + "build": "vite build" + }, + "dependencies": { + "@tanstack/virtual-core": "workspace:*" + }, + "devDependencies": { + "@marko/vite": "^3.0.0", + "@testing-library/dom": "^10.0.0", + "marko": "^6.0.0" + }, + "peerDependencies": { + "marko": "^6.0.0" + } +} diff --git a/packages/marko-virtual/src/index.ts b/packages/marko-virtual/src/index.ts new file mode 100644 index 000000000..0f3afa319 --- /dev/null +++ b/packages/marko-virtual/src/index.ts @@ -0,0 +1,56 @@ +/** + * @tanstack/marko-virtual — Marko 6 adapter for @tanstack/virtual-core + * + * Provides row, column, and grid virtualisation for Marko 6 applications + * via the `` and `` tags. + * + * Tags are auto-discovered by the Marko compiler when this package is + * installed — no imports needed. Just use `` or + * `` directly in your `.marko` files. + * + * @example + * ```marko + * // Row virtualisation + *
+ * 35 + * getScrollElement=scrollEl + * > + *
+ * + *
+ * Row ${item.index} + *
+ * + *
+ * + *
+ * + * // Column virtualisation — same tag, horizontal=true + * 100 + * horizontal=true + * getScrollElement=scrollEl + * > + * ... + *
+ * + * // Grid — compose two tags + * 35 getScrollElement=scrollEl + * > + * 100 horizontal=true getScrollElement=scrollEl + * > + * ... + * + *
+ * ``` + * + * @packageDocumentation + */ + +// Re-export everything from virtual-core so consumers only need this package +export * from '@tanstack/virtual-core' diff --git a/packages/marko-virtual/src/tags/virtualizer/index.marko b/packages/marko-virtual/src/tags/virtualizer/index.marko new file mode 100644 index 000000000..35ea0ea0b --- /dev/null +++ b/packages/marko-virtual/src/tags/virtualizer/index.marko @@ -0,0 +1,78 @@ +import { Virtualizer } from "@tanstack/virtual-core" +import type { VirtualItem, ScrollToOptions } from "@tanstack/virtual-core" +import { buildOptions } from "./options" + +export interface Input { + count: number + estimateSize?: (index: number) => number + getScrollElement: () => Element | null + overscan?: number + horizontal?: boolean + paddingStart?: number + paddingEnd?: number + scrollPaddingStart?: number + scrollPaddingEnd?: number + gap?: number + lanes?: number + initialOffset?: number | (() => number) + content: Marko.Body<[{ + virtualItems: VirtualItem[] + totalSize: number + measureElement: ((el: Element | null) => void) | undefined + scrollToIndex: (index: number, options?: ScrollToOptions) => void + scrollToOffset: (offset: number, options?: ScrollToOptions) => void + }]> +} + + | null)/> + void) | null)/> + + + + + onMount() { + const notify = () => { + const inst = v + if (!inst) return + items = inst.getVirtualItems() + size = inst.getTotalSize() + } + + v = new Virtualizer(buildOptions(input, notify)) + cleanup = v!._didMount() + v!._willUpdate() + } + + onUpdate() { + const current = v + if (!current) return + + const notify = () => { + const inst = v + if (!inst) return + items = inst.getVirtualItems() + size = inst.getTotalSize() + } + + current.setOptions({ ...current.options, ...buildOptions(input, notify) }) + + // _willUpdate() is a no-op when the scroll element is unchanged, so + // notify() explicitly afterwards to recompute on count/option changes. + current._willUpdate() + notify() + } + + onDestroy() { + cleanup?.() + v = null + cleanup = null + } +/> + +<${input.content} + virtualItems=items + totalSize=size + measureElement=v?.measureElement + scrollToIndex=(index: number, options?: ScrollToOptions) => v?.scrollToIndex(index, options) + scrollToOffset=(offset: number, options?: ScrollToOptions) => v?.scrollToOffset(offset, options) +/> diff --git a/packages/marko-virtual/src/tags/virtualizer/options.ts b/packages/marko-virtual/src/tags/virtualizer/options.ts new file mode 100644 index 000000000..d401a758d --- /dev/null +++ b/packages/marko-virtual/src/tags/virtualizer/options.ts @@ -0,0 +1,50 @@ +import { + elementScroll, + observeElementOffset, + observeElementRect, +} from '@tanstack/virtual-core' +import type { VirtualizerOptions } from '@tanstack/virtual-core' + +// The subset of tag input that maps onto virtual-core options. Kept here +// (rather than imported from index.marko) so this helper has no dependency +// on the Marko template's generated types. +export interface VirtualizerInput { + count: number + estimateSize?: (index: number) => number + getScrollElement: () => Element | null + overscan?: number + horizontal?: boolean + paddingStart?: number + paddingEnd?: number + scrollPaddingStart?: number + scrollPaddingEnd?: number + gap?: number + lanes?: number + initialOffset?: number | (() => number) +} + +// Single source of truth for the input -> virtual-core option mapping, +// shared by onMount (construction) and onUpdate (setOptions). +export function buildOptions( + input: VirtualizerInput, + notify: () => void, +): VirtualizerOptions { + return { + count: input.count, + estimateSize: input.estimateSize ?? (() => 50), + getScrollElement: input.getScrollElement, + overscan: input.overscan ?? 5, + horizontal: input.horizontal ?? false, + paddingStart: input.paddingStart, + paddingEnd: input.paddingEnd, + scrollPaddingStart: input.scrollPaddingStart, + scrollPaddingEnd: input.scrollPaddingEnd, + gap: input.gap, + lanes: input.lanes, + initialOffset: input.initialOffset, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: notify, + } +} diff --git a/packages/marko-virtual/src/tags/window-virtualizer/index.marko b/packages/marko-virtual/src/tags/window-virtualizer/index.marko new file mode 100644 index 000000000..095452a04 --- /dev/null +++ b/packages/marko-virtual/src/tags/window-virtualizer/index.marko @@ -0,0 +1,75 @@ +import { Virtualizer } from "@tanstack/virtual-core" +import type { VirtualItem, ScrollToOptions } from "@tanstack/virtual-core" +import { buildOptions } from "./options" + +export interface Input { + count: number + estimateSize?: (index: number) => number + overscan?: number + paddingStart?: number + paddingEnd?: number + scrollPaddingStart?: number + scrollPaddingEnd?: number + gap?: number + lanes?: number + content: Marko.Body<[{ + virtualItems: VirtualItem[] + totalSize: number + measureElement: ((el: Element | null) => void) | undefined + scrollToIndex: (index: number, options?: ScrollToOptions) => void + scrollToOffset: (offset: number, options?: ScrollToOptions) => void + }]> +} + + | null)/> + void) | null)/> + + + + + onMount() { + const notify = () => { + const inst = v + if (!inst) return + items = inst.getVirtualItems() + size = inst.getTotalSize() + } + + v = new Virtualizer(buildOptions(input, notify)) + cleanup = v!._didMount() + v!._willUpdate() + } + + onUpdate() { + const current = v + if (!current) return + + const notify = () => { + const inst = v + if (!inst) return + items = inst.getVirtualItems() + size = inst.getTotalSize() + } + + current.setOptions({ ...current.options, ...buildOptions(input, notify) }) + + // _willUpdate() is a no-op when the scroll element is unchanged, so + // notify() explicitly afterwards to recompute on count/option changes. + current._willUpdate() + notify() + } + + onDestroy() { + cleanup?.() + v = null + cleanup = null + } +/> + +<${input.content} + virtualItems=items + totalSize=size + measureElement=v?.measureElement + scrollToIndex=(index: number, options?: ScrollToOptions) => v?.scrollToIndex(index, options) + scrollToOffset=(offset: number, options?: ScrollToOptions) => v?.scrollToOffset(offset, options) +/> diff --git a/packages/marko-virtual/src/tags/window-virtualizer/options.ts b/packages/marko-virtual/src/tags/window-virtualizer/options.ts new file mode 100644 index 000000000..ab0c81e04 --- /dev/null +++ b/packages/marko-virtual/src/tags/window-virtualizer/options.ts @@ -0,0 +1,46 @@ +import { + observeWindowOffset, + observeWindowRect, + windowScroll, +} from '@tanstack/virtual-core' +import type { VirtualizerOptions } from '@tanstack/virtual-core' + +// The subset of tag input that maps onto virtual-core options. Kept here +// (rather than imported from index.marko) so this helper has no dependency +// on the Marko template's generated types. +export interface WindowVirtualizerInput { + count: number + estimateSize?: (index: number) => number + overscan?: number + paddingStart?: number + paddingEnd?: number + scrollPaddingStart?: number + scrollPaddingEnd?: number + gap?: number + lanes?: number +} + +// Single source of truth for the input -> virtual-core option mapping, +// shared by onMount (construction) and onUpdate (setOptions). +export function buildOptions( + input: WindowVirtualizerInput, + notify: () => void, +): VirtualizerOptions { + return { + count: input.count, + estimateSize: input.estimateSize ?? (() => 50), + getScrollElement: () => (typeof document !== 'undefined' ? window : null), + overscan: input.overscan ?? 5, + paddingStart: input.paddingStart, + paddingEnd: input.paddingEnd, + scrollPaddingStart: input.scrollPaddingStart, + scrollPaddingEnd: input.scrollPaddingEnd, + gap: input.gap, + lanes: input.lanes, + initialOffset: () => (typeof document !== 'undefined' ? window.scrollY : 0), + observeElementRect: observeWindowRect, + observeElementOffset: observeWindowOffset, + scrollToFn: windowScroll, + onChange: notify, + } +} diff --git a/packages/marko-virtual/tests/fixtures/count-update-fixture.marko b/packages/marko-virtual/tests/fixtures/count-update-fixture.marko new file mode 100644 index 000000000..c425bbdb8 --- /dev/null +++ b/packages/marko-virtual/tests/fixtures/count-update-fixture.marko @@ -0,0 +1,41 @@ +// Fixture for testing reactive count changes via onUpdate. +// The tag must recalculate items when count changes — +// this requires the explicit notify() call after _willUpdate() in onUpdate. +// Without it, count changes silently have no effect. + +export interface Input { + initialCount?: number +} + + + +
+
diff --git a/packages/marko-virtual/tests/fixtures/virtualizer-fixture.marko b/packages/marko-virtual/tests/fixtures/virtualizer-fixture.marko new file mode 100644 index 000000000..e6a2acc09 --- /dev/null +++ b/packages/marko-virtual/tests/fixtures/virtualizer-fixture.marko @@ -0,0 +1,35 @@ +// Test fixture for tag. +// Not a route file — no needed. +// No guard needed since template.mount() runs client-side directly. + +export interface Input { + count?: number + itemHeight?: number + horizontal?: boolean + lanes?: number +} + +
+ input.itemHeight ?? 50 + horizontal=input.horizontal ?? false + lanes=input.lanes ?? 1 + getScrollElement=scrollEl + > +
+ +
+ Row ${item.index} +
+ +
+ +
diff --git a/packages/marko-virtual/tests/fixtures/window-virtualizer-fixture.marko b/packages/marko-virtual/tests/fixtures/window-virtualizer-fixture.marko new file mode 100644 index 000000000..d6647e96d --- /dev/null +++ b/packages/marko-virtual/tests/fixtures/window-virtualizer-fixture.marko @@ -0,0 +1,26 @@ +// Test fixture for tag. + +export interface Input { + count?: number + itemHeight?: number +} + + input.itemHeight ?? 50 +> +
+ +
+ Row ${item.index} +
+ +
+
diff --git a/packages/marko-virtual/tests/index.test.ts b/packages/marko-virtual/tests/index.test.ts new file mode 100644 index 000000000..c88bf72ca --- /dev/null +++ b/packages/marko-virtual/tests/index.test.ts @@ -0,0 +1,377 @@ +/** + * Unit tests for @tanstack/marko-virtual + * + * These tests cover the TypeScript adapter layer — re-exports and Virtualizer + * construction with the options that the and + * tags wire up internally. + * + * Tag-level integration tests (testing the compiled Marko components with DOM + * mounting and reactive updates) live in tests/tags.test.ts and use + * @marko/vite + template.mount() directly. + */ +import { beforeEach, describe, expect, test, vi } from 'vitest' +import { + defaultKeyExtractor, + defaultRangeExtractor, + elementScroll, + observeElementOffset, + observeElementRect, + observeWindowOffset, + observeWindowRect, + Virtualizer, + windowScroll, +} from '../src/index' + +// --------------------------------------------------------------------------- +// Mock scroll dimensions so virtualizers can calculate visible ranges +// --------------------------------------------------------------------------- + +beforeEach(() => { + Object.defineProperties(HTMLElement.prototype, { + scrollHeight: { + configurable: true, + get: () => Number.MAX_SAFE_INTEGER, + }, + scrollWidth: { + configurable: true, + get: () => Number.MAX_SAFE_INTEGER, + }, + }) +}) + +// --------------------------------------------------------------------------- +// Re-export surface +// --------------------------------------------------------------------------- + +describe('re-exports', () => { + test('exports Virtualizer from virtual-core', () => { + expect(Virtualizer).toBeDefined() + expect(typeof Virtualizer).toBe('function') + }) + + test('exports element scroll observers', () => { + expect(observeElementRect).toBeDefined() + expect(observeElementOffset).toBeDefined() + expect(elementScroll).toBeDefined() + }) + + test('exports window scroll observers', () => { + expect(observeWindowRect).toBeDefined() + expect(observeWindowOffset).toBeDefined() + expect(windowScroll).toBeDefined() + }) + + test('exports utility functions', () => { + expect(defaultRangeExtractor).toBeDefined() + expect(defaultKeyExtractor).toBeDefined() + }) +}) + +// --------------------------------------------------------------------------- +// Row virtualizer (the default behaviour) +// --------------------------------------------------------------------------- + +describe('row virtualizer', () => { + test('creates a Virtualizer instance', () => { + const el = document.createElement('div') + const onChange = vi.fn() + + const v = new Virtualizer({ + count: 100, + getScrollElement: () => el, + estimateSize: () => 50, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange, + }) + + expect(v).toBeDefined() + expect(v.options.count).toBe(100) + expect(v.options.horizontal).toBeFalsy() + }) + + test('getVirtualItems returns an array before mount', () => { + const el = document.createElement('div') + + const v = new Virtualizer({ + count: 100, + getScrollElement: () => el, + estimateSize: () => 50, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + expect(Array.isArray(v.getVirtualItems())).toBe(true) + }) + + test('getTotalSize returns estimate-based total before mount', () => { + const el = document.createElement('div') + + const v = new Virtualizer({ + count: 100, + getScrollElement: () => el, + estimateSize: () => 50, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + // In v3, getTotalSize() = count x estimateSize even before _didMount(). + // Mount sets up the ResizeObserver for the scroll element measured + // dimensions - it does not gate the estimate-based total size calculation. + expect(v.getTotalSize()).toBe(5000) // 100 items x 50px each + }) + + test('setOptions updates count', () => { + const el = document.createElement('div') + + const v = new Virtualizer({ + count: 100, + getScrollElement: () => el, + estimateSize: () => 50, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + v.setOptions({ ...v.options, count: 200 }) + expect(v.options.count).toBe(200) + }) + + test('onChange callback is called when virtualizer is notified of dimensions', () => { + const el = document.createElement('div') + const onChange = vi.fn() + + const v = new Virtualizer({ + count: 100, + getScrollElement: () => el, + estimateSize: () => 50, + // Mock both observers to fire synchronously in jsdom. + // The real observeElementOffset uses scroll event listeners that + // do not fire synchronously in jsdom, so we stub both here. + observeElementRect: (_instance, cb) => { + cb({ width: 400, height: 400 }) + return () => {} + }, + observeElementOffset: (_instance, cb) => { + cb(0, false) + return () => {} + }, + scrollToFn: elementScroll, + onChange, + }) + + const cleanup = v._didMount() + v._willUpdate() + expect(onChange).toHaveBeenCalled() + + cleanup() + }) +}) + +// --------------------------------------------------------------------------- +// Column virtualizer (horizontal=true) +// --------------------------------------------------------------------------- + +describe('column virtualizer', () => { + test('creates a horizontal Virtualizer instance', () => { + const el = document.createElement('div') + + const v = new Virtualizer({ + count: 50, + horizontal: true, + getScrollElement: () => el, + estimateSize: () => 100, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + expect(v.options.horizontal).toBe(true) + expect(v.options.count).toBe(50) + }) + + test('uses width not height for sizing', () => { + const el = document.createElement('div') + const onChange = vi.fn() + + const v = new Virtualizer({ + count: 50, + horizontal: true, + getScrollElement: () => el, + estimateSize: () => 100, + observeElementRect: (_instance, cb) => { + cb({ width: 400, height: 200 }) + return () => {} + }, + observeElementOffset, + scrollToFn: elementScroll, + onChange, + }) + + const cleanup = v._didMount() + // After mount with a 400px-wide container, virtual items should exist + const items = v.getVirtualItems() + expect(Array.isArray(items)).toBe(true) + cleanup() + }) +}) + +// --------------------------------------------------------------------------- +// Grid (two virtualizers composed) +// --------------------------------------------------------------------------- + +describe('grid (two virtualizers)', () => { + test('row and column virtualizers can be created independently', () => { + const el = document.createElement('div') + + const rows = new Virtualizer({ + count: 1000, + getScrollElement: () => el, + estimateSize: () => 35, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + const cols = new Virtualizer({ + count: 100, + horizontal: true, + getScrollElement: () => el, + estimateSize: () => 100, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + expect(rows.options.horizontal).toBeFalsy() + expect(cols.options.horizontal).toBe(true) + expect(rows.options.count).toBe(1000) + expect(cols.options.count).toBe(100) + }) +}) + +// --------------------------------------------------------------------------- +// Lifecycle: _didMount and _willUpdate +// --------------------------------------------------------------------------- + +describe('virtualizer lifecycle', () => { + test('_didMount returns a cleanup function', () => { + const el = document.createElement('div') + + const v = new Virtualizer({ + count: 100, + getScrollElement: () => el, + estimateSize: () => 50, + observeElementRect: (_instance, _cb) => () => {}, + observeElementOffset: (_instance, _cb) => () => {}, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + const cleanup = v._didMount() + expect(typeof cleanup).toBe('function') + // Cleanup should not throw + expect(() => cleanup()).not.toThrow() + }) + + test('_willUpdate does not throw', () => { + const el = document.createElement('div') + + const v = new Virtualizer({ + count: 100, + getScrollElement: () => el, + estimateSize: () => 50, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + expect(() => v._willUpdate()).not.toThrow() + }) +}) + +// --------------------------------------------------------------------------- +// Options: overscan, paddingStart, paddingEnd, gap, lanes +// --------------------------------------------------------------------------- + +describe('virtualizer options', () => { + test('accepts overscan option', () => { + const el = document.createElement('div') + + const v = new Virtualizer({ + count: 100, + getScrollElement: () => el, + estimateSize: () => 50, + overscan: 10, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + expect(v.options.overscan).toBe(10) + }) + + test('accepts paddingStart and paddingEnd', () => { + const el = document.createElement('div') + + const v = new Virtualizer({ + count: 100, + getScrollElement: () => el, + estimateSize: () => 50, + paddingStart: 16, + paddingEnd: 16, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + expect(v.options.paddingStart).toBe(16) + expect(v.options.paddingEnd).toBe(16) + }) + + test('accepts gap option', () => { + const el = document.createElement('div') + + const v = new Virtualizer({ + count: 100, + getScrollElement: () => el, + estimateSize: () => 50, + gap: 8, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + expect(v.options.gap).toBe(8) + }) + + test('accepts lanes option for masonry', () => { + const el = document.createElement('div') + + const v = new Virtualizer({ + count: 100, + getScrollElement: () => el, + estimateSize: () => 200, + lanes: 3, + observeElementRect, + observeElementOffset, + scrollToFn: elementScroll, + onChange: vi.fn(), + }) + + expect(v.options.lanes).toBe(3) + }) +}) diff --git a/packages/marko-virtual/tests/marko.d.ts b/packages/marko-virtual/tests/marko.d.ts new file mode 100644 index 000000000..9a2770e4e --- /dev/null +++ b/packages/marko-virtual/tests/marko.d.ts @@ -0,0 +1,32 @@ +// Ambient type declaration for .marko template imports. +// @marko/vite compiles .marko files to browser templates exposing mount(). +// The full Marko.Template type is available via the marko package but +// requires the Marko language toolchain. For test imports we declare the +// minimal shape we actually use. +declare module '*.marko' { + const template: { + mount: ( + input: Record, + container: Element | DocumentFragment, + ) => { destroy: () => void } + } + export default template +} + +// Type declarations for @marko/vite and @marko/run/vite. +// Both export the same Vite plugin factory; @marko/run/vite re-exports from +// @marko/vite. Users may import from either path depending on their setup. +// The actual packages may ship their own types; these are fallbacks. +declare module '@marko/vite' { + import type { Plugin } from 'vite' + + function marko(options?: Record): Plugin + export default marko +} + +declare module '@marko/run/vite' { + import type { Plugin } from 'vite' + + function marko(options?: Record): Plugin + export default marko +} diff --git a/packages/marko-virtual/tests/setup.ts b/packages/marko-virtual/tests/setup.ts new file mode 100644 index 000000000..bc9a61100 --- /dev/null +++ b/packages/marko-virtual/tests/setup.ts @@ -0,0 +1,46 @@ +import { vi } from 'vitest' + +// --------------------------------------------------------------------------- +// requestAnimationFrame — not available in jsdom. +// Marko 6's scheduler uses rAF. Without this, signal-driven DOM updates +// never flush and items never appear after onMount. +// --------------------------------------------------------------------------- +if (!global.requestAnimationFrame) { + ;( + global as typeof globalThis & { requestAnimationFrame: unknown } + ).requestAnimationFrame = (cb: FrameRequestCallback) => + setTimeout(cb, 16) as unknown as number + ;( + global as typeof globalThis & { cancelAnimationFrame: unknown } + ).cancelAnimationFrame = (id: number) => + clearTimeout(id as unknown as ReturnType) +} + +// --------------------------------------------------------------------------- +// ResizeObserver — not available in jsdom. +// observeElementRect sets one up, but also fires handler() synchronously +// first (giving us the initial rect). The mock prevents errors on .observe(). +// --------------------------------------------------------------------------- +;(global as typeof globalThis & { ResizeObserver: unknown }).ResizeObserver = + vi.fn(function () { + return { + observe: vi.fn(), + unobserve: vi.fn(), + disconnect: vi.fn(), + } + }) + +// --------------------------------------------------------------------------- +// offsetHeight / offsetWidth — always 0 in jsdom (no CSS layout engine). +// observeElementRect calls getRect(element) = { offsetWidth, offsetHeight }. +// Without this, the virtualizer sees a 0-height viewport and renders no items. +// 400px ÷ 50px default estimateSize = 8 visible + 5 overscan each side ≈ 18. +// --------------------------------------------------------------------------- +Object.defineProperty(HTMLElement.prototype, 'offsetHeight', { + configurable: true, + get: () => 400, +}) +Object.defineProperty(HTMLElement.prototype, 'offsetWidth', { + configurable: true, + get: () => 400, +}) diff --git a/packages/marko-virtual/tests/tags.test.ts b/packages/marko-virtual/tests/tags.test.ts new file mode 100644 index 000000000..a53bcef2b --- /dev/null +++ b/packages/marko-virtual/tests/tags.test.ts @@ -0,0 +1,278 @@ +/** + * Integration tests for and Marko tags. + * + * @marko/testing-library v1.1.2 has a broken isV6 detection: + * const isV6 = !(template as any).renderSync + * Marko 6 browser-compiled templates include renderSync from the runtime, + * causing the library to fall into the Marko 3/4 code path and call + * template.render(input, callback) — which doesn't exist on browser templates. + * + * We bypass @marko/testing-library entirely and call template.mount() directly, + * which is the Marko 6 DOM API. @marko/vite compiles .marko files for the + * browser in vitest/jsdom, so mount() is always available. + * + * ENVIRONMENT: + * - jsdom with rAF, ResizeObserver, offsetHeight mocked (see tests/setup.ts) + * - @marko/vite compiles .marko fixtures → browser templates with mount() + * - waitFor() retries until Marko's RAF-based reactive flush completes + * + * WHY THESE TESTS EXIST: + * The TS unit tests in index.test.ts never compile or mount a .marko file. + * The vs <${input.content}> architecture bug was invisible to them. + * These tests close that gap by mounting real fixture components and asserting + * that virtual items appear in the DOM. + */ + +import { afterEach, describe, expect, test } from 'vitest' +import { waitFor } from '@testing-library/dom' +import VirtualizerFixture from './fixtures/virtualizer-fixture.marko' +import WindowVirtualizerFixture from './fixtures/window-virtualizer-fixture.marko' +import CountUpdateFixture from './fixtures/count-update-fixture.marko' + +// Cast to any — @marko/vite compiles .marko files as ES modules whose default +// export is the template object with mount(input, container): Instance. +const Virtualizer = VirtualizerFixture as any +const WindowVirtualizer = WindowVirtualizerFixture as any +const CountUpdate = CountUpdateFixture as any + +// --------------------------------------------------------------------------- +// Test helpers +// --------------------------------------------------------------------------- + +const instances: Array<{ destroy(): void }> = [] + +function mountFixture(Template: any, input: Record = {}) { + const container = document.createElement('div') + document.body.appendChild(container) + const instance = Template.mount(input, container) + instances.push(instance) + return container +} + +afterEach(() => { + // Destroy Marko instances to run the onDestroy lifecycle (virtual-core cleanup) + instances.forEach((i) => i.destroy()) + instances.length = 0 + document.body.innerHTML = '' +}) + +// --------------------------------------------------------------------------- +// — row virtualisation +// --------------------------------------------------------------------------- + +describe(' rows', () => { + test('renders body content — catches vs <${input.content}> bug', () => { + // With : body never renders → virtual-wrapper missing + // With <${input.content}>: body IS rendered → virtual-wrapper present + // This test definitively catches the architecture bug. + const el = mountFixture(Virtualizer, { count: 100 }) + expect(el.querySelector("[data-testid='virtual-wrapper']")).toBeTruthy() + }) + + test('populates virtualItems after mount', async () => { + // onMount fires → _willUpdate → observeElementRect (sync, mocked 400px) + // → notify() → items signal → Marko RAF flush → DOM updated + const el = mountFixture(Virtualizer, { count: 100 }) + await waitFor(() => + expect( + el.querySelectorAll("[data-testid='virtual-item']").length, + ).toBeGreaterThan(0), + ) + }) + + test('items have sequential data-index starting from 0', async () => { + const el = mountFixture(Virtualizer, { count: 100 }) + await waitFor(() => { + const items = el.querySelectorAll("[data-testid='virtual-item']") + expect(items[0]!.getAttribute('data-index')).toBe('0') + expect(items[1]!.getAttribute('data-index')).toBe('1') + }) + }) + + test('totalSize equals count × estimateSize in px', async () => { + const el = mountFixture(Virtualizer, { count: 100, itemHeight: 50 }) + await waitFor(() => + expect( + (el.querySelector("[data-testid='virtual-wrapper']") as HTMLElement) + ?.style.height, + ).toBe('5000px'), + ) + }) + + test('renders exactly count items when count < viewport capacity', async () => { + // 3 items × 50px = 150px < 400px mocked viewport → all 3 rendered + const el = mountFixture(Virtualizer, { count: 3 }) + await waitFor(() => + expect(el.querySelectorAll("[data-testid='virtual-item']")).toHaveLength( + 3, + ), + ) + }) + + test('renders no items when count is 0', () => { + const el = mountFixture(Virtualizer, { count: 0 }) + // Wrapper exists (body content rendered) but no items + expect(el.querySelector("[data-testid='virtual-wrapper']")).toBeTruthy() + expect(el.querySelectorAll("[data-testid='virtual-item']")).toHaveLength(0) + }) + + test('totalSize is 0 when count is 0', () => { + const el = mountFixture(Virtualizer, { count: 0 }) + const wrapper = el.querySelector( + "[data-testid='virtual-wrapper']", + ) as HTMLElement + expect(wrapper?.style.height).toBe('0px') + }) +}) + +// --------------------------------------------------------------------------- +// — reactive updates (onUpdate path) +// --------------------------------------------------------------------------- + +describe(' reactive updates', () => { + test('count increase re-renders additional items (tests onUpdate + notify())', async () => { + // This test covers the critical onUpdate code path: + // 1. Parent changes count → Marko calls onUpdate on + // 2. onUpdate calls v.setOptions({ count: newCount, ... }) + // 3. v._willUpdate() is a no-op (scroll element unchanged) + // 4. notify() is called explicitly — WITHOUT this call, count changes + // have no effect because _willUpdate() only runs when the scroll + // element changes. This was the critical bug documented in the insights. + // 5. notify() → items = v.getVirtualItems() → Marko re-renders + // + // initialCount: 3 → all 3 items fit in 400px viewport (3 × 50px = 150px) + const el = mountFixture(CountUpdate, { initialCount: 3 }) + await waitFor(() => + expect(el.querySelectorAll("[data-testid='virtual-item']")).toHaveLength( + 3, + ), + ) + + // Click the button to increment count from 3 → 4 + el.querySelector("[data-testid='increment-btn']")!.dispatchEvent( + new MouseEvent('click', { bubbles: true }), + ) + + // Now 4 items should render — confirms onUpdate + notify() works + await waitFor(() => + expect(el.querySelectorAll("[data-testid='virtual-item']")).toHaveLength( + 4, + ), + ) + }) + + test('count decrease removes items from DOM', async () => { + // Start with 5 items, then decrement twice and verify item count drops. + // Tests the onUpdate + notify() path for count reduction. + // initialCount: 5 → all 5 fit in 400px (5 × 50px = 250px) + const el = mountFixture(CountUpdate, { initialCount: 5 }) + await waitFor(() => + expect(el.querySelectorAll("[data-testid='virtual-item']")).toHaveLength( + 5, + ), + ) + + // Decrement: 5 → 4 + const btn = el.querySelector("[data-testid='decrement-btn']")! + btn.dispatchEvent(new MouseEvent('click', { bubbles: true })) + await waitFor(() => + expect(el.querySelectorAll("[data-testid='virtual-item']")).toHaveLength( + 4, + ), + ) + + // Decrement: 4 → 3 + btn.dispatchEvent(new MouseEvent('click', { bubbles: true })) + await waitFor(() => + expect(el.querySelectorAll("[data-testid='virtual-item']")).toHaveLength( + 3, + ), + ) + }) + + test('totalSize updates when count changes', async () => { + const el = mountFixture(CountUpdate, { initialCount: 3 }) + // Initial: 3 × 50 = 150px + await waitFor(() => + expect( + (el.querySelector("[data-testid='virtual-wrapper']") as HTMLElement) + ?.style.height, + ).toBe('150px'), + ) + + // Increment count → 4 × 50 = 200px + el.querySelector("[data-testid='increment-btn']")!.dispatchEvent( + new MouseEvent('click', { bubbles: true }), + ) + await waitFor(() => + expect( + (el.querySelector("[data-testid='virtual-wrapper']") as HTMLElement) + ?.style.height, + ).toBe('200px'), + ) + }) +}) + +// --------------------------------------------------------------------------- +// — column virtualisation +// --------------------------------------------------------------------------- + +describe(' columns', () => { + test('horizontal mode renders items with translateX positioning', async () => { + const el = mountFixture(Virtualizer, { count: 100, horizontal: true }) + await waitFor(() => { + const items = el.querySelectorAll("[data-testid='virtual-item']") + expect(items.length).toBeGreaterThan(0) + expect((items[0]! as HTMLElement).style.transform).toContain( + 'translateX(0px)', + ) + }) + }) +}) + +// --------------------------------------------------------------------------- +// — masonry lanes +// --------------------------------------------------------------------------- + +describe(' lanes', () => { + test('multi-lane layout renders items', async () => { + const el = mountFixture(Virtualizer, { count: 20, lanes: 3 }) + await waitFor(() => + expect( + el.querySelectorAll("[data-testid='virtual-item']").length, + ).toBeGreaterThan(0), + ) + }) +}) + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- + +describe('', () => { + test('renders body content', () => { + const el = mountFixture(WindowVirtualizer, { count: 100 }) + expect(el.querySelector("[data-testid='virtual-wrapper']")).toBeTruthy() + }) + + test('populates virtualItems after mount', async () => { + const el = mountFixture(WindowVirtualizer, { count: 100 }) + await waitFor(() => + expect( + el.querySelectorAll("[data-testid='virtual-item']").length, + ).toBeGreaterThan(0), + ) + }) + + test('items have data-index starting from 0', async () => { + const el = mountFixture(WindowVirtualizer, { count: 100 }) + await waitFor(() => + expect( + el + .querySelectorAll("[data-testid='virtual-item']") + .item(0) + ?.getAttribute('data-index'), + ).toBe('0'), + ) + }) +}) diff --git a/packages/marko-virtual/tsconfig.json b/packages/marko-virtual/tsconfig.json new file mode 100644 index 000000000..a003c8a12 --- /dev/null +++ b/packages/marko-virtual/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "include": [ + "src/**/*.ts", + "tests/**/*.ts", + "eslint.config.js", + "vite.config.ts", + "vitest.config.ts" + ] +} diff --git a/packages/marko-virtual/vite.config.ts b/packages/marko-virtual/vite.config.ts new file mode 100644 index 000000000..c6fdd8338 --- /dev/null +++ b/packages/marko-virtual/vite.config.ts @@ -0,0 +1,15 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/vite-config' + +// Test config lives in vitest.config.ts (vitest uses that file first). +// This file handles only the library build via tanstackViteConfig. +// Pattern mirrors other adapters (react-virtual, etc.): mergeConfig with defineConfig. +const config = defineConfig({}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: './src/index.ts', + srcDir: './src', + }), +) diff --git a/packages/marko-virtual/vitest.config.ts b/packages/marko-virtual/vitest.config.ts new file mode 100644 index 000000000..2bea09739 --- /dev/null +++ b/packages/marko-virtual/vitest.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from 'vitest/config' +import marko from '@marko/vite' +import packageJson from './package.json' + +// This config is used by `vitest` only. +// @marko/vite is an app plugin requiring SSR+browser build order — it must +// never appear in the library build (vite.config.ts). +export default defineConfig({ + plugins: [marko() as any], + test: { + name: packageJson.name, + dir: './tests', + watch: false, + environment: 'jsdom', + setupFiles: ['./tests/setup.ts'], + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a4ac4fbb..7e926aeb0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,10 +19,10 @@ importers: version: 1.56.1 '@tanstack/eslint-config': specifier: 0.3.4 - version: 0.3.4(@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3) + version: 0.3.4(@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3) '@tanstack/vite-config': specifier: 0.4.3 - version: 0.4.3(@types/node@24.9.2)(rollup@4.59.0)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + version: 0.4.3(@types/node@24.9.2)(rollup@4.59.0)(supports-color@10.2.2)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.9.1 @@ -31,10 +31,10 @@ importers: version: 24.9.2 eslint: specifier: ^9.36.0 - version: 9.39.0(jiti@2.6.1) + version: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) jsdom: specifier: ^27.0.0 - version: 27.1.0 + version: 27.1.0(supports-color@10.2.2) knip: specifier: ^5.63.1 version: 5.66.4(@types/node@24.9.2)(typescript@5.6.3) @@ -43,7 +43,7 @@ importers: version: 4.0.2 nx: specifier: 22.1.3 - version: 22.1.3(debug@4.4.3) + version: 22.1.3 premove: specifier: ^4.0.0 version: 4.0.0 @@ -70,7 +70,7 @@ importers: version: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) vitest: specifier: ^4.1.4 - version: 4.1.4(@types/node@24.9.2)(jsdom@27.1.0)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + version: 4.1.4(@types/node@24.9.2)(jsdom@27.1.0(supports-color@10.2.2))(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) benchmarks: dependencies: @@ -156,13 +156,13 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^19.0.0 - version: 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1) + version: 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(supports-color@10.2.2)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': specifier: ^19.0.0 - version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3) + version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3)(supports-color@10.2.2) '@angular/compiler-cli': specifier: ^19.0.0 - version: 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) + version: 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -211,10 +211,10 @@ importers: version: 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': specifier: ^19.0.0 - version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3) + version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3)(supports-color@10.2.2) '@angular/compiler-cli': specifier: ^19.0.0 - version: 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) + version: 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -266,10 +266,10 @@ importers: version: 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': specifier: ^19.0.0 - version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3) + version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3)(supports-color@10.2.2) '@angular/compiler-cli': specifier: ^19.0.0 - version: 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) + version: 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -318,10 +318,10 @@ importers: version: 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': specifier: ^19.0.0 - version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3) + version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3)(supports-color@10.2.2) '@angular/compiler-cli': specifier: ^19.0.0 - version: 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) + version: 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -370,10 +370,10 @@ importers: version: 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': specifier: ^19.0.0 - version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3) + version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3)(supports-color@10.2.2) '@angular/compiler-cli': specifier: ^19.0.0 - version: 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) + version: 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -425,10 +425,10 @@ importers: version: 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': specifier: ^19.0.0 - version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3) + version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3)(supports-color@10.2.2) '@angular/compiler-cli': specifier: ^19.0.0 - version: 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) + version: 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -483,10 +483,10 @@ importers: version: 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': specifier: ^19.0.0 - version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3) + version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3)(supports-color@10.2.2) '@angular/compiler-cli': specifier: ^19.0.0 - version: 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) + version: 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -535,10 +535,10 @@ importers: version: 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': specifier: ^19.0.0 - version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3) + version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3)(supports-color@10.2.2) '@angular/compiler-cli': specifier: ^19.0.0 - version: 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) + version: 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -587,10 +587,10 @@ importers: version: 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': specifier: ^19.0.0 - version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3) + version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3)(supports-color@10.2.2) '@angular/compiler-cli': specifier: ^19.0.0 - version: 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) + version: 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -645,6 +645,139 @@ importers: specifier: ^6.4.2 version: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + examples/marko/dynamic: + dependencies: + '@marko/run': + specifier: ^0.7.0 + version: 0.7.7(@marko/compiler@5.39.65)(@types/node@24.9.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.2.2)(marko@6.1.8)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + '@tanstack/marko-virtual': + specifier: workspace:* + version: link:../../../packages/marko-virtual + marko: + specifier: ^6.0.0 + version: 6.1.8 + devDependencies: + typescript: + specifier: 5.6.3 + version: 5.6.3 + vite: + specifier: ^6.4.2 + version: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + + examples/marko/fixed: + dependencies: + '@marko/run': + specifier: ^0.7.0 + version: 0.7.7(@marko/compiler@5.39.65)(@types/node@24.9.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.2.2)(marko@6.1.8)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + '@tanstack/marko-virtual': + specifier: workspace:* + version: link:../../../packages/marko-virtual + marko: + specifier: ^6.0.0 + version: 6.1.8 + devDependencies: + typescript: + specifier: 5.6.3 + version: 5.6.3 + vite: + specifier: ^6.4.2 + version: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + + examples/marko/grid: + dependencies: + '@marko/run': + specifier: ^0.7.0 + version: 0.7.7(@marko/compiler@5.39.65)(@types/node@24.9.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.2.2)(marko@6.1.8)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + '@tanstack/marko-virtual': + specifier: workspace:* + version: link:../../../packages/marko-virtual + marko: + specifier: ^6.0.0 + version: 6.1.8 + devDependencies: + typescript: + specifier: 5.6.3 + version: 5.6.3 + vite: + specifier: ^6.4.2 + version: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + + examples/marko/infinite-scroll: + dependencies: + '@marko/run': + specifier: ^0.7.0 + version: 0.7.7(@marko/compiler@5.39.65)(@types/node@24.9.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.2.2)(marko@6.1.8)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + '@tanstack/marko-virtual': + specifier: workspace:* + version: link:../../../packages/marko-virtual + marko: + specifier: ^6.0.0 + version: 6.1.8 + devDependencies: + typescript: + specifier: 5.6.3 + version: 5.6.3 + vite: + specifier: ^6.4.2 + version: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + + examples/marko/smooth-scroll: + dependencies: + '@marko/run': + specifier: ^0.7.0 + version: 0.7.7(@marko/compiler@5.39.65)(@types/node@24.9.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.2.2)(marko@6.1.8)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + '@tanstack/marko-virtual': + specifier: workspace:* + version: link:../../../packages/marko-virtual + marko: + specifier: ^6.0.0 + version: 6.1.8 + devDependencies: + typescript: + specifier: 5.6.3 + version: 5.6.3 + vite: + specifier: ^6.4.2 + version: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + + examples/marko/variable: + dependencies: + '@marko/run': + specifier: ^0.7.0 + version: 0.7.7(@marko/compiler@5.39.65)(@types/node@24.9.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.2.2)(marko@6.1.8)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + '@tanstack/marko-virtual': + specifier: workspace:* + version: link:../../../packages/marko-virtual + marko: + specifier: ^6.0.0 + version: 6.1.8 + devDependencies: + typescript: + specifier: 5.6.3 + version: 5.6.3 + vite: + specifier: ^6.4.2 + version: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + + examples/marko/window: + dependencies: + '@marko/run': + specifier: ^0.7.0 + version: 0.7.7(@marko/compiler@5.39.65)(@types/node@24.9.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.2.2)(marko@6.1.8)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + '@tanstack/marko-virtual': + specifier: workspace:* + version: link:../../../packages/marko-virtual + marko: + specifier: ^6.0.0 + version: 6.1.8 + devDependencies: + typescript: + specifier: 5.6.3 + version: 5.6.3 + vite: + specifier: ^6.4.2 + version: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + examples/react/chat: dependencies: '@tanstack/react-virtual': @@ -1010,7 +1143,7 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^3.1.2 - version: 3.1.2(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + version: 3.1.2(supports-color@10.2.2)(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) '@tsconfig/svelte': specifier: ^5.0.4 version: 5.0.5 @@ -1448,13 +1581,13 @@ importers: version: 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': specifier: ^19.0.0 - version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3) + version: 19.2.24(@types/node@24.9.2)(chokidar@4.0.3)(supports-color@10.2.2) '@angular/common': specifier: ^19.0.0 version: 19.2.20(@angular/core@19.2.20(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) '@angular/compiler-cli': specifier: ^19.0.0 - version: 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) + version: 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) '@angular/core': specifier: ^19.0.0 version: 19.2.20(rxjs@7.8.2)(zone.js@0.15.1) @@ -1482,11 +1615,27 @@ importers: devDependencies: '@open-wc/testing': specifier: ^4.0.0 - version: 4.0.0 + version: 4.0.0(supports-color@10.2.2) lit: specifier: ^3.3.0 version: 3.3.1 + packages/marko-virtual: + dependencies: + '@tanstack/virtual-core': + specifier: workspace:* + version: link:../virtual-core + devDependencies: + '@marko/vite': + specifier: ^3.0.0 + version: 3.1.6(@marko/compiler@5.39.65)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + '@testing-library/dom': + specifier: ^10.0.0 + version: 10.4.1 + marko: + specifier: ^6.0.0 + version: 6.1.8 + packages/react-virtual: dependencies: '@tanstack/virtual-core': @@ -2378,10 +2527,18 @@ packages: '@chenglou/pretext@0.0.7': resolution: {integrity: sha512-FV5hj3fGqpBlzbANUbR+s+6XuNRrghVVyuNs33zdH2SzU7MvK+7GlW6xREjDCreixKbexEn7OEkDgAFeWuu5Hg==} + '@chialab/estransform@0.19.1': + resolution: {integrity: sha512-Op0TvQxnzdcnBriFUIjgg3V3MpOB9Cfs4S7TvIuypPegFOSvuFAOcPl5V02NJ9dyGoOc8W6ORbSldc5PYKhOCQ==} + engines: {node: '>=18'} + '@codesandbox/vue-preview@0.1.1-alpha.16': resolution: {integrity: sha512-ZhiG66TcDMc7GegF2rhXrlL9zE/xioL1dDnn5ymxnaK+Lwt1/Lc0gwlgaa78QyjapDI8oPK2KJDEnYs8kcalUw==} hasBin: true + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} @@ -2965,6 +3122,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} @@ -3085,12 +3246,43 @@ packages: cpu: [x64] os: [win32] + '@luxass/strip-json-comments@1.4.0': + resolution: {integrity: sha512-Zl343to4u/t8jz1q7R/1UY6hLX+344cwPLEXsIYthVwdU5zyjuVBGcpf2E24+QZkwFfRfmnHTcscreQzWn3hiA==} + engines: {node: '>=18'} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@marko/compiler@5.39.65': + resolution: {integrity: sha512-m8RLnKj8OqYu8/wXCTw9ftSgsBJfHH/4VUdVDSq106ibXDiv5K+RXIi2BsIV4JVlEjClM64P0b34+S56d0Gb7Q==} + engines: {node: 18 || 20 || >=22} + + '@marko/run-explorer@2.0.3': + resolution: {integrity: sha512-7y2+yAwptzuCpjbDaexVmTLi/XulB26zmqOsHwly//asclKJUobCvO3fpFPhl+jf1+NaWD7jVPtmdCbTeaQxKQ==} + peerDependencies: + '@marko/run': ^0.7||^0.8||^0.9||^0.10 + + '@marko/run@0.7.7': + resolution: {integrity: sha512-8Yb2IZJEPlK3Ex3PFpuslO5oXxPSw6IJ1ZQbR2HM4V91bLksQemObUqniEcV6Q2EKpIEeesBjyVIhPlfRmm/aQ==} + hasBin: true + peerDependencies: + marko: 5 - 6 + + '@marko/vite@3.1.6': + resolution: {integrity: sha512-Y5yUYnPRwS/qrJTdUHTpel3IAapSLN5BLhTpqnO1zlQSV8xKe2cE/AnUH+qKcrXTyR/iJp0NzrwtyXQPTEYThw==} + peerDependencies: + '@marko/compiler': ^5 + vite: ^2 || ^3 || ^4 || ^5 + + '@marko/vite@5.4.10': + resolution: {integrity: sha512-4HAyrAJmmjVYkVIF72FRAjh4CdqYMEGGErQ8cCBtxDRpvgB24uaTE9uGSdz7BmU0Z8fwgfNcjuO4HXQrluJrQw==} + peerDependencies: + '@marko/compiler': ^5 + vite: 4 - 8 + '@microsoft/api-extractor-model@7.29.6': resolution: {integrity: sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==} @@ -3134,6 +3326,88 @@ packages: cpu: [x64] os: [win32] + '@napi-rs/magic-string-android-arm-eabi@0.3.4': + resolution: {integrity: sha512-sszAYxqtzzJ4FDerDNHcqL9NhqPhj8W4DNiOanXYy50mA5oojlRtaAFPiB5ZMrWDBM32v5Q30LrmxQ4eTtu2Dg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/magic-string-android-arm64@0.3.4': + resolution: {integrity: sha512-jdQ6HuO0X5rkX4MauTcWR4HWdgjakTOmmzqXg8L26+jOHVVG1LZE+Su5qvV4bP8vMb2h+vPE+JsnwqSmWymu3Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/magic-string-darwin-arm64@0.3.4': + resolution: {integrity: sha512-6NmMtvURce9/oq09XBZmuIeI6lPLGtEJ2ZPO/QzL3nLZa6wygiCnO/sFACKYNg5/73ET5HMMTeuogE1JI+r2Lw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/magic-string-darwin-x64@0.3.4': + resolution: {integrity: sha512-f9LmfMiUAKDOtl0meOuLYeVb6OERrgGzrTg1Tn3R3fTAShM2kxRbfAuPE9ljuXxIFzOv/uqRNLSl/LqCJwpREA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/magic-string-freebsd-x64@0.3.4': + resolution: {integrity: sha512-rqduQ4odiDK4QdM45xHWRTU4wtFIfpp8g8QGpz+3qqg7ivldDqbbNOrBaf6Oeu77uuEvWggnkyuChotfKgJdJQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/magic-string-linux-arm-gnueabihf@0.3.4': + resolution: {integrity: sha512-pVaJEdEpiPqIfq3M4+yMAATS7Z9muDcWYn8H7GFH1ygh8GwgLgKfy/n/lG2M6zp18Mwd0x7E2E/qg9GgCyUzoQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/magic-string-linux-arm64-gnu@0.3.4': + resolution: {integrity: sha512-9FwoAih/0tzEZx0BjYYIxWkSRMjonIn91RFM3q3MBs/evmThXUYXUqLNa1PPIkK1JoksswtDi48qWWLt8nGflQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/magic-string-linux-arm64-musl@0.3.4': + resolution: {integrity: sha512-wCR7R+WPOcAKmVQc1s6h6HwfwW1vL9pM8BjUY9Ljkdb8wt1LmZEmV2Sgfc1SfbRQzbyl+pKeufP6adRRQVzYDA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/magic-string-linux-x64-gnu@0.3.4': + resolution: {integrity: sha512-sbxFDpYnt5WFbxQ1xozwOvh5A7IftqSI0WnE9O7KsQIOi0ej2dvFbfOW4tmFkvH/YP8KJELo5AhP2+kEq1DpYA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/magic-string-linux-x64-musl@0.3.4': + resolution: {integrity: sha512-jN4h/7e2Ul8v3UK5IZu38NXLMdzVWhY4uEDlnwuUAhwRh26wBQ1/pLD97Uy/Z3dFNBQPcsv60XS9fOM1YDNT6w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/magic-string-win32-arm64-msvc@0.3.4': + resolution: {integrity: sha512-gMUyTRHLWpzX2ntJFCbW2Gnla9Y/WUmbkZuW5SBAo/Jo8QojHn76Y4PNgnoXdzcsV9b/45RBxurYKAfFg9WTyg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/magic-string-win32-ia32-msvc@0.3.4': + resolution: {integrity: sha512-QIMauMOvEHgL00K9np/c9CT/CRtLOz3mRTQqcZ9XGzSoAMrpxH71KSpDJrKl7h7Ro6TZ+hJ0C3T+JVuTCZNv4A==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/magic-string-win32-x64-msvc@0.3.4': + resolution: {integrity: sha512-V8FMSf828MzOI3P6/765MR7zHU6CUZqiyPhmAnwYoKFNxfv7oCviN/G6NcENeCdcYOvNgh5fYzaNLB96ndId5A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/magic-string@0.3.4': + resolution: {integrity: sha512-DEWl/B99RQsyMT3F9bvrXuhL01/eIQp/dtNSE3G1jQ4mTGRcP4iHWxoPZ577WrbjUinrNgvRA5+08g8fkPgimQ==} + engines: {node: '>= 10'} + '@napi-rs/nice-android-arm-eabi@1.1.1': resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} engines: {node: '>= 10'} @@ -3382,6 +3656,52 @@ packages: '@open-wc/testing@4.0.0': resolution: {integrity: sha512-KI70O0CJEpBWs3jrTju4BFCy7V/d4tFfYWkg8pMzncsDhD7TYNHLw5cy+s1FHXIgVFetnMDhPpwlKIPvtTQW7w==} + '@oxc-parser/binding-darwin-arm64@0.8.0': + resolution: {integrity: sha512-3Dws5Wzj9efojjqvhS4ZF+Abh0EoiI5ciOE2kdLifMzSg4fnmYAIOktoUnPEo87TNIb4SiFJ5JgPBgEyq42Eow==} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.8.0': + resolution: {integrity: sha512-DAUJ/mfq0Jn2VDYn69bhHTsIWj+aZ/viamexFwaLL7ntkIFmGpzAJZUlWofpY1IRJynKWW+P5AOLYXMllw4qUw==} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-linux-arm64-gnu@0.8.0': + resolution: {integrity: sha512-ZHQVey/O4K3zTIKtpfsbtJIE8MPTRHRxgY3dejaoeFQGf9C3HasgF132Yp4zN/jOUx+x8czKPVa/Af40ViyhGQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-musl@0.8.0': + resolution: {integrity: sha512-Diw+Tnf5v+zAYXzDoSKCZsMaroU6GoqZMS7smfDtFnZYTHWZrsTmPBLUQe7AFiG7O7tkhsCdcWjOYgbVkrSVOA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-x64-gnu@0.8.0': + resolution: {integrity: sha512-WloqcRrtQUVEP/Sy8ZeEgF0HgBKQjOv3zLFZqbC5ipkerKriGcVbsq3fOIMOi/55AM6/UhIAjeZGnoeco72JjQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.8.0': + resolution: {integrity: sha512-2j7BD9szwSXTvSj0Q8VE98UHGYvrgZzdLy4EyB0FilhQnopEfz+YV674rWGY2Il1VYxHJwGctrTJHvARolu37g==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-win32-arm64-msvc@0.8.0': + resolution: {integrity: sha512-mcomr1og17yCmnwn8Q7CRzrH9Va0HccWe4Ld3/u/elBsw0SEzYGVvECRzCyRglYAbKTtusz7as9Jee0RiMOMmg==} + cpu: [arm64] + os: [win32] + libc: [null] + + '@oxc-parser/binding-win32-x64-msvc@0.8.0': + resolution: {integrity: sha512-nIBkc1KZOVYUaHT3+U+gM354P3byMAIXMvlmLMbs0kWVRcI4vrzL8qwWpC6QdBQxWKZGqPEqGolv8H4dDYA9nQ==} + cpu: [x64] + os: [win32] + libc: [null] + '@oxc-resolver/binding-android-arm-eabi@11.12.0': resolution: {integrity: sha512-/IfGWLNdmS1kVYM2g+Xw4qXNWtCPZ/i5YMprflA8FC3vAjT4N0VucQcDxUPHxatQwre4qnhbFFWqRa1mz6Cgkw==} cpu: [arm] @@ -3485,6 +3805,10 @@ packages: cpu: [x64] os: [win32] + '@parcel/source-map@2.1.1': + resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} + engines: {node: ^12.18.3 || >=14} + '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -4874,6 +5198,9 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -4890,6 +5217,10 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} @@ -4952,6 +5283,9 @@ packages: compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + complain@1.6.1: + resolution: {integrity: sha512-WsiVAbAPcPSwyC5k8g/PLceaW0MXJUw61KqBd9uiyDOSuDIC6Ho/EbyhdFjeV6wq44R2g/b8IFpvV/1ZyXiqUQ==} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -5231,6 +5565,9 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} + draftlog@1.0.13: + resolution: {integrity: sha512-GeMWOpXERBpfVDK6v7m0x1hPg8+g8ZsZWqJl2T17wHqrm4h8fnjiZmXcnCrmwogAc6R3YTxFXax15wezfuyCUw==} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -5301,6 +5638,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -5319,6 +5660,9 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + errorstacks@2.4.1: resolution: {integrity: sha512-jE4i0SMYevwu/xxAuzhly/KTwtj0xDhbzB6m1xPImxTkw8wcCbgarOQPfCVMi5JKVyW7in29pNJCCJrry3Ynnw==} @@ -5344,6 +5688,13 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + esbuild-plugin-browserslist@0.16.0: + resolution: {integrity: sha512-vfwl1RmCa4D+wWoAxStz2g0O3wWGyUAv6mK9mfgF7X2UY3z/b/6ySTWoPu9nnKvBea6D3uk2zS1TOLt/b5qgLQ==} + engines: {node: '>=18'} + peerDependencies: + browserslist: ^4.21.8 + esbuild: ~0.25.0 + esbuild-wasm@0.25.4: resolution: {integrity: sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==} engines: {node: '>=18'} @@ -5523,6 +5874,10 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -5706,6 +6061,12 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -5782,9 +6143,18 @@ packages: html-link-extractor@1.0.5: resolution: {integrity: sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==} + htmljs-parser@5.10.2: + resolution: {integrity: sha512-Db/pHZehPxGD8Cy0NvACoMfnVQqfgEiK7z+7cuEDOeJdnzuomyaw3I31A+1uoZmS6IjvTD5iuFA+XL2LE+SieA==} + htmlparser2@10.0.0: resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + http-assert@1.5.0: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} @@ -5835,6 +6205,10 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + human-format@1.2.1: + resolution: {integrity: sha512-o5Ldz62VWR5lYUZ8aVQaLKiN37NsHnmk3xjMoUjza3mGkk8MvMofgZT0T6HKSCKSJIir+AWk9Dx8KhxvZAUgCg==} + engines: {node: '>=4'} + human-id@4.1.2: resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} hasBin: true @@ -6094,6 +6468,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + jest-diff@30.2.0: resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6227,6 +6605,12 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + lasso-caching-fs@1.0.2: + resolution: {integrity: sha512-mudop0s8U3tLm3Fn9lhiZsiELpLeJToEo6RlDLdph7vWRxL9Sz0o+9WUw1IwlpCYXv/P0CLsMYWFgPwIKWEYvg==} + + lasso-package-root@1.0.1: + resolution: {integrity: sha512-j6LnauNCldqSDvOxoKpD6sTzudPGMiwcZQbySoF9KvJ0lD9Dp2t6QZF8kC0jbUDHuQPiAo5RuQ/mC3AGXscUYA==} + launch-editor@2.12.0: resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} @@ -6387,6 +6771,10 @@ packages: engines: {node: '>= 18'} hasBin: true + marko@6.1.8: + resolution: {integrity: sha512-7OLNy2gdSyxlTwwOpsVeFlWypcATV/SM140pkW2YUNkTzTnSDR3ICf4uoKtmTD/fXVzr0Uo+lAcVrmEz/sI0vA==} + engines: {node: '>=22'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -6760,6 +7148,9 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + oxc-parser@0.8.0: + resolution: {integrity: sha512-ObPeMkbDX7igb7NyyAC8CbVC3fY+YmlMsxsRQ2oyFBkpQtI5tjoyqSDKbS9A9EcJvt2q89C4UoC+HjVBdLYYJg==} + oxc-resolver@11.12.0: resolution: {integrity: sha512-zmS2q2txiB+hS2u0aiIwmvITIJN8c8ThlWoWB762Wx5nUw8WBlttp0rzt8nnuP1cGIq9YJ7sGxfsgokm+SQk5Q==} @@ -6841,6 +7232,9 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-node-args@1.1.3: + resolution: {integrity: sha512-Dp9KVLLq7g9TfGh3Uo8bv+0zW+YEKis+9J3d6KFp/GHkbqS5jd5xveavErhrOP2hsAmbCwdKFBTxBlNxXMK6vg==} + parse-node-version@1.0.1: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} @@ -6896,6 +7290,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} @@ -7091,6 +7489,15 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + raptor-async@1.1.3: + resolution: {integrity: sha512-VZCxygWMjW9lKqnApK9D2QbfyzRn7ehiTqnXWwMCLBXANSy+xbnYfbX/5f8YX3bZXu+g+JESmqWPchIQrZj2ig==} + + raptor-regexp@1.0.1: + resolution: {integrity: sha512-DqC7ViHJUs3jLIxJI1/HVvCu3yPJaP8CM7PGsHvjimg7yJ3lLOdCBxlPE0G2Q8OJgUA8Pe7nvhm6lcQ3hZepow==} + + raptor-util@3.2.0: + resolution: {integrity: sha512-uEDMMkBCJvjTqYMBnJNxn+neiS6a0rhybQNA9RaexGor1uvKjwyHA5VcbZMZEuqXhKUWbL+WNS7PhuZVZNB7pw==} + raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} @@ -7176,6 +7583,9 @@ packages: resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true + relative-import-path@1.0.0: + resolution: {integrity: sha512-ZvbtoduKQmD4PZeJPfH6Ql21qUWhaMxiHkIsH+FUnZqKDwNIXBtGg5zRZyHWomiGYk8n5+KMBPK7Mi4D0XWfNg==} + remove-accents@0.5.0: resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} @@ -7335,6 +7745,10 @@ packages: select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + self-closing-tags@1.0.1: + resolution: {integrity: sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==} + engines: {node: '>=0.12.0'} + selfsigned@2.4.1: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} @@ -7591,6 +8005,9 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -7652,6 +8069,10 @@ packages: resolution: {integrity: sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==} engines: {node: '>=14.16'} + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -8149,6 +8570,9 @@ packages: resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} engines: {node: 20 || >=22} + warp10@2.1.0: + resolution: {integrity: sha512-krhkqzJdUxAZv2Cx0Gz6dN1r7TTrG9RDewkDHBbJQIqbNTCdB5ZUHVh7VkA4DgrKW4ZXPPUQKCwmI/3btDse9A==} + watchpack@2.4.2: resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} @@ -8362,6 +8786,9 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.1.12: resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} @@ -8386,15 +8813,15 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1)': + '@angular-devkit/build-angular@19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(supports-color@10.2.2)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1902.24(chokidar@4.0.3) '@angular-devkit/build-webpack': 0.1902.24(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.105.0(esbuild@0.25.4)))(webpack@5.105.0(esbuild@0.25.4)) '@angular-devkit/core': 19.2.24(chokidar@4.0.3) '@angular/build': 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.2.2)(postcss@8.5.2)(terser@5.39.0)(typescript@5.6.3)(yaml@2.8.1) - '@angular/compiler-cli': 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) - '@babel/core': 7.26.10 + '@angular/compiler-cli': 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/generator': 7.26.10 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-split-export-declaration': 7.24.7 @@ -8414,7 +8841,7 @@ snapshots: css-loader: 7.1.2(webpack@5.105.0(esbuild@0.25.4)) esbuild-wasm: 0.25.4 fast-glob: 3.3.3 - http-proxy-middleware: 3.0.5 + http-proxy-middleware: 3.0.5(supports-color@10.2.2) istanbul-lib-instrument: 6.0.3 jsonc-parser: 3.3.1 karma-source-map-support: 1.4.0 @@ -8442,7 +8869,7 @@ snapshots: typescript: 5.6.3 webpack: 5.105.0(esbuild@0.25.4) webpack-dev-middleware: 7.4.2(webpack@5.105.0(esbuild@0.25.4)) - webpack-dev-server: 5.2.2(webpack@5.105.0(esbuild@0.25.4)) + webpack-dev-server: 5.2.2(supports-color@10.2.2)(webpack@5.105.0(esbuild@0.25.4)) webpack-merge: 6.0.1 webpack-subresource-integrity: 5.1.0(webpack@5.105.0(esbuild@0.25.4)) optionalDependencies: @@ -8470,36 +8897,120 @@ snapshots: - webpack-cli - yaml - '@angular-devkit/build-webpack@0.1902.24(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.105.0(esbuild@0.25.4)))(webpack@5.105.0(esbuild@0.25.4))': + '@angular-devkit/build-angular@19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: + '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1902.24(chokidar@4.0.3) - rxjs: 7.8.1 - webpack: 5.105.0(esbuild@0.25.4) - webpack-dev-server: 5.2.2(webpack@5.105.0(esbuild@0.25.4)) - transitivePeerDependencies: - - chokidar - - '@angular-devkit/core@19.2.24(chokidar@4.0.3)': - dependencies: - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) - jsonc-parser: 3.3.1 - picomatch: 4.0.4 - rxjs: 7.8.1 - source-map: 0.7.4 - optionalDependencies: - chokidar: 4.0.3 - - '@angular-devkit/schematics@19.2.24(chokidar@4.0.3)': - dependencies: + '@angular-devkit/build-webpack': 0.1902.24(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.105.0(esbuild@0.25.4)))(webpack@5.105.0(esbuild@0.25.4)) '@angular-devkit/core': 19.2.24(chokidar@4.0.3) - jsonc-parser: 3.3.1 - magic-string: 0.30.17 - ora: 5.4.1 - rxjs: 7.8.1 - transitivePeerDependencies: - - chokidar - + '@angular/build': 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(@angular/compiler@19.2.20)(@types/node@24.9.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.2.2)(postcss@8.5.2)(terser@5.39.0)(typescript@5.6.3)(yaml@2.8.1) + '@angular/compiler-cli': 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) + '@babel/core': 7.26.10(supports-color@10.2.2) + '@babel/generator': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.26.10) + '@babel/preset-env': 7.26.9(@babel/core@7.26.10) + '@babel/runtime': 7.26.10 + '@discoveryjs/json-ext': 0.6.3 + '@ngtools/webpack': 19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(typescript@5.6.3)(webpack@5.105.0(esbuild@0.25.4)) + '@vitejs/plugin-basic-ssl': 1.2.0(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + ansi-colors: 4.1.3 + autoprefixer: 10.4.20(postcss@8.5.2) + babel-loader: 9.2.1(@babel/core@7.26.10)(webpack@5.105.0(esbuild@0.25.4)) + browserslist: 4.27.0 + copy-webpack-plugin: 12.0.2(webpack@5.105.0(esbuild@0.25.4)) + css-loader: 7.1.2(webpack@5.105.0(esbuild@0.25.4)) + esbuild-wasm: 0.25.4 + fast-glob: 3.3.3 + http-proxy-middleware: 3.0.5 + istanbul-lib-instrument: 6.0.3 + jsonc-parser: 3.3.1 + karma-source-map-support: 1.4.0 + less: 4.2.2 + less-loader: 12.2.0(less@4.2.2)(webpack@5.105.0(esbuild@0.25.4)) + license-webpack-plugin: 4.0.2(webpack@5.105.0(esbuild@0.25.4)) + loader-utils: 3.3.1 + mini-css-extract-plugin: 2.9.2(webpack@5.105.0(esbuild@0.25.4)) + open: 10.1.0 + ora: 5.4.1 + picomatch: 4.0.4 + piscina: 4.8.0 + postcss: 8.5.2 + postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.6.3)(webpack@5.105.0(esbuild@0.25.4)) + resolve-url-loader: 5.0.0 + rxjs: 7.8.1 + sass: 1.85.0 + sass-loader: 16.0.5(sass@1.85.0)(webpack@5.105.0(esbuild@0.25.4)) + semver: 7.7.1 + source-map-loader: 5.0.0(webpack@5.105.0(esbuild@0.25.4)) + source-map-support: 0.5.21 + terser: 5.39.0 + tree-kill: 1.2.2 + tslib: 2.8.1 + typescript: 5.6.3 + webpack: 5.105.0(esbuild@0.25.4) + webpack-dev-middleware: 7.4.2(webpack@5.105.0(esbuild@0.25.4)) + webpack-dev-server: 5.2.2(supports-color@10.2.2)(webpack@5.105.0(esbuild@0.25.4)) + webpack-merge: 6.0.1 + webpack-subresource-integrity: 5.1.0(webpack@5.105.0(esbuild@0.25.4)) + optionalDependencies: + esbuild: 0.25.4 + transitivePeerDependencies: + - '@angular/compiler' + - '@rspack/core' + - '@swc/core' + - '@types/node' + - bufferutil + - chokidar + - debug + - html-webpack-plugin + - jiti + - lightningcss + - node-sass + - sass-embedded + - stylus + - sugarss + - supports-color + - tsx + - uglify-js + - utf-8-validate + - vite + - webpack-cli + - yaml + + '@angular-devkit/build-webpack@0.1902.24(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.105.0(esbuild@0.25.4)))(webpack@5.105.0(esbuild@0.25.4))': + dependencies: + '@angular-devkit/architect': 0.1902.24(chokidar@4.0.3) + rxjs: 7.8.1 + webpack: 5.105.0(esbuild@0.25.4) + webpack-dev-server: 5.2.2(supports-color@10.2.2)(webpack@5.105.0(esbuild@0.25.4)) + transitivePeerDependencies: + - chokidar + + '@angular-devkit/core@19.2.24(chokidar@4.0.3)': + dependencies: + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + jsonc-parser: 3.3.1 + picomatch: 4.0.4 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 4.0.3 + + '@angular-devkit/schematics@19.2.24(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 19.2.24(chokidar@4.0.3) + jsonc-parser: 3.3.1 + magic-string: 0.30.17 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + '@angular/animations@19.2.20(@angular/common@19.2.20(@angular/core@19.2.20(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.20(rxjs@7.8.2)(zone.js@0.15.1))': dependencies: '@angular/common': 19.2.20(@angular/core@19.2.20(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) @@ -8511,8 +9022,8 @@ snapshots: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1902.24(chokidar@4.0.3) '@angular/compiler': 19.2.20 - '@angular/compiler-cli': 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) - '@babel/core': 7.26.10 + '@angular/compiler-cli': 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-split-export-declaration': 7.24.7 '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) @@ -8522,7 +9033,7 @@ snapshots: browserslist: 4.27.0 esbuild: 0.25.4 fast-glob: 3.3.3 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@10.2.2) istanbul-lib-instrument: 6.0.3 listr2: 8.2.5 magic-string: 0.30.17 @@ -8554,7 +9065,7 @@ snapshots: - tsx - yaml - '@angular/cli@19.2.24(@types/node@24.9.2)(chokidar@4.0.3)': + '@angular/cli@19.2.24(@types/node@24.9.2)(chokidar@4.0.3)(supports-color@10.2.2)': dependencies: '@angular-devkit/architect': 0.1902.24(chokidar@4.0.3) '@angular-devkit/core': 19.2.24(chokidar@4.0.3) @@ -8568,7 +9079,7 @@ snapshots: listr2: 8.2.5 npm-package-arg: 12.0.2 npm-pick-manifest: 10.0.0 - pacote: 20.0.0 + pacote: 20.0.0(supports-color@10.2.2) resolve: 1.22.10 semver: 7.7.1 symbol-observable: 4.0.0 @@ -8584,10 +9095,10 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3)': + '@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3)': dependencies: '@angular/compiler': 19.2.20 - '@babel/core': 7.26.9 + '@babel/core': 7.26.9(supports-color@10.2.2) '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 4.0.3 convert-source-map: 1.9.0 @@ -8673,7 +9184,7 @@ snapshots: '@babel/compat-data@7.28.5': {} - '@babel/core@7.26.10': + '@babel/core@7.26.10(supports-color@10.2.2)': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 @@ -8686,14 +9197,14 @@ snapshots: '@babel/traverse': 7.28.5 '@babel/types': 7.28.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/core@7.26.9': + '@babel/core@7.26.9(supports-color@10.2.2)': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 @@ -8706,7 +9217,7 @@ snapshots: '@babel/traverse': 7.28.5 '@babel/types': 7.28.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8726,7 +9237,7 @@ snapshots: '@babel/types': 7.28.5 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8767,7 +9278,7 @@ snapshots: '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 @@ -8780,17 +9291,17 @@ snapshots: '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.4.0 semver: 6.3.1 '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) lodash.debounce: 4.0.8 resolve: 1.22.11 transitivePeerDependencies: @@ -8818,7 +9329,7 @@ snapshots: '@babel/helper-module-transforms@7.28.3(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.28.5 @@ -8827,7 +9338,7 @@ snapshots: '@babel/helper-module-transforms@7.28.3(@babel/core@7.26.9)': dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.26.9(supports-color@10.2.2) '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.28.5 @@ -8851,7 +9362,7 @@ snapshots: '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.28.3 '@babel/traverse': 7.28.5 @@ -8860,7 +9371,7 @@ snapshots: '@babel/helper-replace-supers@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 '@babel/traverse': 7.28.5 @@ -8903,7 +9414,7 @@ snapshots: '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/traverse': 7.28.5 transitivePeerDependencies: @@ -8911,17 +9422,17 @@ snapshots: '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.26.10) @@ -8930,7 +9441,7 @@ snapshots: '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/traverse': 7.28.5 transitivePeerDependencies: @@ -8938,21 +9449,21 @@ snapshots: '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': @@ -8962,18 +9473,18 @@ snapshots: '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) '@babel/traverse': 7.28.5 @@ -8982,7 +9493,7 @@ snapshots: '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) @@ -8991,17 +9502,17 @@ snapshots: '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: @@ -9009,7 +9520,7 @@ snapshots: '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: @@ -9017,7 +9528,7 @@ snapshots: '@babel/plugin-transform-classes@7.28.4(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-globals': 7.28.0 @@ -9029,13 +9540,13 @@ snapshots: '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.27.2 '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/traverse': 7.28.5 transitivePeerDependencies: @@ -9043,39 +9554,39 @@ snapshots: '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: @@ -9083,7 +9594,7 @@ snapshots: '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/traverse': 7.28.5 @@ -9092,27 +9603,27 @@ snapshots: '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-literals@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: @@ -9120,7 +9631,7 @@ snapshots: '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: @@ -9128,7 +9639,7 @@ snapshots: '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 @@ -9138,7 +9649,7 @@ snapshots: '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: @@ -9146,28 +9657,28 @@ snapshots: '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.26.10) @@ -9178,7 +9689,7 @@ snapshots: '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.10) transitivePeerDependencies: @@ -9186,12 +9697,12 @@ snapshots: '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: @@ -9199,12 +9710,12 @@ snapshots: '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: @@ -9212,7 +9723,7 @@ snapshots: '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 @@ -9221,7 +9732,7 @@ snapshots: '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': @@ -9236,23 +9747,23 @@ snapshots: '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.26.10) @@ -9264,12 +9775,12 @@ snapshots: '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-spread@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: @@ -9277,46 +9788,46 @@ snapshots: '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.27.1 '@babel/preset-env@7.26.9(@babel/core@7.26.10)': dependencies: '@babel/compat-data': 7.28.5 - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 @@ -9390,7 +9901,7 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.27.1 '@babel/types': 7.28.5 esutils: 2.0.3 @@ -9415,7 +9926,7 @@ snapshots: '@babel/parser': 7.28.5 '@babel/template': 7.27.2 '@babel/types': 7.28.5 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -9584,6 +10095,14 @@ snapshots: '@chenglou/pretext@0.0.7': {} + '@chialab/estransform@0.19.1': + dependencies: + '@napi-rs/magic-string': 0.3.4 + '@parcel/source-map': 2.1.1 + cjs-module-lexer: 1.4.3 + es-module-lexer: 1.7.0 + oxc-parser: 0.8.0 + '@codesandbox/vue-preview@0.1.1-alpha.16': dependencies: ws: 8.18.3 @@ -9591,6 +10110,9 @@ snapshots: - bufferutil - utf-8-validate + '@colors/colors@1.5.0': + optional: true + '@csstools/color-helpers@5.1.0': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -9781,17 +10303,17 @@ snapshots: '@esbuild/win32-x64@0.25.4': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))': dependencies: - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.21.1(supports-color@10.2.2)': dependencies: '@eslint/object-schema': 2.1.7 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -9804,10 +10326,10 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': + '@eslint/eslintrc@3.3.1(supports-color@10.2.2)': dependencies: ajv: 6.12.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -10004,6 +10526,8 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/cliui@9.0.0': {} + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.2 @@ -10109,6 +10633,8 @@ snapshots: '@lmdb/lmdb-win32-x64@3.2.6': optional: true + '@luxass/strip-json-comments@1.4.0': {} + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.28.4 @@ -10125,6 +10651,87 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@marko/compiler@5.39.65': + dependencies: + '@luxass/strip-json-comments': 1.4.0 + complain: 1.6.1 + he: 1.2.0 + htmljs-parser: 5.10.2 + jsesc: 3.1.0 + kleur: 4.1.5 + lasso-package-root: 1.0.1 + raptor-regexp: 1.0.1 + raptor-util: 3.2.0 + relative-import-path: 1.0.0 + resolve-from: 5.0.0 + self-closing-tags: 1.0.1 + source-map-support: 0.5.21 + + '@marko/run-explorer@2.0.3(@marko/run@0.7.7(@marko/compiler@5.39.65)(@types/node@24.9.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.2.2)(marko@6.1.8)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))': + dependencies: + '@marko/run': 0.7.7(@marko/compiler@5.39.65)(@types/node@24.9.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.2.2)(marko@6.1.8)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + + '@marko/run@0.7.7(@marko/compiler@5.39.65)(@types/node@24.9.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.2.2)(marko@6.1.8)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)': + dependencies: + '@marko/run-explorer': 2.0.3(@marko/run@0.7.7(@marko/compiler@5.39.65)(@types/node@24.9.2)(esbuild@0.25.12)(jiti@2.6.1)(less@4.2.2)(marko@6.1.8)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + '@marko/vite': 5.4.10(@marko/compiler@5.39.65)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + browserslist: 4.28.2 + cli-table3: 0.6.5 + compression: 1.8.1(supports-color@10.2.2) + debug: 4.4.3(supports-color@10.2.2) + dotenv: 16.6.1 + draftlog: 1.0.13 + esbuild-plugin-browserslist: 0.16.0(browserslist@4.28.2)(esbuild@0.25.12)(supports-color@10.2.2) + glob: 11.1.0 + human-format: 1.2.1 + kleur: 4.1.5 + marko: 6.1.8 + parse-node-args: 1.1.3 + sade: 1.8.1 + serve-static: 1.16.2(supports-color@10.2.2) + supports-color: 10.2.2 + vite: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + warp10: 2.1.0 + transitivePeerDependencies: + - '@marko/compiler' + - '@types/node' + - esbuild + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + '@marko/vite@3.1.6(@marko/compiler@5.39.65)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))': + dependencies: + '@marko/compiler': 5.39.65 + anymatch: 3.1.3 + domelementtype: 2.3.0 + domhandler: 5.0.3 + htmlparser2: 9.1.0 + resolve: 1.22.11 + resolve.exports: 2.0.3 + vite: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + + '@marko/vite@5.4.10(@marko/compiler@5.39.65)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))': + dependencies: + '@chialab/estransform': 0.19.1 + '@marko/compiler': 5.39.65 + anymatch: 3.1.3 + domelementtype: 2.3.0 + domhandler: 5.0.3 + fast-glob: 3.3.3 + htmlparser2: 10.1.0 + relative-import-path: 1.0.0 + resolve: 1.22.11 + resolve.exports: 2.0.3 + vite: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + '@microsoft/api-extractor-model@7.29.6(@types/node@24.9.2)': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -10178,6 +10785,61 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true + '@napi-rs/magic-string-android-arm-eabi@0.3.4': + optional: true + + '@napi-rs/magic-string-android-arm64@0.3.4': + optional: true + + '@napi-rs/magic-string-darwin-arm64@0.3.4': + optional: true + + '@napi-rs/magic-string-darwin-x64@0.3.4': + optional: true + + '@napi-rs/magic-string-freebsd-x64@0.3.4': + optional: true + + '@napi-rs/magic-string-linux-arm-gnueabihf@0.3.4': + optional: true + + '@napi-rs/magic-string-linux-arm64-gnu@0.3.4': + optional: true + + '@napi-rs/magic-string-linux-arm64-musl@0.3.4': + optional: true + + '@napi-rs/magic-string-linux-x64-gnu@0.3.4': + optional: true + + '@napi-rs/magic-string-linux-x64-musl@0.3.4': + optional: true + + '@napi-rs/magic-string-win32-arm64-msvc@0.3.4': + optional: true + + '@napi-rs/magic-string-win32-ia32-msvc@0.3.4': + optional: true + + '@napi-rs/magic-string-win32-x64-msvc@0.3.4': + optional: true + + '@napi-rs/magic-string@0.3.4': + optionalDependencies: + '@napi-rs/magic-string-android-arm-eabi': 0.3.4 + '@napi-rs/magic-string-android-arm64': 0.3.4 + '@napi-rs/magic-string-darwin-arm64': 0.3.4 + '@napi-rs/magic-string-darwin-x64': 0.3.4 + '@napi-rs/magic-string-freebsd-x64': 0.3.4 + '@napi-rs/magic-string-linux-arm-gnueabihf': 0.3.4 + '@napi-rs/magic-string-linux-arm64-gnu': 0.3.4 + '@napi-rs/magic-string-linux-arm64-musl': 0.3.4 + '@napi-rs/magic-string-linux-x64-gnu': 0.3.4 + '@napi-rs/magic-string-linux-x64-musl': 0.3.4 + '@napi-rs/magic-string-win32-arm64-msvc': 0.3.4 + '@napi-rs/magic-string-win32-ia32-msvc': 0.3.4 + '@napi-rs/magic-string-win32-x64-msvc': 0.3.4 + '@napi-rs/nice-android-arm-eabi@1.1.1': optional: true @@ -10272,7 +10934,7 @@ snapshots: '@ngtools/webpack@19.2.24(@angular/compiler-cli@19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3))(typescript@5.6.3)(webpack@5.105.0(esbuild@0.25.4))': dependencies: - '@angular/compiler-cli': 19.2.20(@angular/compiler@19.2.20)(typescript@5.6.3) + '@angular/compiler-cli': 19.2.20(@angular/compiler@19.2.20)(supports-color@10.2.2)(typescript@5.6.3) typescript: 5.6.3 webpack: 5.105.0(esbuild@0.25.4) @@ -10291,8 +10953,8 @@ snapshots: '@npmcli/agent@3.0.0': dependencies: agent-base: 7.1.4 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + http-proxy-agent: 7.0.2(supports-color@10.2.2) + https-proxy-agent: 7.0.6(supports-color@10.2.2) lru-cache: 10.4.3 socks-proxy-agent: 8.0.5 transitivePeerDependencies: @@ -10384,10 +11046,10 @@ snapshots: '@open-wc/dedupe-mixin': 2.0.1 lit: 3.3.1 - '@open-wc/semantic-dom-diff@0.20.1': + '@open-wc/semantic-dom-diff@0.20.1(supports-color@10.2.2)': dependencies: '@types/chai': 4.3.20 - '@web/test-runner-commands': 0.9.0 + '@web/test-runner-commands': 0.9.0(supports-color@10.2.2) transitivePeerDependencies: - bufferutil - supports-color @@ -10399,10 +11061,10 @@ snapshots: lit: 3.3.1 lit-html: 3.3.1 - '@open-wc/testing@4.0.0': + '@open-wc/testing@4.0.0(supports-color@10.2.2)': dependencies: '@esm-bundle/chai': 4.3.4-fix.0 - '@open-wc/semantic-dom-diff': 0.20.1 + '@open-wc/semantic-dom-diff': 0.20.1(supports-color@10.2.2) '@open-wc/testing-helpers': 3.0.1 '@types/chai-dom': 1.11.3 '@types/sinon-chai': 3.2.12 @@ -10412,6 +11074,30 @@ snapshots: - supports-color - utf-8-validate + '@oxc-parser/binding-darwin-arm64@0.8.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.8.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.8.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.8.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.8.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.8.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.8.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.8.0': + optional: true + '@oxc-resolver/binding-android-arm-eabi@11.12.0': optional: true @@ -10471,6 +11157,10 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.12.0': optional: true + '@parcel/source-map@2.1.1': + dependencies: + detect-libc: 1.0.3 + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -10693,10 +11383,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@sigstore/tuf@3.1.1': + '@sigstore/tuf@3.1.1(supports-color@10.2.2)': dependencies: '@sigstore/protobuf-specs': 0.4.3 - tuf-js: 3.1.0 + tuf-js: 3.1.0(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -10712,11 +11402,11 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.5.0(eslint@9.39.0(jiti@2.6.1))': + '@stylistic/eslint-plugin@5.5.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2)) '@typescript-eslint/types': 8.46.2 - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -10733,19 +11423,42 @@ snapshots: transitivePeerDependencies: - typescript + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(supports-color@10.2.2)(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)))(supports-color@10.2.2)(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 3.1.2(supports-color@10.2.2)(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + debug: 4.4.3(supports-color@10.2.2) + svelte: 4.2.20 + vite: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)))(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))': dependencies: '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) svelte: 4.2.20 vite: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color + '@sveltejs/vite-plugin-svelte@3.1.2(supports-color@10.2.2)(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(supports-color@10.2.2)(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)))(supports-color@10.2.2)(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + debug: 4.4.3(supports-color@10.2.2) + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.21 + svelte: 4.2.20 + svelte-hmr: 0.16.0(svelte@4.2.20) + vite: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) + vitefu: 0.2.5(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + transitivePeerDependencies: + - supports-color + '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))': dependencies: '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)))(svelte@4.2.20)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.21 @@ -10769,16 +11482,16 @@ snapshots: '@tanstack/table-core': 8.21.3 tslib: 2.8.1 - '@tanstack/eslint-config@0.3.4(@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3)': + '@tanstack/eslint-config@0.3.4(@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3)': dependencies: '@eslint/js': 9.39.0 - '@stylistic/eslint-plugin': 5.5.0(eslint@9.39.0(jiti@2.6.1)) - eslint: 9.39.0(jiti@2.6.1) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1)) - eslint-plugin-n: 17.23.1(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3) + '@stylistic/eslint-plugin': 5.5.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2)) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2) + eslint-plugin-n: 17.23.1(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(typescript@5.6.3) globals: 16.5.0 - typescript-eslint: 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3) - vue-eslint-parser: 10.2.0(eslint@9.39.0(jiti@2.6.1)) + typescript-eslint: 8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3) + vue-eslint-parser: 10.2.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint-import-resolver-node @@ -10820,13 +11533,13 @@ snapshots: '@tanstack/table-core@8.21.3': {} - '@tanstack/vite-config@0.4.3(@types/node@24.9.2)(rollup@4.59.0)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))': + '@tanstack/vite-config@0.4.3(@types/node@24.9.2)(rollup@4.59.0)(supports-color@10.2.2)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.59.0) vite: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) - vite-plugin-dts: 4.2.3(@types/node@24.9.2)(rollup@4.59.0)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + vite-plugin-dts: 4.2.3(@types/node@24.9.2)(rollup@4.59.0)(supports-color@10.2.2)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) vite-plugin-externalize-deps: 0.10.0(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) - vite-tsconfig-paths: 5.1.4(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) + vite-tsconfig-paths: 5.1.4(supports-color@10.2.2)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - rollup @@ -11126,15 +11839,15 @@ snapshots: dependencies: '@types/node': 24.9.2 - '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/type-utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.46.2 - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -11143,14 +11856,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3)': + '@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.46.2 '@typescript-eslint/types': 8.46.2 '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.46.2 - debug: 4.4.3 - eslint: 9.39.0(jiti@2.6.1) + debug: 4.4.3(supports-color@10.2.2) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -11159,7 +11872,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.6.3) '@typescript-eslint/types': 8.46.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -11173,13 +11886,13 @@ snapshots: dependencies: typescript: 5.6.3 - '@typescript-eslint/type-utils@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.46.2 '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.6.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3) - debug: 4.4.3 - eslint: 9.39.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(typescript@5.6.3) + debug: 4.4.3(supports-color@10.2.2) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) ts-api-utils: 2.1.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: @@ -11193,7 +11906,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.6.3) '@typescript-eslint/types': 8.46.2 '@typescript-eslint/visitor-keys': 8.46.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -11203,13 +11916,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3)': + '@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2)) '@typescript-eslint/scope-manager': 8.46.2 '@typescript-eslint/types': 8.46.2 '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.6.3) - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -11474,7 +12187,7 @@ snapshots: dependencies: errorstacks: 2.4.1 - '@web/dev-server-core@0.7.5': + '@web/dev-server-core@0.7.5(supports-color@10.2.2)': dependencies: '@types/koa': 2.15.0 '@types/ws': 7.4.7 @@ -11485,9 +12198,9 @@ snapshots: get-stream: 6.0.1 is-stream: 2.0.1 isbinaryfile: 5.0.6 - koa: 2.16.3 + koa: 2.16.3(supports-color@10.2.2) koa-etag: 4.0.0 - koa-send: 5.0.1 + koa-send: 5.0.1(supports-color@10.2.2) koa-static: 5.0.0 lru-cache: 8.0.5 mime-types: 2.1.35 @@ -11504,18 +12217,18 @@ snapshots: '@types/parse5': 6.0.3 parse5: 6.0.1 - '@web/test-runner-commands@0.9.0': + '@web/test-runner-commands@0.9.0(supports-color@10.2.2)': dependencies: - '@web/test-runner-core': 0.13.4 + '@web/test-runner-core': 0.13.4(supports-color@10.2.2) mkdirp: 1.0.4 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@web/test-runner-core@0.13.4': + '@web/test-runner-core@0.13.4(supports-color@10.2.2)': dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@types/babel__code-frame': 7.0.6 '@types/co-body': 6.1.3 '@types/convert-source-map': 2.0.3 @@ -11523,7 +12236,7 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@web/browser-logs': 0.4.1 - '@web/dev-server-core': 0.7.5 + '@web/dev-server-core': 0.7.5(supports-color@10.2.2) chokidar: 4.0.3 cli-cursor: 3.1.0 co-body: 6.2.0 @@ -11782,7 +12495,7 @@ snapshots: axe-core@4.11.0: {} - axios@1.13.1(debug@4.4.3): + axios@1.13.1: dependencies: follow-redirects: 1.15.11(debug@4.4.3) form-data: 4.0.4 @@ -11794,7 +12507,7 @@ snapshots: babel-loader@9.2.1(@babel/core@7.26.10)(webpack@5.105.0(esbuild@0.25.4)): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) find-cache-dir: 4.0.0 schema-utils: 4.3.3 webpack: 5.105.0(esbuild@0.25.4) @@ -11811,7 +12524,7 @@ snapshots: babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.26.10): dependencies: '@babel/compat-data': 7.28.5 - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.10) semver: 6.3.1 transitivePeerDependencies: @@ -11819,7 +12532,7 @@ snapshots: babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.10) core-js-compat: 3.46.0 transitivePeerDependencies: @@ -11827,7 +12540,7 @@ snapshots: babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.26.10): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.10(supports-color@10.2.2) '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.10) transitivePeerDependencies: - supports-color @@ -11882,11 +12595,11 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - body-parser@1.20.3: + body-parser@1.20.3(supports-color@10.2.2): dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 2.6.9 + debug: 2.6.9(supports-color@10.2.2) depd: 2.0.0 destroy: 1.2.0 http-errors: 2.0.0 @@ -12042,6 +12755,8 @@ snapshots: chrome-trace-event@1.0.4: {} + cjs-module-lexer@1.4.3: {} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -12054,6 +12769,12 @@ snapshots: cli-spinners@2.9.2: {} + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 @@ -12115,15 +12836,19 @@ snapshots: compare-versions@6.1.1: {} + complain@1.6.1: + dependencies: + error-stack-parser: 2.1.4 + compressible@2.0.18: dependencies: mime-db: 1.54.0 - compression@1.8.1: + compression@1.8.1(supports-color@10.2.2): dependencies: bytes: 3.1.2 compressible: 2.0.18 - debug: 2.6.9 + debug: 2.6.9(supports-color@10.2.2) negotiator: 0.6.4 on-headers: 1.1.0 safe-buffer: 5.2.1 @@ -12174,7 +12899,7 @@ snapshots: core-js-compat@3.46.0: dependencies: - browserslist: 4.27.0 + browserslist: 4.28.2 core-util-is@1.0.3: {} @@ -12249,17 +12974,21 @@ snapshots: debounce@1.2.1: {} - debug@2.6.9: + debug@2.6.9(supports-color@10.2.2): dependencies: ms: 2.0.0 + optionalDependencies: + supports-color: 10.2.2 debug@3.2.7: dependencies: ms: 2.1.3 - debug@4.4.3: + debug@4.4.3(supports-color@10.2.2): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 10.2.2 decimal.js@10.6.0: {} @@ -12306,8 +13035,7 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@1.0.3: - optional: true + detect-libc@1.0.3: {} detect-libc@2.1.2: optional: true @@ -12354,6 +13082,8 @@ snapshots: dotenv@8.6.0: {} + draftlog@1.0.13: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -12417,6 +13147,8 @@ snapshots: entities@6.0.1: {} + entities@7.0.1: {} + env-paths@2.2.1: {} environment@1.1.0: {} @@ -12432,6 +13164,10 @@ snapshots: dependencies: is-arrayish: 0.2.1 + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + errorstacks@2.4.1: {} es-define-property@1.0.1: {} @@ -12453,6 +13189,15 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + esbuild-plugin-browserslist@0.16.0(browserslist@4.28.2)(esbuild@0.25.12)(supports-color@10.2.2): + dependencies: + browserslist: 4.28.2 + debug: 4.4.3(supports-color@10.2.2) + esbuild: 0.25.12 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + esbuild-wasm@0.25.4: {} esbuild@0.25.12: @@ -12520,9 +13265,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.39.0(jiti@2.6.1)): + eslint-compat-utils@0.5.1(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2)): dependencies: - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) semver: 7.7.3 eslint-import-context@0.1.9(unrs-resolver@1.11.1): @@ -12532,19 +13277,19 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-plugin-es-x@7.8.0(eslint@9.39.0(jiti@2.6.1)): + eslint-plugin-es-x@7.8.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2)) '@eslint-community/regexpp': 4.12.2 - eslint: 9.39.0(jiti@2.6.1) - eslint-compat-utils: 0.5.1(eslint@9.39.0(jiti@2.6.1)) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) + eslint-compat-utils: 0.5.1(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2): dependencies: '@typescript-eslint/types': 8.46.2 comment-parser: 1.4.1 - debug: 4.4.3 - eslint: 9.39.0(jiti@2.6.1) + debug: 4.4.3(supports-color@10.2.2) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.1.1 @@ -12552,16 +13297,16 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(typescript@5.6.3) transitivePeerDependencies: - supports-color - eslint-plugin-n@17.23.1(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3): + eslint-plugin-n@17.23.1(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(typescript@5.6.3): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2)) enhanced-resolve: 5.18.3 - eslint: 9.39.0(jiti@2.6.1) - eslint-plugin-es-x: 7.8.0(eslint@9.39.0(jiti@2.6.1)) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) + eslint-plugin-es-x: 7.8.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2)) get-tsconfig: 4.13.0 globals: 15.15.0 globrex: 0.1.2 @@ -12585,14 +13330,14 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.0(jiti@2.6.1): + eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 + '@eslint/config-array': 0.21.1(supports-color@10.2.2) '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.1 + '@eslint/eslintrc': 3.3.1(supports-color@10.2.2) '@eslint/js': 9.39.0 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 @@ -12602,7 +13347,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -12678,21 +13423,21 @@ snapshots: exponential-backoff@3.1.3: {} - express@4.21.2: + express@4.21.2(supports-color@10.2.2): dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.3 + body-parser: 1.20.3(supports-color@10.2.2) content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.7.1 cookie-signature: 1.0.6 - debug: 2.6.9 + debug: 2.6.9(supports-color@10.2.2) depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.3.1 + finalhandler: 1.3.1(supports-color@10.2.2) fresh: 0.5.2 http-errors: 2.0.0 merge-descriptors: 1.0.3 @@ -12704,8 +13449,8 @@ snapshots: qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 + send: 0.19.0(supports-color@10.2.2) + serve-static: 1.16.2(supports-color@10.2.2) setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -12732,6 +13477,8 @@ snapshots: fast-uri@3.1.0: {} + fastest-levenshtein@1.0.16: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -12764,9 +13511,9 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.3.1: + finalhandler@1.3.1(supports-color@10.2.2): dependencies: - debug: 2.6.9 + debug: 2.6.9(supports-color@10.2.2) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -12805,9 +13552,13 @@ snapshots: flatted@3.3.3: {} + follow-redirects@1.15.11(debug@4.4.3(supports-color@10.2.2)): + optionalDependencies: + debug: 4.4.3(supports-color@10.2.2) + follow-redirects@1.15.11(debug@4.4.3): optionalDependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) foreground-child@3.3.1: dependencies: @@ -12921,6 +13672,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.1.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.2 + globals@14.0.0: {} globals@15.15.0: {} @@ -12992,6 +13752,8 @@ snapshots: dependencies: cheerio: 1.1.2 + htmljs-parser@5.10.2: {} + htmlparser2@10.0.0: dependencies: domelementtype: 2.3.0 @@ -12999,6 +13761,20 @@ snapshots: domutils: 3.2.2 entities: 6.0.1 + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 + + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + http-assert@1.5.0: dependencies: deep-equal: 1.0.1 @@ -13033,10 +13809,10 @@ snapshots: http-parser-js@0.5.10: {} - http-proxy-agent@7.0.2: + http-proxy-agent@7.0.2(supports-color@10.2.2): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -13055,7 +13831,7 @@ snapshots: http-proxy-middleware@3.0.5: dependencies: '@types/http-proxy': 1.17.17 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) http-proxy: 1.18.1(debug@4.4.3) is-glob: 4.0.3 is-plain-object: 5.0.0 @@ -13063,6 +13839,25 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy-middleware@3.0.5(supports-color@10.2.2): + dependencies: + '@types/http-proxy': 1.17.17 + debug: 4.4.3(supports-color@10.2.2) + http-proxy: 1.18.1(debug@4.4.3(supports-color@10.2.2)) + is-glob: 4.0.3 + is-plain-object: 5.0.0 + micromatch: 4.0.8 + transitivePeerDependencies: + - supports-color + + http-proxy@1.18.1(debug@4.4.3(supports-color@10.2.2)): + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.11(debug@4.4.3(supports-color@10.2.2)) + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + http-proxy@1.18.1(debug@4.4.3): dependencies: eventemitter3: 4.0.7 @@ -13071,13 +13866,15 @@ snapshots: transitivePeerDependencies: - debug - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@10.2.2): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color + human-format@1.2.1: {} + human-id@4.1.2: {} human-signals@2.1.0: {} @@ -13281,6 +14078,10 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + jest-diff@30.2.0: dependencies: '@jest/diff-sequences': 30.0.1 @@ -13311,7 +14112,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@27.1.0: + jsdom@27.1.0(supports-color@10.2.2): dependencies: '@acemir/cssom': 0.9.19 '@asamuzakjp/dom-selector': 6.7.4 @@ -13319,8 +14120,8 @@ snapshots: data-urls: 6.0.0 decimal.js: 10.6.0 html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + http-proxy-agent: 7.0.2(supports-color@10.2.2) + https-proxy-agent: 7.0.6(supports-color@10.2.2) is-potential-custom-element-name: 1.0.1 parse5: 8.0.0 saxes: 6.0.0 @@ -13408,9 +14209,9 @@ snapshots: dependencies: etag: 1.8.1 - koa-send@5.0.1: + koa-send@5.0.1(supports-color@10.2.2): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) http-errors: 1.8.1 resolve-path: 1.4.0 transitivePeerDependencies: @@ -13419,18 +14220,18 @@ snapshots: koa-static@5.0.0: dependencies: debug: 3.2.7 - koa-send: 5.0.1 + koa-send: 5.0.1(supports-color@10.2.2) transitivePeerDependencies: - supports-color - koa@2.16.3: + koa@2.16.3(supports-color@10.2.2): dependencies: accepts: 1.3.8 cache-content-type: 1.0.1 content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.9.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -13453,6 +14254,14 @@ snapshots: kolorist@1.8.0: {} + lasso-caching-fs@1.0.2: + dependencies: + raptor-async: 1.1.3 + + lasso-package-root@1.0.1: + dependencies: + lasso-caching-fs: 1.0.2 + launch-editor@2.12.0: dependencies: picocolors: 1.1.1 @@ -13648,6 +14457,13 @@ snapshots: marked@12.0.2: {} + marko@6.1.8: + dependencies: + '@marko/compiler': 5.39.65 + csstype: 3.2.3 + fastest-levenshtein: 1.0.16 + magic-string: 0.30.21 + math-intrinsics@1.1.0: {} mdn-data@2.0.30: {} @@ -13933,13 +14749,13 @@ snapshots: dependencies: boolbase: 1.0.0 - nx@22.1.3(debug@4.4.3): + nx@22.1.3: dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.2 '@zkochan/js-yaml': 0.0.7 - axios: 1.13.1(debug@4.4.3) + axios: 1.13.1 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -14060,6 +14876,17 @@ snapshots: outdent@0.5.0: {} + oxc-parser@0.8.0: + optionalDependencies: + '@oxc-parser/binding-darwin-arm64': 0.8.0 + '@oxc-parser/binding-darwin-x64': 0.8.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.8.0 + '@oxc-parser/binding-linux-arm64-musl': 0.8.0 + '@oxc-parser/binding-linux-x64-gnu': 0.8.0 + '@oxc-parser/binding-linux-x64-musl': 0.8.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.8.0 + '@oxc-parser/binding-win32-x64-msvc': 0.8.0 + oxc-resolver@11.12.0: optionalDependencies: '@oxc-resolver/binding-android-arm-eabi': 11.12.0 @@ -14140,7 +14967,7 @@ snapshots: package-manager-detector@1.5.0: {} - pacote@20.0.0: + pacote@20.0.0(supports-color@10.2.2): dependencies: '@npmcli/git': 6.0.3 '@npmcli/installed-package-contents': 3.0.0 @@ -14156,7 +14983,7 @@ snapshots: npm-registry-fetch: 18.0.2 proc-log: 5.0.0 promise-retry: 2.0.1 - sigstore: 3.1.0 + sigstore: 3.1.0(supports-color@10.2.2) ssri: 12.0.0 tar: 6.2.1 transitivePeerDependencies: @@ -14168,11 +14995,15 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-node-args@1.1.3: + dependencies: + '@babel/runtime': 7.28.4 + parse-node-version@1.0.1: {} parse5-html-rewriting-stream@7.0.0: @@ -14223,6 +15054,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.2: + dependencies: + lru-cache: 11.2.2 + minipass: 7.1.2 + path-to-regexp@0.1.12: {} path-type@4.0.0: {} @@ -14393,6 +15229,12 @@ snapshots: range-parser@1.2.1: {} + raptor-async@1.1.3: {} + + raptor-regexp@1.0.1: {} + + raptor-util@3.2.0: {} + raw-body@2.5.2: dependencies: bytes: 3.1.2 @@ -14484,6 +15326,8 @@ snapshots: dependencies: jsesc: 3.1.0 + relative-import-path@1.0.0: {} + remove-accents@0.5.0: {} require-directory@2.1.1: {} @@ -14647,6 +15491,8 @@ snapshots: select-hose@2.0.0: {} + self-closing-tags@1.0.1: {} + selfsigned@2.4.1: dependencies: '@types/node-forge': 1.3.14 @@ -14665,9 +15511,9 @@ snapshots: semver@7.7.3: {} - send@0.19.0: + send@0.19.0(supports-color@10.2.2): dependencies: - debug: 2.6.9 + debug: 2.6.9(supports-color@10.2.2) depd: 2.0.0 destroy: 1.2.0 encodeurl: 1.0.2 @@ -14693,11 +15539,11 @@ snapshots: seroval@1.3.2: {} - serve-index@1.9.1: + serve-index@1.9.1(supports-color@10.2.2): dependencies: accepts: 1.3.8 batch: 0.6.1 - debug: 2.6.9 + debug: 2.6.9(supports-color@10.2.2) escape-html: 1.0.3 http-errors: 1.6.3 mime-types: 2.1.35 @@ -14705,12 +15551,12 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@1.16.2: + serve-static@1.16.2(supports-color@10.2.2): dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.19.0 + send: 0.19.0(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -14799,13 +15645,13 @@ snapshots: signal-exit@4.1.0: {} - sigstore@3.1.0: + sigstore@3.1.0(supports-color@10.2.2): dependencies: '@sigstore/bundle': 3.1.0 '@sigstore/core': 2.0.0 '@sigstore/protobuf-specs': 0.4.3 '@sigstore/sign': 3.1.0 - '@sigstore/tuf': 3.1.1 + '@sigstore/tuf': 3.1.1(supports-color@10.2.2) '@sigstore/verify': 2.1.1 transitivePeerDependencies: - supports-color @@ -14843,7 +15689,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) socks: 2.8.7 transitivePeerDependencies: - supports-color @@ -14906,9 +15752,9 @@ snapshots: spdx-license-ids@3.0.22: {} - spdy-transport@3.0.0: + spdy-transport@3.0.0(supports-color@10.2.2): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -14917,13 +15763,13 @@ snapshots: transitivePeerDependencies: - supports-color - spdy@4.0.2: + spdy@4.0.2(supports-color@10.2.2): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 - spdy-transport: 3.0.0 + spdy-transport: 3.0.0(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -14937,6 +15783,8 @@ snapshots: stackback@0.0.2: {} + stackframe@1.3.4: {} + statuses@1.5.0: {} statuses@2.0.1: {} @@ -14991,6 +15839,8 @@ snapshots: strip-json-comments@5.0.2: {} + supports-color@10.2.2: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -15161,10 +16011,10 @@ snapshots: tsscmp@1.0.6: {} - tuf-js@3.1.0: + tuf-js@3.1.0(supports-color@10.2.2): dependencies: '@tufjs/models': 3.0.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) make-fetch-happen: 14.0.3 transitivePeerDependencies: - supports-color @@ -15182,13 +16032,13 @@ snapshots: typed-assert@1.0.9: {} - typescript-eslint@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3): + typescript-eslint@8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3) - '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3))(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.6.3) '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.6.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.6.3) - eslint: 9.39.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(typescript@5.6.3) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -15291,14 +16141,14 @@ snapshots: svelte: 4.2.20 vue: 3.5.22(typescript@5.6.3) - vite-plugin-dts@4.2.3(@types/node@24.9.2)(rollup@4.59.0)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)): + vite-plugin-dts@4.2.3(@types/node@24.9.2)(rollup@4.59.0)(supports-color@10.2.2)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@24.9.2) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) '@volar/typescript': 2.4.23 '@vue/language-core': 2.1.6(typescript@5.6.3) compare-versions: 6.1.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) kolorist: 1.8.0 local-pkg: 0.5.1 magic-string: 0.30.21 @@ -15329,9 +16179,9 @@ snapshots: transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(supports-color@10.2.2)(typescript@5.6.3)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.6.3) optionalDependencies: @@ -15365,7 +16215,7 @@ snapshots: optionalDependencies: vite: 6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1) - vitest@4.1.4(@types/node@24.9.2)(jsdom@27.1.0)(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)): + vitest@4.1.4(@types/node@24.9.2)(jsdom@27.1.0(supports-color@10.2.2))(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)): dependencies: '@vitest/expect': 4.1.4 '@vitest/mocker': 4.1.4(vite@6.4.2(@types/node@24.9.2)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.1)) @@ -15389,7 +16239,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.9.2 - jsdom: 27.1.0 + jsdom: 27.1.0(supports-color@10.2.2) transitivePeerDependencies: - msw @@ -15399,10 +16249,10 @@ snapshots: dependencies: vue: 3.5.22(typescript@5.6.3) - vue-eslint-parser@10.2.0(eslint@9.39.0(jiti@2.6.1)): + vue-eslint-parser@10.2.0(eslint@9.39.0(jiti@2.6.1)(supports-color@10.2.2))(supports-color@10.2.2): dependencies: - debug: 4.4.3 - eslint: 9.39.0(jiti@2.6.1) + debug: 4.4.3(supports-color@10.2.2) + eslint: 9.39.0(jiti@2.6.1)(supports-color@10.2.2) eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -15433,6 +16283,8 @@ snapshots: walk-up-path@4.0.0: {} + warp10@2.1.0: {} + watchpack@2.4.2: dependencies: glob-to-regexp: 0.4.1 @@ -15469,7 +16321,7 @@ snapshots: optionalDependencies: webpack: 5.105.0(esbuild@0.25.4) - webpack-dev-server@5.2.2(webpack@5.105.0(esbuild@0.25.4)): + webpack-dev-server@5.2.2(supports-color@10.2.2)(webpack@5.105.0(esbuild@0.25.4)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -15483,9 +16335,9 @@ snapshots: bonjour-service: 1.3.0 chokidar: 3.6.0 colorette: 2.0.20 - compression: 1.8.1 + compression: 1.8.1(supports-color@10.2.2) connect-history-api-fallback: 2.0.0 - express: 4.21.2 + express: 4.21.2(supports-color@10.2.2) graceful-fs: 4.2.11 http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.2.0 @@ -15494,9 +16346,9 @@ snapshots: p-retry: 6.2.1 schema-utils: 4.3.3 selfsigned: 2.4.1 - serve-index: 1.9.1 + serve-index: 1.9.1(supports-color@10.2.2) sockjs: 0.3.24 - spdy: 4.0.2 + spdy: 4.0.2(supports-color@10.2.2) webpack-dev-middleware: 7.4.2(webpack@5.105.0(esbuild@0.25.4)) ws: 8.18.3 optionalDependencies: @@ -15657,6 +16509,8 @@ snapshots: yoctocolors-cjs@2.1.3: {} + zod@3.25.76: {} + zod@4.1.12: {} zone.js@0.15.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index eeb04cba3..bf011f51c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,6 +10,7 @@ packages: - 'examples/svelte/*' - 'examples/vue/*' - 'examples/lit/*' + - 'examples/marko/*' - 'benchmarks' allowBuilds: