diff --git a/.changeset/healthy-papayas-own.md b/.changeset/healthy-papayas-own.md new file mode 100644 index 00000000..c06ac528 --- /dev/null +++ b/.changeset/healthy-papayas-own.md @@ -0,0 +1,5 @@ +--- +'@inox-tools/request-state': patch +--- + +Refactor client state injection to be fully compliant with Web APIs diff --git a/.github/workflows/example-deploys.yml b/.github/workflows/example-deploys.yml index 26087d94..85a23cae 100644 --- a/.github/workflows/example-deploys.yml +++ b/.github/workflows/example-deploys.yml @@ -40,6 +40,8 @@ jobs: - sitemap-ext - custom-routing - astro-when + - request-state + - request-nanostores steps: - name: Checkout uses: actions/checkout@v4 @@ -73,6 +75,14 @@ jobs: - name: Discard all git changes run: git restore . + - name: Create Cloudflare Pages Project + run: |- + pnpm dlx wrangler pages project create 'inox-tools-ex-${{ matrix.example }}' --production-branch main || true + working-directory: examples/${{ matrix.example }} + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + - name: Publish to Cloudflare Pages run: pnpm dlx wrangler pages deploy dist --project-name 'inox-tools-ex-${{ matrix.example }}' --branch '${{ github.head_ref }}' working-directory: examples/${{ matrix.example }} diff --git a/examples/deploy-cloudflare.sh b/examples/deploy-cloudflare.sh index 653942f9..7b920ba6 100755 --- a/examples/deploy-cloudflare.sh +++ b/examples/deploy-cloudflare.sh @@ -17,6 +17,9 @@ if [ ! -d "$SCRIPT_DIR/$PROJECT_NAME" ]; then exit 1 fi +cp "$SCRIPT_DIR/wrangler.toml" "$SCRIPT_DIR/$PROJECT_NAME/wrangler.toml" +echo "name = \"inox-tools-ex-$PROJECT_NAME\"" >>"$SCRIPT_DIR/$PROJECT_NAME/wrangler.toml" + cd "$SCRIPT_DIR/$PROJECT_NAME" # Check that the project is an Astro project @@ -29,7 +32,7 @@ fi pnpm astro add cloudflare --yes # Build the project -pnpm build +pnpm astro build # Restore the Astro project to its original state git restore package.json astro.config.* diff --git a/examples/request-nanostores/.gitignore b/examples/request-nanostores/.gitignore new file mode 100644 index 00000000..16d54bb1 --- /dev/null +++ b/examples/request-nanostores/.gitignore @@ -0,0 +1,24 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ diff --git a/examples/request-nanostores/README.md b/examples/request-nanostores/README.md new file mode 100644 index 00000000..163c9129 --- /dev/null +++ b/examples/request-nanostores/README.md @@ -0,0 +1,11 @@ +# Astro Example: Nanostores + +```sh +npm create astro@latest -- --template with-nanostores +``` + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/with-nanostores) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/with-nanostores) +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/with-nanostores/devcontainer.json) + +This example showcases using [`nanostores`](https://github.com/nanostores/nanostores) to provide shared state between components of any framework. [**Read our documentation on sharing state**](https://docs.astro.build/en/core-concepts/sharing-state/) for a complete breakdown of this project, along with guides to use React, Vue, Svelte, or Solid! diff --git a/examples/request-nanostores/astro.config.ts b/examples/request-nanostores/astro.config.ts new file mode 100644 index 00000000..b1bfed0f --- /dev/null +++ b/examples/request-nanostores/astro.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from 'astro/config'; +import preact from '@astrojs/preact'; +import requestNanostores from '@inox-tools/request-nanostores'; + +import node from '@astrojs/node'; + +// https://astro.build/config +export default defineConfig({ + // Enable many frameworks to support all different kinds of components. + integrations: [preact(), requestNanostores()], + compressHTML: false, + output: 'server', + adapter: node({ + mode: 'standalone', + }), + experimental: { + actions: true, + }, +}); diff --git a/examples/request-nanostores/package.json b/examples/request-nanostores/package.json new file mode 100644 index 00000000..5f5531a1 --- /dev/null +++ b/examples/request-nanostores/package.json @@ -0,0 +1,24 @@ +{ + "name": "@example/request-nanostores", + "private": true, + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro check && astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/check": "^0.9.3", + "@astrojs/node": "^8.3.3", + "@astrojs/preact": "^3.5.1", + "@inox-tools/request-nanostores": "workspace:^", + "@nanostores/preact": "^0.5.2", + "astro": "^4.14.2", + "nanostores": "^0.11.2", + "preact": "^10.23.1", + "typescript": "^5.5.4" + } +} diff --git a/examples/request-nanostores/public/favicon.svg b/examples/request-nanostores/public/favicon.svg new file mode 100644 index 00000000..f157bd1c --- /dev/null +++ b/examples/request-nanostores/public/favicon.svg @@ -0,0 +1,9 @@ + + + + diff --git a/examples/request-nanostores/public/images/astronaut-figurine.png b/examples/request-nanostores/public/images/astronaut-figurine.png new file mode 100644 index 00000000..aac9b445 Binary files /dev/null and b/examples/request-nanostores/public/images/astronaut-figurine.png differ diff --git a/examples/request-nanostores/src/actions/index.ts b/examples/request-nanostores/src/actions/index.ts new file mode 100644 index 00000000..0ce575b0 --- /dev/null +++ b/examples/request-nanostores/src/actions/index.ts @@ -0,0 +1,24 @@ +import { defineAction, z } from 'astro:actions'; +import { CART_COOKIE_NAME, cookieOptions, extractCartCookie } from '../cookies'; + +export const server = { + setCartItem: defineAction({ + input: z.object({ + id: z.string(), + quantity: z.number(), + }), + handler: async (input, ctx) => { + const currentCookie = extractCartCookie(ctx.cookies); + + const newCookie = { + ...currentCookie, + [input.id]: { + id: input.id, + quantity: input.quantity, + }, + }; + + ctx.cookies.set(CART_COOKIE_NAME, newCookie, cookieOptions(ctx.url)); + }, + }), +}; diff --git a/examples/request-nanostores/src/cartStore.ts b/examples/request-nanostores/src/cartStore.ts new file mode 100644 index 00000000..1c191089 --- /dev/null +++ b/examples/request-nanostores/src/cartStore.ts @@ -0,0 +1,40 @@ +import { shared } from '@it-astro:request-nanostores'; +import { atom, map, task } from 'nanostores'; +import { actions } from 'astro:actions'; + +export const isCartOpen = shared('isCartOpen', atom(false)); + +export type CartItem = { + id: string; + name: string; + imageSrc: string; + quantity: number; +}; + +export type CartItemDisplayInfo = Pick; + +export const cartItems = shared('cartItems', map>({})); + +export function addCartItem({ id, name, imageSrc }: CartItemDisplayInfo) { + task(async () => { + const existingEntry = cartItems.get()[id]; + const newEntry = existingEntry + ? { + ...existingEntry, + quantity: existingEntry.quantity + 1, + } + : { + id, + name, + imageSrc, + quantity: 1, + }; + + cartItems.setKey(id, newEntry); + + await actions.setCartItem({ + id: newEntry.id, + quantity: newEntry.quantity, + }); + }); +} diff --git a/examples/request-nanostores/src/components/AddToCartForm.tsx b/examples/request-nanostores/src/components/AddToCartForm.tsx new file mode 100644 index 00000000..e0571fc5 --- /dev/null +++ b/examples/request-nanostores/src/components/AddToCartForm.tsx @@ -0,0 +1,18 @@ +import { isCartOpen, addCartItem } from '../cartStore'; +import type { CartItemDisplayInfo } from '../cartStore'; +import type { ComponentChildren } from 'preact'; + +type Props = { + item: CartItemDisplayInfo; + children: ComponentChildren; +}; + +export default function AddToCartForm({ item, children }: Props) { + async function addToCart(e: SubmitEvent) { + e.preventDefault(); + isCartOpen.set(true); + await addCartItem(item); + } + + return
{children}
; +} diff --git a/examples/request-nanostores/src/components/CartFlyout.module.css b/examples/request-nanostores/src/components/CartFlyout.module.css new file mode 100644 index 00000000..cee43dd4 --- /dev/null +++ b/examples/request-nanostores/src/components/CartFlyout.module.css @@ -0,0 +1,29 @@ +.container { + position: fixed; + right: 0; + top: var(--nav-height); + height: 100vh; + background: var(--color-bg-2); + padding-inline: 2rem; + min-width: min(90vw, 300px); + border-left: 3px solid var(--color-bg-3); +} + +.list { + list-style: none; + padding: 0; +} + +.listItem { + display: flex; + gap: 1rem; + align-items: center; +} + +.listItem * { + margin-block: 0.3rem; +} + +.listItemImg { + width: 4rem; +} diff --git a/examples/request-nanostores/src/components/CartFlyout.tsx b/examples/request-nanostores/src/components/CartFlyout.tsx new file mode 100644 index 00000000..98fd8cbf --- /dev/null +++ b/examples/request-nanostores/src/components/CartFlyout.tsx @@ -0,0 +1,28 @@ +import { useStore } from '@nanostores/preact'; +import { cartItems, isCartOpen } from '../cartStore'; +import styles from './CartFlyout.module.css'; + +export default function CartFlyout() { + const $isCartOpen = useStore(isCartOpen); + const $cartItems = useStore(cartItems); + + return ( + + ); +} diff --git a/examples/request-nanostores/src/components/CartFlyoutToggle.tsx b/examples/request-nanostores/src/components/CartFlyoutToggle.tsx new file mode 100644 index 00000000..14ce1c70 --- /dev/null +++ b/examples/request-nanostores/src/components/CartFlyoutToggle.tsx @@ -0,0 +1,7 @@ +import { useStore } from '@nanostores/preact'; +import { isCartOpen } from '../cartStore'; + +export default function CartFlyoutToggle() { + const $isCartOpen = useStore(isCartOpen); + return ; +} diff --git a/examples/request-nanostores/src/components/FigurineDescription.astro b/examples/request-nanostores/src/components/FigurineDescription.astro new file mode 100644 index 00000000..1294b151 --- /dev/null +++ b/examples/request-nanostores/src/components/FigurineDescription.astro @@ -0,0 +1,44 @@ +

Astronaut Figurine

+

Limited Edition

+

+ The limited edition Astronaut Figurine is the perfect gift for any Astro contributor. This + fully-poseable action figurine comes equipped with: +

+ +

+ * Dust not actually from the lunar surface +

+ + diff --git a/examples/request-nanostores/src/cookies.ts b/examples/request-nanostores/src/cookies.ts new file mode 100644 index 00000000..d9485c21 --- /dev/null +++ b/examples/request-nanostores/src/cookies.ts @@ -0,0 +1,28 @@ +import type { AstroCookies, AstroCookieSetOptions } from 'astro'; +import type { CartItem } from './cartStore'; + +type CartCookie = Record>; + +export const CART_COOKIE_NAME = 'cart'; + +export function cookieOptions(url: URL): AstroCookieSetOptions { + return { + path: '/', + domain: url.hostname, + httpOnly: true, + secure: url.protocol === 'https:', + sameSite: 'lax', + maxAge: 3600, + }; +} + +export function extractCartCookie(cookies: AstroCookies): CartCookie { + const cookie = cookies.get(CART_COOKIE_NAME); + if (!cookie) return {}; + + try { + return cookie.json(); + } catch { + return {}; + } +} diff --git a/examples/request-nanostores/src/env.d.ts b/examples/request-nanostores/src/env.d.ts new file mode 100644 index 00000000..e16c13c6 --- /dev/null +++ b/examples/request-nanostores/src/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/request-nanostores/src/layouts/Layout.astro b/examples/request-nanostores/src/layouts/Layout.astro new file mode 100644 index 00000000..86ba11a6 --- /dev/null +++ b/examples/request-nanostores/src/layouts/Layout.astro @@ -0,0 +1,112 @@ +--- +import CartFlyout from '../components/CartFlyout'; +import CartFlyoutToggle from '../components/CartFlyoutToggle'; + +interface Props { + title: string; +} + +const { title } = Astro.props; +--- + + + + + + + + + {title} + + +
+ +
+ + + + + + + + diff --git a/examples/request-nanostores/src/pages/index.astro b/examples/request-nanostores/src/pages/index.astro new file mode 100644 index 00000000..1c006a65 --- /dev/null +++ b/examples/request-nanostores/src/pages/index.astro @@ -0,0 +1,60 @@ +--- +import { cartItems, type CartItemDisplayInfo } from '../cartStore'; +import Layout from '../layouts/Layout.astro'; +import AddToCartForm from '../components/AddToCartForm'; +import FigurineDescription from '../components/FigurineDescription.astro'; +import { extractCartCookie } from '../cookies'; + +const item: CartItemDisplayInfo = { + id: 'astronaut-figurine', + name: 'Astronaut Figurine', + imageSrc: '/images/astronaut-figurine.png', +}; + +const cartCookie = extractCartCookie(Astro.cookies); +const itemQuantity = cartCookie[item.id]?.quantity || 0; + +if (itemQuantity > 0) { + cartItems.setKey(item.id, { + ...item, + quantity: itemQuantity, + }); +} +--- + + +
+
+
+ + + + +
+ {item.name} +
+
+
+ + diff --git a/examples/request-nanostores/tsconfig.json b/examples/request-nanostores/tsconfig.json new file mode 100644 index 00000000..e90c686c --- /dev/null +++ b/examples/request-nanostores/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "preact" + } +} \ No newline at end of file diff --git a/examples/wrangler.toml b/examples/wrangler.toml new file mode 100644 index 00000000..185f7647 --- /dev/null +++ b/examples/wrangler.toml @@ -0,0 +1,3 @@ +pages_build_output_dir = "dist" +compatibility_flags = ["nodejs_als"] +compatibility_date = "2024-08-16" diff --git a/packages/request-state/src/plugin.ts b/packages/request-state/src/plugin.ts index ada421e4..248c27e4 100644 --- a/packages/request-state/src/plugin.ts +++ b/packages/request-state/src/plugin.ts @@ -14,6 +14,14 @@ export const plugin = (): Plugin => { return RESOLVED_MODULE_ID; } }, + config(config) { + if (config.ssr?.external === true) return; + + config.ssr = { + ...config.ssr, + external: [...(config.ssr?.external ?? []), 'node:async_hooks'], + }; + }, load(id, options) { if (id !== RESOLVED_MODULE_ID) return; diff --git a/packages/request-state/src/runtime/middleware.ts b/packages/request-state/src/runtime/middleware.ts index f03da1c9..1856eb2b 100644 --- a/packages/request-state/src/runtime/middleware.ts +++ b/packages/request-state/src/runtime/middleware.ts @@ -1,4 +1,3 @@ -import type { ReadableStream } from 'node:stream/web'; import { defineMiddleware } from 'astro/middleware'; import { collectState } from './serverState.js'; import { parse } from 'content-type'; @@ -14,18 +13,31 @@ export const onRequest = defineMiddleware(async (_, next) => { if (mediaType !== 'text/html' && !mediaType.startsWith('text/html+')) return result; - async function* render() { - for await (const chunk of result.body as ReadableStream) { - yield chunk; - } + const newBody = result.body + ?.pipeThrough(new TextDecoderStream()) + .pipeThrough(injectState(getState)) + .pipeThrough(new TextEncoderStream()); - const state = getState(); - - if (state) { - yield ``; - } - } - - // @ts-expect-error generator not assignable to ReadableStream - return new Response(render(), result); + return new Response(newBody, result); }); + +function injectState(getState: () => string | false) { + let injected = false; + return new TransformStream({ + transform(chunk, controller) { + if (!injected) { + const bodyCloseIndex = chunk.indexOf(''); + if (bodyCloseIndex > -1) { + const state = getState(); + if (state) { + const stateScript = ``; + + chunk = chunk.slice(0, bodyCloseIndex) + stateScript + chunk.slice(bodyCloseIndex); + } + injected = true; + } + } + controller.enqueue(chunk); + }, + }); +} diff --git a/packages/request-state/tsconfig.json b/packages/request-state/tsconfig.json index bfc6df51..d29b8ba9 100644 --- a/packages/request-state/tsconfig.json +++ b/packages/request-state/tsconfig.json @@ -1,4 +1,9 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": "../../tsconfig.base.json" + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "lib": [ + "dom" + ] + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 747f25c3..9b359b63 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -163,7 +163,7 @@ importers: devDependencies: '@astrojs/check': specifier: ^0.9.2 - version: 0.9.2(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) + version: 0.9.3(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) typescript: specifier: ~5.5.4 version: 5.5.4 @@ -172,7 +172,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.2 - version: 0.9.2(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) + version: 0.9.3(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) '@astrojs/node': specifier: ^8.3.3 version: 8.3.3(astro@4.14.2(@types/node@22.4.0)(rollup@4.20.0)(typescript@5.5.4)) @@ -190,7 +190,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.2 - version: 0.9.2(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) + version: 0.9.3(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) '@inox-tools/content-utils': specifier: workspace:^ version: link:../../packages/content-utils @@ -211,7 +211,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.2 - version: 0.9.2(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) + version: 0.9.3(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) '@astrojs/mdx': specifier: ^3.1.3 version: 3.1.3(astro@4.14.2(@types/node@22.4.0)(rollup@4.20.0)(typescript@5.5.4)) @@ -248,7 +248,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.2 - version: 0.9.2(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) + version: 0.9.3(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) '@astrojs/node': specifier: ^8.3.3 version: 8.3.3(astro@4.14.2(@types/node@22.4.0)(rollup@4.20.0)(typescript@5.5.4)) @@ -273,7 +273,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.2 - version: 0.9.2(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) + version: 0.9.3(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) '@astrojs/node': specifier: ^8.3.3 version: 8.3.3(astro@4.14.2(@types/node@22.4.0)(rollup@4.20.0)(typescript@5.5.4)) @@ -294,11 +294,41 @@ importers: specifier: link:../../packages/inline-mod version: link:../../packages/inline-mod + examples/request-nanostores: + dependencies: + '@astrojs/check': + specifier: ^0.9.3 + version: 0.9.3(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) + '@astrojs/node': + specifier: ^8.3.3 + version: 8.3.3(astro@4.14.2(@types/node@22.4.0)(rollup@4.20.0)(typescript@5.5.4)) + '@astrojs/preact': + specifier: ^3.5.1 + version: 3.5.1(@babel/core@7.25.2)(preact@10.23.2)(vite@5.4.1(@types/node@22.4.0)) + '@inox-tools/request-nanostores': + specifier: workspace:^ + version: link:../../packages/request-nanostores + '@nanostores/preact': + specifier: ^0.5.2 + version: 0.5.2(nanostores@0.11.2)(preact@10.23.2) + astro: + specifier: ^4.14.2 + version: 4.14.2(@types/node@22.4.0)(rollup@4.20.0)(typescript@5.5.4) + nanostores: + specifier: ^0.11.2 + version: 0.11.2 + preact: + specifier: ^10.23.1 + version: 10.23.2 + typescript: + specifier: ^5.5.4 + version: 5.5.4 + examples/request-state: dependencies: '@astrojs/check': specifier: ^0.9.2 - version: 0.9.2(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) + version: 0.9.3(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) '@astrojs/node': specifier: ^8.3.3 version: 8.3.3(astro@4.14.2(@types/node@22.4.0)(rollup@4.20.0)(typescript@5.5.4)) @@ -322,7 +352,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.2 - version: 0.9.2(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) + version: 0.9.3(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) '@astrojs/mdx': specifier: ^3.1.3 version: 3.1.3(astro@4.14.2(@types/node@22.4.0)(rollup@4.20.0)(typescript@5.5.4)) @@ -809,8 +839,8 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@astrojs/check@0.9.2': - resolution: {integrity: sha512-6rWxtJTbd/ctdAlmla0CAvloGaai5IUTG0K21kctJHHGKJKnGH6Xana7m0zNOtHpVPEJi1SgC/TcsN+ltYt0Cg==} + '@astrojs/check@0.9.3': + resolution: {integrity: sha512-I6Dz45bMI5YRbp4yK2LKWsHH3/kkHRGdPGruGkLap6pqxhdcNh7oCgN04Ac+haDfc9ow5BYPGPmEhkwef15GQQ==} hasBin: true peerDependencies: typescript: ^5.0.0 @@ -821,8 +851,8 @@ packages: '@astrojs/internal-helpers@0.4.1': resolution: {integrity: sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==} - '@astrojs/language-server@2.14.0': - resolution: {integrity: sha512-vDufoVpQ7xP98F1FdI9TwccglqsRGGzyQ0D6dQV2W23p/Nif7npWStrv00WeY6YQHBFxsygccOzdvzzITaxViw==} + '@astrojs/language-server@2.14.1': + resolution: {integrity: sha512-mkKtCTPRD4dyKdAqIP0zmmPyO/ZABOqFESnaVca47Dg/sAagJnDSEsDUDzNbHFh1+9Dj1o5y4iwNsxJboGdaNg==} hasBin: true peerDependencies: prettier: ^3.0.0 @@ -847,6 +877,12 @@ packages: peerDependencies: astro: ^4.2.0 + '@astrojs/preact@3.5.1': + resolution: {integrity: sha512-sKF0Di7kwr2pMAc0PbEGuNF9AhJdLImQqtbgUUP3x75zaBg6mJsHmVt5jMqYpW4zWBfLuqACTaNLxWwu6u4nzw==} + engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} + peerDependencies: + preact: ^10.6.5 + '@astrojs/prism@3.1.0': resolution: {integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} @@ -871,8 +907,8 @@ packages: resolution: {integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - '@astrojs/yaml2ts@0.2.0': - resolution: {integrity: sha512-xyJ2JpenXis5V2yk4OExNyHXyRlCKrJcPfNPLK0rqf24grqpRZ4bYD/ztesYicYlaXehH9aUJXG0mVu8P02G9A==} + '@astrojs/yaml2ts@0.2.1': + resolution: {integrity: sha512-CBaNwDQJz20E5WxzQh4thLVfhB3JEEGz72wRA+oJp6fQR37QLAqXZJU0mHC+yqMOQ6oj0GfRPJrz6hjf+zm6zA==} '@babel/code-frame@7.24.7': resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} @@ -947,6 +983,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-development@7.24.7': + resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.25.2': resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} engines: {node: '>=6.9.0'} @@ -1528,6 +1570,13 @@ packages: '@mdx-js/mdx@3.0.1': resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + '@nanostores/preact@0.5.2': + resolution: {integrity: sha512-DZ5G0UuHTJ8NNS8I3Jd6f4RCcWIl4siYD+vaV6jQf0T6xJ3QqTSkJkYNQTZK7O+7NC/mzaLkomyLQqD+w1E0Tg==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0 + preact: '>=10.0.0' + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1578,6 +1627,41 @@ packages: '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@preact/preset-vite@2.8.2': + resolution: {integrity: sha512-m3tl+M8IO8jgiHnk+7LSTFl8axdPXloewi7iGVLdmCwf34XOzEUur0bZVewW4DUbUipFjTS2CXu27+5f/oexBA==} + peerDependencies: + '@babel/core': 7.x + vite: 2.x || 3.x || 4.x || 5.x + + '@preact/signals-core@1.8.0': + resolution: {integrity: sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==} + + '@preact/signals@1.3.0': + resolution: {integrity: sha512-EOMeg42SlLS72dhoq6Vjq08havnLseWmPQ8A0YsgIAqMgWgx7V1a39+Pxo6i7SY5NwJtH4849JogFq3M67AzWg==} + peerDependencies: + preact: 10.x + + '@prefresh/babel-plugin@0.5.1': + resolution: {integrity: sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==} + + '@prefresh/core@1.5.2': + resolution: {integrity: sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==} + peerDependencies: + preact: ^10.0.0 + + '@prefresh/utils@1.2.0': + resolution: {integrity: sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==} + + '@prefresh/vite@2.4.6': + resolution: {integrity: sha512-miYbTl2J1YNaQJWyWHJzyIpNh7vKUuXC1qCDRzPeWjhQ+9bxeXkUBGDGd9I1f37R5GQYi1S65AN5oR0BR2WzvQ==} + peerDependencies: + preact: ^10.4.0 + vite: '>=2.0.0' + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + '@rollup/pluginutils@5.1.0': resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} @@ -1822,28 +1906,25 @@ packages: '@vitest/utils@2.0.5': resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} - '@volar/kit@2.4.0-alpha.18': - resolution: {integrity: sha512-dZMSNhesh23lhd61ax2l04IgIcYofAjm8M+5BKAmX47ROweyc8RrrslszCFUJynlmXx6JS1PoHqvo8+E0aAYQQ==} + '@volar/kit@2.4.0': + resolution: {integrity: sha512-uqwtPKhrbnP+3f8hs+ltDYXLZ6Wdbs54IzkaPocasI4aBhqWLht5qXctE1MqpZU52wbH359E0u9nhxEFmyon+w==} peerDependencies: typescript: '*' - '@volar/language-core@2.4.0-alpha.18': - resolution: {integrity: sha512-JAYeJvYQQROmVRtSBIczaPjP3DX4QW1fOqW1Ebs0d3Y3EwSNRglz03dSv0Dm61dzd0Yx3WgTW3hndDnTQqgmyg==} + '@volar/language-core@2.4.0': + resolution: {integrity: sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==} - '@volar/language-server@2.4.0-alpha.18': - resolution: {integrity: sha512-dciHEE/R5kzI0bY71QfkoCVQ3cQI6g9MHfA4oIP6UhnJy0CdleUalWSygOXoD3Nq7Yk6wn2BRrb1PP5MsadY/Q==} + '@volar/language-server@2.4.0': + resolution: {integrity: sha512-rmGIjAxWekWQiGH97Mosb4juiD/hfFYNQKV5Py9r7vDOLSkbIwRhITbwHm88NJKs8P6TNc6w/PfBXN6yjKadJg==} - '@volar/language-service@2.4.0-alpha.18': - resolution: {integrity: sha512-EuetrtbEtudi9buinWAG5U3Jam5dY27zXd/7GYnx542kBwanWOBM8i4DAQd0z7M11fOxXgybxPA933uaSyaOog==} + '@volar/language-service@2.4.0': + resolution: {integrity: sha512-4P3yeQXIL68mLfS3n6P3m02IRg3GnLHUU9k/1PCHEfm5FG9bySkDOc72dbBn2vAa2BxOqm18bmmZXrsWuQ5AOw==} - '@volar/snapshot-document@2.4.0-alpha.18': - resolution: {integrity: sha512-JAeclEly/wnILhR4Pu9MpgBLInZJH49O1zoy8fU+pk5I+zpv7JIEby5z2UFAS60+sIDnxBdAGd7rZ5VibE70vg==} + '@volar/source-map@2.4.0': + resolution: {integrity: sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==} - '@volar/source-map@2.4.0-alpha.18': - resolution: {integrity: sha512-MTeCV9MUwwsH0sNFiZwKtFrrVZUK6p8ioZs3xFzHc2cvDXHWlYN3bChdQtwKX+FY2HG6H3CfAu1pKijolzIQ8g==} - - '@volar/typescript@2.4.0-alpha.18': - resolution: {integrity: sha512-sXh5Y8sqGUkgxpMWUGvRXggxYHAVxg0Pa1C42lQZuPDrW6vHJPR0VCK8Sr7WJsAW530HuNQT/ZIskmXtxjybMQ==} + '@volar/typescript@2.4.0': + resolution: {integrity: sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==} '@vscode/emmet-helper@2.9.3': resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} @@ -1983,6 +2064,11 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-plugin-transform-hook-names@1.0.2: + resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} + peerDependencies: + '@babel/core': ^7.12.10 + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -2240,9 +2326,16 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-selector-parser@3.0.5: resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2347,6 +2440,19 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dot-case@2.1.1: resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} @@ -2722,6 +2828,10 @@ packages: hastscript@9.0.0: resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + header-case@1.0.1: resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} @@ -3042,6 +3152,9 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} @@ -3130,6 +3243,10 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + magicast@0.3.4: resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} @@ -3416,6 +3533,9 @@ packages: encoding: optional: true + node-html-parser@6.1.13: + resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} + node-plop@0.26.3: resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} engines: {node: '>=8.9.4'} @@ -3659,6 +3779,14 @@ packages: resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} engines: {node: ^10 || ^12 || >=14} + preact-render-to-string@6.5.9: + resolution: {integrity: sha512-Fn9R89h6qrQeSRmsH2O2fWzqpVwsJgEL9UTly5nGEV2ldhVuG+9JhXdNJ6zreIkOZcBT20+AOMwlG1x72znJ+g==} + peerDependencies: + preact: '>=10' + + preact@10.23.2: + resolution: {integrity: sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==} + preferred-pm@3.1.4: resolution: {integrity: sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==} engines: {node: '>=10'} @@ -4030,6 +4158,10 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stack-trace@1.0.0-pre2: + resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} + engines: {node: '>=16'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -4488,34 +4620,34 @@ packages: jsdom: optional: true - volar-service-css@0.0.59: - resolution: {integrity: sha512-gLNjJnECbalPvQB7qeJjhkDN8sR5M3ItbVYjnyio61aHaWptIiXm/HfDahcQ2ApwmvWidkMWWegjGq5L0BENDA==} + volar-service-css@0.0.61: + resolution: {integrity: sha512-Ct9L/w+IB1JU8F4jofcNCGoHy6TF83aiapfZq9A0qYYpq+Kk5dH+ONS+rVZSsuhsunq8UvAuF8Gk6B8IFLfniw==} peerDependencies: - '@volar/language-service': ~2.4.0-alpha.12 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-emmet@0.0.59: - resolution: {integrity: sha512-6EynHcuMwMBETpK29TbZvIMmvzdVG+Tkokk9VWfZeI+SwDptk2tgdhEqiXXvIkqYNgbuu73Itp66lpH76cAU+Q==} + volar-service-emmet@0.0.61: + resolution: {integrity: sha512-iiYqBxjjcekqrRruw4COQHZME6EZYWVbkHjHDbULpml3g8HGJHzpAMkj9tXNCPxf36A+f1oUYjsvZt36qPg4cg==} peerDependencies: - '@volar/language-service': ~2.4.0-alpha.12 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-html@0.0.59: - resolution: {integrity: sha512-hEXOsYpILDlITZxnqRLV9OepVWD63GZBsyjMxszwdzlxvGZjzbGcBBinJGGJRwFIV8djdJwnt91bkdg1V5tj6Q==} + volar-service-html@0.0.61: + resolution: {integrity: sha512-yFE+YmmgqIL5HI4ORqP++IYb1QaGcv+xBboI0WkCxJJ/M35HZj7f5rbT3eQ24ECLXFbFCFanckwyWJVz5KmN3Q==} peerDependencies: - '@volar/language-service': ~2.4.0-alpha.12 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-prettier@0.0.59: - resolution: {integrity: sha512-FmBR4lsgFRGR3V0LnxZZal0WqdOJjuLL6mQSj4p57M15APtQwuocG/FiF+ONGFnwRXMOIBDBTCARdth+TKgL3A==} + volar-service-prettier@0.0.61: + resolution: {integrity: sha512-F612nql5I0IS8HxXemCGvOR2Uxd4XooIwqYVUvk7WSBxP/+xu1jYvE3QJ7EVpl8Ty3S4SxPXYiYTsG3bi+gzIQ==} peerDependencies: - '@volar/language-service': ~2.4.0-alpha.12 + '@volar/language-service': ~2.4.0 prettier: ^2.2 || ^3.0 peerDependenciesMeta: '@volar/language-service': @@ -4523,26 +4655,26 @@ packages: prettier: optional: true - volar-service-typescript-twoslash-queries@0.0.59: - resolution: {integrity: sha512-skm8e6yhCIkqLwJB6S9MqT5lO9LNFuMD3dYxKpmOZs1CKbXmCZZTmLfEaD5VkJae1xdleEDZFFTHl2O5HLjOGQ==} + volar-service-typescript-twoslash-queries@0.0.61: + resolution: {integrity: sha512-99FICGrEF0r1E2tV+SvprHPw9Knyg7BdW2fUch0tf59kG+KG+Tj4tL6tUg+cy8f23O/VXlmsWFMIE+bx1dXPnQ==} peerDependencies: - '@volar/language-service': ~2.4.0-alpha.12 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-typescript@0.0.59: - resolution: {integrity: sha512-VCOpfiu+lUo5lapWLB5L5vmQGtwzmNWn5MueV915eku7blpphmE+Z7hCNcL1NApn7AetXWhiblv8ZhmUx/dGIA==} + volar-service-typescript@0.0.61: + resolution: {integrity: sha512-4kRHxVbW7wFBHZWRU6yWxTgiKETBDIJNwmJUAWeP0mHaKpnDGj/astdRFKqGFRYVeEYl45lcUPhdJyrzanjsdQ==} peerDependencies: - '@volar/language-service': ~2.4.0-alpha.12 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-yaml@0.0.59: - resolution: {integrity: sha512-7Pi7XWnmgcWmdW7essscHn2+CcG1BEgnNjEE/31GaycwvLu4rPF+Xztzc0ErZLSFW3F2EBPzaecWfrGL2l4NGQ==} + volar-service-yaml@0.0.61: + resolution: {integrity: sha512-L+gbDiLDQQ1rZUbJ3mf3doDsoQUa8OZM/xdpk/unMg1Vz24Zmi2Ign8GrZyBD7bRoIQDwOH9gdktGDKzRPpUNw==} peerDependencies: - '@volar/language-service': ~2.4.0-alpha.12 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true @@ -4737,9 +4869,9 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@astrojs/check@0.9.2(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4)': + '@astrojs/check@0.9.3(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4)': dependencies: - '@astrojs/language-server': 2.14.0(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) + '@astrojs/language-server': 2.14.1(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4) chokidar: 3.6.0 fast-glob: 3.3.2 kleur: 4.1.5 @@ -4753,25 +4885,25 @@ snapshots: '@astrojs/internal-helpers@0.4.1': {} - '@astrojs/language-server@2.14.0(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4)': + '@astrojs/language-server@2.14.1(prettier-plugin-astro@0.14.1)(prettier@3.3.3)(typescript@5.5.4)': dependencies: '@astrojs/compiler': 2.10.3 - '@astrojs/yaml2ts': 0.2.0 + '@astrojs/yaml2ts': 0.2.1 '@jridgewell/sourcemap-codec': 1.5.0 - '@volar/kit': 2.4.0-alpha.18(typescript@5.5.4) - '@volar/language-core': 2.4.0-alpha.18 - '@volar/language-server': 2.4.0-alpha.18 - '@volar/language-service': 2.4.0-alpha.18 - '@volar/typescript': 2.4.0-alpha.18 + '@volar/kit': 2.4.0(typescript@5.5.4) + '@volar/language-core': 2.4.0 + '@volar/language-server': 2.4.0 + '@volar/language-service': 2.4.0 + '@volar/typescript': 2.4.0 fast-glob: 3.3.2 muggle-string: 0.4.1 - volar-service-css: 0.0.59(@volar/language-service@2.4.0-alpha.18) - volar-service-emmet: 0.0.59(@volar/language-service@2.4.0-alpha.18) - volar-service-html: 0.0.59(@volar/language-service@2.4.0-alpha.18) - volar-service-prettier: 0.0.59(@volar/language-service@2.4.0-alpha.18)(prettier@3.3.3) - volar-service-typescript: 0.0.59(@volar/language-service@2.4.0-alpha.18) - volar-service-typescript-twoslash-queries: 0.0.59(@volar/language-service@2.4.0-alpha.18) - volar-service-yaml: 0.0.59(@volar/language-service@2.4.0-alpha.18) + volar-service-css: 0.0.61(@volar/language-service@2.4.0) + volar-service-emmet: 0.0.61(@volar/language-service@2.4.0) + volar-service-html: 0.0.61(@volar/language-service@2.4.0) + volar-service-prettier: 0.0.61(@volar/language-service@2.4.0)(prettier@3.3.3) + volar-service-typescript: 0.0.61(@volar/language-service@2.4.0) + volar-service-typescript-twoslash-queries: 0.0.61(@volar/language-service@2.4.0) + volar-service-yaml: 0.0.61(@volar/language-service@2.4.0) vscode-html-languageservice: 5.3.0 vscode-uri: 3.0.8 optionalDependencies: @@ -4832,6 +4964,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@astrojs/preact@3.5.1(@babel/core@7.25.2)(preact@10.23.2)(vite@5.4.1(@types/node@22.4.0))': + dependencies: + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.25.2) + '@preact/preset-vite': 2.8.2(@babel/core@7.25.2)(preact@10.23.2)(vite@5.4.1(@types/node@22.4.0)) + '@preact/signals': 1.3.0(preact@10.23.2) + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.25.2) + preact: 10.23.2 + preact-render-to-string: 6.5.9(preact@10.23.2) + transitivePeerDependencies: + - '@babel/core' + - supports-color + - vite + '@astrojs/prism@3.1.0': dependencies: prismjs: 1.29.0 @@ -4913,7 +5059,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/yaml2ts@0.2.0': + '@astrojs/yaml2ts@0.2.1': dependencies: yaml: 2.5.0 @@ -5016,6 +5162,13 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -5619,6 +5772,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@nanostores/preact@0.5.2(nanostores@0.11.2)(preact@10.23.2)': + dependencies: + nanostores: 0.11.2 + preact: 10.23.2 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5655,6 +5813,58 @@ snapshots: '@polka/url@1.0.0-next.25': {} + '@preact/preset-vite@2.8.2(@babel/core@7.25.2)(preact@10.23.2)(vite@5.4.1(@types/node@22.4.0))': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.25.2) + '@prefresh/vite': 2.4.6(preact@10.23.2)(vite@5.4.1(@types/node@22.4.0)) + '@rollup/pluginutils': 4.2.1 + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.25.2) + debug: 4.3.6 + kolorist: 1.8.0 + magic-string: 0.30.5 + node-html-parser: 6.1.13 + resolve: 1.22.8 + source-map: 0.7.4 + stack-trace: 1.0.0-pre2 + vite: 5.4.1(@types/node@22.4.0) + transitivePeerDependencies: + - preact + - supports-color + + '@preact/signals-core@1.8.0': {} + + '@preact/signals@1.3.0(preact@10.23.2)': + dependencies: + '@preact/signals-core': 1.8.0 + preact: 10.23.2 + + '@prefresh/babel-plugin@0.5.1': {} + + '@prefresh/core@1.5.2(preact@10.23.2)': + dependencies: + preact: 10.23.2 + + '@prefresh/utils@1.2.0': {} + + '@prefresh/vite@2.4.6(preact@10.23.2)(vite@5.4.1(@types/node@22.4.0))': + dependencies: + '@babel/core': 7.25.2 + '@prefresh/babel-plugin': 0.5.1 + '@prefresh/core': 1.5.2(preact@10.23.2) + '@prefresh/utils': 1.2.0 + '@rollup/pluginutils': 4.2.1 + preact: 10.23.2 + vite: 5.4.1(@types/node@22.4.0) + transitivePeerDependencies: + - supports-color + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 3.0.1 + '@rollup/pluginutils@5.1.0(rollup@4.20.0)': dependencies: '@types/estree': 1.0.5 @@ -5923,25 +6133,24 @@ snapshots: loupe: 3.1.1 tinyrainbow: 1.2.0 - '@volar/kit@2.4.0-alpha.18(typescript@5.5.4)': + '@volar/kit@2.4.0(typescript@5.5.4)': dependencies: - '@volar/language-service': 2.4.0-alpha.18 - '@volar/typescript': 2.4.0-alpha.18 + '@volar/language-service': 2.4.0 + '@volar/typescript': 2.4.0 typesafe-path: 0.2.2 typescript: 5.5.4 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - '@volar/language-core@2.4.0-alpha.18': + '@volar/language-core@2.4.0': dependencies: - '@volar/source-map': 2.4.0-alpha.18 + '@volar/source-map': 2.4.0 - '@volar/language-server@2.4.0-alpha.18': + '@volar/language-server@2.4.0': dependencies: - '@volar/language-core': 2.4.0-alpha.18 - '@volar/language-service': 2.4.0-alpha.18 - '@volar/snapshot-document': 2.4.0-alpha.18 - '@volar/typescript': 2.4.0-alpha.18 + '@volar/language-core': 2.4.0 + '@volar/language-service': 2.4.0 + '@volar/typescript': 2.4.0 path-browserify: 1.0.1 request-light: 0.7.0 vscode-languageserver: 9.0.1 @@ -5949,23 +6158,18 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - '@volar/language-service@2.4.0-alpha.18': + '@volar/language-service@2.4.0': dependencies: - '@volar/language-core': 2.4.0-alpha.18 + '@volar/language-core': 2.4.0 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - '@volar/snapshot-document@2.4.0-alpha.18': - dependencies: - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.12 + '@volar/source-map@2.4.0': {} - '@volar/source-map@2.4.0-alpha.18': {} - - '@volar/typescript@2.4.0-alpha.18': + '@volar/typescript@2.4.0': dependencies: - '@volar/language-core': 2.4.0-alpha.18 + '@volar/language-core': 2.4.0 path-browserify: 1.0.1 vscode-uri: 3.0.8 @@ -6175,6 +6379,10 @@ snapshots: axobject-query@4.1.0: {} + babel-plugin-transform-hook-names@1.0.2(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -6438,8 +6646,18 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + css-selector-parser@3.0.5: {} + css-what@6.1.0: {} + cssesc@3.0.0: {} data-uri-to-buffer@6.0.2: {} @@ -6517,6 +6735,24 @@ snapshots: dlv@1.1.3: {} + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dot-case@2.1.1: dependencies: no-case: 2.3.2 @@ -7079,6 +7315,8 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 + he@1.2.0: {} + header-case@1.0.1: dependencies: no-case: 2.3.2 @@ -7365,6 +7603,8 @@ snapshots: kleur@4.1.5: {} + kolorist@1.8.0: {} + lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -7469,6 +7709,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.5: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + magicast@0.3.4: dependencies: '@babel/parser': 7.25.3 @@ -8016,6 +8260,11 @@ snapshots: dependencies: whatwg-url: 5.0.0 + node-html-parser@6.1.13: + dependencies: + css-select: 5.1.0 + he: 1.2.0 + node-plop@0.26.3: dependencies: '@babel/runtime-corejs3': 7.25.0 @@ -8282,6 +8531,12 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 + preact-render-to-string@6.5.9(preact@10.23.2): + dependencies: + preact: 10.23.2 + + preact@10.23.2: {} + preferred-pm@3.1.4: dependencies: find-up: 5.0.0 @@ -8781,6 +9036,8 @@ snapshots: sprintf-js@1.1.3: {} + stack-trace@1.0.0-pre2: {} + stackback@0.0.2: {} starlight-links-validator@0.10.1(@astrojs/starlight@0.26.1(astro@4.14.2(@types/node@22.4.0)(rollup@4.20.0)(typescript@5.5.4)))(astro@4.14.2(@types/node@22.4.0)(rollup@4.20.0)(typescript@5.5.4)): @@ -9228,45 +9485,45 @@ snapshots: - supports-color - terser - volar-service-css@0.0.59(@volar/language-service@2.4.0-alpha.18): + volar-service-css@0.0.61(@volar/language-service@2.4.0): dependencies: vscode-css-languageservice: 6.3.0 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0-alpha.18 + '@volar/language-service': 2.4.0 - volar-service-emmet@0.0.59(@volar/language-service@2.4.0-alpha.18): + volar-service-emmet@0.0.61(@volar/language-service@2.4.0): dependencies: '@emmetio/css-parser': 0.4.0 '@emmetio/html-matcher': 1.3.0 '@vscode/emmet-helper': 2.9.3 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0-alpha.18 + '@volar/language-service': 2.4.0 - volar-service-html@0.0.59(@volar/language-service@2.4.0-alpha.18): + volar-service-html@0.0.61(@volar/language-service@2.4.0): dependencies: vscode-html-languageservice: 5.3.0 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0-alpha.18 + '@volar/language-service': 2.4.0 - volar-service-prettier@0.0.59(@volar/language-service@2.4.0-alpha.18)(prettier@3.3.3): + volar-service-prettier@0.0.61(@volar/language-service@2.4.0)(prettier@3.3.3): dependencies: vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0-alpha.18 + '@volar/language-service': 2.4.0 prettier: 3.3.3 - volar-service-typescript-twoslash-queries@0.0.59(@volar/language-service@2.4.0-alpha.18): + volar-service-typescript-twoslash-queries@0.0.61(@volar/language-service@2.4.0): dependencies: vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0-alpha.18 + '@volar/language-service': 2.4.0 - volar-service-typescript@0.0.59(@volar/language-service@2.4.0-alpha.18): + volar-service-typescript@0.0.61(@volar/language-service@2.4.0): dependencies: path-browserify: 1.0.1 semver: 7.6.3 @@ -9275,14 +9532,14 @@ snapshots: vscode-nls: 5.2.0 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0-alpha.18 + '@volar/language-service': 2.4.0 - volar-service-yaml@0.0.59(@volar/language-service@2.4.0-alpha.18): + volar-service-yaml@0.0.61(@volar/language-service@2.4.0): dependencies: vscode-uri: 3.0.8 yaml-language-server: 1.15.0 optionalDependencies: - '@volar/language-service': 2.4.0-alpha.18 + '@volar/language-service': 2.4.0 vscode-css-languageservice@6.3.0: dependencies: