extends Error \n```\n**Extends:** Error\n\n\n\n\nConstructor\n\n\n \n\nModifiers\n\n\n \n\nDescription\n\n\n \n\n\n[(constructor)(status, data)](./router.servererror._constructor_.md)\n\n\n \n\n\n \n\nConstructs a new instance of the `ServerError` class\n\n\n \n
\n\n\n\n\nProperty\n\n\n \n\nModifiers\n\n\n \n\nType\n\n\n \n\nDescription\n\n\n \n\n\n[data](#servererror-data)\n\n\n \n\n\n \n\nT\n\n\n \n\n\n \n\n\n[status](#servererror-status)\n\n\n \n\n\n \n\nnumber\n\n\n \n\n\n \n
",
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-router/src/middleware/request-handler/error-handler.ts",
"mdFile": "router.servererror.md"
},
diff --git a/packages/docs/src/routes/api/qwik-router-middleware-request-handler/index.md b/packages/docs/src/routes/api/qwik-router-middleware-request-handler/index.md
index 7787381d86f..024e1988ce2 100644
--- a/packages/docs/src/routes/api/qwik-router-middleware-request-handler/index.md
+++ b/packages/docs/src/routes/api/qwik-router-middleware-request-handler/index.md
@@ -1216,7 +1216,7 @@ Description
-(statusCode: ErrorCodes, message: string) => ErrorResponse
+<T = any>(statusCode: ErrorCodes, message: T) => [ServerError](#servererror)<T>
@@ -1465,7 +1465,7 @@ export interface ResolveValue
## ServerError
```typescript
-export declare class ServerError> extends Error
+export declare class ServerError extends Error
```
**Extends:** Error
diff --git a/packages/docs/src/routes/api/qwik-router/api.json b/packages/docs/src/routes/api/qwik-router/api.json
index 40cbdd67ecd..7f346335139 100644
--- a/packages/docs/src/routes/api/qwik-router/api.json
+++ b/packages/docs/src/routes/api/qwik-router/api.json
@@ -198,6 +198,20 @@
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-router/src/runtime/src/types.ts",
"mdFile": "router.documentstyle.md"
},
+ {
+ "name": "ErrorBoundary",
+ "id": "errorboundary",
+ "hierarchy": [
+ {
+ "name": "ErrorBoundary",
+ "id": "errorboundary"
+ }
+ ],
+ "kind": "Variable",
+ "content": "```typescript\nErrorBoundary: import(\"@qwik.dev/core\").Component\n```",
+ "editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-router/src/runtime/src/error-boundary.tsx",
+ "mdFile": "router.errorboundary.md"
+ },
{
"name": "FailOfRest",
"id": "failofrest",
@@ -423,18 +437,18 @@
"mdFile": "router.menudata.md"
},
{
- "name": "NavigationType",
- "id": "navigationtype",
+ "name": "NavigationType_2",
+ "id": "navigationtype_2",
"hierarchy": [
{
- "name": "NavigationType",
- "id": "navigationtype"
+ "name": "NavigationType_2",
+ "id": "navigationtype_2"
}
],
"kind": "TypeAlias",
"content": "```typescript\nexport type NavigationType = 'initial' | 'form' | 'link' | 'popstate';\n```",
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-router/src/runtime/src/types.ts",
- "mdFile": "router.navigationtype.md"
+ "mdFile": "router.navigationtype_2.md"
},
{
"name": "omitProps",
@@ -740,7 +754,7 @@
}
],
"kind": "TypeAlias",
- "content": "```typescript\nexport type RouteNavigate = QRL<(path?: string | number | URL, options?: {\n type?: Exclude;\n forceReload?: boolean;\n replaceState?: boolean;\n scroll?: boolean;\n} | boolean) => Promise>;\n```\n**References:** [NavigationType](#navigationtype)",
+ "content": "```typescript\nexport type RouteNavigate = QRL<(path?: string | number | URL, options?: {\n type?: Exclude;\n forceReload?: boolean;\n replaceState?: boolean;\n scroll?: boolean;\n} | boolean) => Promise>;\n```\n**References:** [NavigationType](#navigationtype_2)",
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik-router/src/runtime/src/types.ts",
"mdFile": "router.routenavigate.md"
},
diff --git a/packages/docs/src/routes/api/qwik-router/index.md b/packages/docs/src/routes/api/qwik-router/index.md
index 5b5b538345a..894817daed1 100644
--- a/packages/docs/src/routes/api/qwik-router/index.md
+++ b/packages/docs/src/routes/api/qwik-router/index.md
@@ -1132,6 +1132,14 @@ string
[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-router/src/runtime/src/types.ts)
+## ErrorBoundary
+
+```typescript
+ErrorBoundary: import("@qwik.dev/core").Component;
+```
+
+[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-router/src/runtime/src/error-boundary.tsx)
+
## FailOfRest
```typescript
@@ -1593,7 +1601,7 @@ export type MenuData = [pathname: string, menuLoader: MenuModuleLoader];
[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-router/src/runtime/src/types.ts)
-## NavigationType
+## NavigationType_2
```typescript
export type NavigationType = "initial" | "form" | "link" | "popstate";
@@ -2262,7 +2270,7 @@ export type RouteNavigate = QRL<
>;
```
-**References:** [NavigationType](#navigationtype)
+**References:** [NavigationType](#navigationtype_2)
[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik-router/src/runtime/src/types.ts)
diff --git a/packages/docs/src/routes/api/qwik/api.json b/packages/docs/src/routes/api/qwik/api.json
index ed4d5b195d3..d860c702f7b 100644
--- a/packages/docs/src/routes/api/qwik/api.json
+++ b/packages/docs/src/routes/api/qwik/api.json
@@ -2158,7 +2158,7 @@
}
],
"kind": "Function",
- "content": "```typescript\nuseErrorBoundary: () => Readonly\n```\n**Returns:**\n\nReadonly<[ErrorBoundaryStore](#errorboundarystore)>",
+ "content": "```typescript\nuseErrorBoundary: () => ErrorBoundaryStore\n```\n**Returns:**\n\n[ErrorBoundaryStore](#errorboundarystore)",
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/use/use-error-boundary.ts",
"mdFile": "core.useerrorboundary.md"
},
@@ -2368,7 +2368,7 @@
}
],
"kind": "Function",
- "content": "Reruns the `taskFn` when the observed inputs change.\n\nUse `useTask` to observe changes on a set of inputs, and then re-execute the `taskFn` when those inputs change.\n\nThe `taskFn` only executes if the observed inputs change. To observe the inputs, use the `obs` function to wrap property reads. This creates subscriptions that will trigger the `taskFn` to rerun.\n\n\n```typescript\nuseTask$: (qrl: import(\"./use-task\").TaskFn) => void\n```\n\n\n\n\nParameter\n\n\n \n\nType\n\n\n \n\nDescription\n\n\n \n\n\nqrl\n\n\n \n\nimport(\"./use-task\").[TaskFn](#taskfn)\n\n\n \n\n\n \n
\n**Returns:**\n\nvoid",
+ "content": "Reruns the `taskFn` when the observed inputs change.\n\nUse `useTask` to observe changes on a set of inputs, and then re-execute the `taskFn` when those inputs change.\n\nThe `taskFn` only executes if the observed inputs change. To observe the inputs, use the `obs` function to wrap property reads. This creates subscriptions that will trigger the `taskFn` to rerun.\n\n\n```typescript\nuseTask$: (fn: TaskFn) => void\n```\n\n\n\n\nParameter\n\n\n \n\nType\n\n\n \n\nDescription\n\n\n \n\n\nfn\n\n\n \n\n[TaskFn](#taskfn)\n\n\n \n\n\n \n
\n**Returns:**\n\nvoid",
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/use/use-task-dollar.ts",
"mdFile": "core.usetask_.md"
},
@@ -2382,7 +2382,7 @@
}
],
"kind": "Function",
- "content": "```tsx\nconst Timer = component$(() => {\n const store = useStore({\n count: 0,\n });\n\n useVisibleTask$(() => {\n // Only runs in the client\n const timer = setInterval(() => {\n store.count++;\n }, 500);\n return () => {\n clearInterval(timer);\n };\n });\n\n return {store.count}
;\n});\n```\n\n\n```typescript\nuseVisibleTask$: (qrl: import(\"./use-task\").TaskFn, opts?: import(\"./use-visible-task\").OnVisibleTaskOptions | undefined) => void\n```\n\n\n\n\nParameter\n\n\n \n\nType\n\n\n \n\nDescription\n\n\n \n\n\nqrl\n\n\n \n\nimport(\"./use-task\").[TaskFn](#taskfn)\n\n\n \n\n\n \n\n\nopts\n\n\n \n\nimport(\"./use-visible-task\").[OnVisibleTaskOptions](#onvisibletaskoptions) \\| undefined\n\n\n \n\n_(Optional)_\n\n\n \n
\n**Returns:**\n\nvoid",
+ "content": "```tsx\nconst Timer = component$(() => {\n const store = useStore({\n count: 0,\n });\n\n useVisibleTask$(() => {\n // Only runs in the client\n const timer = setInterval(() => {\n store.count++;\n }, 500);\n return () => {\n clearInterval(timer);\n };\n });\n\n return {store.count}
;\n});\n```\n\n\n```typescript\nuseVisibleTask$: (fn: TaskFn, opts?: OnVisibleTaskOptions) => void\n```\n\n\n\n\nParameter\n\n\n \n\nType\n\n\n \n\nDescription\n\n\n \n\n\nfn\n\n\n \n\n[TaskFn](#taskfn)\n\n\n \n\n\n \n\n\nopts\n\n\n \n\n[OnVisibleTaskOptions](#onvisibletaskoptions)\n\n\n \n\n_(Optional)_\n\n\n \n
\n**Returns:**\n\nvoid",
"editUrl": "https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/use/use-visible-task-dollar.ts",
"mdFile": "core.usevisibletask_.md"
},
diff --git a/packages/docs/src/routes/api/qwik/index.md b/packages/docs/src/routes/api/qwik/index.md
index e2c3ffefd8e..bccd7d4dd10 100644
--- a/packages/docs/src/routes/api/qwik/index.md
+++ b/packages/docs/src/routes/api/qwik/index.md
@@ -8642,12 +8642,12 @@ void
## useErrorBoundary
```typescript
-useErrorBoundary: () => Readonly;
+useErrorBoundary: () => ErrorBoundaryStore;
```
**Returns:**
-Readonly<[ErrorBoundaryStore](#errorboundarystore)>
+[ErrorBoundaryStore](#errorboundarystore)
[Edit this section](https://github.com/QwikDev/qwik/tree/main/packages/qwik/src/core/use/use-error-boundary.ts)
@@ -9333,7 +9333,7 @@ Use `useTask` to observe changes on a set of inputs, and then re-execute the `ta
The `taskFn` only executes if the observed inputs change. To observe the inputs, use the `obs` function to wrap property reads. This creates subscriptions that will trigger the `taskFn` to rerun.
```typescript
-useTask$: (qrl: import("./use-task").TaskFn) => void
+useTask$: (fn: TaskFn) => void
```
@@ -9351,11 +9351,11 @@ Description
-qrl
+fn
-import("./use-task").[TaskFn](#taskfn)
+[TaskFn](#taskfn)
@@ -9390,7 +9390,7 @@ const Timer = component$(() => {
```
```typescript
-useVisibleTask$: (qrl: import("./use-task").TaskFn, opts?: import("./use-visible-task").OnVisibleTaskOptions | undefined) => void
+useVisibleTask$: (fn: TaskFn, opts?: OnVisibleTaskOptions) => void
```
@@ -9408,11 +9408,11 @@ Description
-qrl
+fn
-import("./use-task").[TaskFn](#taskfn)
+[TaskFn](#taskfn)
@@ -9423,7 +9423,7 @@ opts
-import("./use-visible-task").[OnVisibleTaskOptions](#onvisibletaskoptions) \| undefined
+[OnVisibleTaskOptions](#onvisibletaskoptions)
diff --git a/packages/docs/src/routes/demo/cookbook/drag&drop/advanced/index.tsx b/packages/docs/src/routes/demo/cookbook/drag&drop/advanced/index.tsx
index b0c1b02311f..f621ccf6b25 100644
--- a/packages/docs/src/routes/demo/cookbook/drag&drop/advanced/index.tsx
+++ b/packages/docs/src/routes/demo/cookbook/drag&drop/advanced/index.tsx
@@ -1,4 +1,4 @@
-import { component$, sync$, useSignal, $ } from '@builder.io/qwik';
+import { component$, sync$, useSignal, $ } from '@qwik.dev/core';
type Item = {
id: number;
diff --git a/packages/docs/src/routes/demo/cookbook/drag&drop/basic/index.tsx b/packages/docs/src/routes/demo/cookbook/drag&drop/basic/index.tsx
index ba1a1d470a3..91f058b4e40 100644
--- a/packages/docs/src/routes/demo/cookbook/drag&drop/basic/index.tsx
+++ b/packages/docs/src/routes/demo/cookbook/drag&drop/basic/index.tsx
@@ -1,4 +1,4 @@
-import { component$, sync$, useSignal, $ } from '@builder.io/qwik';
+import { component$, sync$, useSignal, $ } from '@qwik.dev/core';
export default component$(() => {
const items1 = useSignal([
diff --git a/packages/docs/src/routes/docs/(qwikcity)/error-handling/index.mdx b/packages/docs/src/routes/docs/(qwikcity)/error-handling/index.mdx
new file mode 100644
index 00000000000..ab59ecc056c
--- /dev/null
+++ b/packages/docs/src/routes/docs/(qwikcity)/error-handling/index.mdx
@@ -0,0 +1,112 @@
+---
+title: Error handling | Qwik Router
+contributors:
+ - DustinJSilk
+updated_at: '2025-01-11T18:00:00Z'
+created_at: '2025-01-11T18:00:00Z'
+---
+
+# Error handling
+
+When an error is thrown in a loader or `server$` function, a 500 error is returned to the client along with the error. This is useful during development but isn't always desirable for production systems. Qwik provides the tools necessary to customise how errors are handled.
+
+Throwing a `ServerError` instance allows you to return custom errors to the browser with a different status code and serialised data.
+
+> Loaders also provide a helper function on the event object to easily create new ServerErrors.
+
+```tsx
+// Throw ServerErrors from a routerLoader$
+const useProduct = routeLoader$(async (ev) => {
+ const product = await fetch('api/product/1')
+
+ if (!product) {
+ // Throw a 404 with a custom payload
+ throw new ServerError(404, 'Product not found')
+
+ // Or use the existing helper function
+ throw ev.error(404, 'Product not found')
+ }
+
+ return product
+})
+
+// Throw ServerErrors from a server$
+const getPrices = server$(() => {
+ if (!isAuthenticated()) {
+ throw new ServerError(401, { code: 401 })
+ }
+
+ return fetch('api/product/1/prices')
+})
+
+export default component$(() => {
+ const product = useProduct()
+
+ useVisibleTask(() => {
+ getPrices()
+ .then()
+ .catch(err => {
+ // The payload from a ServerError is deserialised as the error caught in the client
+ if (err.code === 401) {
+ // Navigate to login page
+ }
+
+ // Show generic error
+ })
+ })
+
+ return Product page
+})
+```
+
+## Error interceptor
+
+Intercepting errors with middleware has a few usecases: you might want to hide error details in production systems, add structured error logging, or map the error status codes from RPC API calls to HTTP status codes. This is all achieveable with middleware in a `plugin` file.
+
+```tsx
+// src/routes/plugin@errors.ts
+import { type RequestHandler } from '@qwik.dev/router'
+import { RedirectMessage } from '@qwik.dev/router/middleware/request-handler'
+import { isDev } from '@qwik.dev/core/build'
+
+export const onRequest: RequestHandler = async ({ next }) => {
+ try {
+ return await next();
+ } catch (err) {
+ // Pass through 3xx redirects
+ if (isRedirectMessage(err)) {
+ throw err
+ }
+
+ // Pass through ServerErrors
+ if (isServerError(err)) {
+ throw err
+ }
+
+ // Log unknown errors
+ console.error('unknown error', err)
+
+ if (isDev) {
+ throw err
+ } else {
+ throw new ServerError(500, 'Internal server error');
+ }
+ }
+};
+
+function isServerError(err: unknown): err is ServerError {
+ return (
+ err instanceof ServerError ||
+ // This is required for dev environments due to an issue with vite: https://github.com/vitejs/vite/issues/3910
+ (isDev && err instanceof Error && err.constructor.name === "ServerError")
+ );
+}
+
+function isRedirectMessage(err: unknown): err is RedirectMessage {
+ return (
+ err instanceof RedirectMessage ||
+ // This is required for dev environments due to an issue with vite: https://github.com/vitejs/vite/issues/3910
+ (isDev && err instanceof Error && err.constructor.name === "RedirectMessage")
+ );
+}
+```
diff --git a/packages/docs/src/routes/docs/(qwikcity)/guides/capacitor/index.mdx b/packages/docs/src/routes/docs/(qwikcity)/guides/capacitor/index.mdx
index ff06082050b..7802ff4ea6d 100644
--- a/packages/docs/src/routes/docs/(qwikcity)/guides/capacitor/index.mdx
+++ b/packages/docs/src/routes/docs/(qwikcity)/guides/capacitor/index.mdx
@@ -215,7 +215,7 @@ plugins: {
3. Update your Qwik component `index.tsx` to use the Device plugin:
```tsx
-import { component$, useSignal, useVisibleTask$ } from '@builder.io/qwik';
+import { component$, useSignal, useVisibleTask$ } from '@qwik.dev/core';
import { Device } from '@capacitor/device';
export const DeviceInfoComponent = component$(() => {
@@ -284,8 +284,8 @@ import {
useComputed$,
useSignal,
useVisibleTask$,
-} from "@builder.io/qwik";
-import type { DocumentHead } from "@builder.io/qwik-city";
+} from "@qwik.dev/core";
+import type { DocumentHead } from "@qwik.dev/router";
import { LiveUpdate } from "@capawesome/capacitor-live-update";
const VERSION = "1.0.0";
diff --git a/packages/docs/src/routes/docs/(qwikrouter)/action/index.mdx b/packages/docs/src/routes/docs/(qwikrouter)/action/index.mdx
index dc62ca34f63..818e248c980 100644
--- a/packages/docs/src/routes/docs/(qwikrouter)/action/index.mdx
+++ b/packages/docs/src/routes/docs/(qwikrouter)/action/index.mdx
@@ -154,8 +154,8 @@ But when using actions programmatically, you can still upload files by passing a
```tsx title="src/routes/index.tsx"
-import { component$ } from '@builder.io/qwik';
-import { routeAction$ } from '@builder.io/qwik-city';
+import { component$ } from '@qwik.dev/core';
+import { routeAction$ } from '@qwik.dev/router';
export const useUploadFile = routeAction$(async ({file}) => {
// save the file somewhere...
diff --git a/packages/docs/src/routes/docs/(qwikrouter)/advanced/request-handling/index.mdx b/packages/docs/src/routes/docs/(qwikrouter)/advanced/request-handling/index.mdx
index dd645496e75..f708c5af292 100644
--- a/packages/docs/src/routes/docs/(qwikrouter)/advanced/request-handling/index.mdx
+++ b/packages/docs/src/routes/docs/(qwikrouter)/advanced/request-handling/index.mdx
@@ -17,7 +17,7 @@ created_at: '2023-03-20T23:45:13Z'
Each `layout.ts` and `index.ts` file inside the `src/routes` directory has the ability to access the current HTTP request, response, and URL. This allows you to retrieve and modify data, and even respond with custom content.
-Qwik Router implements a middleware system based on the hirarchy of the `src/routes` directory. The middleware system is used to handle HTTP requests and responses and is available to pages, layouts, and [endpoints](/docs/(qwikrouter)/endpoints/index.mdx).
+Qwik Router implements a middleware system based on the hierarchy of the `src/routes` directory. The middleware system is used to handle HTTP requests and responses and is available to pages, layouts, and [endpoints](/docs/(qwikrouter)/endpoints/index.mdx).
Each route can add HTTP request and response handlers, allowing developers to retrieve and modify data. The handlers can also be used by [endpoints](/docs/(qwikrouter)/endpoints/index.mdx), which only respond with data rather than a page's HTML.
@@ -109,7 +109,7 @@ export interface CookieOptions {
For more information on these attributes and their values, please refer to [the MDN article on the Set-Cookie header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes).
**delete**
-Appends a header with the provided key to the cookie. The new header will have an expired date in the `expires` field, telling the browers to remove it.
+Appends a header with the provided key to the cookie. The new header will have an expired date in the `expires` field, telling the browsers to remove it.
```tsx
cookie.delete('my-cookie');
diff --git a/packages/docs/src/routes/docs/(qwikrouter)/route-loader/index.mdx b/packages/docs/src/routes/docs/(qwikrouter)/route-loader/index.mdx
index 015a49ab64f..49cfd67de83 100644
--- a/packages/docs/src/routes/docs/(qwikrouter)/route-loader/index.mdx
+++ b/packages/docs/src/routes/docs/(qwikrouter)/route-loader/index.mdx
@@ -22,7 +22,7 @@ created_at: '2023-03-20T23:45:13Z'
Route Loaders load data in the server so it becomes available to use inside Qwik Components. They trigger when SPA/MPA navigation happens so they can be invoked by Qwik Components during rendering.
-Please note that route loaders should be exported only from `layout.tsx` or `index.tsx` files. But they can be declared in any valid way ES modules allow. To reuse a route loader across multiple `layout.tsx` or `index.tsx files, define it in a separate file, export it, then import it in `layout.tsx` or `index.tsx files and [`re-export`](/docs/(qwikcity)/re-exporting-loaders/index.mdx) it as a named export.
+Please note that route loaders should be exported only from `layout.tsx` or `index.tsx` files. But they can be declared in any valid way ES modules allow. To reuse a route loader across multiple `layout.tsx` or `index.tsx files, define it in a separate file, export it, then import it in `layout.tsx` or `index.tsx files and [`re-export`](/docs/(qwikrouter)/re-exporting-loaders/index.mdx) it as a named export.
> If you want to manage common reusable routeLoaders$ it is essential that this function is re-exported from within 'layout.tsx' or 'index.tsx file of the existing route otherwise it will not run or throw exception. For more information [check this section](/docs/(qwikrouter)/re-exporting-loaders/index.mdx).
diff --git a/packages/docs/src/routes/docs/cookbook/drag&drop/index.mdx b/packages/docs/src/routes/docs/cookbook/drag&drop/index.mdx
index 5e461f0a6b4..720cdfbd8e8 100644
--- a/packages/docs/src/routes/docs/cookbook/drag&drop/index.mdx
+++ b/packages/docs/src/routes/docs/cookbook/drag&drop/index.mdx
@@ -23,7 +23,7 @@ you can use the `preventdefault:dragover` and `preventdefault:drop` attributes.
```tsx
-import { component$, useSignal, sync$, $ } from '@builder.io/qwik';
+import { component$, useSignal, sync$, $ } from '@qwik.dev/core';
export default component$(() => {
const items1 = useSignal([
@@ -155,7 +155,7 @@ export default component$(() => {
```tsx
-import { component$, sync$, useSignal, $ } from '@builder.io/qwik';
+import { component$, sync$, useSignal, $ } from '@qwik.dev/core';
type Item = {
id: number;
@@ -355,4 +355,4 @@ function insertElement(arr: Item[], index: number, item: Item) {
-You can find more information about drag-and-drop in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API).
\ No newline at end of file
+You can find more information about drag-and-drop in the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API).
diff --git a/packages/docs/src/routes/docs/cookbook/index.mdx b/packages/docs/src/routes/docs/cookbook/index.mdx
index bee807e0782..2166b350fc3 100644
--- a/packages/docs/src/routes/docs/cookbook/index.mdx
+++ b/packages/docs/src/routes/docs/cookbook/index.mdx
@@ -32,3 +32,4 @@ Examples:
- [Synchronous Events with State](./sync-events/)
- [Theme Management](./theme-management/)
- [Drag & Drop](./drag&drop/)
+- [View Transition](./view-transition/)
\ No newline at end of file
diff --git a/packages/docs/src/routes/docs/cookbook/view-transition/index.mdx b/packages/docs/src/routes/docs/cookbook/view-transition/index.mdx
new file mode 100644
index 00000000000..d0170bb0238
--- /dev/null
+++ b/packages/docs/src/routes/docs/cookbook/view-transition/index.mdx
@@ -0,0 +1,130 @@
+---
+title: Cookbook | View Transition API
+contributors:
+ - GrandSchtroumpf
+---
+
+# View Transition API
+By default Qwik will start a view transition when SPA navigation. We can run animation either with CSS or WAAPI.
+
+## CSS
+```tsx
+export default component$(({ list }) => {
+ return (
+
+ {list.map((item) => (
+ // Create a name per item
+ ...
+ ))}
+
+ )
+})
+```
+
+```css
+.item {
+ /* Alias to target all .item with a view-transition-name */
+ view-transition-class: animated-item;
+}
+/* Animate when item didn't exist in the previous page */
+::view-transition-new(.animated-item):only-child {
+ animation: fade-in 200ms;
+}
+/* Animate when item doesn't exist in the next page */
+::view-transition-old(.animated-item):only-child {
+ animation: fade-out 200ms;
+}
+```
+
+Sometime we need to have some specific logic before the animation start. In this case you can listen to the `qviewTransition` event.
+
+For example if you want to only animate visible element:
+```tsx
+export default component$(() => {
+ // In this case we need the callback to be sync, else the transition might have already happened
+ useOnDocument('qviewTransition', sync$((event: CustomEvent) => {
+ const transition = event.detail;
+ const items = document.querySelectorAll('.item');
+ for (const item of items) {
+ if (!item.checkVisibility()) continue;
+ item.dataset.hasViewTransition = true;
+ }
+ }))
+ return (
+
+ {list.map((item) => (
+ // Create a name per item
+ ...
+ ))}
+
+ )
+})
+```
+
+```css
+.item[data-has-view-transition="true"] {
+ view-transition-class: animated-item;
+}
+::view-transition-new(.animated-item):only-child {
+ animation: fade-in 200ms;
+}
+::view-transition-old(.animated-item):only-child {
+ animation: fade-out 200ms;
+}
+```
+
+> **Note**: `ViewTransition` interface is available with Typescript >5.6.
+
+## WAAPI
+With Web Animation API you can get more precise, but for that we need to wait for the ::view-transition pseudo-element to exist in the DOM. To achieve that you can wait the `transition.ready` promise.
+
+In this example we add some delay for each item :
+```tsx
+export default component$(() => {
+ // Remove default style on the pseudo-element.
+ useStyles$(`
+ li {
+ view-transition-class: items;
+ }
+ ::view-transition-old(.items) {
+ animation: none;
+ }
+ `);
+ useOnDocument('qviewTransition', $(async (event: CustomEvent) => {
+ // Get visible item's viewTransitionName (should happen before transition is ready)
+ const items = document.querySelectorAll('.item');
+ const names = Array.from(items)
+ .filter((item) => item.checkVisibility())
+ .map((item) => item.style.viewTransitionName);
+
+ // Wait for ::view-transition pseudo-element to exist
+ const transition = event.detail;
+ await transition.ready;
+
+ // Animate each leaving item
+ for (let i = 0; i < names.length; i++) {
+ // Note: we animate the element
+ document.documentElement.animate({
+ opacity: 0,
+ transform: 'scale(0.9)'
+ }, {
+ // Target the pseudo-element inside the element
+ pseudoElement: `::view-transition-old(${names[i]})`,
+ duration: 200,
+ fill: "forwards",
+ delay: i * 50, // Add delay for each pseudo-element
+ })
+ }
+ }))
+ return (
+
+ {list.map((item) => (
+ // Create a name per item
+ ...
+ ))}
+
+ )
+})
+```
+
+> **Note**: For it to work correctly, we need to **remove the default view transition** animation else it happens on top of the `.animate()`. I'm using `view-transition-class` which is only working with Chrome right now.
diff --git a/packages/docs/src/routes/docs/docs.css b/packages/docs/src/routes/docs/docs.css
index a64a7c48d81..cc170b2148c 100644
--- a/packages/docs/src/routes/docs/docs.css
+++ b/packages/docs/src/routes/docs/docs.css
@@ -185,29 +185,25 @@ h6 a:hover .icon {
font-weight: 800;
}
-[data-rehype-pretty-code-fragment] {
- overflow: auto;
- color: white;
- background-color: rgb(1 31 51);
- border-radius: 8px;
- margin: 20px 0;
+.highlighted-word {
+ background: #4199d3;
+ color: #111 !important;
}
-[data-rehype-pretty-code-fragment] pre {
- overflow: auto;
- border-radius: 8px;
- max-height: var(--pretty-code-fragment-max-height);
+.highlighted {
+ background-color: #7b8d9f33 !important;
}
-[data-rehype-pretty-code-title] {
- padding: 5px 15px;
+.shiki-title {
background: #4199d3;
- font-family: monospace;
- font-weight: bold;
+ color: #111;
+ display: block;
+ padding: 0.5rem;
+ border-radius: 8px 8px 0px 0px;
}
-[data-highlighted-chars] {
- background: #ac7ef4;
+pre {
+ border-radius: 8px;
}
.docs article pre {
diff --git a/packages/docs/src/routes/docs/integrations/tailwind-v3/index.mdx b/packages/docs/src/routes/docs/integrations/tailwind-v3/index.mdx
new file mode 100644
index 00000000000..a6c44506161
--- /dev/null
+++ b/packages/docs/src/routes/docs/integrations/tailwind-v3/index.mdx
@@ -0,0 +1,71 @@
+---
+title: Tailwind | Integrations
+keywords: 'styles, styling'
+contributors:
+ - manucorporat
+ - leifermendez
+ - reemardelarosa
+ - mhevery
+ - nickclark
+ - igorbabko
+ - Benny-Nottonson
+ - mrhoodz
+ - NickClark
+ - adamdbradley
+ - sreeisalso
+ - maiieul
+updated_at: '2025-03-08T18:53:23Z'
+created_at: '2023-04-06T21:28:28Z'
+---
+
+import PackageManagerTabs from '~/components/package-manager-tabs/index.tsx';
+
+# Tailwind
+Tailwind is a CSS framework that provides us with single-purpose utility classes which are
+opinionated for the most part, and which help us design our web pages from right inside our
+markup or `.js/.jsx/.ts/.tsx/.mdx` files. [Tailwindcss Website](https://tailwindcss.com/)
+## Usage
+You can add Tailwind easily by using the following Qwik starter script:
+
+
+```shell
+pnpm run qwik add tailwind-v3
+```
+
+
+```shell
+npm run qwik add tailwind-v3
+```
+
+
+```shell
+yarn run qwik add tailwind-v3
+```
+
+
+```shell
+bun run qwik add tailwind-v3
+```
+
+
+
+The previous command updates your app with the necessary dependencies.
+
+It also adds new files to your project folder:
+
+- `postcss.config.js`
+- `tailwind.config.js`
+- `.vscode/settings.json`
+
+and modifies your `src/global.css` to include
+
+```css title="src/global.css"
+
+# global.css file
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+...stuff...
+```
\ No newline at end of file
diff --git a/packages/docs/src/routes/docs/integrations/tailwind/index.mdx b/packages/docs/src/routes/docs/integrations/tailwind/index.mdx
index a5a44f90779..cdca6172e94 100644
--- a/packages/docs/src/routes/docs/integrations/tailwind/index.mdx
+++ b/packages/docs/src/routes/docs/integrations/tailwind/index.mdx
@@ -13,7 +13,8 @@ contributors:
- NickClark
- adamdbradley
- sreeisalso
-updated_at: '2025-01-24T18:53:23Z'
+ - maiieul
+updated_at: '2025-03-08T18:53:23Z'
created_at: '2023-04-06T21:28:28Z'
---
@@ -25,9 +26,11 @@ Tailwind is a CSS framework that provides us with single-purpose utility classes
opinionated for the most part, and which help us design our web pages from right inside our
markup or `.js/.jsx/.ts/.tsx/.mdx` files. [Tailwindcss Website](https://tailwindcss.com/)
+> This page contains updated instructions for tailwind v4. If you need to use tailwind v3, you can find the relevant documentation [here](/docs/integrations/tailwind-v3).
+
## Usage
-You can add Tailwind easily by using the following Qwik starter script:
+You can add Tailwind v4 easily by using the following Qwik starter script:
@@ -53,7 +56,7 @@ bun run qwik add tailwind
The previous command updates your app with the necessary dependencies,
-and modifies following files
+and modifies the following files
```css title="src/global.css"
diff --git a/packages/docs/src/routes/docs/menu.md b/packages/docs/src/routes/docs/menu.md
index 630dbe2c06a..cf6be73d4a0 100644
--- a/packages/docs/src/routes/docs/menu.md
+++ b/packages/docs/src/routes/docs/menu.md
@@ -31,6 +31,7 @@
- [Endpoints]()
- [Middleware]()
- [server$]()
+- [Error handling]()
- [Re-exporting loaders](/docs/(qwikrouter)/re-exporting-loaders/index.mdx)
- [Caching]()
- [HTML attributes]()
@@ -52,6 +53,7 @@
- [Sync events w state](/docs/cookbook/sync-events/index.mdx)
- [Theme Management](/docs/cookbook/theme-management/index.mdx)
- [Drag & Drop](/docs/cookbook/drag&drop/index.mdx)
+- [View Transition](/docs/cookbook/view-transition/index.mdx)
## Integrations
diff --git a/packages/docs/vite.config.ts b/packages/docs/vite.config.ts
index 4c83e4669e1..d38d860cb52 100644
--- a/packages/docs/vite.config.ts
+++ b/packages/docs/vite.config.ts
@@ -8,6 +8,10 @@ import { defineConfig, loadEnv, type Plugin } from 'vite';
import Inspect from 'vite-plugin-inspect';
import { examplesData, playgroundData, rawSource, tutorialData } from './vite.repl-apps';
import { sourceResolver } from './vite.source-resolver';
+import shikiRehype from '@shikijs/rehype';
+import { transformerMetaHighlight, transformerMetaWordHighlight } from '@shikijs/transformers';
+import { transformerColorizedBrackets } from '@shikijs/colorized-brackets';
+import type { ShikiTransformer } from '@shikijs/types';
const PUBLIC_QWIK_INSIGHTS_KEY = loadEnv('', '.', 'PUBLIC').PUBLIC_QWIK_INSIGHTS_KEY;
const docsDir = new URL(import.meta.url).pathname;
@@ -52,9 +56,45 @@ const muteWarningsPlugin = (warningsToIgnore: string[][]): Plugin => {
};
};
-export default defineConfig(async () => {
- const { default: rehypePrettyCode } = await import('rehype-pretty-code');
+function transformerShowEmptyLines(): ShikiTransformer {
+ return {
+ line(node) {
+ if (node.children.length === 0) {
+ node.children = [{ type: 'text', value: ' ' }];
+ return node;
+ }
+ },
+ };
+}
+
+function transformerMetaShowTitle(): ShikiTransformer {
+ return {
+ root(node) {
+ const meta = this.options.meta?.__raw;
+ if (!meta) {
+ return;
+ }
+ const titleMatch = meta.match(/title="([^"]*)"/);
+ if (!titleMatch) {
+ return;
+ }
+ const title = titleMatch[1] ?? '';
+ if (title.length > 0) {
+ node.children.unshift({
+ type: 'element',
+ tagName: 'div',
+ properties: {
+ class: 'shiki-title',
+ },
+ children: [{ type: 'text', value: title }],
+ });
+ }
+ meta.replace(titleMatch[0], '');
+ },
+ };
+}
+export default defineConfig(async () => {
const routesDir = resolve('src', 'routes');
return {
optimizeDeps: {
@@ -116,46 +156,16 @@ export default defineConfig(async () => {
mdx: {
rehypePlugins: [
[
- rehypePrettyCode as any,
+ shikiRehype,
{
theme: 'dark-plus',
- onVisitLine(node: any) {
- // Prevent lines from collapsing in `display: grid` mode, and
- // allow empty lines to be copy/pasted
- if (node.children.length === 0) {
- node.children = [{ type: 'text', value: ' ' }];
- }
- },
- onVisitHighlightedLine(node: any) {
- // Each line node by default has `class="line"`.
- if (node.properties.className) {
- node.properties.className.push('line--highlighted');
- }
- },
- onVisitHighlightedWord(node: any, id: string) {
- // Each word node has no className by default.
- node.properties.className = ['word'];
- if (id) {
- const backgroundColor = {
- a: 'rgb(196 42 94 / 59%)',
- b: 'rgb(0 103 163 / 56%)',
- c: 'rgb(100 50 255 / 35%)',
- }[id];
-
- const color = {
- a: 'rgb(255 225 225 / 100%)',
- b: 'rgb(175 255 255 / 100%)',
- c: 'rgb(225 200 255 / 100%)',
- }[id];
- if (node.properties['data-rehype-pretty-code-wrapper']) {
- node.children.forEach((childNode: any) => {
- childNode.properties.style = ``;
- childNode.properties.className = '';
- });
- }
- node.properties.style = `background-color: ${backgroundColor}; color: ${color};`;
- }
- },
+ transformers: [
+ transformerMetaHighlight(),
+ transformerMetaWordHighlight(),
+ transformerColorizedBrackets(),
+ transformerShowEmptyLines(),
+ transformerMetaShowTitle(),
+ ],
},
],
],
diff --git a/packages/eslint-plugin-qwik/README.md b/packages/eslint-plugin-qwik/README.md
index 13fa15ec321..4a1f390d900 100644
--- a/packages/eslint-plugin-qwik/README.md
+++ b/packages/eslint-plugin-qwik/README.md
@@ -1,6 +1,109 @@
# eslint-plugin-qwik
-## Implemented
+Qwik comes with its own set of ESLint rules to help developers write better code.
-- `no-use-after-await` (deprecated)
-- `valid-lexical-scope`
+## Usage
+
+Install the plugin:
+
+```bash
+npm add -D eslint-plugin-qwik
+pnpm add -D eslint-plugin-qwik
+yarn add -D eslint-plugin-qwik
+```
+
+> `eslint-plugin-qwik` uses the tsc typechecker to type information. You must include the `tsconfigRootDir` in the `parserOptions`.
+
+## Configurations
+
+### Flat config (recommended)
+
+```js
+// eslint.config.js
+import js from '@eslint/js';
+import globals from 'globals';
+import tseslint from 'typescript-eslint';
+import { qwikEslint9Plugin } from 'eslint-plugin-qwik';
+
+export const qwikConfig = [
+ js.configs.recommended,
+ ...tseslint.configs.recommended,
+ {
+ languageOptions: {
+ parserOptions: {
+ projectService: true,
+ tsconfigRootDir: import.meta.dirname,
+ },
+ },
+ },
+ {
+ files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'],
+ languageOptions: {
+ globals: {
+ ...globals.serviceworker,
+ ...globals.browser,
+ ...globals.node,
+ },
+ },
+ },
+ ...qwikEslint9Plugin.configs.recommended,
+ {
+ ignores: ['node_modules/*', 'dist/*', 'server/*', 'tmp/*'],
+ },
+];
+```
+
+> `ignores` must always be the last configuration in the array. Note that in shared configs, the `ignores` must be defined where the config is used, not in the shared config.
+
+### Legacy config (`eslint < 9`)
+
+```js
+// .eslintrc.js
+module.exports = {
+ env: {
+ browser: true,
+ es2021: true,
+ node: true,
+ },
+ extends: [
+ 'eslint:recommended',
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:qwik/recommended',
+ ],
+ parser: '@typescript-eslint/parser',
+ parserOptions: {
+ tsconfigRootDir: __dirname,
+ project: ['./tsconfig.json'],
+ ecmaVersion: 2021,
+ sourceType: 'module',
+ ecmaFeatures: {
+ jsx: true,
+ },
+ },
+ plugins: ['@typescript-eslint'],
+};
+```
+
+> To ignore files, you must use the `.eslintignore` file.
+
+## List of supported rules
+
+- **Warn** in 'recommended' ruleset — ✔️
+- **Error** in 'recommended' ruleset — ✅
+- **Warn** in 'strict' ruleset — 🔒
+- **Error** in 'strict' ruleset — 🔐
+- **Typecheck** — 💭
+
+| Rule | Description | Ruleset |
+| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
+| [`qwik/valid-lexical-scope`](https://qwik.dev/docs/advanced/eslint/#valid-lexical-scope) | Used the tsc typechecker to detect the capture of unserializable data in dollar `($)` scopes. | ✅ 🔐 💭 |
+| [`qwik/use-method-usage`](https://qwik.dev/docs/advanced/eslint/#use-method-usage) | Detect invalid use of use hook. | ✅ 🔐 |
+| [`qwik/no-react-props`](https://qwik.dev/docs/advanced/eslint/#no-react-props) | Disallow usage of React-specific `className/htmlFor` props. | ✅ 🔐 |
+| [`qwik/loader-location`](https://qwik.dev/docs/advanced/eslint/#loader-location) | Detect declaration location of `loader$`. | ✔️ 🔐 |
+| [`qwik/prefer-classlist`](https://qwik.dev/docs/advanced/eslint/#prefer-classlist) | Enforce using the `classlist` prop over importing a `classnames` helper. The `classlist` prop accepts an object `{ [class: string]: boolean }` just like `classnames`. | ✔️ 🔐 |
+| [`qwik/jsx-no-script-url`](https://qwik.dev/docs/advanced/eslint/#jsx-no-script-url) | Disallow javascript: URLs. | ✔️ 🔐 |
+| [`qwik/jsx-key`](https://qwik.dev/docs/advanced/eslint/#jsx-key) | Disallow missing `key` props in iterators/collection literals. | ✔️ 🔐 |
+| [`qwik/unused-server`](https://qwik.dev/docs/advanced/eslint/#unused-server) | Detect unused `server$()` functions. | ✅ 🔐 |
+| [`qwik/jsx-img`](https://qwik.dev/docs/advanced/eslint/#jsx-img) | For performance reasons, always provide width and height attributes for ` ` elements, it will help to prevent layout shifts. | ✔️ 🔐 |
+| [`qwik/jsx-a`](https://qwik.dev/docs/advanced/eslint/#jsx-a) | For a perfect SEO score, always provide href attribute for `` elements. | ✔️ 🔐 |
+| [`qwik/no-use-visible-task`](https://qwik.dev/docs/advanced/eslint/#no-use-visible-task) | Detect `useVisibleTask$()` functions. | ✔️ 🔒 |
diff --git a/packages/eslint-plugin-qwik/index.ts b/packages/eslint-plugin-qwik/index.ts
index cbc1ddec787..f9598d7ef7c 100644
--- a/packages/eslint-plugin-qwik/index.ts
+++ b/packages/eslint-plugin-qwik/index.ts
@@ -1,3 +1,4 @@
+import type { TSESLint } from '@typescript-eslint/utils';
import { jsxAtag } from './src/jsxAtag';
import { jsxImg } from './src/jsxImg';
import { jsxKey } from './src/jsxKey';
@@ -12,11 +13,13 @@ import { validLexicalScope } from './src/validLexicalScope';
import { serializerSignalUsage } from './src/serializerSignalUsage';
import pkg from './package.json';
+type Rules = NonNullable;
+
const rules = {
- 'use-method-usage': useMethodUsage,
'valid-lexical-scope': validLexicalScope,
- 'loader-location': loaderLocation,
+ 'use-method-usage': useMethodUsage,
'no-react-props': noReactProps,
+ 'loader-location': loaderLocation,
'prefer-classlist': preferClasslist,
'jsx-no-script-url': jsxNoScriptUrl,
'jsx-key': jsxKey,
@@ -25,27 +28,28 @@ const rules = {
'jsx-a': jsxAtag,
'no-use-visible-task': noUseVisibleTask,
'serializer-signal-usage': serializerSignalUsage,
-};
+} as const satisfies Rules;
-const recommendedRules = {
- 'qwik/use-method-usage': 'error',
+const recommendedRulesLevels = {
'qwik/valid-lexical-scope': 'error',
+ 'qwik/use-method-usage': 'error',
'qwik/no-react-props': 'error',
+ 'qwik/loader-location': 'warn',
'qwik/prefer-classlist': 'warn',
'qwik/jsx-no-script-url': 'warn',
- 'qwik/loader-location': 'warn',
'qwik/jsx-key': 'warn',
'qwik/unused-server': 'error',
'qwik/jsx-img': 'warn',
'qwik/jsx-a': 'warn',
'qwik/no-use-visible-task': 'warn',
'qwik/serializer-signal-usage': 'error',
-};
-const strictRules = {
+} as const satisfies TSESLint.FlatConfig.Rules;
+
+const strictRulesLevels = {
'qwik/valid-lexical-scope': 'error',
'qwik/use-method-usage': 'error',
- 'qwik/loader-location': 'error',
'qwik/no-react-props': 'error',
+ 'qwik/loader-location': 'error',
'qwik/prefer-classlist': 'error',
'qwik/jsx-no-script-url': 'error',
'qwik/jsx-key': 'error',
@@ -54,37 +58,27 @@ const strictRules = {
'qwik/jsx-a': 'error',
'qwik/no-use-visible-task': 'warn',
'qwik/serializer-signal-usage': 'error',
-};
+} as const satisfies TSESLint.FlatConfig.Rules;
const configs = {
recommended: {
plugins: ['qwik'],
- rules: recommendedRules,
+ rules: recommendedRulesLevels,
},
strict: {
plugins: ['qwik'],
- rules: strictRules,
+ rules: strictRulesLevels,
},
-};
+} as const satisfies Record;
-const qwikEslint9Plugin = {
+const qwikEslint9Plugin: TSESLint.FlatConfig.Plugin = {
configs: {
- recommended: [
- {
- plugins: {
- qwik: this,
- },
- rules: recommendedRules,
- },
- ],
- strict: [
- {
- plugins: {
- qwik: this,
- },
- rules: strictRules,
- },
- ],
+ get recommended() {
+ return recommendedConfig;
+ },
+ get strict() {
+ return strictConfig;
+ },
},
meta: {
name: pkg.name,
@@ -93,4 +87,22 @@ const qwikEslint9Plugin = {
rules,
};
+const recommendedConfig: TSESLint.FlatConfig.ConfigArray = [
+ {
+ plugins: {
+ qwik: qwikEslint9Plugin,
+ },
+ rules: recommendedRulesLevels,
+ },
+];
+
+const strictConfig: TSESLint.FlatConfig.ConfigArray = [
+ {
+ plugins: {
+ qwik: qwikEslint9Plugin,
+ },
+ rules: strictRulesLevels,
+ },
+];
+
export { configs, qwikEslint9Plugin, rules };
diff --git a/packages/eslint-plugin-qwik/qwik.unit.ts b/packages/eslint-plugin-qwik/qwik.unit.ts
index fd94ba3cb79..f593c844ca6 100644
--- a/packages/eslint-plugin-qwik/qwik.unit.ts
+++ b/packages/eslint-plugin-qwik/qwik.unit.ts
@@ -1,9 +1,9 @@
-import * as vitest from 'vitest';
import { RuleTester, type RuleTesterConfig } from '@typescript-eslint/rule-tester';
+import { readFile, readdir, stat } from 'node:fs/promises';
+import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
+import * as vitest from 'vitest';
import { rules } from './index';
-import { readdir, readFile, stat } from 'node:fs/promises';
-import { join } from 'path';
// https://typescript-eslint.io/packages/rule-tester/#vitest
RuleTester.afterAll = vitest.afterAll;
@@ -42,7 +42,13 @@ interface InvalidTestCase extends TestCase {
}
await (async function setupEsLintRuleTesters() {
// list './test' directory content and set up one RuleTester per directory
- const testDir = join(__dirname, './tests');
+ let testDir = join(dirname(fileURLToPath(import.meta.url)), './tests');
+ const isWindows = process.platform === 'win32';
+ if (isWindows && testDir.startsWith('\\')) {
+ // in Windows testDir starts with a \ causing errors
+ testDir = testDir.substring(1);
+ }
+
const ruleNames = await readdir(testDir);
for (const ruleName of ruleNames) {
const rule = rules[ruleName];
diff --git a/packages/eslint-plugin-qwik/src/validLexicalScope.ts b/packages/eslint-plugin-qwik/src/validLexicalScope.ts
index 974d39f27ee..67669d22dda 100644
--- a/packages/eslint-plugin-qwik/src/validLexicalScope.ts
+++ b/packages/eslint-plugin-qwik/src/validLexicalScope.ts
@@ -74,6 +74,11 @@ export const validLexicalScope = createRule({
if (variableType === 'ImportBinding') {
return;
}
+
+ if (isQwikHook(declaredVariable, context)) {
+ return;
+ }
+
let dollarScope: Scope.Scope | null = ref.from;
let dollarIdentifier: string | undefined;
while (dollarScope) {
@@ -485,6 +490,43 @@ function getContent(symbol: ts.Symbol, sourceCode: string) {
return '';
}
+function isQwikHook(variable, context) {
+ const def = variable.defs[0];
+ if (!def || def.type !== 'Variable') {
+ return false;
+ }
+
+ const init = def.node.init;
+ if (
+ init?.type === 'CallExpression' &&
+ init.callee.type === 'Identifier' &&
+ /^use[A-Z]/.test(init.callee.name)
+ ) {
+ const hookName = init.callee.name;
+ const scope = context.sourceCode.getScope(def.node);
+ const ref = scope.references.find((r) => r.identifier.name === hookName);
+
+ return ref?.resolved && isFromQwikModule(ref.resolved, context);
+ }
+ return false;
+}
+
+function isFromQwikModule(resolvedVar) {
+ return resolvedVar.defs.some((def) => {
+ if (def.type !== 'ImportBinding') {
+ return false;
+ }
+ const importSource = def.parent.source.value;
+
+ return (
+ importSource.startsWith('@qwik.dev/core') ||
+ importSource.startsWith('@qwik.dev/router') ||
+ importSource.startsWith('@builder.io/qwik') ||
+ importSource.startsWith('@builder.io/qwik-city')
+ );
+ });
+}
+
const ALLOWED_CLASSES = {
Promise: true,
URL: true,
diff --git a/packages/eslint-plugin-qwik/tests/valid-lexical-scope/valid-use-doc.tsx b/packages/eslint-plugin-qwik/tests/valid-lexical-scope/valid-use-doc.tsx
new file mode 100644
index 00000000000..35f5b77e963
--- /dev/null
+++ b/packages/eslint-plugin-qwik/tests/valid-lexical-scope/valid-use-doc.tsx
@@ -0,0 +1,18 @@
+import { component$, useComputed$ } from '@qwik.dev/core';
+import { useDocumentHead } from '@qwik.dev/router';
+import { useLocation as exampleTest } from '@qwik.dev/router';
+const loc = exampleTest();
+
+export default component$(() => {
+ const head = useDocumentHead();
+ const authorId = useComputed$(() => {
+ return head.meta; // <--- EESLint was not happy here, but now it is
+ });
+ return (
+ <>
+ {authorId.value}
+ pathname: {loc.url.pathname}
+ skuId: {loc.params.skuId}
+ >
+ );
+});
diff --git a/packages/insights/package.json b/packages/insights/package.json
index 1c71bcc2bb0..ec192d65fff 100644
--- a/packages/insights/package.json
+++ b/packages/insights/package.json
@@ -31,10 +31,10 @@
"prettier": "3.4.2",
"prettier-plugin-tailwindcss": "0.5.14",
"tailwindcss": "3.4.6",
- "typescript": "5.4.5",
+ "typescript": "5.8.2",
"undici": "*",
"vite": "5.4.10",
- "vite-tsconfig-paths": "5.0.1",
+ "vite-tsconfig-paths": "5.1.4",
"vitest": "3.0.8",
"zod": "3.22.4"
},
diff --git a/packages/insights/src/db/query-helpers.ts b/packages/insights/src/db/query-helpers.ts
index 3d5c2d06e95..4489ffbe6aa 100644
--- a/packages/insights/src/db/query-helpers.ts
+++ b/packages/insights/src/db/query-helpers.ts
@@ -64,7 +64,7 @@ export function delayBucketField(bucket: number): VectorKeys<`delayCount`> {
}
function pad(value: number): VectorKeys<''> {
- return value < 10 ? '0' + value : (String(value) as any);
+ return value < 10 ? (('0' + value) as '00') : (String(value) as any);
}
export function createEdgeRow({
diff --git a/packages/qwik-react/package.json b/packages/qwik-react/package.json
index cb06855d7eb..6aa05c8f12a 100644
--- a/packages/qwik-react/package.json
+++ b/packages/qwik-react/package.json
@@ -9,7 +9,7 @@
"@types/react-dom": "18.3.0",
"react": "18.3.1",
"react-dom": "18.3.1",
- "typescript": "5.4.5",
+ "typescript": "5.8.2",
"vite": "5.4.10"
},
"engines": {
diff --git a/packages/qwik-react/src/api-extractor.json b/packages/qwik-react/src/api-extractor.json
index 2638985580c..478728020c8 100644
--- a/packages/qwik-react/src/api-extractor.json
+++ b/packages/qwik-react/src/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/dist-dev/dts-out/packages/qwik-react/src/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/packages/qwik-react/src/",
"reportTempFolder": "/dist-dev/api-extractor/qwik-react"
},
diff --git a/packages/qwik-router/package.json b/packages/qwik-router/package.json
index e34c29d03d7..8d2165be9b3 100644
--- a/packages/qwik-router/package.json
+++ b/packages/qwik-router/package.json
@@ -17,7 +17,7 @@
},
"devDependencies": {
"@azure/functions": "3.5.1",
- "@microsoft/api-extractor": "7.43.1",
+ "@microsoft/api-extractor": "7.52.1",
"@netlify/edge-functions": "2.10.0",
"@qwik.dev/core": "workspace:*",
"@types/mdast": "4.0.4",
@@ -37,7 +37,7 @@
"remark-gfm": "4.0.0",
"set-cookie-parser": "2.6.0",
"tsm": "2.3.0",
- "typescript": "5.4.5",
+ "typescript": "5.8.2",
"unified": "11.0.5",
"unist-util-visit": "5.0.0",
"uvu": "0.5.6",
diff --git a/packages/qwik-router/src/adapters/azure-swa/api.md b/packages/qwik-router/src/adapters/azure-swa/router.api.md
similarity index 100%
rename from packages/qwik-router/src/adapters/azure-swa/api.md
rename to packages/qwik-router/src/adapters/azure-swa/router.api.md
diff --git a/packages/qwik-router/src/adapters/azure-swa/vite/api-extractor.json b/packages/qwik-router/src/adapters/azure-swa/vite/api-extractor.json
index 0391a4d6b7f..d99ce7c52a4 100644
--- a/packages/qwik-router/src/adapters/azure-swa/vite/api-extractor.json
+++ b/packages/qwik-router/src/adapters/azure-swa/vite/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/adapters/azure-swa/vite/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/adapters/azure-swa/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/adapters/azure-swa"
},
diff --git a/packages/qwik-router/src/adapters/bun-server/api.md b/packages/qwik-router/src/adapters/bun-server/router.api.md
similarity index 100%
rename from packages/qwik-router/src/adapters/bun-server/api.md
rename to packages/qwik-router/src/adapters/bun-server/router.api.md
diff --git a/packages/qwik-router/src/adapters/bun-server/vite/api-extractor.json b/packages/qwik-router/src/adapters/bun-server/vite/api-extractor.json
index c0d30942c15..082db29e50a 100644
--- a/packages/qwik-router/src/adapters/bun-server/vite/api-extractor.json
+++ b/packages/qwik-router/src/adapters/bun-server/vite/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/adapters/bun-server/vite/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/adapters/bun-server/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/adapters/bun-server"
},
diff --git a/packages/qwik-router/src/adapters/cloud-run/api.md b/packages/qwik-router/src/adapters/cloud-run/router.api.md
similarity index 100%
rename from packages/qwik-router/src/adapters/cloud-run/api.md
rename to packages/qwik-router/src/adapters/cloud-run/router.api.md
diff --git a/packages/qwik-router/src/adapters/cloud-run/vite/api-extractor.json b/packages/qwik-router/src/adapters/cloud-run/vite/api-extractor.json
index 6f14b89701e..dabfbc2e0a9 100644
--- a/packages/qwik-router/src/adapters/cloud-run/vite/api-extractor.json
+++ b/packages/qwik-router/src/adapters/cloud-run/vite/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/adapters/cloud-run/vite/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/adapters/cloud-run/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/adapters/cloud-run"
},
diff --git a/packages/qwik-router/src/adapters/cloudflare-pages/api.md b/packages/qwik-router/src/adapters/cloudflare-pages/router.api.md
similarity index 100%
rename from packages/qwik-router/src/adapters/cloudflare-pages/api.md
rename to packages/qwik-router/src/adapters/cloudflare-pages/router.api.md
diff --git a/packages/qwik-router/src/adapters/cloudflare-pages/vite/api-extractor.json b/packages/qwik-router/src/adapters/cloudflare-pages/vite/api-extractor.json
index 4026fa738ab..840492f03fd 100644
--- a/packages/qwik-router/src/adapters/cloudflare-pages/vite/api-extractor.json
+++ b/packages/qwik-router/src/adapters/cloudflare-pages/vite/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/adapters/cloudflare-pages/vite/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/adapters/cloudflare-pages/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/adapters/cloudflare-pages"
},
diff --git a/packages/qwik-router/src/adapters/deno-server/api.md b/packages/qwik-router/src/adapters/deno-server/router.api.md
similarity index 100%
rename from packages/qwik-router/src/adapters/deno-server/api.md
rename to packages/qwik-router/src/adapters/deno-server/router.api.md
diff --git a/packages/qwik-router/src/adapters/deno-server/vite/api-extractor.json b/packages/qwik-router/src/adapters/deno-server/vite/api-extractor.json
index da963db400c..9b34f362ff2 100644
--- a/packages/qwik-router/src/adapters/deno-server/vite/api-extractor.json
+++ b/packages/qwik-router/src/adapters/deno-server/vite/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/adapters/deno-server/vite/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/adapters/deno-server/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/adapters/deno-server"
},
diff --git a/packages/qwik-router/src/adapters/netlify-edge/api.md b/packages/qwik-router/src/adapters/netlify-edge/router.api.md
similarity index 100%
rename from packages/qwik-router/src/adapters/netlify-edge/api.md
rename to packages/qwik-router/src/adapters/netlify-edge/router.api.md
diff --git a/packages/qwik-router/src/adapters/netlify-edge/vite/api-extractor.json b/packages/qwik-router/src/adapters/netlify-edge/vite/api-extractor.json
index 668d6ee3865..83035e20bdd 100644
--- a/packages/qwik-router/src/adapters/netlify-edge/vite/api-extractor.json
+++ b/packages/qwik-router/src/adapters/netlify-edge/vite/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/adapters/netlify-edge/vite/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/adapters/netlify-edge/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/adapters/netlify-edge"
},
diff --git a/packages/qwik-router/src/adapters/node-server/api.md b/packages/qwik-router/src/adapters/node-server/router.api.md
similarity index 100%
rename from packages/qwik-router/src/adapters/node-server/api.md
rename to packages/qwik-router/src/adapters/node-server/router.api.md
diff --git a/packages/qwik-router/src/adapters/node-server/vite/api-extractor.json b/packages/qwik-router/src/adapters/node-server/vite/api-extractor.json
index 51fb42d4bde..14d48a9984d 100644
--- a/packages/qwik-router/src/adapters/node-server/vite/api-extractor.json
+++ b/packages/qwik-router/src/adapters/node-server/vite/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/adapters/node-server/vite/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/adapters/node-server/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/adapters/node-server"
},
diff --git a/packages/qwik-router/src/adapters/shared/api.md b/packages/qwik-router/src/adapters/shared/router.api.md
similarity index 100%
rename from packages/qwik-router/src/adapters/shared/api.md
rename to packages/qwik-router/src/adapters/shared/router.api.md
diff --git a/packages/qwik-router/src/adapters/shared/vite/api-extractor.json b/packages/qwik-router/src/adapters/shared/vite/api-extractor.json
index a78595ac166..47ea21a0758 100644
--- a/packages/qwik-router/src/adapters/shared/vite/api-extractor.json
+++ b/packages/qwik-router/src/adapters/shared/vite/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/adapters/shared/vite/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/adapters/shared/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/adapters/shared"
},
diff --git a/packages/qwik-router/src/adapters/static/api.md b/packages/qwik-router/src/adapters/static/router.api.md
similarity index 100%
rename from packages/qwik-router/src/adapters/static/api.md
rename to packages/qwik-router/src/adapters/static/router.api.md
diff --git a/packages/qwik-router/src/adapters/static/vite/api-extractor.json b/packages/qwik-router/src/adapters/static/vite/api-extractor.json
index eaccf26a8b7..1f15f314005 100644
--- a/packages/qwik-router/src/adapters/static/vite/api-extractor.json
+++ b/packages/qwik-router/src/adapters/static/vite/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/adapters/static/vite/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/adapters/static/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/adapters/static"
},
diff --git a/packages/qwik-router/src/adapters/vercel-edge/api.md b/packages/qwik-router/src/adapters/vercel-edge/router.api.md
similarity index 100%
rename from packages/qwik-router/src/adapters/vercel-edge/api.md
rename to packages/qwik-router/src/adapters/vercel-edge/router.api.md
diff --git a/packages/qwik-router/src/adapters/vercel-edge/vite/api-extractor.json b/packages/qwik-router/src/adapters/vercel-edge/vite/api-extractor.json
index 247a1f9f49e..8086472dad7 100644
--- a/packages/qwik-router/src/adapters/vercel-edge/vite/api-extractor.json
+++ b/packages/qwik-router/src/adapters/vercel-edge/vite/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/adapters/vercel-edge/vite/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/adapters/vercel-edge/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/adapters/vercel-edge"
},
diff --git a/packages/qwik-router/src/buildtime/vite/api-extractor.json b/packages/qwik-router/src/buildtime/vite/api-extractor.json
index 1fcea4a1e73..c94848548c6 100644
--- a/packages/qwik-router/src/buildtime/vite/api-extractor.json
+++ b/packages/qwik-router/src/buildtime/vite/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/buildtime/vite/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/buildtime/vite/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/vite"
},
diff --git a/packages/qwik-router/src/buildtime/vite/api.md b/packages/qwik-router/src/buildtime/vite/router.api.md
similarity index 100%
rename from packages/qwik-router/src/buildtime/vite/api.md
rename to packages/qwik-router/src/buildtime/vite/router.api.md
diff --git a/packages/qwik-router/src/middleware/aws-lambda/api-extractor.json b/packages/qwik-router/src/middleware/aws-lambda/api-extractor.json
index fa75a965468..2638f448044 100644
--- a/packages/qwik-router/src/middleware/aws-lambda/api-extractor.json
+++ b/packages/qwik-router/src/middleware/aws-lambda/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/middleware/aws-lambda/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/middleware/aws-lambda/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/middleware/aws-lambda"
},
diff --git a/packages/qwik-router/src/middleware/aws-lambda/api.md b/packages/qwik-router/src/middleware/aws-lambda/router.api.md
similarity index 83%
rename from packages/qwik-router/src/middleware/aws-lambda/api.md
rename to packages/qwik-router/src/middleware/aws-lambda/router.api.md
index ae3b70653e7..79476c97c8b 100644
--- a/packages/qwik-router/src/middleware/aws-lambda/api.md
+++ b/packages/qwik-router/src/middleware/aws-lambda/router.api.md
@@ -4,8 +4,6 @@
```ts
-///
-
import { Http2ServerRequest } from 'http2';
import { IncomingMessage } from 'http';
import { NodeRequestNextFunction } from '@qwik.dev/router/middleware/node';
@@ -24,9 +22,9 @@ export const createQwikCity: typeof createQwikRouter;
// @public (undocumented)
export function createQwikRouter(opts: AwsOpt): {
fixPath: (pathT: string) => string;
- router: (req: IncomingMessage | Http2ServerRequest, res: ServerResponse, next: NodeRequestNextFunction) => Promise;
- staticFile: (req: IncomingMessage | Http2ServerRequest, res: ServerResponse, next: (e?: any) => void) => Promise;
- notFound: (req: IncomingMessage | Http2ServerRequest, res: ServerResponse, next: (e: any) => void) => Promise;
+ router: (req: IncomingMessage | Http2ServerRequest, res: ServerResponse, next: NodeRequestNextFunction) => Promise;
+ staticFile: (req: IncomingMessage | Http2ServerRequest, res: ServerResponse, next: (e?: any) => void) => Promise;
+ notFound: (req: IncomingMessage | Http2ServerRequest, res: ServerResponse, next: (e: any) => void) => Promise;
handle: (req: any, res: any) => void;
};
diff --git a/packages/qwik-router/src/middleware/azure-swa/api-extractor.json b/packages/qwik-router/src/middleware/azure-swa/api-extractor.json
index 0ef61b2e63e..d626be73295 100644
--- a/packages/qwik-router/src/middleware/azure-swa/api-extractor.json
+++ b/packages/qwik-router/src/middleware/azure-swa/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/middleware/azure-swa/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/middleware/azure-swa/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/middleware/azure-swa"
},
diff --git a/packages/qwik-router/src/middleware/azure-swa/api.md b/packages/qwik-router/src/middleware/azure-swa/router.api.md
similarity index 100%
rename from packages/qwik-router/src/middleware/azure-swa/api.md
rename to packages/qwik-router/src/middleware/azure-swa/router.api.md
diff --git a/packages/qwik-router/src/middleware/bun/api-extractor.json b/packages/qwik-router/src/middleware/bun/api-extractor.json
index 8c57b69f7e6..1119e4275cd 100644
--- a/packages/qwik-router/src/middleware/bun/api-extractor.json
+++ b/packages/qwik-router/src/middleware/bun/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/middleware/bun/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/middleware/bun/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/middleware/bun"
},
diff --git a/packages/qwik-router/src/middleware/bun/api.md b/packages/qwik-router/src/middleware/bun/router.api.md
similarity index 100%
rename from packages/qwik-router/src/middleware/bun/api.md
rename to packages/qwik-router/src/middleware/bun/router.api.md
diff --git a/packages/qwik-router/src/middleware/cloudflare-pages/api-extractor.json b/packages/qwik-router/src/middleware/cloudflare-pages/api-extractor.json
index 5b0e7324df2..1ed9f3f5cbf 100644
--- a/packages/qwik-router/src/middleware/cloudflare-pages/api-extractor.json
+++ b/packages/qwik-router/src/middleware/cloudflare-pages/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/middleware/cloudflare-pages/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/middleware/cloudflare-pages/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/middleware/cloudflare-pages"
},
diff --git a/packages/qwik-router/src/middleware/cloudflare-pages/api.md b/packages/qwik-router/src/middleware/cloudflare-pages/router.api.md
similarity index 83%
rename from packages/qwik-router/src/middleware/cloudflare-pages/api.md
rename to packages/qwik-router/src/middleware/cloudflare-pages/router.api.md
index f09af0cbd04..f3dd54d10ef 100644
--- a/packages/qwik-router/src/middleware/cloudflare-pages/api.md
+++ b/packages/qwik-router/src/middleware/cloudflare-pages/router.api.md
@@ -10,11 +10,11 @@ import type { ServerRenderOptions } from '@qwik.dev/router/middleware/request-ha
export const createQwikCity: typeof createQwikRouter;
// @public (undocumented)
-export function createQwikRouter(opts: QwikRouterCloudflarePagesOptions): (request: PlatformCloudflarePages['request'], env: PlatformCloudflarePages['env'] & {
+export function createQwikRouter(opts: QwikRouterCloudflarePagesOptions): (request: PlatformCloudflarePages["request"], env: PlatformCloudflarePages["env"] & {
ASSETS: {
fetch: (req: Request) => Response;
};
-}, ctx: PlatformCloudflarePages['ctx']) => Promise;
+}, ctx: PlatformCloudflarePages["ctx"]) => Promise;
// @public (undocumented)
export interface PlatformCloudflarePages {
diff --git a/packages/qwik-router/src/middleware/deno/api-extractor.json b/packages/qwik-router/src/middleware/deno/api-extractor.json
index ea956e6294f..c92fad7a95e 100644
--- a/packages/qwik-router/src/middleware/deno/api-extractor.json
+++ b/packages/qwik-router/src/middleware/deno/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/middleware/deno/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/middleware/deno/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/middleware/deno"
},
diff --git a/packages/qwik-router/src/middleware/deno/api.md b/packages/qwik-router/src/middleware/deno/router.api.md
similarity index 100%
rename from packages/qwik-router/src/middleware/deno/api.md
rename to packages/qwik-router/src/middleware/deno/router.api.md
diff --git a/packages/qwik-router/src/middleware/firebase/api-extractor.json b/packages/qwik-router/src/middleware/firebase/api-extractor.json
index 9b94bda187c..78b982d6c9e 100755
--- a/packages/qwik-router/src/middleware/firebase/api-extractor.json
+++ b/packages/qwik-router/src/middleware/firebase/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/middleware/firebase/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/middleware/firebase/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/middleware/firebase"
},
diff --git a/packages/qwik-router/src/middleware/firebase/api.md b/packages/qwik-router/src/middleware/firebase/router.api.md
old mode 100755
new mode 100644
similarity index 100%
rename from packages/qwik-router/src/middleware/firebase/api.md
rename to packages/qwik-router/src/middleware/firebase/router.api.md
diff --git a/packages/qwik-router/src/middleware/netlify-edge/api-extractor.json b/packages/qwik-router/src/middleware/netlify-edge/api-extractor.json
index e0b7535b1f7..b0247c6cb5f 100644
--- a/packages/qwik-router/src/middleware/netlify-edge/api-extractor.json
+++ b/packages/qwik-router/src/middleware/netlify-edge/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/middleware/netlify-edge/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/middleware/netlify-edge/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/middleware/netlify-edge"
},
diff --git a/packages/qwik-router/src/middleware/netlify-edge/api.md b/packages/qwik-router/src/middleware/netlify-edge/router.api.md
similarity index 100%
rename from packages/qwik-router/src/middleware/netlify-edge/api.md
rename to packages/qwik-router/src/middleware/netlify-edge/router.api.md
diff --git a/packages/qwik-router/src/middleware/node/api-extractor.json b/packages/qwik-router/src/middleware/node/api-extractor.json
index cf23e459e7d..ea472405566 100644
--- a/packages/qwik-router/src/middleware/node/api-extractor.json
+++ b/packages/qwik-router/src/middleware/node/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/middleware/node/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/middleware/node/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/middleware/node"
},
diff --git a/packages/qwik-router/src/middleware/node/api.md b/packages/qwik-router/src/middleware/node/router.api.md
similarity index 95%
rename from packages/qwik-router/src/middleware/node/api.md
rename to packages/qwik-router/src/middleware/node/router.api.md
index e3e8711114a..9553c720899 100644
--- a/packages/qwik-router/src/middleware/node/api.md
+++ b/packages/qwik-router/src/middleware/node/router.api.md
@@ -4,8 +4,6 @@
```ts
-///
-
import type { ClientConn } from '@qwik.dev/router/middleware/request-handler';
import type { Http2ServerRequest } from 'node:http2';
import type { IncomingMessage } from 'node:http';
diff --git a/packages/qwik-router/src/middleware/request-handler/api-extractor.json b/packages/qwik-router/src/middleware/request-handler/api-extractor.json
index 612f9b55934..8214ed450f0 100644
--- a/packages/qwik-router/src/middleware/request-handler/api-extractor.json
+++ b/packages/qwik-router/src/middleware/request-handler/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/middleware/request-handler/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/middleware/request-handler/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/middleware/request-handler"
},
diff --git a/packages/qwik-router/src/middleware/request-handler/error-handler.ts b/packages/qwik-router/src/middleware/request-handler/error-handler.ts
index a8c8bace6ea..f9dea9d7700 100644
--- a/packages/qwik-router/src/middleware/request-handler/error-handler.ts
+++ b/packages/qwik-router/src/middleware/request-handler/error-handler.ts
@@ -1,19 +1,20 @@
/** @public */
-export class ServerError> extends Error {
+export class ServerError extends Error {
constructor(
public status: number,
public data: T
) {
- super();
+ super(typeof data === 'string' ? data : undefined);
}
}
-export class ErrorResponse extends Error {
+/** @deprecated */
+export class ErrorResponse extends ServerError {
constructor(
public status: number,
message?: string
) {
- super(message);
+ super(status, message);
}
}
diff --git a/packages/qwik-router/src/middleware/request-handler/request-event.ts b/packages/qwik-router/src/middleware/request-handler/request-event.ts
index 97d6b28c882..c345081ee63 100644
--- a/packages/qwik-router/src/middleware/request-handler/request-event.ts
+++ b/packages/qwik-router/src/middleware/request-handler/request-event.ts
@@ -11,7 +11,6 @@ import type {
import { isPromise } from '../../runtime/src/utils';
import { createCacheControl } from './cache-control';
import { Cookie } from './cookie';
-import { ErrorResponse } from './error-handler';
import { AbortMessage, RedirectMessage } from './redirect-handler';
import { encoder } from './resolve-request-handlers';
import type {
@@ -27,6 +26,7 @@ import type {
ServerRequestMode,
} from './types';
import { IsQData, QDATA_JSON, QDATA_JSON_LEN } from './user-response';
+import { ServerError } from './error-handler';
const RequestEvLoaders = Symbol('RequestEvLoaders');
const RequestEvMode = Symbol('RequestEvMode');
@@ -204,9 +204,9 @@ export function createRequestEvent(
return locale || '';
},
- error: (statusCode: number, message: string) => {
+ error: (statusCode: number, message: T) => {
status = statusCode;
- return new ErrorResponse(statusCode, message);
+ return new ServerError(statusCode, message);
},
redirect: (statusCode: number, url: string) => {
@@ -342,7 +342,7 @@ const parseRequest = async (
if (data) {
try {
return qwikSerializer._deserialize(decodeURIComponent(data)) as JSONValue;
- } catch (err) {
+ } catch {
//
}
}
diff --git a/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts b/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts
index a30beac2e57..b3098ce7b5f 100644
--- a/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts
+++ b/packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts
@@ -12,7 +12,6 @@ import type {
RouteModule,
ValidatorReturn,
} from '../../runtime/src/types';
-import { ServerError } from './error-handler';
import { HttpStatus } from './http-status-codes';
import { RedirectMessage } from './redirect-handler';
import {
@@ -305,23 +304,12 @@ async function pureServerFunction(ev: RequestEvent) {
const [qrl, ...args] = data;
if (isQrl(qrl) && qrl.getHash() === fn) {
let result: unknown;
- try {
- if (isDev) {
- result = await measure(ev, `server_${qrl.getSymbol()}`, () =>
- (qrl as Function).apply(ev, args)
- );
- } else {
- result = await (qrl as Function).apply(ev, args);
- }
- } catch (err) {
- if (err instanceof ServerError) {
- ev.headers.set('Content-Type', 'application/qwik-json');
- ev.send(err.status, await qwikSerializer._serialize([err.data]));
- return;
- }
- ev.headers.set('Content-Type', 'application/qwik-json');
- ev.send(500, await qwikSerializer._serialize([err]));
- return;
+ if (isDev) {
+ result = await measure(ev, `server_${qrl.getSymbol()}`, () =>
+ (qrl as Function).apply(ev, args)
+ );
+ } else {
+ result = await (qrl as Function).apply(ev, args);
}
if (isAsyncIterator(result)) {
ev.headers.set('Content-Type', 'text/qwik-json-stream');
diff --git a/packages/qwik-router/src/middleware/request-handler/api.md b/packages/qwik-router/src/middleware/request-handler/router.api.md
similarity index 94%
rename from packages/qwik-router/src/middleware/request-handler/api.md
rename to packages/qwik-router/src/middleware/request-handler/router.api.md
index d5708ce1b3d..5a3a06547ae 100644
--- a/packages/qwik-router/src/middleware/request-handler/api.md
+++ b/packages/qwik-router/src/middleware/request-handler/router.api.md
@@ -127,8 +127,7 @@ export interface RequestEventBase {
// @public (undocumented)
export interface RequestEventCommon extends RequestEventBase {
// Warning: (ae-forgotten-export) The symbol "ErrorCodes" needs to be exported by the entry point index.d.ts
- // Warning: (ae-forgotten-export) The symbol "ErrorResponse" needs to be exported by the entry point index.d.ts
- readonly error: (statusCode: ErrorCodes, message: string) => ErrorResponse;
+ readonly error: (statusCode: ErrorCodes, message: T) => ServerError;
// (undocumented)
readonly exit: () => AbortMessage;
readonly html: (statusCode: StatusCodes, html: string) => AbortMessage;
@@ -177,7 +176,7 @@ export interface ResolveValue {
}
// @public (undocumented)
-export class ServerError> extends Error {
+export class ServerError extends Error {
constructor(status: number, data: T);
// (undocumented)
data: T;
@@ -231,7 +230,7 @@ export class _TextEncoderStream_polyfill {
// (undocumented)
get encoding(): string;
// (undocumented)
- get readable(): ReadableStream;
+ get readable(): ReadableStream>;
// (undocumented)
get writable(): WritableStream;
}
diff --git a/packages/qwik-router/src/middleware/request-handler/types.ts b/packages/qwik-router/src/middleware/request-handler/types.ts
index 5eb6eb96cee..b17fac83108 100644
--- a/packages/qwik-router/src/middleware/request-handler/types.ts
+++ b/packages/qwik-router/src/middleware/request-handler/types.ts
@@ -1,7 +1,7 @@
import type { _deserialize, _serialize, _verifySerializable } from '@qwik.dev/core/internal';
import type { Render, RenderOptions } from '@qwik.dev/core/server';
import type { Action, FailReturn, Loader, QwikCityPlan, QwikRouterConfig } from '@qwik.dev/router';
-import type { ErrorResponse } from './error-handler';
+import type { ServerError } from './error-handler';
import type { AbortMessage, RedirectMessage } from './redirect-handler';
import type { RequestEventInternal } from './request-event';
@@ -158,7 +158,8 @@ export type ClientErrorCode =
| 428 // Precondition Required
| 429 // Too Many Requests
| 431 // Request Header Fields Too Large
- | 451; // Unavailable For Legal Reasons
+ | 451 // Unavailable For Legal Reasons
+ | 499; // Client closed request
/**
* HTTP Server Error Status Codes Status codes in the 5xx range indicate that the server encountered
@@ -209,7 +210,7 @@ export interface RequestEventCommon
* to end a response with `404`, and use the 404 handler in the routes directory. See
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Status for which status code should be used.
*/
- readonly error: (statusCode: ErrorCodes, message: string) => ErrorResponse;
+ readonly error: (statusCode: ErrorCodes, message: T) => ServerError;
/**
* Convenience method to send an text body response. The response will be automatically set the
diff --git a/packages/qwik-router/src/middleware/request-handler/user-response.ts b/packages/qwik-router/src/middleware/request-handler/user-response.ts
index e32a5d05d0f..c1589eb0e58 100644
--- a/packages/qwik-router/src/middleware/request-handler/user-response.ts
+++ b/packages/qwik-router/src/middleware/request-handler/user-response.ts
@@ -1,9 +1,14 @@
import type { QwikManifest, ResolvedManifest } from '@qwik.dev/core/optimizer';
import type { RequestEvent, RequestHandler } from '@qwik.dev/router';
import type { LoadedRoute } from '../../runtime/src/types';
-import { ErrorResponse, getErrorHtml, minimalHtmlResponse } from './error-handler';
+import { ServerError, getErrorHtml, minimalHtmlResponse } from './error-handler';
import { AbortMessage, RedirectMessage } from './redirect-handler';
-import { createRequestEvent, getRequestMode, type RequestEventInternal } from './request-event';
+import {
+ RequestEvQwikSerializer,
+ createRequestEvent,
+ getRequestMode,
+ type RequestEventInternal,
+} from './request-event';
import { encoder } from './resolve-request-handlers';
import type { QwikSerializer, ServerRequestEvent, StatusCodes } from './types';
@@ -65,12 +70,18 @@ async function runNext(requestEv: RequestEventInternal, resolve: (value: any) =>
if (e instanceof RedirectMessage) {
const stream = requestEv.getWritableStream();
await stream.close();
- } else if (e instanceof ErrorResponse) {
- console.error(e);
+ } else if (e instanceof ServerError) {
if (!requestEv.headersSent) {
- const html = getErrorHtml(e.status, e);
const status = e.status as StatusCodes;
- requestEv.html(status, html);
+ const accept = requestEv.request.headers.get('Accept');
+ if (accept && !accept.includes('text/html')) {
+ const qwikSerializer = requestEv[RequestEvQwikSerializer];
+ requestEv.headers.set('Content-Type', 'application/qwik-json');
+ requestEv.send(status, await qwikSerializer._serialize([e.data]));
+ } else {
+ const html = getErrorHtml(e.status, e.data);
+ requestEv.html(status, html);
+ }
}
} else if (!(e instanceof AbortMessage)) {
if (getRequestMode(requestEv) !== 'dev') {
diff --git a/packages/qwik-router/src/middleware/vercel-edge/api-extractor.json b/packages/qwik-router/src/middleware/vercel-edge/api-extractor.json
index 32c138c5808..9d3b77b10ab 100644
--- a/packages/qwik-router/src/middleware/vercel-edge/api-extractor.json
+++ b/packages/qwik-router/src/middleware/vercel-edge/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/middleware/vercel-edge/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/middleware/vercel-edge/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/middleware/vercel-edge"
},
diff --git a/packages/qwik-router/src/middleware/vercel-edge/api.md b/packages/qwik-router/src/middleware/vercel-edge/router.api.md
similarity index 100%
rename from packages/qwik-router/src/middleware/vercel-edge/api.md
rename to packages/qwik-router/src/middleware/vercel-edge/router.api.md
diff --git a/packages/qwik-router/src/runtime/src/api-extractor.json b/packages/qwik-router/src/runtime/src/api-extractor.json
index 6b08b450d8a..a7341146529 100644
--- a/packages/qwik-router/src/runtime/src/api-extractor.json
+++ b/packages/qwik-router/src/runtime/src/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/runtime/src/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/runtime/src/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/src/runtime"
},
diff --git a/packages/qwik-router/src/runtime/src/error-boundary.tsx b/packages/qwik-router/src/runtime/src/error-boundary.tsx
index 13710b19556..7ede68ec07b 100644
--- a/packages/qwik-router/src/runtime/src/error-boundary.tsx
+++ b/packages/qwik-router/src/runtime/src/error-boundary.tsx
@@ -1,14 +1,25 @@
-import { component$, useErrorBoundary, Slot, type QRL } from '@qwik.dev/core';
+import { component$, useErrorBoundary, Slot, type QRL, useOnWindow, $ } from '@qwik.dev/core';
/** @public */
export interface ErrorBoundaryProps {
- children: any;
- fallback$: QRL<(ev: any) => any>;
+ fallback$?: QRL<(error: any) => any>;
}
/** @public */
export const ErrorBoundary = component$((props: ErrorBoundaryProps) => {
const store = useErrorBoundary();
- return store.error === undefined ? : <>{props.fallback$(store.error)}>;
+ useOnWindow(
+ 'qerror',
+ $((e: CustomEvent) => {
+ // we are allowed to write to our "read-only" store
+ (store.error as any) = e.detail.error;
+ })
+ );
+
+ if (store.error && props.fallback$) {
+ return <>{props.fallback$(store.error)}>;
+ }
+
+ return ;
});
diff --git a/packages/qwik-router/src/runtime/src/index.ts b/packages/qwik-router/src/runtime/src/index.ts
index b2517744519..11758ba6cad 100644
--- a/packages/qwik-router/src/runtime/src/index.ts
+++ b/packages/qwik-router/src/runtime/src/index.ts
@@ -46,6 +46,7 @@ export type {
ZodConstructor,
} from './types';
+export { ErrorBoundary } from './error-boundary';
export { Link, type LinkProps } from './link-component';
export {
QWIK_CITY_SCROLLER,
diff --git a/packages/qwik-router/src/runtime/src/api.md b/packages/qwik-router/src/runtime/src/router.api.md
similarity index 95%
rename from packages/qwik-router/src/runtime/src/api.md
rename to packages/qwik-router/src/runtime/src/router.api.md
index f619f1fb965..457bd100489 100644
--- a/packages/qwik-router/src/runtime/src/api.md
+++ b/packages/qwik-router/src/runtime/src/router.api.md
@@ -206,6 +206,11 @@ export interface DocumentStyle {
readonly style: string;
}
+// Warning: (ae-forgotten-export) The symbol "ErrorBoundaryProps" needs to be exported by the entry point index.d.ts
+//
+// @public (undocumented)
+export const ErrorBoundary: Component;
+
// @public (undocumented)
export type FailOfRest = REST extends readonly DataValidator[] ? ERROR : never;
@@ -298,7 +303,8 @@ export type LoaderSignal = TYPE extends () => ValueOrPromise(obj: T, keys: KEYS[]): Omit;
@@ -441,7 +447,7 @@ export interface RouteLocation {
// @public (undocumented)
export type RouteNavigate = QRL<(path?: string | number | URL, options?: {
- type?: Exclude;
+ type?: Exclude;
forceReload?: boolean;
replaceState?: boolean;
scroll?: boolean;
diff --git a/packages/qwik-router/src/runtime/src/server-functions.ts b/packages/qwik-router/src/runtime/src/server-functions.ts
index 3bb5fdfaaf7..d065522cd54 100644
--- a/packages/qwik-router/src/runtime/src/server-functions.ts
+++ b/packages/qwik-router/src/runtime/src/server-functions.ts
@@ -437,6 +437,7 @@ export const serverQrl = (
headers: {
...headers,
'Content-Type': 'application/qwik-json',
+ Accept: 'application/json, application/qwik-json, text/qwik-json-stream, text/plain',
// Required so we don't call accidentally
'X-QRL': qrlHash,
},
@@ -471,19 +472,19 @@ export const serverQrl = (
} else if (contentType === 'application/qwik-json') {
const str = await res.text();
const [obj] = _deserialize(str, ctxElm ?? document.documentElement);
- if (res.status >= 500) {
+ if (res.status >= 400) {
throw obj;
}
return obj;
} else if (contentType === 'application/json') {
const obj = await res.json();
- if (res.status >= 500) {
+ if (res.status >= 400) {
throw obj;
}
return obj;
} else if (contentType === 'text/plain' || contentType === 'text/html') {
const str = await res.text();
- if (res.status >= 500) {
+ if (res.status >= 400) {
throw str;
}
return str;
diff --git a/packages/qwik-router/src/runtime/src/service-worker/api-extractor.json b/packages/qwik-router/src/runtime/src/service-worker/api-extractor.json
index ebc75833062..33b93ba9c7a 100644
--- a/packages/qwik-router/src/runtime/src/service-worker/api-extractor.json
+++ b/packages/qwik-router/src/runtime/src/service-worker/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/runtime/src/service-worker/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/runtime/src/service-worker/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/src/runtime/service-worker"
},
diff --git a/packages/qwik-router/src/runtime/src/service-worker/api.md b/packages/qwik-router/src/runtime/src/service-worker/router.api.md
similarity index 100%
rename from packages/qwik-router/src/runtime/src/service-worker/api.md
rename to packages/qwik-router/src/runtime/src/service-worker/router.api.md
diff --git a/packages/qwik-router/src/static/api-extractor.json b/packages/qwik-router/src/static/api-extractor.json
index ca28d702dc2..6a843e444aa 100644
--- a/packages/qwik-router/src/static/api-extractor.json
+++ b/packages/qwik-router/src/static/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik-router/src/static/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/static/",
"reportTempFolder": "/../../dist-dev/api-extractor/qwik-router/static"
},
diff --git a/packages/qwik-router/src/static/api.md b/packages/qwik-router/src/static/router.api.md
similarity index 93%
rename from packages/qwik-router/src/static/api.md
rename to packages/qwik-router/src/static/router.api.md
index 815edea307a..150329b3c16 100644
--- a/packages/qwik-router/src/static/api.md
+++ b/packages/qwik-router/src/static/router.api.md
@@ -4,8 +4,6 @@
```ts
-///
-
import type { RenderOptions } from '@qwik.dev/core/server';
// @public
diff --git a/packages/qwik-router/src/static/worker-thread.ts b/packages/qwik-router/src/static/worker-thread.ts
index 6dbb8a23c12..82da1350300 100644
--- a/packages/qwik-router/src/static/worker-thread.ts
+++ b/packages/qwik-router/src/static/worker-thread.ts
@@ -289,7 +289,7 @@ const noopWriter: WritableStreamDefaultWriter = {
releaseLock() {},
};
-const noopWritableStream: WritableStream = {
+const noopWritableStream = {
get locked() {
return false;
},
diff --git a/packages/qwik/public.d.ts b/packages/qwik/public.d.ts
index fccc2f88fb8..55008e659ce 100644
--- a/packages/qwik/public.d.ts
+++ b/packages/qwik/public.d.ts
@@ -39,6 +39,8 @@ export {
// TODO should this be used instead of EventHandler?
QRLEventHandlerMulti,
QwikIntrinsicElements,
+ QwikHTMLElements,
+ QwikSVGElements,
QwikJSX as JSX,
QwikJSX,
ReadonlySignal,
diff --git a/packages/qwik/src/build/api-extractor.json b/packages/qwik/src/build/api-extractor.json
index 22cbb2d4840..552d182704c 100644
--- a/packages/qwik/src/build/api-extractor.json
+++ b/packages/qwik/src/build/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik/src/build/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/build/",
"reportTempFolder": "/../../dist-dev/api-extractor/build/"
},
diff --git a/packages/qwik/src/build/api.md b/packages/qwik/src/build/core.api.md
similarity index 100%
rename from packages/qwik/src/build/api.md
rename to packages/qwik/src/build/core.api.md
diff --git a/packages/qwik/src/core/api-extractor.json b/packages/qwik/src/core/api-extractor.json
index 47728e556c7..e95274fb989 100644
--- a/packages/qwik/src/core/api-extractor.json
+++ b/packages/qwik/src/core/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik/src/core/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/core/",
"reportTempFolder": "/../../dist-dev/api-extractor/core/"
},
diff --git a/packages/qwik/src/core/api.md b/packages/qwik/src/core/core.api.md
similarity index 96%
rename from packages/qwik/src/core/api.md
rename to packages/qwik/src/core/core.api.md
index 46bc158c932..bc1164aedfa 100644
--- a/packages/qwik/src/core/api.md
+++ b/packages/qwik/src/core/core.api.md
@@ -8,7 +8,10 @@ import * as CSS_2 from 'csstype';
import { isBrowser } from '@qwik.dev/core/build';
import { isDev } from '@qwik.dev/core/build';
import { isServer } from '@qwik.dev/core/build';
+import { QRL as QRL_2 } from './qrl.public';
+import { ReadonlySignal as ReadonlySignal_2 } from '..';
import type { StreamWriter as StreamWriter_2 } from '@qwik.dev/core';
+import { ValueOrPromise as ValueOrPromise_2 } from '..';
// @public
export const $: (expression: T) => QRL;
@@ -275,7 +278,7 @@ export interface ErrorBoundaryStore {
}
// @public (undocumented)
-export const event$: (qrl: T) => QRL;
+export const event$: (qrl: T) => QRL_2;
// @public
export type EventHandler = {
@@ -826,7 +829,7 @@ export type ResourceReturn = ResourcePending | ResourceResolved | Resou
export const _restProps: (props: PropsProxy, omit: string[], target?: Props) => Props;
// @internal
-export const _run: (...args: unknown[]) => ValueOrPromise;
+export const _run: (...args: unknown[]) => ValueOrPromise_2;
// @internal
export function _serialize(data: unknown[]): Promise;
@@ -1613,7 +1616,7 @@ export const useContext: UseContext;
export const useContextProvider: (context: ContextId, newValue: STATE) => void;
// @public (undocumented)
-export const useErrorBoundary: () => Readonly;
+export const useErrorBoundary: () => ErrorBoundaryStore;
// @public (undocumented)
export const useId: () => string;
@@ -1648,7 +1651,7 @@ export const useSerializer$: typeof createSerializer$;
// Warning: (ae-internal-missing-underscore) The name "useSerializerQrl" should be prefixed with an underscore because the declaration is marked as @internal
//
// @internal (undocumented)
-export const useSerializerQrl: (qrl: QRL>) => ReadonlySignal;
+export const useSerializerQrl: (qrl: QRL>) => ReadonlySignal_2;
// @public (undocumented)
export function useServerData(key: string): T | undefined;
@@ -1701,7 +1704,7 @@ export interface UseStylesScoped {
export const useStylesScopedQrl: (styles: QRL) => UseStylesScoped;
// @public
-export const useTask$: (qrl: TaskFn) => void;
+export const useTask$: (fn: TaskFn) => void;
// Warning: (ae-internal-missing-underscore) The name "useTaskQrl" should be prefixed with an underscore because the declaration is marked as @internal
//
@@ -1709,7 +1712,7 @@ export const useTask$: (qrl: TaskFn) => void;
export const useTaskQrl: (qrl: QRL) => void;
// @public
-export const useVisibleTask$: (qrl: TaskFn, opts?: OnVisibleTaskOptions | undefined) => void;
+export const useVisibleTask$: (fn: TaskFn, opts?: OnVisibleTaskOptions) => void;
// Warning: (ae-internal-missing-underscore) The name "useVisibleTaskQrl" should be prefixed with an underscore because the declaration is marked as @internal
//
@@ -1804,7 +1807,7 @@ export const _weakSerialize: (input: T) => Partial;
export function withLocale(locale: string, fn: () => T): T;
// @internal
-export const _wrapProp: , P extends keyof T>(args_0: T, args_1?: P | undefined) => any;
+export const _wrapProp: , P extends keyof T>(...args: [T, P?]) => any;
// @internal @deprecated (undocumented)
export const _wrapSignal: , P extends keyof T>(obj: T, prop: P) => any;
diff --git a/packages/qwik/src/core/index.ts b/packages/qwik/src/core/index.ts
index b4e5bd40805..fcff4219ff4 100644
--- a/packages/qwik/src/core/index.ts
+++ b/packages/qwik/src/core/index.ts
@@ -165,6 +165,7 @@ export type {
QwikVisibleEvent,
QwikIdleEvent,
QwikInitEvent,
+ QwikTransitionEvent,
// old
NativeAnimationEvent,
NativeClipboardEvent,
@@ -192,7 +193,6 @@ export type {
QwikTouchEvent,
QwikUIEvent,
QwikWheelEvent,
- QwikTransitionEvent,
} from './shared/jsx/types/jsx-qwik-events';
//////////////////////////////////////////////////////////////////////////////////////////
diff --git a/packages/qwik/src/core/shared/jsx/types/jsx-qwik-attributes.ts b/packages/qwik/src/core/shared/jsx/types/jsx-qwik-attributes.ts
index 1c839ca1ac3..4eff2000464 100644
--- a/packages/qwik/src/core/shared/jsx/types/jsx-qwik-attributes.ts
+++ b/packages/qwik/src/core/shared/jsx/types/jsx-qwik-attributes.ts
@@ -5,6 +5,7 @@ import type {
QwikIdleEvent,
QwikInitEvent,
QwikSymbolEvent,
+ QwikViewTransitionEvent,
QwikVisibleEvent,
} from './jsx-qwik-events';
@@ -113,6 +114,7 @@ type AllEventMapRaw = HTMLElementEventMap &
qinit: QwikInitEvent;
qsymbol: QwikSymbolEvent;
qvisible: QwikVisibleEvent;
+ qviewTransition: QwikViewTransitionEvent;
};
/** This corrects the TS definition for ToggleEvent @public */
diff --git a/packages/qwik/src/core/shared/jsx/types/jsx-qwik-events.ts b/packages/qwik/src/core/shared/jsx/types/jsx-qwik-events.ts
index d8c028f9c5e..d365a508736 100644
--- a/packages/qwik/src/core/shared/jsx/types/jsx-qwik-events.ts
+++ b/packages/qwik/src/core/shared/jsx/types/jsx-qwik-events.ts
@@ -16,6 +16,8 @@ export type QwikSymbolEvent = CustomEvent<{
export type QwikInitEvent = CustomEvent<{}>;
/** Emitted by qwik-loader on document when the document first becomes idle @public */
export type QwikIdleEvent = CustomEvent<{}>;
+/** Emitted by qwik-core on document when the a view transition start @public */
+export type QwikViewTransitionEvent = CustomEvent;
// Utility types for supporting autocompletion in union types
diff --git a/packages/qwik/src/core/shared/jsx/types/jsx-types.unit.tsx b/packages/qwik/src/core/shared/jsx/types/jsx-types.unit.tsx
index 4b1206766d7..43ca119a727 100644
--- a/packages/qwik/src/core/shared/jsx/types/jsx-types.unit.tsx
+++ b/packages/qwik/src/core/shared/jsx/types/jsx-types.unit.tsx
@@ -249,7 +249,6 @@ describe('types', () => {
>
Bar
-
>
);
diff --git a/packages/qwik/src/core/shared/qrl/qrl.ts b/packages/qwik/src/core/shared/qrl/qrl.ts
index 711015dbaf7..34f8c263908 100644
--- a/packages/qwik/src/core/shared/qrl/qrl.ts
+++ b/packages/qwik/src/core/shared/qrl/qrl.ts
@@ -6,6 +6,7 @@ import { createQRL, emitEvent, type QRLInternal } from './qrl-class';
import type { QRL } from './qrl.public';
// https://regexr.com/68v72
+// @ts-expect-error this is a valid regex
const EXTRACT_IMPORT_PATH = /\(\s*(['"])([^\1]+)\1\s*\)/;
// https://regexr.com/690ds
diff --git a/packages/qwik/src/core/shared/shared-serialization.ts b/packages/qwik/src/core/shared/shared-serialization.ts
index 975fce104d6..1210a1a756e 100644
--- a/packages/qwik/src/core/shared/shared-serialization.ts
+++ b/packages/qwik/src/core/shared/shared-serialization.ts
@@ -718,9 +718,9 @@ export const createSerializationContext = (
const isSsrNode = (NodeConstructor ? (obj) => obj instanceof NodeConstructor : () => false) as (
obj: unknown
) => obj is SsrNode;
- isDomRef = (DomRefConstructor ? (obj) => obj instanceof DomRefConstructor : () => false) as (
- obj: unknown
- ) => obj is DomRef;
+ isDomRef = (
+ DomRefConstructor ? (obj) => obj instanceof DomRefConstructor : ((() => false) as any)
+ ) as (obj: unknown) => obj is DomRef;
return {
$serialize$(): void {
diff --git a/packages/qwik/src/core/use/use-error-boundary.ts b/packages/qwik/src/core/use/use-error-boundary.ts
index 0dc3d00b38c..dc5398c27d5 100644
--- a/packages/qwik/src/core/use/use-error-boundary.ts
+++ b/packages/qwik/src/core/use/use-error-boundary.ts
@@ -1,16 +1,11 @@
-import { qrl } from '../shared/qrl/qrl';
-import { type ErrorBoundaryStore, ERROR_CONTEXT } from '../shared/error/error-handling';
+import { ERROR_CONTEXT, type ErrorBoundaryStore } from '../shared/error/error-handling';
import { useContextProvider } from './use-context';
-import { useOn } from './use-on';
import { useStore } from './use-store.public';
/** @public */
-export const useErrorBoundary = (): Readonly => {
- const store: ErrorBoundaryStore = useStore({
- error: undefined,
- });
- useOn('error-boundary', qrl('/runtime', 'error', [store]));
- useContextProvider(ERROR_CONTEXT, store);
+export const useErrorBoundary = () => {
+ const error = useStore({ error: undefined });
+ useContextProvider(ERROR_CONTEXT, error);
- return store;
+ return error;
};
diff --git a/packages/qwik/src/core/use/use-task-dollar.ts b/packages/qwik/src/core/use/use-task-dollar.ts
index c45f03f2e7a..e26ad32c3bb 100644
--- a/packages/qwik/src/core/use/use-task-dollar.ts
+++ b/packages/qwik/src/core/use/use-task-dollar.ts
@@ -1,5 +1,5 @@
import { implicit$FirstArg } from '../shared/qrl/implicit_dollar';
-import { useTaskQrl } from './use-task';
+import { useTaskQrl, type TaskFn } from './use-task';
//
// !!DO NOT EDIT THIS COMMENT DIRECTLY!!!
@@ -62,4 +62,5 @@ import { useTaskQrl } from './use-task';
* @see `Tracker`
*/
//
-export const useTask$ = /*#__PURE__*/ implicit$FirstArg(useTaskQrl);
+// We need to cast to help out the api extractor
+export const useTask$ = /*#__PURE__*/ implicit$FirstArg(useTaskQrl) as (fn: TaskFn) => void;
diff --git a/packages/qwik/src/core/use/use-visible-task-dollar.ts b/packages/qwik/src/core/use/use-visible-task-dollar.ts
index 9054eee6eb9..6f40b84334f 100644
--- a/packages/qwik/src/core/use/use-visible-task-dollar.ts
+++ b/packages/qwik/src/core/use/use-visible-task-dollar.ts
@@ -1,5 +1,6 @@
import { implicit$FirstArg } from '../shared/qrl/implicit_dollar';
-import { useVisibleTaskQrl } from './use-visible-task';
+import type { TaskFn } from './use-task';
+import { useVisibleTaskQrl, type OnVisibleTaskOptions } from './use-visible-task';
//
// !!DO NOT EDIT THIS COMMENT DIRECTLY!!!
@@ -28,4 +29,8 @@ import { useVisibleTaskQrl } from './use-visible-task';
* @public
*/
//
-export const useVisibleTask$ = /*#__PURE__*/ implicit$FirstArg(useVisibleTaskQrl);
+// We need to cast to help out the api extractor
+export const useVisibleTask$ = /*#__PURE__*/ implicit$FirstArg(useVisibleTaskQrl) as (
+ fn: TaskFn,
+ opts?: OnVisibleTaskOptions
+) => void;
diff --git a/packages/qwik/src/optimizer/api-extractor.json b/packages/qwik/src/optimizer/api-extractor.json
index 0d6579534f9..4a2f1d4eceb 100644
--- a/packages/qwik/src/optimizer/api-extractor.json
+++ b/packages/qwik/src/optimizer/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik/src/optimizer/src/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/optimizer/src/",
"reportTempFolder": "/../../dist-dev/api-extractor/optimizer/"
},
diff --git a/packages/qwik/src/optimizer/src/api.md b/packages/qwik/src/optimizer/src/core.api.md
similarity index 100%
rename from packages/qwik/src/optimizer/src/api.md
rename to packages/qwik/src/optimizer/src/core.api.md
diff --git a/packages/qwik/src/optimizer/src/plugins/plugin.ts b/packages/qwik/src/optimizer/src/plugins/plugin.ts
index 3be7741b473..c58c36b987e 100644
--- a/packages/qwik/src/optimizer/src/plugins/plugin.ts
+++ b/packages/qwik/src/optimizer/src/plugins/plugin.ts
@@ -80,7 +80,7 @@ export interface QwikPackages {
path: string;
}
-export function createPlugin(optimizerOptions: OptimizerOptions = {}) {
+export function createQwikPlugin(optimizerOptions: OptimizerOptions = {}) {
const id = `${Math.round(Math.random() * 899) + 100}`;
const clientResults = new Map();
@@ -107,7 +107,7 @@ export function createPlugin(optimizerOptions: OptimizerOptions = {}) {
rootDir: null as any,
tsconfigFileNames: ['./tsconfig.json'],
input: null as any,
- outDir: null as any,
+ outDir: '',
assetsDir: null as any,
resolveQwikBuild: true,
entryStrategy: null as any,
@@ -1102,6 +1102,8 @@ export interface NormalizedQwikPluginOptions
experimental?: Record;
}
+export type QwikPlugin = ReturnType;
+
/** @public */
export type QwikBuildTarget = 'client' | 'ssr' | 'lib' | 'test';
diff --git a/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts b/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts
index ce47c57d5d1..1255f59811e 100644
--- a/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts
+++ b/packages/qwik/src/optimizer/src/plugins/plugin.unit.ts
@@ -2,7 +2,7 @@ import path, { resolve } from 'node:path';
import { assert, describe, expect, test } from 'vitest';
import { normalizePath } from '../../../testing/util';
import type { QwikManifest } from '../types';
-import { ExperimentalFeatures, createPlugin } from './plugin';
+import { ExperimentalFeatures, createQwikPlugin } from './plugin';
import { qwikVite } from './vite';
import type { ResolvedId } from 'rollup';
@@ -91,6 +91,12 @@ test('debug true', async () => {
assert.deepEqual(opts.debug, true);
});
+test('csr', async () => {
+ const plugin = await mockPlugin();
+ const opts = plugin.normalizeOptions({ csr: true });
+ assert.deepEqual(opts.outDir, '');
+});
+
test('override entryStrategy', async () => {
const plugin = await mockPlugin();
const opts = plugin.normalizeOptions({
@@ -296,7 +302,7 @@ describe('resolveId', () => {
});
async function mockPlugin(os = process.platform) {
- const plugin = createPlugin({
+ const plugin = createQwikPlugin({
sys: {
cwd: () => process.cwd(),
env: 'node',
diff --git a/packages/qwik/src/optimizer/src/plugins/rollup.ts b/packages/qwik/src/optimizer/src/plugins/rollup.ts
index b47fde1bab2..71c5fad6d7b 100644
--- a/packages/qwik/src/optimizer/src/plugins/rollup.ts
+++ b/packages/qwik/src/optimizer/src/plugins/rollup.ts
@@ -11,12 +11,13 @@ import type {
} from '../types';
import { versions } from '../versions';
import {
- createPlugin,
Q_MANIFEST_FILENAME,
+ createQwikPlugin,
type ExperimentalFeatures,
type NormalizedQwikPluginOptions,
type QwikBuildMode,
type QwikBuildTarget,
+ type QwikPlugin,
type QwikPluginOptions,
} from './plugin';
@@ -27,7 +28,7 @@ type QwikRollupPluginApi = {
/** @public */
export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any {
- const qwikPlugin = createPlugin(qwikRollupOpts.optimizerOptions);
+ const qwikPlugin = createQwikPlugin(qwikRollupOpts.optimizerOptions);
const rollupPlugin: QwikRollupPlugin = {
name: 'rollup-plugin-qwik',
@@ -77,12 +78,7 @@ export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any {
},
outputOptions(rollupOutputOpts) {
- return normalizeRollupOutputOptionsObject(
- qwikPlugin.getOptions(),
- rollupOutputOpts,
- false,
- qwikPlugin.manualChunks
- );
+ return normalizeRollupOutputOptionsObject(qwikPlugin, rollupOutputOpts, false);
},
async buildStart() {
@@ -160,10 +156,9 @@ export function qwikRollup(qwikRollupOpts: QwikRollupPluginOptions = {}): any {
}
export function normalizeRollupOutputOptions(
- opts: NormalizedQwikPluginOptions,
+ qwikPlugin: QwikPlugin,
rollupOutputOpts: Rollup.OutputOptions | Rollup.OutputOptions[] | undefined,
useAssetsDir: boolean,
- manualChunks: Rollup.GetManualChunk,
outDir?: string
): Rollup.OutputOptions | Rollup.OutputOptions[] {
if (Array.isArray(rollupOutputOpts)) {
@@ -173,25 +168,26 @@ export function normalizeRollupOutputOptions(
}
return rollupOutputOpts.map((outputOptsObj) => ({
- ...normalizeRollupOutputOptionsObject(opts, outputOptsObj, useAssetsDir, manualChunks),
+ ...normalizeRollupOutputOptionsObject(qwikPlugin, outputOptsObj, useAssetsDir),
dir: outDir || outputOptsObj.dir,
}));
}
return {
- ...normalizeRollupOutputOptionsObject(opts, rollupOutputOpts, useAssetsDir, manualChunks),
+ ...normalizeRollupOutputOptionsObject(qwikPlugin, rollupOutputOpts, useAssetsDir),
dir: outDir || rollupOutputOpts?.dir,
};
}
export function normalizeRollupOutputOptionsObject(
- opts: NormalizedQwikPluginOptions,
+ qwikPlugin: QwikPlugin,
rollupOutputOptsObj: Rollup.OutputOptions | undefined,
- useAssetsDir: boolean,
- manualChunks: Rollup.GetManualChunk
+ useAssetsDir: boolean
): Rollup.OutputOptions {
const outputOpts: Rollup.OutputOptions = { ...rollupOutputOptsObj };
-
+ const opts = qwikPlugin.getOptions();
+ const optimizer = qwikPlugin.getOptimizer();
+ const manualChunks = qwikPlugin.manualChunks;
if (opts.target === 'client') {
// client output
if (!outputOpts.assetFileNames) {
@@ -201,9 +197,31 @@ export function normalizeRollupOutputOptionsObject(
? `${opts.assetsDir}/${assetFileNames}`
: assetFileNames;
}
- // Friendly name in dev or preview with debug mode
- const fileName =
- opts.buildMode == 'production' && !opts.debug ? 'build/q-[hash].js' : 'build/[name].js';
+
+ let fileName: string | ((chunkInfo: Rollup.PreRenderedChunk) => string) | undefined;
+ if (opts.buildMode === 'production' && !opts.debug) {
+ fileName = 'build/q-[hash].js';
+ } else {
+ // Friendlier names in dev or preview with debug mode
+ fileName = (chunkInfo) => {
+ if (chunkInfo.moduleIds?.some((id) => id.endsWith('core.prod.mjs'))) {
+ return 'build/core.js';
+ }
+ if (chunkInfo.moduleIds?.some((id) => id.endsWith('qwik-router/lib/index.qwik.mjs'))) {
+ return 'build/qwik-router.js';
+ }
+
+ // The chunk name can often be a path. We sanitize it to use dashes instead of slashes, to keep the same folder structure as without debug:true.
+ // Besides, Rollup doesn't accept absolute or relative paths as inputs for the [name] placeholder for the same reason.
+ const path = optimizer.sys.path;
+ const relativePath = path.relative(optimizer.sys.cwd(), chunkInfo.name);
+ const sanitized = relativePath
+ .replace(/^(\.\.\/)+/, '')
+ .replace(/^\/+/, '')
+ .replace(/\//g, '-');
+ return `build/${sanitized}.js`;
+ };
+ }
// client production output
if (!outputOpts.entryFileNames) {
outputOpts.entryFileNames = useAssetsDir ? `${opts.assetsDir}/${fileName}` : fileName;
diff --git a/packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts b/packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts
index 07b98735d87..03c9788f741 100644
--- a/packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts
+++ b/packages/qwik/src/optimizer/src/plugins/vite-dev-server.ts
@@ -89,6 +89,10 @@ export async function configureDevServer(
const hasQwikRouter = server.config.plugins?.some(
(plugin) => plugin.name === 'vite-plugin-qwik-router'
);
+
+ // to maintain css importers after HMR
+ const cssImportedByCSS = new Set();
+
// qwik middleware injected BEFORE vite internal middlewares
server.middlewares.use(async (req, res, next) => {
try {
@@ -163,12 +167,30 @@ export async function configureDevServer(
if (query === '' && CSS_EXTENSIONS.some((ext) => pathId.endsWith(ext))) {
const isEntryCSS = v.importers.size === 0;
+ const hasCSSImporter = Array.from(v.importers).some((importer) => {
+ const importerPath = (importer as typeof v).url || (importer as typeof v).file;
+
+ const isCSS =
+ importerPath && CSS_EXTENSIONS.some((ext) => importerPath.endsWith(ext));
+
+ if (isCSS && v.url) {
+ cssImportedByCSS.add(v.url);
+ }
+
+ return isCSS;
+ });
+
const hasJSImporter = Array.from(v.importers).some((importer) => {
const importerPath = (importer as typeof v).url || (importer as typeof v).file;
return importerPath && JS_EXTENSIONS.test(importerPath);
});
- if ((isEntryCSS || hasJSImporter) && !added.has(v.url)) {
+ if (
+ (isEntryCSS || hasJSImporter) &&
+ !hasCSSImporter &&
+ !cssImportedByCSS.has(v.url) &&
+ !added.has(v.url)
+ ) {
added.add(v.url);
manifest.injections!.push({
tag: 'link',
@@ -218,12 +240,29 @@ export async function configureDevServer(
CSS_EXTENSIONS.some((ext) => pathId.endsWith(ext))
) {
const isEntryCSS = v.importers.size === 0;
+ const hasCSSImporter = Array.from(v.importers).some((importer) => {
+ const importerPath = (importer as typeof v).url || (importer as typeof v).file;
+
+ const isCSS =
+ importerPath && CSS_EXTENSIONS.some((ext) => importerPath.endsWith(ext));
+
+ if (isCSS && v.url) {
+ cssImportedByCSS.add(v.url);
+ }
+
+ return isCSS;
+ });
+
const hasJSImporter = Array.from(v.importers).some((importer) => {
const importerPath = (importer as typeof v).url || (importer as typeof v).file;
return importerPath && JS_EXTENSIONS.test(importerPath);
});
- if (isEntryCSS || hasJSImporter) {
+ if (
+ (isEntryCSS || hasJSImporter) &&
+ !hasCSSImporter &&
+ !cssImportedByCSS.has(v.url)
+ ) {
res.write(` `);
added.add(v.url);
}
diff --git a/packages/qwik/src/optimizer/src/plugins/vite.ts b/packages/qwik/src/optimizer/src/plugins/vite.ts
index 12b1fdcbce6..90009902ed7 100644
--- a/packages/qwik/src/optimizer/src/plugins/vite.ts
+++ b/packages/qwik/src/optimizer/src/plugins/vite.ts
@@ -26,7 +26,7 @@ import {
Q_MANIFEST_FILENAME,
SSR_OUT_DIR,
TRANSFORM_REGEX,
- createPlugin,
+ createQwikPlugin,
parseId,
type ExperimentalFeatures,
type NormalizedQwikPluginOptions,
@@ -75,7 +75,7 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any {
? (id, type) => TRANSFORM_REGEX.test(id) || qwikViteOpts.fileFilter!(id, type)
: () => true;
const injections: GlobalInjections[] = [];
- const qwikPlugin = createPlugin(qwikViteOpts.optimizerOptions);
+ const qwikPlugin = createQwikPlugin(qwikViteOpts.optimizerOptions);
async function loadQwikInsights(clientOutDir = ''): Promise {
const sys = qwikPlugin.getSys();
@@ -381,10 +381,9 @@ export function qwikVite(qwikViteOpts: QwikVitePluginOptions = {}): any {
updatedViteConfig.build!.rollupOptions = {
input: opts.input,
output: normalizeRollupOutputOptions(
- opts,
+ qwikPlugin,
viteConfig.build?.rollupOptions?.output,
useAssetsDir,
- qwikPlugin.manualChunks,
buildOutputDir
),
preserveEntrySignatures: 'exports-only',
diff --git a/packages/qwik/src/optimizer/src/plugins/vite.unit.ts b/packages/qwik/src/optimizer/src/plugins/vite.unit.ts
index 1d4760004e1..2c5973ea1cb 100644
--- a/packages/qwik/src/optimizer/src/plugins/vite.unit.ts
+++ b/packages/qwik/src/optimizer/src/plugins/vite.unit.ts
@@ -12,6 +12,29 @@ import {
const cwd = process.cwd();
+const chunkInfoMocks: Rollup.PreRenderedChunk[] = [
+ {
+ exports: [''],
+ name: 'chunk.tsx',
+ facadeModuleId: 'chunk.tsx',
+ isDynamicEntry: false,
+ isEntry: false,
+ isImplicitEntry: false,
+ moduleIds: ['chunk.tsx'],
+ type: 'chunk',
+ },
+ {
+ exports: [''],
+ name: cwd + '/app/chunk.tsx',
+ facadeModuleId: cwd + '/app/chunk.tsx',
+ isDynamicEntry: false,
+ isEntry: false,
+ isImplicitEntry: false,
+ moduleIds: [cwd + '/app/chunk.tsx'],
+ type: 'chunk',
+ },
+];
+
function mockOptimizerOptions(): OptimizerOptions {
return {
sys: {
@@ -61,6 +84,12 @@ test('command: serve, mode: development', async () => {
const build = c.build!;
const rollupOptions = build!.rollupOptions!;
const outputOptions = rollupOptions.output as Rollup.OutputOptions;
+ const chunkFileNames = outputOptions.chunkFileNames as (
+ chunkInfo: Rollup.PreRenderedChunk
+ ) => string;
+ const entryFileNames = outputOptions.entryFileNames as (
+ chunkInfo: Rollup.PreRenderedChunk
+ ) => string;
assert.deepEqual(opts.target, 'client');
assert.deepEqual(opts.buildMode, 'development');
@@ -71,8 +100,10 @@ test('command: serve, mode: development', async () => {
assert.deepEqual(rollupOptions.input, normalizePath(resolve(cwd, 'src', 'entry.dev')));
assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]');
- assert.deepEqual(outputOptions.chunkFileNames, 'build/[name].js');
- assert.deepEqual(outputOptions.entryFileNames, 'build/[name].js');
+ assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
+ assert.deepEqual(entryFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
+ assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
+ assert.deepEqual(entryFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
assert.deepEqual(outputOptions.format, 'es');
assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]);
@@ -131,6 +162,12 @@ test('command: build, mode: development', async () => {
const build = c.build!;
const rollupOptions = build!.rollupOptions!;
const outputOptions = rollupOptions.output as Rollup.OutputOptions;
+ const chunkFileNames = outputOptions.chunkFileNames as (
+ chunkInfo: Rollup.PreRenderedChunk
+ ) => string;
+ const entryFileNames = outputOptions.entryFileNames as (
+ chunkInfo: Rollup.PreRenderedChunk
+ ) => string;
assert.deepEqual(opts.target, 'client');
assert.deepEqual(opts.buildMode, 'development');
@@ -144,8 +181,10 @@ test('command: build, mode: development', async () => {
assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]);
assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]');
- assert.deepEqual(outputOptions.chunkFileNames, 'build/[name].js');
- assert.deepEqual(outputOptions.entryFileNames, 'build/[name].js');
+ assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
+ assert.deepEqual(entryFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
+ assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
+ assert.deepEqual(entryFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]);
assert.deepEqual(build.ssr, undefined);
diff --git a/packages/qwik/src/server/api-extractor.json b/packages/qwik/src/server/api-extractor.json
index 4515aa8972b..467bf17a04c 100644
--- a/packages/qwik/src/server/api-extractor.json
+++ b/packages/qwik/src/server/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "../../dist-dev/dts-out/packages/qwik/src/server/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/server/",
"reportTempFolder": "../../dist-dev/api-extractor/server/"
},
diff --git a/packages/qwik/src/server/api.md b/packages/qwik/src/server/core.api.md
similarity index 100%
rename from packages/qwik/src/server/api.md
rename to packages/qwik/src/server/core.api.md
diff --git a/packages/qwik/src/testing/api-extractor.json b/packages/qwik/src/testing/api-extractor.json
index 765fc2f078c..fd611574a99 100644
--- a/packages/qwik/src/testing/api-extractor.json
+++ b/packages/qwik/src/testing/api-extractor.json
@@ -4,7 +4,6 @@
"mainEntryPointFilePath": "/../../dist-dev/dts-out/packages/qwik/src/testing/index.d.ts",
"apiReport": {
"enabled": true,
- "reportFileName": "api.md",
"reportFolder": "/src/testing/",
"reportTempFolder": "/../../dist-dev/api-extractor/testing/"
},
diff --git a/packages/qwik/src/testing/api.md b/packages/qwik/src/testing/core.api.md
similarity index 100%
rename from packages/qwik/src/testing/api.md
rename to packages/qwik/src/testing/core.api.md
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4677d30b676..94a963ad6c3 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5,7 +5,7 @@ settings:
excludeLinksFromLockfile: false
overrides:
- typescript: 5.4.5
+ typescript: 5.8.2
vfile: 6.0.2
'@supabase/realtime-js': 2.8.4
@@ -44,11 +44,11 @@ importers:
specifier: 3.0.1
version: 3.0.1
'@microsoft/api-documenter':
- specifier: 7.24.2
- version: 7.24.2(@types/node@20.14.11)
+ specifier: 7.26.17
+ version: 7.26.17(@types/node@20.14.11)
'@microsoft/api-extractor':
- specifier: 7.43.1
- version: 7.43.1(@types/node@20.14.11)
+ specifier: 7.52.1
+ version: 7.52.1(@types/node@20.14.11)
'@napi-rs/cli':
specifier: 2.18.4
version: 2.18.4
@@ -108,10 +108,10 @@ importers:
version: 1.0.2
'@typescript-eslint/eslint-plugin':
specifier: 7.16.1
- version: 7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)
+ version: 7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.8.2))(eslint@8.57.0)(typescript@5.8.2)
'@typescript-eslint/parser':
specifier: 7.16.1
- version: 7.16.1(eslint@8.57.0)(typescript@5.4.5)
+ version: 7.16.1(eslint@8.57.0)(typescript@5.8.2)
'@vitest/coverage-v8':
specifier: 3.0.8
version: 3.0.8(vitest@3.0.8(@types/debug@4.1.12)(@types/node@20.14.11)(terser@5.37.0))
@@ -144,7 +144,7 @@ importers:
version: 8.57.0
eslint-plugin-import:
specifier: 2.29.1
- version: 2.29.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)
+ version: 2.29.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.8.2))(eslint@8.57.0)
eslint-plugin-no-only-tests:
specifier: 3.1.0
version: 3.1.0
@@ -204,7 +204,7 @@ importers:
version: 3.3.2
syncpack:
specifier: 12.3.3
- version: 12.3.3(typescript@5.4.5)
+ version: 12.3.3(typescript@5.8.2)
terser:
specifier: 5.37.0
version: 5.37.0
@@ -218,8 +218,8 @@ importers:
specifier: 4.19.2
version: 4.19.2
typescript:
- specifier: 5.4.5
- version: 5.4.5
+ specifier: 5.8.2
+ version: 5.8.2
vfile:
specifier: 6.0.2
version: 6.0.2
@@ -231,10 +231,10 @@ importers:
version: 7.0.4(rollup@4.24.2)
vite-plugin-dts:
specifier: 4.3.0
- version: 4.3.0(@types/node@20.14.11)(rollup@4.24.2)(typescript@5.4.5)(vite@5.4.10(@types/node@20.14.11)(terser@5.37.0))
+ version: 4.3.0(@types/node@20.14.11)(rollup@4.24.2)(typescript@5.8.2)(vite@5.4.10(@types/node@20.14.11)(terser@5.37.0))
vite-tsconfig-paths:
- specifier: 5.0.1
- version: 5.0.1(typescript@5.4.5)(vite@5.4.10(@types/node@20.14.11)(terser@5.37.0))
+ specifier: 5.1.4
+ version: 5.1.4(typescript@5.8.2)(vite@5.4.10(@types/node@20.14.11)(terser@5.37.0))
vitest:
specifier: 3.0.8
version: 3.0.8(@types/debug@4.1.12)(@types/node@20.14.11)(terser@5.37.0)
@@ -322,6 +322,18 @@ importers:
'@qwik.dev/router':
specifier: workspace:*
version: link:../qwik-router
+ '@shikijs/colorized-brackets':
+ specifier: 3.1.0
+ version: 3.1.0
+ '@shikijs/rehype':
+ specifier: 3.1.0
+ version: 3.1.0
+ '@shikijs/transformers':
+ specifier: 3.1.0
+ version: 3.1.0
+ '@shikijs/types':
+ specifier: 3.1.0
+ version: 3.1.0
'@supabase/supabase-js':
specifier: 2.44.4
version: 2.44.4
@@ -378,7 +390,7 @@ importers:
version: 1.29.0
puppeteer:
specifier: 22.13.1
- version: 22.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)
+ version: 22.13.1(bufferutil@4.0.8)(typescript@5.8.2)(utf-8-validate@5.0.10)
qwik-image:
specifier: 0.0.16
version: 0.0.16
@@ -388,18 +400,15 @@ importers:
react-dom:
specifier: 18.3.1
version: 18.3.1(react@18.3.1)
- rehype-pretty-code:
- specifier: 0.14.0
- version: 0.14.0(shiki@1.29.1)
shiki:
- specifier: 1.29.1
- version: 1.29.1
+ specifier: 3.1.0
+ version: 3.1.0
snarkdown:
specifier: 2.0.0
version: 2.0.0
tailwindcss:
specifier: 3.4.6
- version: 3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.4.5))
+ version: 3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.8.2))
terser:
specifier: 5.37.0
version: 5.37.0
@@ -407,8 +416,8 @@ importers:
specifier: 2.3.0
version: 2.3.0
typescript:
- specifier: 5.4.5
- version: 5.4.5
+ specifier: 5.8.2
+ version: 5.8.2
undici:
specifier: '*'
version: 6.18.2
@@ -429,7 +438,7 @@ importers:
dependencies:
'@typescript-eslint/utils':
specifier: ^8.12.2
- version: 8.14.0(eslint@8.57.0)(typescript@5.4.5)
+ version: 8.14.0(eslint@8.57.0)(typescript@5.8.2)
jsx-ast-utils:
specifier: ^3.3.5
version: 3.3.5
@@ -448,7 +457,7 @@ importers:
version: 1.0.5
'@typescript-eslint/rule-tester':
specifier: 8.14.0
- version: 8.14.0(eslint@8.57.0)(typescript@5.4.5)
+ version: 8.14.0(eslint@8.57.0)(typescript@5.8.2)
redent:
specifier: 4.0.0
version: 4.0.0
@@ -503,10 +512,10 @@ importers:
version: 20.14.11
'@typescript-eslint/eslint-plugin':
specifier: 7.16.1
- version: 7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)
+ version: 7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.8.2))(eslint@8.57.0)(typescript@5.8.2)
'@typescript-eslint/parser':
specifier: 7.16.1
- version: 7.16.1(eslint@8.57.0)(typescript@5.4.5)
+ version: 7.16.1(eslint@8.57.0)(typescript@5.8.2)
autoprefixer:
specifier: 10.4.19
version: 10.4.19(postcss@8.4.39)
@@ -533,10 +542,10 @@ importers:
version: 0.5.14(prettier-plugin-jsdoc@1.3.2(prettier@3.4.2))(prettier@3.4.2)
tailwindcss:
specifier: 3.4.6
- version: 3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.4.5))
+ version: 3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.8.2))
typescript:
- specifier: 5.4.5
- version: 5.4.5
+ specifier: 5.8.2
+ version: 5.8.2
undici:
specifier: '*'
version: 6.18.2
@@ -544,8 +553,8 @@ importers:
specifier: 5.4.10
version: 5.4.10(@types/node@20.14.11)(terser@5.37.0)
vite-tsconfig-paths:
- specifier: 5.0.1
- version: 5.0.1(typescript@5.4.5)(vite@5.4.10(@types/node@20.14.11)(terser@5.37.0))
+ specifier: 5.1.4
+ version: 5.1.4(typescript@5.8.2)(vite@5.4.10(@types/node@20.14.11)(terser@5.37.0))
vitest:
specifier: 3.0.8
version: 3.0.8(@types/debug@4.1.12)(@types/node@20.14.11)(terser@5.37.0)
@@ -604,8 +613,8 @@ importers:
specifier: 18.3.1
version: 18.3.1(react@18.3.1)
typescript:
- specifier: 5.4.5
- version: 5.4.5
+ specifier: 5.8.2
+ version: 5.8.2
vite:
specifier: 5.4.10
version: 5.4.10(@types/node@20.14.11)(terser@5.37.0)
@@ -629,7 +638,7 @@ importers:
version: 6.18.2
valibot:
specifier: '>=0.36.0 <2'
- version: 0.42.1(typescript@5.4.5)
+ version: 0.42.1(typescript@5.8.2)
vfile:
specifier: 6.0.2
version: 6.0.2
@@ -647,8 +656,8 @@ importers:
specifier: 3.5.1
version: 3.5.1
'@microsoft/api-extractor':
- specifier: 7.43.1
- version: 7.43.1(@types/node@20.14.11)
+ specifier: 7.52.1
+ version: 7.52.1(@types/node@20.14.11)
'@netlify/edge-functions':
specifier: 2.10.0
version: 2.10.0
@@ -707,8 +716,8 @@ importers:
specifier: 2.3.0
version: 2.3.0
typescript:
- specifier: 5.4.5
- version: 5.4.5
+ specifier: 5.8.2
+ version: 5.8.2
unified:
specifier: 11.0.5
version: 11.0.5
@@ -846,18 +855,10 @@ packages:
resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==}
engines: {node: '>=6.9.0'}
- '@babel/helper-string-parser@7.24.8':
- resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
- engines: {node: '>=6.9.0'}
-
'@babel/helper-string-parser@7.25.9':
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-identifier@7.24.7':
- resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
- engines: {node: '>=6.9.0'}
-
'@babel/helper-validator-identifier@7.25.9':
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
@@ -866,11 +867,6 @@ packages:
resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==}
engines: {node: '>=6.9.0'}
- '@babel/parser@7.24.6':
- resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
'@babel/parser@7.26.10':
resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==}
engines: {node: '>=6.0.0'}
@@ -1047,7 +1043,6 @@ packages:
'@effect/schema@0.66.5':
resolution: {integrity: sha512-xfu5161JyrfAS1Ruwv0RXd4QFiCALbm3iu9nlW9N9K+52wbS0WdO6XUekPZ9V/O7LN+XmlIh5Y9xhJaIWCZ/gw==}
- deprecated: this package has been merged into the main effect package
peerDependencies:
effect: ^3.0.3
fast-check: ^3.13.2
@@ -2558,35 +2553,22 @@ packages:
'@mdx-js/mdx@3.0.1':
resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==}
- '@microsoft/api-documenter@7.24.2':
- resolution: {integrity: sha512-q03DXLBj7nzAzLyLRAVklBynqKgSFI/JBmrhF/mEEIpg8orNo4qKXWO1RSkD2IYrqvZV63b13mcUPYgcFdifQA==}
+ '@microsoft/api-documenter@7.26.17':
+ resolution: {integrity: sha512-LOS9U6EJVpejN0vNXFBPdbRW9D2bPJI8FYfLGSaEeiqPfMBlH5QYLKt+OaJomx72uj9Ei6/W49mftK/c+UGPjg==}
hasBin: true
- '@microsoft/api-extractor-model@7.28.14':
- resolution: {integrity: sha512-Bery/c8A8SsKPSvA82cTTuy/+OcxZbLRmKhPkk91/AJOQzxZsShcrmHFAGeiEqSIrv1nPZ3tKq9kfMLdCHmsqg==}
-
- '@microsoft/api-extractor-model@7.29.8':
- resolution: {integrity: sha512-t3Z/xcO6TRbMcnKGVMs4uMzv/gd5j0NhMiJIGjD4cJMeFJ1Hf8wnLSx37vxlRlL0GWlGJhnFgxvnaL6JlS+73g==}
+ '@microsoft/api-extractor-model@7.30.4':
+ resolution: {integrity: sha512-RobC0gyVYsd2Fao9MTKOfTdBm41P/bCMUmzS5mQ7/MoAKEqy0FOBph3JOYdq4X4BsEnMEiSHc+0NUNmdzxCpjA==}
- '@microsoft/api-extractor@7.43.1':
- resolution: {integrity: sha512-ohg40SsvFFgzHFAtYq5wKJc8ZDyY46bphjtnSvhSSlXpPTG7GHwyyXkn48UZiUCBwr2WC7TRC1Jfwz7nreuiyQ==}
+ '@microsoft/api-extractor@7.52.1':
+ resolution: {integrity: sha512-m3I5uAwE05orsu3D1AGyisX5KxsgVXB+U4bWOOaX/Z7Ftp/2Cy41qsNhO6LPvSxHBaapyser5dVorF1t5M6tig==}
hasBin: true
- '@microsoft/api-extractor@7.47.11':
- resolution: {integrity: sha512-lrudfbPub5wzBhymfFtgZKuBvXxoSIAdrvS2UbHjoMT2TjIEddq6Z13pcve7A03BAouw0x8sW8G4txdgfiSwpQ==}
- hasBin: true
-
- '@microsoft/tsdoc-config@0.16.2':
- resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==}
-
- '@microsoft/tsdoc-config@0.17.0':
- resolution: {integrity: sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==}
+ '@microsoft/tsdoc-config@0.17.1':
+ resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==}
- '@microsoft/tsdoc@0.14.2':
- resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==}
-
- '@microsoft/tsdoc@0.15.0':
- resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==}
+ '@microsoft/tsdoc@0.15.1':
+ resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==}
'@modular-forms/qwik@0.23.1':
resolution: {integrity: sha512-oiXMdbH0HNotc9LMUwoEwZSJkY7/SObyQCgAZHsAPIQOyQrDhG2W8rEJVy0zFtSOCxk6NZjLiMcXfcI5glKU8A==}
@@ -3187,67 +3169,54 @@ packages:
cpu: [x64]
os: [win32]
- '@rushstack/node-core-library@4.1.0':
- resolution: {integrity: sha512-qz4JFBZJCf1YN5cAXa1dP6Mki/HrsQxc/oYGAGx29dF2cwF2YMxHoly0FBhMw3IEnxo5fMj0boVfoHVBkpkx/w==}
- peerDependencies:
- '@types/node': '*'
- peerDependenciesMeta:
- '@types/node':
- optional: true
-
- '@rushstack/node-core-library@5.9.0':
- resolution: {integrity: sha512-MMsshEWkTbXqxqFxD4gcIUWQOCeBChlGczdZbHfqmNZQFLHB3yWxDFSMHFUdu2/OB9NUk7Awn5qRL+rws4HQNg==}
+ '@rushstack/node-core-library@5.12.0':
+ resolution: {integrity: sha512-QSwwzgzWoil1SCQse+yCHwlhRxNv2dX9siPnAb9zR/UmMhac4mjMrlMZpk64BlCeOFi1kJKgXRkihSwRMbboAQ==}
peerDependencies:
'@types/node': '*'
peerDependenciesMeta:
'@types/node':
optional: true
- '@rushstack/rig-package@0.5.2':
- resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==}
-
'@rushstack/rig-package@0.5.3':
resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==}
- '@rushstack/terminal@0.10.1':
- resolution: {integrity: sha512-C6Vi/m/84IYJTkfzmXr1+W8Wi3MmBjVF/q3za91Gb3VYjKbpALHVxY6FgH625AnDe5Z0Kh4MHKWA3Z7bqgAezA==}
+ '@rushstack/terminal@0.15.1':
+ resolution: {integrity: sha512-3vgJYwumcjoDOXU3IxZfd616lqOdmr8Ezj4OWgJZfhmiBK4Nh7eWcv8sU8N/HdzXcuHDXCRGn/6O2Q75QvaZMA==}
peerDependencies:
'@types/node': '*'
peerDependenciesMeta:
'@types/node':
optional: true
- '@rushstack/terminal@0.14.2':
- resolution: {integrity: sha512-2fC1wqu1VCExKC0/L+0noVcFQEXEnoBOtCIex1TOjBzEDWcw8KzJjjj7aTP6mLxepG0XIyn9OufeFb6SFsa+sg==}
- peerDependencies:
- '@types/node': '*'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@rushstack/ts-command-line@4.23.6':
+ resolution: {integrity: sha512-7WepygaF3YPEoToh4MAL/mmHkiIImQq3/uAkQX46kVoKTNOOlCtFGyNnze6OYuWw2o9rxsyrHVfIBKxq/am2RA==}
- '@rushstack/ts-command-line@4.19.2':
- resolution: {integrity: sha512-cqmXXmBEBlzo9WtyUrHtF9e6kl0LvBY7aTSVX4jfnBfXWZQWnPq9JTFPlQZ+L/ZwjZ4HrNwQsOVvhe9oOucZkw==}
+ '@shikijs/colorized-brackets@3.1.0':
+ resolution: {integrity: sha512-1LVQQGcUFEwkRUaJUmsgtrsfzM08LfXXnlzudZHiH+WdRmzi6BGa4QlRPDhBGAYpNvXnKOLVvf67x57o98o1PA==}
- '@rushstack/ts-command-line@4.23.0':
- resolution: {integrity: sha512-jYREBtsxduPV6ptNq8jOKp9+yx0ld1Tb/Tkdnlj8gTjazl1sF3DwX2VbluyYrNd0meWIL0bNeer7WDf5tKFjaQ==}
+ '@shikijs/core@3.1.0':
+ resolution: {integrity: sha512-1ppAOyg3F18N8Ge9DmJjGqRVswihN33rOgPovR6gUHW17Hw1L4RlRhnmVQcsacSHh0A8IO1FIgNbtTxUFwodmg==}
- '@shikijs/core@1.29.1':
- resolution: {integrity: sha512-Mo1gGGkuOYjDu5H8YwzmOuly9vNr8KDVkqj9xiKhhhFS8jisAtDSEWB9hzqRHLVQgFdA310e8XRJcW4tYhRB2A==}
+ '@shikijs/engine-javascript@3.1.0':
+ resolution: {integrity: sha512-/LwkhW17jYi7uPcdaaSQQDNW+xgrHXarkrxYPoC6WPzH2xW5mFMw12doHXJBqxmYvtcTbaatcv2MkH9+3PU1FA==}
- '@shikijs/engine-javascript@1.29.1':
- resolution: {integrity: sha512-Hpi8k9x77rCQ7F/7zxIOUruNkNidMyBnP5qAGbLFqg4kRrg1HZhkB8btib5EXbQWTtLb5gBHOdBwshk20njD7Q==}
+ '@shikijs/engine-oniguruma@3.1.0':
+ resolution: {integrity: sha512-reRgy8VzDPdiDocuGDD60Rk/jLxgcgy+6H4n6jYLeN2Yw5ikasRjQQx8ERXtDM35yg2v/d6KolDBcK8hYYhcmw==}
- '@shikijs/engine-oniguruma@1.29.1':
- resolution: {integrity: sha512-gSt2WhLNgEeLstcweQOSp+C+MhOpTsgdNXRqr3zP6M+BUBZ8Md9OU2BYwUYsALBxHza7hwaIWtFHjQ/aOOychw==}
+ '@shikijs/langs@3.1.0':
+ resolution: {integrity: sha512-hAM//sExPXAXG3ZDWjrmV6Vlw4zlWFOcT1ZXNhFRBwPP27scZu/ZIdZ+TdTgy06zSvyF4KIjnF8j6+ScKGu6ww==}
- '@shikijs/langs@1.29.1':
- resolution: {integrity: sha512-iERn4HlyuT044/FgrvLOaZgKVKf3PozjKjyV/RZ5GnlyYEAZFcgwHGkYboeBv2IybQG1KVS/e7VGgiAU4JY2Gw==}
+ '@shikijs/rehype@3.1.0':
+ resolution: {integrity: sha512-snfifm4fwSmkCbUUHrpgHP2F8oPWP6WUQOJrh+k0aQazqv2a0jYLLXs2mK1Y1w/JfQ/NnKNbRUmZQqS9zxTXGw==}
- '@shikijs/themes@1.29.1':
- resolution: {integrity: sha512-lb11zf72Vc9uxkl+aec2oW1HVTHJ2LtgZgumb4Rr6By3y/96VmlU44bkxEb8WBWH3RUtbqAJEN0jljD9cF7H7g==}
+ '@shikijs/themes@3.1.0':
+ resolution: {integrity: sha512-A4MJmy9+ydLNbNCtkmdTp8a+ON+MMXoUe1KTkELkyu0+pHGOcbouhNuobhZoK59cL4cOST6CCz1x+kUdkp9UZA==}
- '@shikijs/types@1.29.1':
- resolution: {integrity: sha512-aBqAuhYRp5vSir3Pc9+QPu9WESBOjUo03ao0IHLC4TyTioSsp/SkbAZSrIH4ghYYC1T1KTEpRSBa83bas4RnPA==}
+ '@shikijs/transformers@3.1.0':
+ resolution: {integrity: sha512-Et+agcilvJOmWh/goUczrdM6R35JrEr8B8xZxJVv6rCIpUo2rICtWZF4YBUIILx5mV78455EcYyFPCrk3lJ+nw==}
+
+ '@shikijs/types@3.1.0':
+ resolution: {integrity: sha512-F8e7Fy4ihtcNpJG572BZZC1ErYrBrzJ5Cbc9Zi3REgWry43gIvjJ9lFAoUnuy7Bvy4IFz7grUSxL5edfrrjFEA==}
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
@@ -3711,7 +3680,7 @@ packages:
'@vue/language-core@2.1.6':
resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==}
peerDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
peerDependenciesMeta:
typescript:
optional: true
@@ -4504,8 +4473,8 @@ packages:
resolution: {integrity: sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==}
engines: {node: '>=18'}
- consola@3.4.0:
- resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==}
+ consola@3.4.2:
+ resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
engines: {node: ^14.18.0 || >=16.10.0}
console-control-strings@1.1.0:
@@ -4555,7 +4524,7 @@ packages:
resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
engines: {node: '>=14'}
peerDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
peerDependenciesMeta:
typescript:
optional: true
@@ -5804,8 +5773,8 @@ packages:
fs-constants@1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
- fs-extra@11.2.0:
- resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
+ fs-extra@11.3.0:
+ resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==}
engines: {node: '>=14.14'}
fs-extra@7.0.1:
@@ -6059,12 +6028,6 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
- hast-util-from-html@2.0.1:
- resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==}
-
- hast-util-from-parse5@8.0.1:
- resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
-
hast-util-heading-rank@2.1.1:
resolution: {integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==}
@@ -6077,9 +6040,6 @@ packages:
hast-util-parse-selector@3.1.1:
resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==}
- hast-util-parse-selector@4.0.0:
- resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
-
hast-util-to-estree@3.1.0:
resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==}
@@ -6092,8 +6052,8 @@ packages:
hast-util-to-string@2.0.0:
resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==}
- hast-util-to-string@3.0.0:
- resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==}
+ hast-util-to-string@3.0.1:
+ resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==}
hast-util-whitespace@3.0.0:
resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
@@ -6101,9 +6061,6 @@ packages:
hastscript@7.2.0:
resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==}
- hastscript@8.0.0:
- resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
-
he@1.2.0:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
@@ -6334,8 +6291,9 @@ packages:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
- is-core-module@2.13.1:
- resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
is-data-view@1.0.1:
resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
@@ -6785,10 +6743,6 @@ packages:
lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
- lodash.get@4.4.2:
- resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
- deprecated: This package is deprecated. Use the optional chaining (?.) operator instead.
-
lodash.includes@4.3.0:
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
@@ -6798,10 +6752,6 @@ packages:
lodash.isempty@4.4.0:
resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==}
- lodash.isequal@4.5.0:
- resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
- deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
-
lodash.isinteger@4.0.4:
resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==}
@@ -7525,8 +7475,8 @@ packages:
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
engines: {node: '>=18'}
- oniguruma-to-es@2.3.0:
- resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==}
+ oniguruma-to-es@3.1.1:
+ resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==}
open@10.1.0:
resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==}
@@ -7709,12 +7659,6 @@ packages:
resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==}
engines: {node: '>=12'}
- parse-numeric-range@1.3.0:
- resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==}
-
- parse5@7.1.2:
- resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
-
parseurl@1.3.3:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
@@ -8251,14 +8195,14 @@ packages:
regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
- regex-recursion@5.1.1:
- resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==}
+ regex-recursion@6.0.2:
+ resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
regex-utilities@2.3.0:
resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
- regex@5.1.1:
- resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==}
+ regex@6.0.1:
+ resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==}
regexp.prototype.flags@1.5.2:
resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
@@ -8275,15 +8219,6 @@ packages:
rehype-autolink-headings@7.1.0:
resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==}
- rehype-parse@9.0.0:
- resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==}
-
- rehype-pretty-code@0.14.0:
- resolution: {integrity: sha512-hBeKF/Wkkf3zyUS8lal9RCUuhypDWLQc+h9UrP9Pav25FUm/AQAVh4m5gdvJxh4Oz+U+xKvdsV01p1LdvsZTiQ==}
- engines: {node: '>=18'}
- peerDependencies:
- shiki: ^1.3.0
-
remark-frontmatter@5.0.0:
resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==}
@@ -8347,11 +8282,9 @@ packages:
resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==}
engines: {node: '>=10'}
- resolve@1.19.0:
- resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==}
-
- resolve@1.22.8:
- resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ resolve@1.22.10:
+ resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+ engines: {node: '>= 0.4'}
hasBin: true
resolve@2.0.0-next.5:
@@ -8564,8 +8497,8 @@ packages:
shell-quote@1.8.1:
resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
- shiki@1.29.1:
- resolution: {integrity: sha512-TghWKV9pJTd/N+IgAIVJtr0qZkB7FfFCUrrEJc0aRmZupo3D1OCVRknQWVRVA7AX/M0Ld7QfoAruPzr3CnUJuw==}
+ shiki@3.1.0:
+ resolution: {integrity: sha512-LdTNyWQlC5zdCaHdcp1zPA1OVA2ivb+KjGOOnGcy02tGaF5ja+dGibWFH7Ar8YlngUgK/scDqworK18Ys9cbYA==}
side-channel@1.0.6:
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
@@ -9101,7 +9034,7 @@ packages:
resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
engines: {node: '>=16'}
peerDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
@@ -9116,7 +9049,7 @@ packages:
'@swc/core': '>=1.2.50'
'@swc/wasm': '>=1.2.50'
'@types/node': '*'
- typescript: 5.4.5
+ typescript: 5.8.2
peerDependenciesMeta:
'@swc/core':
optional: true
@@ -9126,12 +9059,12 @@ packages:
ts-toolbelt@9.6.0:
resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==}
- tsconfck@3.1.0:
- resolution: {integrity: sha512-CMjc5zMnyAjcS9sPLytrbFmj89st2g+JYtY/c02ug4Q+CZaAtCgbyviI0n1YvjZE/pzoc6FbNsINS13DOL1B9w==}
+ tsconfck@3.1.5:
+ resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==}
engines: {node: ^18 || >=20}
hasBin: true
peerDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
peerDependenciesMeta:
typescript:
optional: true
@@ -9154,7 +9087,7 @@ packages:
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
engines: {node: '>= 6'}
peerDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
tsx@4.19.2:
resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
@@ -9218,8 +9151,8 @@ packages:
typedarray-to-buffer@3.1.5:
resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
- typescript@5.4.5:
- resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==}
+ typescript@5.8.2:
+ resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==}
engines: {node: '>=14.17'}
hasBin: true
@@ -9425,7 +9358,7 @@ packages:
valibot@0.42.1:
resolution: {integrity: sha512-3keXV29Ar5b//Hqi4MbSdV7lfVp6zuYLZuA9V1PvQUsXqogr+u5lvLPLk3A4f74VUXDnf/JfWMN6sB+koJ/FFw==}
peerDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
peerDependenciesMeta:
typescript:
optional: true
@@ -9441,17 +9374,10 @@ packages:
resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- validator@13.12.0:
- resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==}
- engines: {node: '>= 0.10'}
-
vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
- vfile-location@5.0.2:
- resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==}
-
vfile-message@4.0.2:
resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
@@ -9476,7 +9402,7 @@ packages:
resolution: {integrity: sha512-LkBJh9IbLwL6/rxh0C1/bOurDrIEmRE7joC+jFdOEEciAFPbpEKOLSAr5nNh5R7CJ45cMbksTrFfy52szzC5eA==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
vite: '*'
peerDependenciesMeta:
vite:
@@ -9492,8 +9418,8 @@ packages:
'@nuxt/kit':
optional: true
- vite-tsconfig-paths@5.0.1:
- resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==}
+ vite-tsconfig-paths@5.1.4:
+ resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==}
peerDependencies:
vite: '*'
peerDependenciesMeta:
@@ -9600,9 +9526,6 @@ packages:
engines: {node: '>=8'}
hasBin: true
- web-namespaces@2.0.1:
- resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
-
web-streams-polyfill@3.3.3:
resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
engines: {node: '>= 8'}
@@ -9825,11 +9748,6 @@ packages:
youch@3.3.3:
resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==}
- z-schema@5.0.5:
- resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==}
- engines: {node: '>=8.0.0'}
- hasBin: true
-
zip-stream@6.0.1:
resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==}
engines: {node: '>= 14'}
@@ -9977,14 +9895,10 @@ snapshots:
'@babel/helper-module-imports@7.24.6':
dependencies:
- '@babel/types': 7.25.6
-
- '@babel/helper-string-parser@7.24.8': {}
+ '@babel/types': 7.26.10
'@babel/helper-string-parser@7.25.9': {}
- '@babel/helper-validator-identifier@7.24.7': {}
-
'@babel/helper-validator-identifier@7.25.9': {}
'@babel/highlight@7.24.6':
@@ -9994,10 +9908,6 @@ snapshots:
js-tokens: 4.0.0
picocolors: 1.1.1
- '@babel/parser@7.24.6':
- dependencies:
- '@babel/types': 7.25.6
-
'@babel/parser@7.26.10':
dependencies:
'@babel/types': 7.26.10
@@ -10008,8 +9918,8 @@ snapshots:
'@babel/types@7.25.6':
dependencies:
- '@babel/helper-string-parser': 7.24.8
- '@babel/helper-validator-identifier': 7.24.7
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
to-fast-properties: 2.0.0
'@babel/types@7.26.10':
@@ -11308,87 +11218,52 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@microsoft/api-documenter@7.24.2(@types/node@20.14.11)':
+ '@microsoft/api-documenter@7.26.17(@types/node@20.14.11)':
dependencies:
- '@microsoft/api-extractor-model': 7.28.14(@types/node@20.14.11)
- '@microsoft/tsdoc': 0.14.2
- '@rushstack/node-core-library': 4.1.0(@types/node@20.14.11)
- '@rushstack/terminal': 0.10.1(@types/node@20.14.11)
- '@rushstack/ts-command-line': 4.19.2(@types/node@20.14.11)
+ '@microsoft/api-extractor-model': 7.30.4(@types/node@20.14.11)
+ '@microsoft/tsdoc': 0.15.1
+ '@rushstack/node-core-library': 5.12.0(@types/node@20.14.11)
+ '@rushstack/terminal': 0.15.1(@types/node@20.14.11)
+ '@rushstack/ts-command-line': 4.23.6(@types/node@20.14.11)
js-yaml: 3.13.1
- resolve: 1.22.8
- transitivePeerDependencies:
- - '@types/node'
-
- '@microsoft/api-extractor-model@7.28.14(@types/node@20.14.11)':
- dependencies:
- '@microsoft/tsdoc': 0.14.2
- '@microsoft/tsdoc-config': 0.16.2
- '@rushstack/node-core-library': 4.1.0(@types/node@20.14.11)
- transitivePeerDependencies:
- - '@types/node'
-
- '@microsoft/api-extractor-model@7.29.8(@types/node@20.14.11)':
- dependencies:
- '@microsoft/tsdoc': 0.15.0
- '@microsoft/tsdoc-config': 0.17.0
- '@rushstack/node-core-library': 5.9.0(@types/node@20.14.11)
+ resolve: 1.22.10
transitivePeerDependencies:
- '@types/node'
- '@microsoft/api-extractor@7.43.1(@types/node@20.14.11)':
+ '@microsoft/api-extractor-model@7.30.4(@types/node@20.14.11)':
dependencies:
- '@microsoft/api-extractor-model': 7.28.14(@types/node@20.14.11)
- '@microsoft/tsdoc': 0.14.2
- '@microsoft/tsdoc-config': 0.16.2
- '@rushstack/node-core-library': 4.1.0(@types/node@20.14.11)
- '@rushstack/rig-package': 0.5.2
- '@rushstack/terminal': 0.10.1(@types/node@20.14.11)
- '@rushstack/ts-command-line': 4.19.2(@types/node@20.14.11)
- lodash: 4.17.21
- minimatch: 3.0.8
- resolve: 1.22.8
- semver: 7.5.4
- source-map: 0.6.1
- typescript: 5.4.5
+ '@microsoft/tsdoc': 0.15.1
+ '@microsoft/tsdoc-config': 0.17.1
+ '@rushstack/node-core-library': 5.12.0(@types/node@20.14.11)
transitivePeerDependencies:
- '@types/node'
- '@microsoft/api-extractor@7.47.11(@types/node@20.14.11)':
+ '@microsoft/api-extractor@7.52.1(@types/node@20.14.11)':
dependencies:
- '@microsoft/api-extractor-model': 7.29.8(@types/node@20.14.11)
- '@microsoft/tsdoc': 0.15.0
- '@microsoft/tsdoc-config': 0.17.0
- '@rushstack/node-core-library': 5.9.0(@types/node@20.14.11)
+ '@microsoft/api-extractor-model': 7.30.4(@types/node@20.14.11)
+ '@microsoft/tsdoc': 0.15.1
+ '@microsoft/tsdoc-config': 0.17.1
+ '@rushstack/node-core-library': 5.12.0(@types/node@20.14.11)
'@rushstack/rig-package': 0.5.3
- '@rushstack/terminal': 0.14.2(@types/node@20.14.11)
- '@rushstack/ts-command-line': 4.23.0(@types/node@20.14.11)
+ '@rushstack/terminal': 0.15.1(@types/node@20.14.11)
+ '@rushstack/ts-command-line': 4.23.6(@types/node@20.14.11)
lodash: 4.17.21
minimatch: 3.0.8
- resolve: 1.22.8
+ resolve: 1.22.10
semver: 7.5.4
source-map: 0.6.1
- typescript: 5.4.5
+ typescript: 5.8.2
transitivePeerDependencies:
- '@types/node'
- '@microsoft/tsdoc-config@0.16.2':
- dependencies:
- '@microsoft/tsdoc': 0.14.2
- ajv: 6.12.6
- jju: 1.4.0
- resolve: 1.19.0
-
- '@microsoft/tsdoc-config@0.17.0':
+ '@microsoft/tsdoc-config@0.17.1':
dependencies:
- '@microsoft/tsdoc': 0.15.0
+ '@microsoft/tsdoc': 0.15.1
ajv: 8.12.0
jju: 1.4.0
- resolve: 1.22.8
+ resolve: 1.22.10
- '@microsoft/tsdoc@0.14.2': {}
-
- '@microsoft/tsdoc@0.15.0': {}
+ '@microsoft/tsdoc@0.15.1': {}
'@modular-forms/qwik@0.23.1(@builder.io/qwik-city@packages+qwik-router)(@builder.io/qwik@packages+qwik)':
dependencies:
@@ -11569,8 +11444,8 @@ snapshots:
strip-ansi: 7.1.0
supports-color: 9.4.0
terminal-link: 3.0.0
- ts-node: 10.9.2(@types/node@20.14.11)(typescript@5.4.5)
- typescript: 5.4.5
+ ts-node: 10.9.2(@types/node@20.14.11)(typescript@5.8.2)
+ typescript: 5.8.2
uuid: 9.0.1
yargs: 17.7.2
transitivePeerDependencies:
@@ -11753,7 +11628,7 @@ snapshots:
'@netlify/zip-it-and-ship-it@9.41.1(supports-color@9.4.0)':
dependencies:
- '@babel/parser': 7.24.6
+ '@babel/parser': 7.26.10
'@babel/types': 7.25.6
'@netlify/binary-info': 1.0.0
'@netlify/serverless-functions-api': 1.31.0
@@ -12079,101 +11954,85 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.24.2':
optional: true
- '@rushstack/node-core-library@4.1.0(@types/node@20.14.11)':
- dependencies:
- fs-extra: 7.0.1
- import-lazy: 4.0.0
- jju: 1.4.0
- resolve: 1.22.8
- semver: 7.5.4
- z-schema: 5.0.5
- optionalDependencies:
- '@types/node': 20.14.11
-
- '@rushstack/node-core-library@5.9.0(@types/node@20.14.11)':
+ '@rushstack/node-core-library@5.12.0(@types/node@20.14.11)':
dependencies:
ajv: 8.13.0
ajv-draft-04: 1.0.0(ajv@8.13.0)
ajv-formats: 3.0.1
- fs-extra: 7.0.1
+ fs-extra: 11.3.0
import-lazy: 4.0.0
jju: 1.4.0
- resolve: 1.22.8
+ resolve: 1.22.10
semver: 7.5.4
optionalDependencies:
'@types/node': 20.14.11
- '@rushstack/rig-package@0.5.2':
- dependencies:
- resolve: 1.22.8
- strip-json-comments: 3.1.1
-
'@rushstack/rig-package@0.5.3':
dependencies:
- resolve: 1.22.8
+ resolve: 1.22.10
strip-json-comments: 3.1.1
- '@rushstack/terminal@0.10.1(@types/node@20.14.11)':
- dependencies:
- '@rushstack/node-core-library': 4.1.0(@types/node@20.14.11)
- supports-color: 8.1.1
- optionalDependencies:
- '@types/node': 20.14.11
-
- '@rushstack/terminal@0.14.2(@types/node@20.14.11)':
+ '@rushstack/terminal@0.15.1(@types/node@20.14.11)':
dependencies:
- '@rushstack/node-core-library': 5.9.0(@types/node@20.14.11)
+ '@rushstack/node-core-library': 5.12.0(@types/node@20.14.11)
supports-color: 8.1.1
optionalDependencies:
'@types/node': 20.14.11
- '@rushstack/ts-command-line@4.19.2(@types/node@20.14.11)':
+ '@rushstack/ts-command-line@4.23.6(@types/node@20.14.11)':
dependencies:
- '@rushstack/terminal': 0.10.1(@types/node@20.14.11)
+ '@rushstack/terminal': 0.15.1(@types/node@20.14.11)
'@types/argparse': 1.0.38
argparse: 1.0.10
string-argv: 0.3.2
transitivePeerDependencies:
- '@types/node'
- '@rushstack/ts-command-line@4.23.0(@types/node@20.14.11)':
+ '@shikijs/colorized-brackets@3.1.0':
dependencies:
- '@rushstack/terminal': 0.14.2(@types/node@20.14.11)
- '@types/argparse': 1.0.38
- argparse: 1.0.10
- string-argv: 0.3.2
- transitivePeerDependencies:
- - '@types/node'
+ shiki: 3.1.0
- '@shikijs/core@1.29.1':
+ '@shikijs/core@3.1.0':
dependencies:
- '@shikijs/engine-javascript': 1.29.1
- '@shikijs/engine-oniguruma': 1.29.1
- '@shikijs/types': 1.29.1
+ '@shikijs/types': 3.1.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
hast-util-to-html: 9.0.5
- '@shikijs/engine-javascript@1.29.1':
+ '@shikijs/engine-javascript@3.1.0':
dependencies:
- '@shikijs/types': 1.29.1
+ '@shikijs/types': 3.1.0
'@shikijs/vscode-textmate': 10.0.2
- oniguruma-to-es: 2.3.0
+ oniguruma-to-es: 3.1.1
- '@shikijs/engine-oniguruma@1.29.1':
+ '@shikijs/engine-oniguruma@3.1.0':
dependencies:
- '@shikijs/types': 1.29.1
+ '@shikijs/types': 3.1.0
'@shikijs/vscode-textmate': 10.0.2
- '@shikijs/langs@1.29.1':
+ '@shikijs/langs@3.1.0':
+ dependencies:
+ '@shikijs/types': 3.1.0
+
+ '@shikijs/rehype@3.1.0':
+ dependencies:
+ '@shikijs/types': 3.1.0
+ '@types/hast': 3.0.4
+ hast-util-to-string: 3.0.1
+ shiki: 3.1.0
+ unified: 11.0.5
+ unist-util-visit: 5.0.0
+
+ '@shikijs/themes@3.1.0':
dependencies:
- '@shikijs/types': 1.29.1
+ '@shikijs/types': 3.1.0
- '@shikijs/themes@1.29.1':
+ '@shikijs/transformers@3.1.0':
dependencies:
- '@shikijs/types': 1.29.1
+ '@shikijs/core': 3.1.0
+ '@shikijs/types': 3.1.0
- '@shikijs/types@1.29.1':
+ '@shikijs/types@3.1.0':
dependencies:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
@@ -12480,41 +12339,41 @@ snapshots:
'@types/node': 20.14.11
optional: true
- '@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)':
+ '@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.8.2))(eslint@8.57.0)(typescript@5.8.2)':
dependencies:
'@eslint-community/regexpp': 4.10.1
- '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.8.2)
'@typescript-eslint/scope-manager': 7.16.1
- '@typescript-eslint/type-utils': 7.16.1(eslint@8.57.0)(typescript@5.4.5)
- '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/type-utils': 7.16.1(eslint@8.57.0)(typescript@5.8.2)
+ '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.8.2)
'@typescript-eslint/visitor-keys': 7.16.1
eslint: 8.57.0
graphemer: 1.4.0
ignore: 5.3.1
natural-compare: 1.4.0
- ts-api-utils: 1.3.0(typescript@5.4.5)
+ ts-api-utils: 1.3.0(typescript@5.8.2)
optionalDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.4.5)':
+ '@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.8.2)':
dependencies:
'@typescript-eslint/scope-manager': 7.16.1
'@typescript-eslint/types': 7.16.1
- '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.4.5)
+ '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.8.2)
'@typescript-eslint/visitor-keys': 7.16.1
debug: 4.4.0(supports-color@9.4.0)
eslint: 8.57.0
optionalDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/rule-tester@8.14.0(eslint@8.57.0)(typescript@5.4.5)':
+ '@typescript-eslint/rule-tester@8.14.0(eslint@8.57.0)(typescript@5.8.2)':
dependencies:
- '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.4.5)
- '@typescript-eslint/utils': 8.14.0(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.8.2)
+ '@typescript-eslint/utils': 8.14.0(eslint@8.57.0)(typescript@5.8.2)
ajv: 6.12.6
eslint: 8.57.0
json-stable-stringify-without-jsonify: 1.0.1
@@ -12534,15 +12393,15 @@ snapshots:
'@typescript-eslint/types': 8.14.0
'@typescript-eslint/visitor-keys': 8.14.0
- '@typescript-eslint/type-utils@7.16.1(eslint@8.57.0)(typescript@5.4.5)':
+ '@typescript-eslint/type-utils@7.16.1(eslint@8.57.0)(typescript@5.8.2)':
dependencies:
- '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.4.5)
- '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.8.2)
+ '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.8.2)
debug: 4.4.0(supports-color@9.4.0)
eslint: 8.57.0
- ts-api-utils: 1.3.0(typescript@5.4.5)
+ ts-api-utils: 1.3.0(typescript@5.8.2)
optionalDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
transitivePeerDependencies:
- supports-color
@@ -12552,7 +12411,7 @@ snapshots:
'@typescript-eslint/types@8.14.0': {}
- '@typescript-eslint/typescript-estree@5.62.0(supports-color@9.4.0)(typescript@5.4.5)':
+ '@typescript-eslint/typescript-estree@5.62.0(supports-color@9.4.0)(typescript@5.8.2)':
dependencies:
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/visitor-keys': 5.62.0
@@ -12560,13 +12419,13 @@ snapshots:
globby: 11.1.0
is-glob: 4.0.3
semver: 7.6.3
- tsutils: 3.21.0(typescript@5.4.5)
+ tsutils: 3.21.0(typescript@5.8.2)
optionalDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@7.16.1(typescript@5.4.5)':
+ '@typescript-eslint/typescript-estree@7.16.1(typescript@5.8.2)':
dependencies:
'@typescript-eslint/types': 7.16.1
'@typescript-eslint/visitor-keys': 7.16.1
@@ -12575,13 +12434,13 @@ snapshots:
is-glob: 4.0.3
minimatch: 9.0.4
semver: 7.6.3
- ts-api-utils: 1.3.0(typescript@5.4.5)
+ ts-api-utils: 1.3.0(typescript@5.8.2)
optionalDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@8.14.0(typescript@5.4.5)':
+ '@typescript-eslint/typescript-estree@8.14.0(typescript@5.8.2)':
dependencies:
'@typescript-eslint/types': 8.14.0
'@typescript-eslint/visitor-keys': 8.14.0
@@ -12590,29 +12449,29 @@ snapshots:
is-glob: 4.0.3
minimatch: 9.0.4
semver: 7.6.3
- ts-api-utils: 1.3.0(typescript@5.4.5)
+ ts-api-utils: 1.3.0(typescript@5.8.2)
optionalDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@7.16.1(eslint@8.57.0)(typescript@5.4.5)':
+ '@typescript-eslint/utils@7.16.1(eslint@8.57.0)(typescript@5.8.2)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
'@typescript-eslint/scope-manager': 7.16.1
'@typescript-eslint/types': 7.16.1
- '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.4.5)
+ '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.8.2)
eslint: 8.57.0
transitivePeerDependencies:
- supports-color
- typescript
- '@typescript-eslint/utils@8.14.0(eslint@8.57.0)(typescript@5.4.5)':
+ '@typescript-eslint/utils@8.14.0(eslint@8.57.0)(typescript@5.8.2)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
'@typescript-eslint/scope-manager': 8.14.0
'@typescript-eslint/types': 8.14.0
- '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.4.5)
+ '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.8.2)
eslint: 8.57.0
transitivePeerDependencies:
- supports-color
@@ -12744,7 +12603,7 @@ snapshots:
'@vue/compiler-core@3.4.27':
dependencies:
- '@babel/parser': 7.24.6
+ '@babel/parser': 7.26.10
'@vue/shared': 3.4.27
entities: 4.5.0
estree-walker: 2.0.2
@@ -12760,7 +12619,7 @@ snapshots:
de-indent: 1.0.2
he: 1.2.0
- '@vue/language-core@2.1.6(typescript@5.4.5)':
+ '@vue/language-core@2.1.6(typescript@5.8.2)':
dependencies:
'@volar/language-core': 2.4.8
'@vue/compiler-dom': 3.4.27
@@ -12771,7 +12630,7 @@ snapshots:
muggle-string: 0.4.1
path-browserify: 1.0.1
optionalDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
'@vue/shared@3.4.27': {}
@@ -13167,7 +13026,7 @@ snapshots:
dependencies:
'@babel/runtime': 7.24.6
cosmiconfig: 7.1.0
- resolve: 1.22.8
+ resolve: 1.22.10
backoff@2.5.0:
dependencies:
@@ -13469,7 +13328,7 @@ snapshots:
citty@0.1.6:
dependencies:
- consola: 3.4.0
+ consola: 3.4.2
clean-deep@3.4.0:
dependencies:
@@ -13683,7 +13542,7 @@ snapshots:
graceful-fs: 4.2.11
xdg-basedir: 5.1.0
- consola@3.4.0: {}
+ consola@3.4.2: {}
console-control-strings@1.1.0: {}
@@ -13717,14 +13576,14 @@ snapshots:
path-type: 4.0.0
yaml: 1.10.2
- cosmiconfig@9.0.0(typescript@5.4.5):
+ cosmiconfig@9.0.0(typescript@5.8.2):
dependencies:
env-paths: 2.2.1
import-fresh: 3.3.0
js-yaml: 4.1.0
parse-json: 5.2.0
optionalDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
cp-file@10.0.0:
dependencies:
@@ -13993,10 +13852,10 @@ snapshots:
detective-typescript@11.2.0(supports-color@9.4.0):
dependencies:
- '@typescript-eslint/typescript-estree': 5.62.0(supports-color@9.4.0)(typescript@5.4.5)
+ '@typescript-eslint/typescript-estree': 5.62.0(supports-color@9.4.0)(typescript@5.8.2)
ast-module-types: 5.0.0
node-source-walk: 6.0.2
- typescript: 5.4.5
+ typescript: 5.8.2
transitivePeerDependencies:
- supports-color
@@ -14562,22 +14421,22 @@ snapshots:
eslint-import-resolver-node@0.3.9:
dependencies:
debug: 3.2.7
- is-core-module: 2.13.1
- resolve: 1.22.8
+ is-core-module: 2.16.1
+ resolve: 1.22.10
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.8.2(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0):
+ eslint-module-utils@2.8.2(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0):
dependencies:
debug: 3.2.7
optionalDependencies:
- '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.8.2)
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0):
+ eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.8.2))(eslint@8.57.0):
dependencies:
array-includes: 3.1.8
array.prototype.findlastindex: 1.2.5
@@ -14587,9 +14446,9 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.8.2(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0)
+ eslint-module-utils: 2.8.2(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0)
hasown: 2.0.2
- is-core-module: 2.13.1
+ is-core-module: 2.16.1
is-glob: 4.0.3
minimatch: 3.1.2
object.fromentries: 2.0.8
@@ -14598,7 +14457,7 @@ snapshots:
semver: 6.3.1
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.8.2)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
@@ -15176,7 +15035,7 @@ snapshots:
fs-constants@1.0.0: {}
- fs-extra@11.2.0:
+ fs-extra@11.3.0:
dependencies:
graceful-fs: 4.2.11
jsonfile: 6.1.0
@@ -15284,7 +15143,7 @@ snapshots:
basic-ftp: 5.0.5
data-uri-to-buffer: 6.0.2
debug: 4.4.0(supports-color@9.4.0)
- fs-extra: 11.2.0
+ fs-extra: 11.3.0
transitivePeerDependencies:
- supports-color
@@ -15472,26 +15331,6 @@ snapshots:
dependencies:
function-bind: 1.1.2
- hast-util-from-html@2.0.1:
- dependencies:
- '@types/hast': 3.0.4
- devlop: 1.1.0
- hast-util-from-parse5: 8.0.1
- parse5: 7.1.2
- vfile: 6.0.2
- vfile-message: 4.0.2
-
- hast-util-from-parse5@8.0.1:
- dependencies:
- '@types/hast': 3.0.4
- '@types/unist': 3.0.3
- devlop: 1.1.0
- hastscript: 8.0.0
- property-information: 6.5.0
- vfile: 6.0.2
- vfile-location: 5.0.2
- web-namespaces: 2.0.1
-
hast-util-heading-rank@2.1.1:
dependencies:
'@types/hast': 2.3.10
@@ -15508,10 +15347,6 @@ snapshots:
dependencies:
'@types/hast': 2.3.10
- hast-util-parse-selector@4.0.0:
- dependencies:
- '@types/hast': 3.0.4
-
hast-util-to-estree@3.1.0:
dependencies:
'@types/estree': 1.0.5
@@ -15571,7 +15406,7 @@ snapshots:
dependencies:
'@types/hast': 2.3.10
- hast-util-to-string@3.0.0:
+ hast-util-to-string@3.0.1:
dependencies:
'@types/hast': 3.0.4
@@ -15587,14 +15422,6 @@ snapshots:
property-information: 6.5.0
space-separated-tokens: 2.0.2
- hastscript@8.0.0:
- dependencies:
- '@types/hast': 3.0.4
- comma-separated-tokens: 2.0.3
- hast-util-parse-selector: 4.0.0
- property-information: 6.5.0
- space-separated-tokens: 2.0.2
-
he@1.2.0: {}
hoist-non-react-statics@3.3.2:
@@ -15805,7 +15632,7 @@ snapshots:
dependencies:
'@fastify/accept-negotiator': 1.1.0
citty: 0.1.6
- consola: 3.4.0
+ consola: 3.4.2
defu: 6.1.4
destr: 2.0.3
etag: 1.8.1
@@ -15872,7 +15699,7 @@ snapshots:
is-callable@1.2.7: {}
- is-core-module@2.13.1:
+ is-core-module@2.16.1:
dependencies:
hasown: 2.0.2
@@ -16246,7 +16073,7 @@ snapshots:
'@parcel/watcher-wasm': 2.4.1
citty: 0.1.6
clipboardy: 4.0.0
- consola: 3.4.0
+ consola: 3.4.2
crossws: 0.2.4
defu: 6.1.4
get-port-please: 3.1.2
@@ -16298,16 +16125,12 @@ snapshots:
lodash-es@4.17.21: {}
- lodash.get@4.4.2: {}
-
lodash.includes@4.3.0: {}
lodash.isboolean@3.0.3: {}
lodash.isempty@4.4.0: {}
- lodash.isequal@4.5.0: {}
-
lodash.isinteger@4.0.4: {}
lodash.isnumber@3.0.3: {}
@@ -17296,14 +17119,14 @@ snapshots:
normalize-package-data@3.0.3:
dependencies:
hosted-git-info: 4.1.0
- is-core-module: 2.13.1
+ is-core-module: 2.16.1
semver: 7.6.3
validate-npm-package-license: 3.0.4
normalize-package-data@6.0.1:
dependencies:
hosted-git-info: 7.0.2
- is-core-module: 2.13.1
+ is-core-module: 2.16.1
semver: 7.6.3
validate-npm-package-license: 3.0.4
@@ -17421,11 +17244,11 @@ snapshots:
dependencies:
mimic-function: 5.0.1
- oniguruma-to-es@2.3.0:
+ oniguruma-to-es@3.1.1:
dependencies:
emoji-regex-xs: 1.0.0
- regex: 5.1.1
- regex-recursion: 5.1.1
+ regex: 6.0.1
+ regex-recursion: 6.0.2
open@10.1.0:
dependencies:
@@ -17641,12 +17464,6 @@ snapshots:
parse-ms@3.0.0: {}
- parse-numeric-range@1.3.0: {}
-
- parse5@7.1.2:
- dependencies:
- entities: 4.5.0
-
parseurl@1.3.3: {}
path-browserify@1.0.1: {}
@@ -17760,20 +17577,20 @@ snapshots:
postcss: 8.4.39
postcss-value-parser: 4.2.0
read-cache: 1.0.0
- resolve: 1.22.8
+ resolve: 1.22.10
postcss-js@4.0.1(postcss@8.4.39):
dependencies:
camelcase-css: 2.0.1
postcss: 8.4.39
- postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.4.5)):
+ postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.8.2)):
dependencies:
lilconfig: 3.1.1
yaml: 2.4.5
optionalDependencies:
postcss: 8.4.39
- ts-node: 10.9.2(@types/node@20.14.11)(typescript@5.4.5)
+ ts-node: 10.9.2(@types/node@20.14.11)(typescript@5.8.2)
postcss-nested@6.0.1(postcss@8.4.39):
dependencies:
@@ -17990,10 +17807,10 @@ snapshots:
- supports-color
- utf-8-validate
- puppeteer@22.13.1(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10):
+ puppeteer@22.13.1(bufferutil@4.0.8)(typescript@5.8.2)(utf-8-validate@5.0.10):
dependencies:
'@puppeteer/browsers': 2.2.4
- cosmiconfig: 9.0.0(typescript@5.4.5)
+ cosmiconfig: 9.0.0(typescript@5.8.2)
devtools-protocol: 0.0.1299070
puppeteer-core: 22.13.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
transitivePeerDependencies:
@@ -18168,14 +17985,13 @@ snapshots:
regenerator-runtime@0.14.1: {}
- regex-recursion@5.1.1:
+ regex-recursion@6.0.2:
dependencies:
- regex: 5.1.1
regex-utilities: 2.3.0
regex-utilities@2.3.0: {}
- regex@5.1.1:
+ regex@6.0.1:
dependencies:
regex-utilities: 2.3.0
@@ -18203,22 +18019,6 @@ snapshots:
unified: 11.0.5
unist-util-visit: 5.0.0
- rehype-parse@9.0.0:
- dependencies:
- '@types/hast': 3.0.4
- hast-util-from-html: 2.0.1
- unified: 11.0.5
-
- rehype-pretty-code@0.14.0(shiki@1.29.1):
- dependencies:
- '@types/hast': 3.0.4
- hast-util-to-string: 3.0.0
- parse-numeric-range: 1.3.0
- rehype-parse: 9.0.0
- shiki: 1.29.1
- unified: 11.0.5
- unist-util-visit: 5.0.0
-
remark-frontmatter@5.0.0:
dependencies:
'@types/mdast': 4.0.4
@@ -18295,20 +18095,15 @@ snapshots:
resolve.exports@2.0.2: {}
- resolve@1.19.0:
- dependencies:
- is-core-module: 2.13.1
- path-parse: 1.0.7
-
- resolve@1.22.8:
+ resolve@1.22.10:
dependencies:
- is-core-module: 2.13.1
+ is-core-module: 2.16.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
resolve@2.0.0-next.5:
dependencies:
- is-core-module: 2.13.1
+ is-core-module: 2.16.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
@@ -18596,14 +18391,14 @@ snapshots:
shell-quote@1.8.1: {}
- shiki@1.29.1:
+ shiki@3.1.0:
dependencies:
- '@shikijs/core': 1.29.1
- '@shikijs/engine-javascript': 1.29.1
- '@shikijs/engine-oniguruma': 1.29.1
- '@shikijs/langs': 1.29.1
- '@shikijs/themes': 1.29.1
- '@shikijs/types': 1.29.1
+ '@shikijs/core': 3.1.0
+ '@shikijs/engine-javascript': 3.1.0
+ '@shikijs/engine-oniguruma': 3.1.0
+ '@shikijs/langs': 3.1.0
+ '@shikijs/themes': 3.1.0
+ '@shikijs/types': 3.1.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
@@ -18932,13 +18727,13 @@ snapshots:
csso: 5.0.5
picocolors: 1.1.1
- syncpack@12.3.3(typescript@5.4.5):
+ syncpack@12.3.3(typescript@5.8.2):
dependencies:
'@effect/schema': 0.66.5(effect@3.0.3)(fast-check@3.17.2)
chalk: 5.3.0
chalk-template: 1.1.0
commander: 12.0.0
- cosmiconfig: 9.0.0(typescript@5.4.5)
+ cosmiconfig: 9.0.0(typescript@5.8.2)
effect: 3.0.3
enquirer: 2.4.1
fast-check: 3.17.2
@@ -18969,7 +18764,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.4.5)):
+ tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.8.2)):
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
@@ -18988,10 +18783,10 @@ snapshots:
postcss: 8.4.39
postcss-import: 15.1.0(postcss@8.4.39)
postcss-js: 4.0.1(postcss@8.4.39)
- postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.4.5))
+ postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.8.2))
postcss-nested: 6.0.1(postcss@8.4.39)
postcss-selector-parser: 6.1.0
- resolve: 1.22.8
+ resolve: 1.22.10
sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
@@ -19171,9 +18966,9 @@ snapshots:
trough@2.2.0: {}
- ts-api-utils@1.3.0(typescript@5.4.5):
+ ts-api-utils@1.3.0(typescript@5.8.2):
dependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
ts-interface-checker@0.1.13: {}
@@ -19182,7 +18977,7 @@ snapshots:
'@ts-morph/common': 0.24.0
code-block-writer: 13.0.3
- ts-node@10.9.2(@types/node@20.14.11)(typescript@5.4.5):
+ ts-node@10.9.2(@types/node@20.14.11)(typescript@5.8.2):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11
@@ -19196,15 +18991,15 @@ snapshots:
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
- typescript: 5.4.5
+ typescript: 5.8.2
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
ts-toolbelt@9.6.0: {}
- tsconfck@3.1.0(typescript@5.4.5):
+ tsconfck@3.1.5(typescript@5.8.2):
optionalDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
tsconfig-paths@3.15.0:
dependencies:
@@ -19221,10 +19016,10 @@ snapshots:
dependencies:
esbuild: 0.15.18
- tsutils@3.21.0(typescript@5.4.5):
+ tsutils@3.21.0(typescript@5.8.2):
dependencies:
tslib: 1.14.1
- typescript: 5.4.5
+ typescript: 5.8.2
tsx@4.19.2:
dependencies:
@@ -19296,7 +19091,7 @@ snapshots:
dependencies:
is-typedarray: 1.0.0
- typescript@5.4.5: {}
+ typescript@5.8.2: {}
ufo@1.5.4: {}
@@ -19330,7 +19125,7 @@ snapshots:
unenv-nightly@1.10.0-1717606461.a117952:
dependencies:
- consola: 3.4.0
+ consola: 3.4.2
defu: 6.1.4
mime: 3.0.0
node-fetch-native: 1.6.6
@@ -19339,7 +19134,7 @@ snapshots:
unenv@1.10.0:
dependencies:
- consola: 3.4.0
+ consola: 3.4.2
defu: 6.1.4
mime: 3.0.0
node-fetch-native: 1.6.6
@@ -19435,7 +19230,7 @@ snapshots:
untun@0.1.3:
dependencies:
citty: 0.1.6
- consola: 3.4.0
+ consola: 3.4.2
pathe: 1.1.2
update-browserslist-db@1.0.16(browserslist@4.23.0):
@@ -19490,9 +19285,9 @@ snapshots:
valibot@0.33.3: {}
- valibot@0.42.1(typescript@5.4.5):
+ valibot@0.42.1(typescript@5.8.2):
optionalDependencies:
- typescript: 5.4.5
+ typescript: 5.8.2
validate-npm-package-license@3.0.4:
dependencies:
@@ -19505,15 +19300,8 @@ snapshots:
validate-npm-package-name@5.0.1: {}
- validator@13.12.0: {}
-
vary@1.1.2: {}
- vfile-location@5.0.2:
- dependencies:
- '@types/unist': 3.0.3
- vfile: 6.0.2
-
vfile-message@4.0.2:
dependencies:
'@types/unist': 3.0.3
@@ -19569,18 +19357,18 @@ snapshots:
- supports-color
- terser
- vite-plugin-dts@4.3.0(@types/node@20.14.11)(rollup@4.24.2)(typescript@5.4.5)(vite@5.4.10(@types/node@20.14.11)(terser@5.37.0)):
+ vite-plugin-dts@4.3.0(@types/node@20.14.11)(rollup@4.24.2)(typescript@5.8.2)(vite@5.4.10(@types/node@20.14.11)(terser@5.37.0)):
dependencies:
- '@microsoft/api-extractor': 7.47.11(@types/node@20.14.11)
+ '@microsoft/api-extractor': 7.52.1(@types/node@20.14.11)
'@rollup/pluginutils': 5.1.0(rollup@4.24.2)
'@volar/typescript': 2.4.8
- '@vue/language-core': 2.1.6(typescript@5.4.5)
+ '@vue/language-core': 2.1.6(typescript@5.8.2)
compare-versions: 6.1.1
debug: 4.4.0(supports-color@9.4.0)
kolorist: 1.8.0
local-pkg: 0.5.0
magic-string: 0.30.11
- typescript: 5.4.5
+ typescript: 5.8.2
optionalDependencies:
vite: 5.4.10(@types/node@20.14.11)(terser@5.37.0)
transitivePeerDependencies:
@@ -19594,7 +19382,7 @@ snapshots:
'@rollup/pluginutils': 5.1.0(rollup@4.24.2)
debug: 4.4.0(supports-color@9.4.0)
error-stack-parser-es: 0.1.4
- fs-extra: 11.2.0
+ fs-extra: 11.3.0
open: 10.1.0
perfect-debounce: 1.0.0
picocolors: 1.1.1
@@ -19604,11 +19392,11 @@ snapshots:
- rollup
- supports-color
- vite-tsconfig-paths@5.0.1(typescript@5.4.5)(vite@5.4.10(@types/node@20.14.11)(terser@5.37.0)):
+ vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@5.4.10(@types/node@20.14.11)(terser@5.37.0)):
dependencies:
debug: 4.4.0(supports-color@9.4.0)
globrex: 0.1.2
- tsconfck: 3.1.0(typescript@5.4.5)
+ tsconfck: 3.1.5(typescript@5.8.2)
optionalDependencies:
vite: 5.4.10(@types/node@20.14.11)(terser@5.37.0)
transitivePeerDependencies:
@@ -19685,8 +19473,6 @@ snapshots:
dependencies:
mri: 1.2.0
- web-namespaces@2.0.1: {}
-
web-streams-polyfill@3.3.3: {}
webidl-conversions@3.0.1: {}
@@ -19807,7 +19593,7 @@ snapshots:
miniflare: 3.20240718.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
nanoid: 3.3.7
path-to-regexp: 6.2.2
- resolve: 1.22.8
+ resolve: 1.22.10
resolve.exports: 2.0.2
selfsigned: 2.4.1
source-map: 0.6.1
@@ -19953,14 +19739,6 @@ snapshots:
mustache: 4.2.0
stacktracey: 2.1.8
- z-schema@5.0.5:
- dependencies:
- lodash.get: 4.4.2
- lodash.isequal: 4.5.0
- validator: 13.12.0
- optionalDependencies:
- commander: 9.5.0
-
zip-stream@6.0.1:
dependencies:
archiver-utils: 5.0.2
diff --git a/scripts/build-clean.ts b/scripts/build-clean.ts
new file mode 100644
index 00000000000..fce37018c2a
--- /dev/null
+++ b/scripts/build-clean.ts
@@ -0,0 +1,14 @@
+import { existsSync, rmSync } from 'node:fs';
+
+const locations = [
+ 'packages/qwik/dist/',
+ 'packages/qwik-router/lib/',
+ 'packages/docs/dist/',
+ 'packages/insights/dist/',
+];
+
+for (const location of locations) {
+ if (existsSync(location)) {
+ rmSync(location, { recursive: true, force: true });
+ }
+}
diff --git a/starters/README.md b/starters/README.md
index 93580a1cc90..5e6b2573fd4 100644
--- a/starters/README.md
+++ b/starters/README.md
@@ -8,36 +8,19 @@ All starters are based on `starters/apps/base`, including the `package.json` and
Here are steps to try out the CLI in a local environment.
-1. Build CLI:
+1. Build the CLI:
- ```
- # pnpm build.cli
- ```
-
-1. Run CLI:
-
- ```
- # node ./packages/create-qwik/dist/create-qwik.cjs
- 💫 Let's create a Qwik project 💫
-
- ✔ Project name … todo-express
- ✔ Select a starter › Todo
- ✔ Select a server › Express
+```zsh
+pnpm build.cli
+```
- ⭐️ Success! Project saved in todo-express directory
+2. Run the CLI:
- 📟 Next steps:
- cd todo-express
- npm install
- npm start
- ```
+```zsh
+pnpm cli.qwik
+```
-1. Change to generated location
- ```
- cd todo-express
- npm install
- npm start
- ```
+> If you want to test the CLI on consumer repository, you can `pnpm link.dist` on the qwik monorepo, then `pnpm link --global @qwik.dev/core` on the consumer project, and finally run the CLI from there.
## Publishing `create-qwik` CLI Package
diff --git a/starters/apps/qwikrouter-test/src/routes/(common)/loaders/loader-error/index.tsx b/starters/apps/qwikrouter-test/src/routes/(common)/loaders/loader-error/index.tsx
new file mode 100644
index 00000000000..6616b2ebefe
--- /dev/null
+++ b/starters/apps/qwikrouter-test/src/routes/(common)/loaders/loader-error/index.tsx
@@ -0,0 +1,11 @@
+import { component$ } from "@qwik.dev/core";
+import { routeLoader$ } from "@qwik.dev/router";
+
+const useError = routeLoader$(async function ({ error }): Promise {
+ throw error(401, "loader-error-uncaught");
+});
+
+export default component$(() => {
+ useError();
+ return <>>;
+});
diff --git a/starters/apps/qwikrouter-test/src/routes/(common)/loaders/loader-error/uncaught-server/index.tsx b/starters/apps/qwikrouter-test/src/routes/(common)/loaders/loader-error/uncaught-server/index.tsx
new file mode 100644
index 00000000000..075c1b0a4f7
--- /dev/null
+++ b/starters/apps/qwikrouter-test/src/routes/(common)/loaders/loader-error/uncaught-server/index.tsx
@@ -0,0 +1,16 @@
+import { component$ } from "@qwik.dev/core";
+import { routeLoader$, server$ } from "@qwik.dev/router";
+import { ServerError } from "@qwik.dev/router/middleware/request-handler";
+
+export const serverError = server$(() => {
+ throw new ServerError(401, "server-error-data");
+});
+
+const useCatchServerErrorInLoader = routeLoader$(async () => {
+ await serverError();
+});
+
+export default component$(() => {
+ useCatchServerErrorInLoader();
+ return <>>;
+});
diff --git a/starters/apps/qwikrouter-test/src/routes/(common)/server-func/server-error/index.tsx b/starters/apps/qwikrouter-test/src/routes/(common)/server-func/server-error/index.tsx
index c98ddd82844..e5137cfb7f8 100644
--- a/starters/apps/qwikrouter-test/src/routes/(common)/server-func/server-error/index.tsx
+++ b/starters/apps/qwikrouter-test/src/routes/(common)/server-func/server-error/index.tsx
@@ -3,35 +3,48 @@ import { ServerError } from "@qwik.dev/router/middleware/request-handler";
import { component$, useSignal, useVisibleTask$ } from "@qwik.dev/core";
import { delay } from "../../actions/login";
-type ResponseTuple = [null | string, string];
+type ErrorReason = {
+ reason: string;
+ middleware: string;
+};
-const serverFunctionA = server$(async function a(): Promise {
- throw new ServerError<[string]>(401, ["my error"]);
+const serverFunctionA = server$(async function a(): Promise {
+ throw new ServerError(401, {
+ reason: "my error",
+ middleware: "server-error-uncaught",
+ });
});
-const serverFunctionB = server$(async function b(): Promise {
- return [null, this.method || ""];
+const serverFunctionB = server$(async function b(): Promise {
+ return this.method;
});
export const MultipleServerFunctionsInvokedInTask = component$(() => {
- const methodA = useSignal("");
+ const errorReason = useSignal("");
+ const errorMiddleware = useSignal("");
const methodB = useSignal("");
useVisibleTask$(async () => {
- const [error /*, data */] = await serverFunctionA();
- if (error) {
- methodA.value = error;
+ try {
+ await serverFunctionA();
+ } catch (err: any) {
+ if (isErrorReason(err)) {
+ errorReason.value = err.reason;
+ errorMiddleware.value = err.middleware;
+ }
}
+
await delay(1);
- // err, method
- const [, method] = await serverFunctionB();
+
+ const method = await serverFunctionB();
methodB.value = method;
});
return (
(
- {methodA.value}
+ {errorReason.value}
+ {errorMiddleware.value}
{methodB.value}
)
@@ -45,3 +58,11 @@ export default component$(() => {
>
);
});
+
+export function isErrorReason(err: any): err is ErrorReason {
+ if (typeof err.reason === "string" && typeof err.middleware === "string") {
+ return true;
+ }
+
+ return false;
+}
diff --git a/starters/apps/qwikrouter-test/src/routes/(common)/server-func/server-error/loader/index.tsx b/starters/apps/qwikrouter-test/src/routes/(common)/server-func/server-error/loader/index.tsx
new file mode 100644
index 00000000000..0290f236188
--- /dev/null
+++ b/starters/apps/qwikrouter-test/src/routes/(common)/server-func/server-error/loader/index.tsx
@@ -0,0 +1,24 @@
+import { component$ } from "@qwik.dev/core";
+import { routeLoader$, server$ } from "@qwik.dev/router";
+import { ServerError } from "@qwik.dev/router/middleware/request-handler";
+
+export const serverError = server$(() => {
+ throw new ServerError(401, "loader-error-data");
+});
+
+const useCatchServerErrorInLoader = routeLoader$(async () => {
+ try {
+ await serverError();
+ } catch (err: any) {
+ if (err instanceof ServerError && typeof err.data === "string") {
+ return err.data;
+ }
+ }
+
+ return "unknown error";
+});
+
+export default component$(() => {
+ const error = useCatchServerErrorInLoader();
+ return {error.value}
;
+});
diff --git a/starters/apps/qwikrouter-test/src/routes/(common)/server-func/server-error/primitive/index.tsx b/starters/apps/qwikrouter-test/src/routes/(common)/server-func/server-error/primitive/index.tsx
new file mode 100644
index 00000000000..67ca63c91ab
--- /dev/null
+++ b/starters/apps/qwikrouter-test/src/routes/(common)/server-func/server-error/primitive/index.tsx
@@ -0,0 +1,37 @@
+import { component$, useSignal, useVisibleTask$ } from "@qwik.dev/core";
+import { server$ } from "@qwik.dev/router";
+import { ServerError } from "@qwik.dev/router/middleware/request-handler";
+
+const serverFunctionA = server$(async () => {
+ throw new ServerError(401, 1);
+});
+
+const serverFunctionB = server$(async () => {
+ throw new ServerError(500, "error");
+});
+
+export default component$(() => {
+ const errorA = useSignal();
+ const errorB = useSignal();
+
+ useVisibleTask$(async () => {
+ try {
+ await serverFunctionA();
+ } catch (err: any) {
+ errorA.value = err;
+ }
+
+ try {
+ await serverFunctionB();
+ } catch (err: any) {
+ errorB.value = err;
+ }
+ });
+
+ return (
+
+ {errorA.value}
+ {errorB.value}
+
+ );
+});
diff --git a/starters/apps/qwikrouter-test/src/routes/error/index.tsx b/starters/apps/qwikrouter-test/src/routes/error/index.tsx
new file mode 100644
index 00000000000..09fef5ae7b6
--- /dev/null
+++ b/starters/apps/qwikrouter-test/src/routes/error/index.tsx
@@ -0,0 +1,27 @@
+import { component$, $ } from "@qwik.dev/core";
+import { ErrorBoundary } from "@qwik.dev/router";
+
+export default component$(() => {
+ return ;
+});
+
+const Issue7227 = component$(() => {
+ return (
+ {
+ return Caught error: {error.message}
;
+ })}
+ >
+
+ All good
+ {
+ throw new Error("Boom!");
+ })}
+ >
+ Throw error
+
+
+
+ );
+});
diff --git a/starters/apps/qwikrouter-test/src/routes/plugin@errors.tsx b/starters/apps/qwikrouter-test/src/routes/plugin@errors.tsx
new file mode 100644
index 00000000000..2fdc82f9702
--- /dev/null
+++ b/starters/apps/qwikrouter-test/src/routes/plugin@errors.tsx
@@ -0,0 +1,32 @@
+import { type RequestHandler } from "@qwik.dev/router";
+import { ServerError } from "@qwik.dev/router/middleware/request-handler";
+import { isDev } from "@qwik.dev/core";
+import { isErrorReason } from "./(common)/server-func/server-error";
+
+export const onRequest: RequestHandler = async ({ next, error }) => {
+ try {
+ return await next();
+ } catch (err) {
+ // Intercept and update ServerErrors to test middleware
+ if (isServerError(err)) {
+ // Update for (common)/server-func/server-error
+ if (isErrorReason(err.data)) {
+ err.data.middleware = "server-error-caught";
+ }
+
+ // Update for (common)/loaders/loader-error
+ if (err.data === "loader-error-uncaught") {
+ err.data = "loader-error-caught";
+ }
+ }
+
+ throw err;
+ }
+};
+
+function isServerError(err: unknown): err is ServerError {
+ return (
+ err instanceof ServerError ||
+ (isDev && err instanceof Error && err.constructor.name === "ServerError")
+ );
+}
diff --git a/starters/e2e/qwikrouter/error.spec.ts b/starters/e2e/qwikrouter/error.spec.ts
new file mode 100644
index 00000000000..9579449fb1d
--- /dev/null
+++ b/starters/e2e/qwikrouter/error.spec.ts
@@ -0,0 +1,11 @@
+import { expect, test } from "@playwright/test";
+
+test.describe("Qwik City Error boundary", () => {
+ test("should catch error", async ({ page }) => {
+ await page.goto("/qwikrouter-test/error");
+
+ page.getByRole("button", { name: "Throw error" }).click();
+
+ await page.waitForSelector('div:has-text("Caught error: Boom!")');
+ });
+});
diff --git a/starters/e2e/qwikrouter/loaders.e2e.ts b/starters/e2e/qwikrouter/loaders.e2e.ts
index 2caac45f903..c05c40706f2 100644
--- a/starters/e2e/qwikrouter/loaders.e2e.ts
+++ b/starters/e2e/qwikrouter/loaders.e2e.ts
@@ -125,5 +125,31 @@ test.describe("loaders", () => {
await expect(page.locator("#prop")).toHaveText("test");
await expect(page.locator("#prop-unwrapped")).toHaveText("test");
});
+
+ test("should modify ServerError in middleware", async ({ page }) => {
+ const response = await page.goto("/qwikrouter-test/loaders/loader-error");
+ const contentType = await response?.headerValue("Content-Type");
+ const status = response?.status();
+
+ expect(status).toEqual(401);
+ expect(contentType).toEqual("text/html; charset=utf-8");
+ const body = page.locator("body");
+ await expect(body).toContainText("loader-error-caught");
+ });
+
+ test("should return html with uncaught ServerErrors thrown in loaders", async ({
+ page,
+ }) => {
+ const response = await page.goto(
+ "/qwikrouter-test/loaders/loader-error/uncaught-server",
+ );
+ const contentType = await response?.headerValue("Content-Type");
+ const status = response?.status();
+
+ expect(status).toEqual(401);
+ expect(contentType).toEqual("text/html; charset=utf-8");
+ const body = page.locator("body");
+ await expect(body).toContainText("server-error-data");
+ });
}
});
diff --git a/starters/e2e/qwikrouter/resource.spec.ts b/starters/e2e/qwikrouter/resource.spec.ts
index 91bf2c1497a..47cc1d68567 100644
--- a/starters/e2e/qwikrouter/resource.spec.ts
+++ b/starters/e2e/qwikrouter/resource.spec.ts
@@ -2,7 +2,7 @@ import { expect, test } from "@playwright/test";
test.describe("Resource", () => {
test("should handle the resource correctly", async ({ page }) => {
- await page.goto("/qwikcity-test/issue7254/");
+ await page.goto("/qwikrouter-test/issue7254/");
await page.getByText("Data: hello Bar");
diff --git a/starters/e2e/qwikrouter/server.e2e.ts b/starters/e2e/qwikrouter/server.e2e.ts
index 9a0b3c53c2e..e6bc048bc06 100644
--- a/starters/e2e/qwikrouter/server.e2e.ts
+++ b/starters/e2e/qwikrouter/server.e2e.ts
@@ -110,11 +110,23 @@ test.describe("server$", () => {
"POST--MyCustomValue-GET--MyCustomValue",
);
});
- test("should allow for ServerError", async ({ page }) => {
+ test("should modify ServerError in middleware", async ({ page }) => {
await page.goto("/qwikrouter-test/server-func/server-error");
const serverConfigContainer = page.locator("#server-error");
- await expect(serverConfigContainer).toContainText("my errorPOST");
+ await expect(serverConfigContainer).toContainText(
+ "my errorserver-error-caughtPOST",
+ );
+ });
+ test("should catch ServerError in routeLoader", async ({ page }) => {
+ await page.goto("/qwikrouter-test/server-func/server-error/loader");
+ const serverConfigContainer = page.locator("#server-error");
+ await expect(serverConfigContainer).toContainText("loader-error-data");
+ });
+ test("should allow primitive ServerError data", async ({ page }) => {
+ await page.goto("/qwikrouter-test/server-func/server-error/primitive");
+ const serverConfigContainer = page.locator("#server-error");
+ await expect(serverConfigContainer).toContainText("1error");
});
});
diff --git a/starters/features/auth/package.json b/starters/features/auth/package.json
index 7e98ef26982..0f5e49d5ae8 100644
--- a/starters/features/auth/package.json
+++ b/starters/features/auth/package.json
@@ -9,7 +9,7 @@
],
"nextSteps": {
"lines": [
- " Please add `optimizeDeps: { include: ['@auth/core'] }`",
+ " Please add `optimizeDeps: { include: ['@auth/qwik'] }`",
" to your vite.config.ts file.",
" Have a look at the docs for more info: ",
" https://qwik.dev/docs/integrations/authjs/"
diff --git a/starters/features/tailwind-v3/.vscode/settings.json b/starters/features/tailwind-v3/.vscode/settings.json
new file mode 100644
index 00000000000..5a586b3d1ef
--- /dev/null
+++ b/starters/features/tailwind-v3/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "css.lint.unknownAtRules": "ignore"
+}
diff --git a/starters/features/tailwind-v3/package.json b/starters/features/tailwind-v3/package.json
new file mode 100644
index 00000000000..a2418146bd5
--- /dev/null
+++ b/starters/features/tailwind-v3/package.json
@@ -0,0 +1,21 @@
+{
+ "description": "Use Tailwind v3 in your Qwik app",
+ "__qwik__": {
+ "displayName": "Integration: Tailwind v3 (styling)",
+ "priority": -10,
+ "viteConfig": {},
+ "docs": [
+ "https://qwik.dev/integrations/integration/tailwind/",
+ "https://tailwindcss.com/docs/utility-first"
+ ],
+ "alwaysInRoot": [
+ ".vscode"
+ ]
+ },
+ "devDependencies": {
+ "autoprefixer": "^10.4.19",
+ "postcss": "^8.4.39",
+ "prettier-plugin-tailwindcss": "^0.5.4",
+ "tailwindcss": "^3.4.17"
+ }
+}
diff --git a/starters/features/tailwind-v3/postcss.config.cjs b/starters/features/tailwind-v3/postcss.config.cjs
new file mode 100644
index 00000000000..12a703d900d
--- /dev/null
+++ b/starters/features/tailwind-v3/postcss.config.cjs
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/starters/features/tailwind-v3/src/global.css b/starters/features/tailwind-v3/src/global.css
new file mode 100644
index 00000000000..b089ddbbc82
--- /dev/null
+++ b/starters/features/tailwind-v3/src/global.css
@@ -0,0 +1,7 @@
+/**
+ * Tailwind CSS imports
+ * View the full documentation at https://tailwindcss.com
+ */
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/starters/features/tailwind-v3/tailwind.config.js b/starters/features/tailwind-v3/tailwind.config.js
new file mode 100644
index 00000000000..2479ed4e88f
--- /dev/null
+++ b/starters/features/tailwind-v3/tailwind.config.js
@@ -0,0 +1,8 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: ['./src/**/*.{js,ts,jsx,tsx,mdx}'],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+};
\ No newline at end of file
diff --git a/starters/features/tailwind/package.json b/starters/features/tailwind/package.json
index d1b3e5dda2c..829a56a7a02 100644
--- a/starters/features/tailwind/package.json
+++ b/starters/features/tailwind/package.json
@@ -1,7 +1,7 @@
{
- "description": "Use Tailwind in your Qwik app",
+ "description": "Use Tailwind v4 in your Qwik app",
"__qwik__": {
- "displayName": "Integration: Tailwind (styling)",
+ "displayName": "Integration: Tailwind v4 (styling)",
"priority": -10,
"viteConfig": {
"imports": [