From eb11cacdd6b27fbdd9dcd4ec2b57eb6ac500c0dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Tue, 10 Oct 2023 18:53:33 +0200 Subject: [PATCH 01/62] docs: update structure to new docs --- docs/0.index.md | 216 ------------------ docs/1.getting-started/1.introduction.md | 75 +----- docs/1.getting-started/10.deployment.md | 2 - docs/1.getting-started/2.installation.md | 58 +++-- docs/1.getting-started/3.configuration.md | 28 +-- docs/1.getting-started/3.views.md | 28 +-- docs/1.getting-started/4.assets.md | 26 +-- docs/1.getting-started/4.styling.md | 21 +- docs/1.getting-started/5.routing.md | 32 +-- docs/1.getting-started/9.layers.md | 2 - docs/2.guide/1.concepts/4.server-engine.md | 2 - .../2.directory-structure/1.content.md | 4 - docs/2.guide/3.going-further/3.modules.md | 2 - 13 files changed, 99 insertions(+), 397 deletions(-) delete mode 100644 docs/0.index.md diff --git a/docs/0.index.md b/docs/0.index.md deleted file mode 100644 index db35c15b032f..000000000000 --- a/docs/0.index.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -title: Documentation -navigation: false -description: Learn everything you need to know about Nuxt, from beginner to master. ---- - - - -::docs-hero -#title -Nuxt Docs -#description -Nuxt is a free and [open-source framework](https://github.com/nuxt/nuxt) with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with [Vue.js](https://vuejs.org). -:: - -::card-item{ .mt-4 } ---- -is: 'div' -gradientBorder: false -descriptionClass: 'w-full sm:w-2/3' -buttonsWrapperClass: 'pr-[100px] sm:pr-0' -backgroundImage: - path: '/assets/docs/getting-started/views/getting-started' - width: '100' - height: '100' - format: 'png' -buttons: - - label: 'Get started' - size: 'sm' - variant: 'primary-gradient' - to: '/docs/getting-started/introduction' - - label: 'Explore Examples' - size: 'sm' - variant: 'secondary' - to: '/docs/examples/hello-world' ---- -#title -Getting Started -#description -Start by learning Nuxt core features, from installation to deployment. -:: - - - -::docs-landing-section -#title -Guide -#description -From an idea to a masterpiece, guides take you on the path to becoming a Nuxter. -#extra - ::card-list - :::card-item - --- - gradientBorder: false - headerClass: 'justify-start px-4 pt-4 sm:px-6' - image: - path: '/assets/docs/getting-started/views/docs-landing/key-concepts' - width: '52' - height: '58' - format: 'svg' - contentClass: 'gap-y-2' - to: '/docs/guide/concepts/auto-imports' - --- - #title - Key Concepts - #description - Get an overview of the concepts that drive the Nuxt experience. - ::: - :::card-item - --- - gradientBorder: false - headerClass: 'justify-start px-4 pt-4 sm:px-6' - image: - path: '/assets/docs/getting-started/views/docs-landing/directory-structure' - width: '52' - height: '58' - format: 'svg' - contentClass: 'gap-y-2' - to: '/docs/guide/directory-structure/nuxt' - --- - #title - Directory Structure - #description - Navigate Nuxt directory structure with this handy guide. - ::: - :::card-item - --- - gradientBorder: false - headerClass: 'justify-start px-4 pt-4 sm:px-6' - image: - path: '/assets/docs/getting-started/views/docs-landing/going-further' - width: '52' - height: '58' - format: 'svg' - contentClass: 'gap-y-2' - to: '/docs/guide/going-further/internals' - --- - #title - Going further - #description - Deep dive into Nuxt internals to master all the features. - ::: - :: -:: - -::docs-landing-section -#title -API -#description -Every Nuxt component, composable and utility, in detail. -#extra - ::card-list - :::card-item - --- - gradientBorder: false - headerClass: 'justify-start px-4 pt-4 sm:px-6' - image: - path: '/assets/docs/getting-started/views/docs-landing/composables' - width: '52' - height: '58' - format: 'svg' - contentClass: 'gap-y-2' - to: '/docs/api/composables/use-app-config' - --- - #title - Composables - #description - From data fetching to error handling, get familiar with Nuxt built-in composables. - ::: - :::card-item - --- - gradientBorder: false - headerClass: 'justify-start px-4 pt-4 sm:px-6' - image: - path: '/assets/docs/getting-started/views/docs-landing/components' - width: '52' - height: '58' - format: 'svg' - contentClass: 'gap-y-2' - to: '/docs/api/components/client-only' - --- - #title - Components - #description - Nuxt components, auto-imported and ready to use in your application. - ::: - :::card-item - --- - gradientBorder: false - headerClass: 'justify-start px-4 pt-4 sm:px-6' - image: - path: '/assets/docs/getting-started/views/docs-landing/utils' - width: '52' - height: '58' - format: 'svg' - contentClass: 'gap-y-2' - to: '/docs/api/utils/dollarfetch' - --- - #title - Utils - #description - Use utility functions to get fine-grained control over your app behavior. - ::: - :::card-item - --- - gradientBorder: false - headerClass: 'justify-start px-4 pt-4 sm:px-6' - image: - path: '/assets/docs/getting-started/views/docs-landing/advanced' - width: '52' - height: '58' - format: 'svg' - contentClass: 'gap-y-2' - to: '/docs/api/advanced/hooks' - --- - #title - Advanced - #description - Learn about lifecycle hooks and Kit utilities in the advanced section. - ::: - :::card-item - --- - gradientBorder: false - headerClass: 'justify-start px-4 pt-4 sm:px-6' - image: - path: '/assets/docs/getting-started/views/docs-landing/commands' - width: '52' - height: '58' - format: 'svg' - contentClass: 'gap-y-2' - to: '/docs/api/commands/add' - --- - #title - Commands - #description - Meet Nuxi, Nuxt 3 command-line tool. The essential companion in your journey. - ::: - :::card-item - --- - gradientBorder: false - headerClass: 'justify-start px-4 pt-4 sm:px-6' - image: - path: '/assets/docs/getting-started/views/docs-landing/configuration' - width: '52' - height: '58' - format: 'svg' - contentClass: 'gap-y-2' - to: '/docs/api/configuration/nuxt-config' - --- - #title - Configuration - #description - Master the Nuxt config file to customize the framework behavior. - ::: - :: -:: diff --git a/docs/1.getting-started/1.introduction.md b/docs/1.getting-started/1.introduction.md index 4503a53691a9..17aeaec47f51 100644 --- a/docs/1.getting-started/1.introduction.md +++ b/docs/1.getting-started/1.introduction.md @@ -1,21 +1,19 @@ --- -navigation.icon: uil:info-circle +title: 'Introduction' +navigation.icon: i-uil-info-circle description: Nuxt's goal is to make web development intuitive and performant with a great Developer Experience in mind. --- -# Introduction - Nuxt is a free and [open-source framework](https://github.com/nuxt/nuxt) with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with [Vue.js](https://vuejs.org). We made everything so you can start writing `.vue` files from the beginning while enjoying hot module replacement in development and a performant application in production with server-side rendering by default. -Nuxt has no vendor lock-in, allowing you to deploy your application [**anywhere, even to the edge**](/docs/getting-started/deployment). +Nuxt has no vendor lock-in, allowing you to deploy your application [**everywhere, even on the edge**](/blog/nuxt-on-the-edge). ## Automation and Conventions Nuxt uses conventions and an opinionated directory structure to automate repetitive tasks and allow developers to focus on pushing features. The configuration file can still customize and override its default behaviors. -::list{type=success} - **File-based routing:** define routes based on the structure of your [`pages/` directory](/docs/guide/directory-structure/pages). This can make it easier to organize your application and avoid the need for manual route configuration. - **Code splitting:** Nuxt automatically splits your code into smaller chunks, which can help reduce the initial load time of your application. - **Server-side rendering out of the box:** Nuxt comes with built-in SSR capabilities, so you don't have to set up a separate server yourself. @@ -23,7 +21,6 @@ Nuxt uses conventions and an opinionated directory structure to automate repetit - **Data-fetching utilities:** Nuxt provides composables to handle SSR-compatible data fetching as well as different strategies. - **Zero-config TypeScript support:** write type-safe code without having to learn TypeScript with our auto-generated types and `tsconfig.json` - **Configured build tools:** we use [Vite](https://vitejs.dev) by default to support hot module replacement (HMR) in development and bundling your code for production with best-practices baked-in. -:: Nuxt takes care of these and provides both frontend and backend functionality so you can focus on what matters: **creating your web application**. @@ -31,22 +28,18 @@ Nuxt takes care of these and provides both frontend and backend functionality so Nuxt comes with built-in server-side rendering (SSR) capabilities by default, without having to configure a server yourself, which has many benefits for web applications: -::list{type=success} - **Faster initial page load time:** Nuxt sends a fully rendered HTML page to the browser, which can be displayed immediately. This can provide a faster perceived page load time and a better user experience (UX), especially on slower networks or devices. - **Improved SEO:** search engines can better index SSR pages because the HTML content is available immediately, rather than requiring JavaScript to render the content on the client-side. - **Better performance on low-powered devices:** it reduces the amount of JavaScript that needs to be downloaded and executed on the client-side, which can be beneficial for low-powered devices that may struggle with processing heavy JavaScript applications. - **Better accessibility:** the content is immediately available on the initial page load, improving accessibility for users who rely on screen readers or other assistive technologies. - **Easier caching:** pages can be cached on the server-side, which can further improve performance by reducing the amount of time it takes to generate and send the content to the client. -:: Overall, server-side rendering can provide a faster and more efficient user experience, as well as improve search engine optimization and accessibility. As Nuxt is a versatile framework, it gives you the possibility to statically render your whole application to a static hosting with `nuxt generate`, disable SSR globally with the `ssr: false` option or leverage hybrid rendering by setting up the `routeRules` option. -::alert{type="info"} -Read more about the [Nuxt rendering modes](/docs/guide/concepts/rendering). -:: +:read-more{title="Nuxt rendering modes" to="/docs/guide/concepts/rendering"} ### Server engine @@ -56,84 +49,30 @@ In development, it uses Rollup and Node.js workers for your server code and cont In production, Nitro builds your app and server into one universal `.output` directory. This output is light: minified and removed from any Node.js modules (except polyfills). You can deploy this output on any system supporting JavaScript, from Node.js, Serverless, Workers, Edge-side rendering or purely static. -::alert{type="info"} -Read more about [Nuxt server engine](/docs/guide/concepts/server-engine). -:: +:read-more{title="Nuxt server engine" to="/docs/guide/concepts/server-engine"} ### Production-ready A Nuxt application can be deployed on a Node or Deno server, pre-rendered to be hosted in static environments, or deployed to serverless and edge providers. -::alert{type="info"} -Discover more in the [deployment section](/docs/getting-started/deployment). -:: +:read-more{title="Deployment section" to="/docs/getting-started/deployment"} ### Modular A module system allows to extend Nuxt with custom features and integrations with third-party services. -::alert{type="info"} -Discover more about [modules](/docs/guide/concepts/modules). -:: +:read-more{title="Nuxt Modules Concept" to="/docs/guide/concepts/modules"} ### Architecture Nuxt is composed of different [core packages](https://github.com/nuxt/nuxt/tree/main/packages): -::list{type=info} - Core Engine: [nuxt](https://github.com/nuxt/nuxt/tree/main/packages/nuxt) - Bundlers: [@nuxt/vite-builder](https://github.com/nuxt/nuxt/tree/main/packages/vite) and [@nuxt/webpack-builder](https://github.com/nuxt/nuxt/tree/main/packages/webpack) - Command line interface: [nuxi](https://github.com/nuxt/nuxt/tree/main/packages/nuxi) - Server engine: [nitro](https://github.com/unjs/nitro) - Development kit: [@nuxt/kit](https://github.com/nuxt/nuxt/tree/main/packages/kit) - Nuxt 2 Bridge: [@nuxt/bridge](https://github.com/nuxt/bridge) -:: We recommend reading each concept to have a full vision of Nuxt capabilities and the scope of each package. -::card-list ---- -cardListClass: 'grid grid-cols-1 gap-y-4' ---- - :::card-item - --- - gradientBorder: false - backgroundImage: - path: '/assets/docs/getting-started/views/are-you-nuxt' - width: '72px' - height: '92px' - format: 'png' - titleClass: 'text-5xl font-semibold u-text-gray-900 pb-2' - descriptionClass: 'md:mr-[64px] w-[90%]' - --- - #title - Are you Nuxt? - #description - Nuxt is the backbone of your Vue.js project, giving structure to build your project with confidence while keeping flexibility. -
-
- Extendable with a strong module ecosystem and hooks engine, it makes it easy to connect your REST or GraphQL endpoints, favorite CMS, CSS frameworks and more. PWA and AMP support is only a module away from your Nuxt project. -
-
- Ready to try? Head over to the [Installation section](/docs/getting-started/installation). - ::: - - :::card-item - --- - gradientBorder: false - backgroundImage: - path: '/assets/docs/getting-started/views/contribute' - width: '72' - height: '92' - format: 'png' - titleClass: 'text-2xl u-text-gray-900 font-semibold' - descriptionClass: 'md:mr-[64px]' - --- - #title - Contribute - #description - Do you want to get involved in the evolution of Nuxt? -
- Follow the [contribution guide](/docs/community/contribution). - ::: -:: diff --git a/docs/1.getting-started/10.deployment.md b/docs/1.getting-started/10.deployment.md index 672d1c5f6581..675044c58621 100644 --- a/docs/1.getting-started/10.deployment.md +++ b/docs/1.getting-started/10.deployment.md @@ -15,11 +15,9 @@ If you are looking for a list of cloud providers that support Nuxt 3, see the [l Discover the Node.js server preset with Nitro to deploy on any Node hosting. -::list{type="success"} - **Default output format** if none is specified or auto-detected
- Loads only the required chunks to render the request for optimal cold start timing
- Useful for deploying Nuxt apps to any Node.js hosting -:: ### Entry Point diff --git a/docs/1.getting-started/2.installation.md b/docs/1.getting-started/2.installation.md index 7c6b4cb12d44..d8e135f904b5 100644 --- a/docs/1.getting-started/2.installation.md +++ b/docs/1.getting-started/2.installation.md @@ -1,22 +1,20 @@ --- -navigation.icon: uil:play-circle +title: 'Installation' +description: 'Get started with Nuxt quickly with our online starters or start locally with your terminal.' +navigation.icon: i-uil-play-circle --- -# Installation - -Get started with Nuxt quickly with our online starters or start locally with your terminal. - ## Play Online You can start playing with Nuxt 3 in your browser using our online sandboxes: -:button-link[Play on StackBlitz]{href="https://nuxt.new/s/v3" blank .mr-2} -:button-link[Play on CodeSandbox]{href="https://nuxt.new/c/v3" blank} +::u-page-grid + :u-page-card[Open on StackBlitz]{icon="i-simple-icons-stackblitz" to="https://nuxt.new/s/v3" target="_blank"} + :u-page-card[Open on CodeSandbox]{icon="i-simple-icons-codesandbox" to="https://nuxt.new/c/v3" target="_blank"} +:: Start with one of our starters and themes directly by opening [nuxt.new](https://nuxt.new). -:button-link[Discover nuxt.new]{href="https://nuxt.new" blank} - ## New Project @@ -27,24 +25,23 @@ Start with one of our starters and themes directly by opening [nuxt.new](https:/ - **Text editor** - We recommend [Visual Studio Code](https://code.visualstudio.com/) with the [Volar Extension](https://marketplace.visualstudio.com/items?itemName=Vue.volar) - **Terminal** - In order to run Nuxt commands -::alert -::details -:summary[Additional notes for an optimal setup:] -- **Node.js**: Make sure to use an even numbered version (18, 20, etc) -- **Nuxtr**: Install the community-developed [Nuxtr extension](https://marketplace.visualstudio.com/items?itemName=Nuxtr.nuxtr-vscode) -- **Volar**: Either enable [**Take Over Mode**](https://vuejs.org/guide/typescript/overview.html#volar-takeover-mode) (recommended) or add the [TypeScript Vue Plugin](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) - -If you have enabled **Take Over Mode** or installed the **TypeScript Vue Plugin (Volar)**, you can disable generating the shim for `*.vue` files in your [`nuxt.config.ts`](/docs/guide/directory-structure/nuxt.config) file: - -```ts [nuxt.config.ts] -export default defineNuxtConfig({ - typescript: { - shim: false - } -}) -``` - -:: +::callout + ::details + :summary[Additional notes for an optimal setup:] + - **Node.js**: Make sure to use an even numbered version (18, 20, etc) + - **Nuxtr**: Install the community-developed [Nuxtr extension](https://marketplace.visualstudio.com/items?itemName=Nuxtr.nuxtr-vscode) + - **Volar**: Either enable [**Take Over Mode**](https://vuejs.org/guide/typescript/overview.html#volar-takeover-mode) (recommended) or add the [TypeScript Vue Plugin](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) + + If you have enabled **Take Over Mode** or installed the **TypeScript Vue Plugin (Volar)**, you can disable generating the shim for `*.vue` files in your [`nuxt.config.ts`](/docs/guide/directory-structure/nuxt.config) file: + + ```ts [nuxt.config.ts] + export default defineNuxtConfig({ + typescript: { + shim: false + } + }) + ``` + :: :: Open a terminal (if you're using [Visual Studio Code](https://code.visualstudio.com/), you can open an [integrated terminal](https://code.visualstudio.com/docs/editor/integrated-terminal)) and use the following command to create a new starter project: @@ -67,7 +64,7 @@ bunx nuxi@latest init Open your project folder in Visual Studio Code: -```bash +```bash [Terminal] code ``` @@ -115,10 +112,9 @@ pnpm dev -o ```bash [bun] bun run dev -o ``` - :: -::alert{type=success icon=โœจ .font-bold} +::callout{icon="i-ph-check-circle-duotone"} Well done! A browser window should automatically open for . :: @@ -126,4 +122,4 @@ Well done! A browser window should automatically open for @@ -86,7 +86,7 @@ const runtimeConfig = useRuntimeConfig() ``` -:ReadMore{link="/docs/guide/going-further/runtime-config"} +:read-more{to="/docs/guide/going-further/runtime-config"} ## App Configuration @@ -114,7 +114,7 @@ const appConfig = useAppConfig() ``` -:ReadMore{link="/docs/guide/directory-structure/app-config"} +:read-more{to="/docs/guide/directory-structure/app-config"} ## `runtimeConfig` vs `app.config` @@ -177,7 +177,7 @@ export default defineNuxtConfig({ }) ``` -:ReadMore{link="/docs/guide/directory-structure/nuxt.config#vue"} +:read-more{to="/docs/guide/directory-structure/nuxt.config#vue"} ### With webpack @@ -195,7 +195,7 @@ export default defineNuxtConfig({ }) ``` -:ReadMore{link="/docs/guide/directory-structure/nuxt.config#loaders"} +:read-more{to="/docs/guide/directory-structure/nuxt.config#loaders"} ### Enabling Experimental Vue Features @@ -210,4 +210,4 @@ export default defineNuxtConfig({ }) ``` -:ReadMore{link="/docs/guide/directory-structure/nuxt.config#vue-1"} +:read-more{to="/docs/guide/directory-structure/nuxt.config#vue-1"} diff --git a/docs/1.getting-started/3.views.md b/docs/1.getting-started/3.views.md index f6940154479b..6a6e38a26107 100644 --- a/docs/1.getting-started/3.views.md +++ b/docs/1.getting-started/3.views.md @@ -1,14 +1,12 @@ --- -navigation.icon: uil:window-section +title: 'Views' +description: 'Nuxt provides several component layers to implement the user interface of your application.' +navigation.icon: i-uil-window-section --- -# Views - -Nuxt provides several component layers to implement the user interface of your application. - ## `app.vue` -![The `app.vue` file is the entry point of your application](/assets/docs/getting-started/views/app.svg) +![The app.vue file is the entry point of your application](/assets/docs/getting-started/views/app.svg) By default, Nuxt will treat this file as the **entrypoint** and render its content for every route of the application. @@ -20,7 +18,7 @@ By default, Nuxt will treat this file as the **entrypoint** and render its conte ``` -::alert +::callout If you are familiar with Vue, you might wonder where `main.js` is (the file that normally creates a Vue app). Nuxt does this behind the scene. :: @@ -57,7 +55,7 @@ Most components are reusable pieces of the user interface, like buttons and menu ![Pages are views tied to a specific route](/assets/docs/getting-started/views/pages.svg) -Pages represent views for each specific route pattern. Every file in the [`pages/` directory](/docs/guide/directory-structure/pages) represents a different route displaying its content. +Pages represent views for each specific route pattern. Every file in the [`pages/`](/docs/guide/directory-structure/pages) directory represents a different route displaying its content. To use pages, create `pages/index.vue` file and add `` component to the `app.vue` (or remove `app.vue` for default entry). You can now create more pages and their corresponding routes by adding new files in the [`pages/` directory](/docs/guide/directory-structure/pages). @@ -84,9 +82,7 @@ To use pages, create `pages/index.vue` file and add `` component to :: -::alert -You will learn more about pages in the [Routing section](/docs/getting-started/routing) -:: +:read-more{title="Routing Section" to="/docs/getting-started/routing"} ## Layouts @@ -94,8 +90,8 @@ You will learn more about pages in the [Routing section](/docs/getting-started/r Layouts are wrappers around pages that contain a common User Interface for several pages, such as a header and footer display. Layouts are Vue files using `` components to display the **page** content. The `layouts/default.vue` file will be used by default. Custom layouts can be set as part of your page metadata. -::alert -If you only have a single layout in your application, we recommend using app.vue with the [`` component](/docs/api/components/nuxt-page) instead. +::callout +If you only have a single layout in your application, we recommend using `app.vue` with [``](/docs/api/components/nuxt-page) instead. :: ::code-group @@ -135,8 +131,8 @@ If you want to create more layouts and learn how to use them in your pages, find ## Advanced: Extending the HTML template -::alert{type=info} -If you only need to modify the head, you can refer to the [SEO and meta section](/docs/getting-started/seo-meta). +::callout +If you only need to modify the ``, you can refer to the [SEO and meta section](/docs/getting-started/seo-meta). :: You can have full control over the HTML template by adding a Nitro plugin that registers a hook. @@ -154,4 +150,4 @@ export default defineNitroPlugin((nitroApp) => { }) ``` -:ReadMore{link="/docs/guide/going-further/hooks"} +:read-more{to="/docs/guide/going-further/hooks"} diff --git a/docs/1.getting-started/4.assets.md b/docs/1.getting-started/4.assets.md index efaab282f151..04e64a59772f 100644 --- a/docs/1.getting-started/4.assets.md +++ b/docs/1.getting-started/4.assets.md @@ -1,19 +1,19 @@ --- +title: 'Assets' +description: 'Nuxt offers two options for your assets.' navigation.icon: uil:image --- -# Assets - Nuxt uses two directories to handle assets like stylesheets, fonts or images. -- The [`public/` directory](/docs/guide/directory-structure/public) content is served at the server root as-is. -- The [`assets/` directory](/docs/guide/directory-structure/assets) contains by convention every asset that you want the build tool (Vite or webpack) to process. +- The [`public/`](/docs/guide/directory-structure/public) directory content is served at the server root as-is. +- The [`assets/`](/docs/guide/directory-structure/assets) directory contains by convention every asset that you want the build tool (Vite or webpack) to process. -## `public/` Directory +## Public Directory -The [`public/` directory](/docs/guide/directory-structure/public) is used as a public server for static assets publicly available at a defined URL of your application. +The [`public/`](/docs/guide/directory-structure/public) directory is used as a public server for static assets publicly available at a defined URL of your application. -You can get a file in the [`public/` directory](/docs/guide/directory-structure/public) from your application's code or from a browser by the root URL `/`. +You can get a file in the [`public/`](/docs/guide/directory-structure/public) directory from your application's code or from a browser by the root URL `/`. ### Example @@ -25,13 +25,13 @@ For example, referencing an image file in the `public/img/` directory, available ``` -## `assets/` Directory +## Assets Directory -Nuxt uses [Vite](https://vitejs.dev/guide/assets.html) or [webpack](https://webpack.js.org/guides/asset-management/) to build and bundle your application. The main function of these build tools is to process JavaScript files, but they can be extended through [plugins](https://vitejs.dev/plugins/) (for Vite) or [loaders](https://webpack.js.org/loaders/) (for webpack) to process other kind of assets, like stylesheets, fonts or SVG. This step transforms the original file mainly for performance or caching purposes (such as stylesheets minification or browser cache invalidation). +Nuxt uses [Vite](https://vitejs.dev/guide/assets.html) (default) or [webpack](https://webpack.js.org/guides/asset-management/) to build and bundle your application. The main function of these build tools is to process JavaScript files, but they can be extended through [plugins](https://vitejs.dev/plugins/) (for Vite) or [loaders](https://webpack.js.org/loaders/) (for webpack) to process other kind of assets, like stylesheets, fonts or SVG. This step transforms the original file mainly for performance or caching purposes (such as stylesheets minification or browser cache invalidation). -By convention, Nuxt uses the [`assets/` directory](/docs/guide/directory-structure/assets) to store these files but there is no auto-scan functionality for this directory, and you can use any other name for it. +By convention, Nuxt uses the [`assets/`](/docs/guide/directory-structure/assets) directory to store these files but there is no auto-scan functionality for this directory, and you can use any other name for it. -In your application's code, you can reference a file located in the [`assets/` directory](/docs/guide/directory-structure/assets) by using the `~/assets/` path. +In your application's code, you can reference a file located in the [`assets/`](/docs/guide/directory-structure/assets) directory by using the `~/assets/` path. ### Example @@ -43,8 +43,8 @@ For example, referencing an image file that will be processed if a build tool is ``` -::alert{type=info icon=๐Ÿ’ก} -Nuxt won't serve files in the [`assets/` directory](/docs/guide/directory-structure/assets) at a static URL like `/assets/my-file.png`. If you need a static URL, use the [`public/` directory](#public-directory). +::callout +Nuxt won't serve files in the [`assets/`](/docs/guide/directory-structure/assets) directory at a static URL like `/assets/my-file.png`. If you need a static URL, use the [`public/`](#public-directory) directory. :: ### Global Styles Imports diff --git a/docs/1.getting-started/4.styling.md b/docs/1.getting-started/4.styling.md index 16093e29adbc..f769ac67eed9 100644 --- a/docs/1.getting-started/4.styling.md +++ b/docs/1.getting-started/4.styling.md @@ -1,9 +1,9 @@ --- +title: 'Styling' +description: 'Learn how to style your Nuxt application.' navigation.icon: uil:palette --- -# Styling - Nuxt is highly flexible when it comes to styling. Write your own styles, or reference local and external stylesheets. You can use CSS preprocessors, CSS frameworks, UI libraries and Nuxt modules to style your application. @@ -30,7 +30,7 @@ import('~/assets/css/first.css') ``` -::alert{type=info} +::callout The stylesheets will be inlined in the HTML rendered by Nuxt. :: @@ -45,7 +45,7 @@ export default defineNuxtConfig({ }) ``` -::alert{type=info} +::callout The stylesheets will be inlined in the HTML rendered by Nuxt, injected globally and present in all pages. :: @@ -120,8 +120,7 @@ export default defineNuxtConfig({ You can use the useHead composable to dynamically set a value in your head in your code. -::ReadMore{link="/docs/api/composables/use-head"} -:: +:read-more{to="/docs/api/composables/use-head"} ```ts useHead({ @@ -184,7 +183,7 @@ export default defineNuxtConfig({ }) ``` -::alert{type=info} +::callout In both cases, the compiled stylesheets will be inlined in the HTML rendered by Nuxt. :: @@ -453,8 +452,7 @@ Use different styles for different layouts. ``` -::ReadMore{link="/docs/guide/directory-structure/layouts"} -:: +:read-more{to="/docs/guide/directory-structure/layouts"} ## Third Party Libraries And Modules @@ -484,14 +482,13 @@ If you are using [UnoCSS](https://unocss.dev/integrations/nuxt), note that it co Nuxt comes with the same `` element that Vue has, and also has support for the experimental [View Transitions API](/docs/getting-started/transitions#view-transitions-api-experimental). -::ReadMore{link="/docs/features/transitions"} -:: +:read-more{to="/docs/features/transitions"} ### Font Advanced Optimization We would recommend using [Fontaine](https://github.com/nuxt-modules/fontaine) to reduce your [CLS](https://web.dev/cls/). If you need something more advanced, consider creating a Nuxt module to extend the build process or the Nuxt runtime. -::alert{type="info"} +::callout Always remember to take advantage of the various tools and techniques available in the Web ecosystem at large to make styling your application easier and more efficient. Whether you're using native CSS, a preprocessor, postcss, a UI library or a module, Nuxt has got you covered. Happy styling! :: diff --git a/docs/1.getting-started/5.routing.md b/docs/1.getting-started/5.routing.md index 3f5ce8de01fe..4c0bfdce9915 100644 --- a/docs/1.getting-started/5.routing.md +++ b/docs/1.getting-started/5.routing.md @@ -1,10 +1,10 @@ --- -navigation.icon: uil:sign-alt +title: 'Routing' description: Nuxt file-system routing creates a route for every file in the pages/ directory. +navigation.icon: i-uil-sign-alt --- -# Routing -One core feature of Nuxt is the file system router. Every Vue file inside the [`pages/` directory](/docs/guide/directory-structure/pages) creates a corresponding URL (or route) that displays the contents of the file. By using dynamic imports for each page, Nuxt leverages code-splitting to ship the minimum amount of JavaScript for the requested route. +One core feature of Nuxt is the file system router. Every Vue file inside the [`pages/`](/docs/guide/directory-structure/pages) directory creates a corresponding URL (or route) that displays the contents of the file. By using dynamic imports for each page, Nuxt leverages code-splitting to ship the minimum amount of JavaScript for the requested route. ## Pages @@ -14,7 +14,7 @@ This file system routing uses naming conventions to create dynamic and nested ro ::code-group -```text [pages/ directory] +```text [pages/] pages/ --| about.vue --| index.vue @@ -22,7 +22,7 @@ pages/ ----| [id].vue ``` -```js [Generated Router file] +```js [Generated Router File] { "routes": [ { @@ -43,13 +43,13 @@ pages/ :: -:ReadMore{link="/docs/guide/directory-structure/pages"} +:read-more{to="/docs/guide/directory-structure/pages"} ## Navigation -The `` component links pages between them. It renders an `` tag with the `href` attribute set to the route of the page. Once the application is hydrated, page transitions are performed in JavaScript by updating the browser URL. This prevents full-page refreshes and allows for animated transitions. +The [``](/docs/api/components/nuxt-link) component links pages between them. It renders an `` tag with the `href` attribute set to the route of the page. Once the application is hydrated, page transitions are performed in JavaScript by updating the browser URL. This prevents full-page refreshes and allows for animated transitions. -When a `` enters the viewport on the client side, Nuxt will automatically prefetch components and payload (generated pages) of the linked pages ahead of time, resulting in faster navigation. +When a [``](/docs/api/components/nuxt-link) enters the viewport on the client side, Nuxt will automatically prefetch components and payload (generated pages) of the linked pages ahead of time, resulting in faster navigation. ```vue [pages/app.vue] ``` -:ReadMore{link="/docs/api/components/nuxt-link"} +:read-more{to="/docs/api/components/nuxt-link"} ## Route Parameters -The `useRoute()` composable can be used in a ` ``` -:ReadMore{link="/docs/api/composables/use-route"} +:read-more{to="/docs/api/composables/use-route"} ## Route Middleware Nuxt provides a customizable route middleware framework you can use throughout your application, ideal for extracting code that you want to run before navigating to a particular route. -::alert{type=info} +::callout Route middleware runs within the Vue part of your Nuxt app. Despite the similar name, they are completely different from server middleware, which are run in the Nitro server part of your app. :: There are three kinds of route middleware: 1. Anonymous (or inline) route middleware, which are defined directly in the pages where they are used. -2. Named route middleware, which are placed in the [`middleware/` directory](/docs/guide/directory-structure/middleware) and will be automatically loaded via asynchronous import when used on a page. (**Note**: The route middleware name is normalized to kebab-case, so `someMiddleware` becomes `some-middleware`.) +2. Named route middleware, which are placed in the [`middleware/`](/docs/guide/directory-structure/middleware) directory and will be automatically loaded via asynchronous import when used on a page. (**Note**: The route middleware name is normalized to kebab-case, so `someMiddleware` becomes `some-middleware`.) 3. Global route middleware, which are placed in the [`middleware/` directory](/docs/guide/directory-structure/middleware) (with a `.global` suffix) and will be automatically run on every route change. Example of an `auth` middleware protecting the `/dashboard` page: @@ -123,11 +123,11 @@ definePageMeta({ :: -:ReadMore{link="/docs/guide/directory-structure/middleware"} +:read-more{to="/docs/guide/directory-structure/middleware"} ## Route Validation -Nuxt offers route validation via the `validate` property in [`definePageMeta`](/docs/api/utils/define-page-meta) in each page you wish to validate. +Nuxt offers route validation via the `validate` property in [`definePageMeta()`](/docs/api/utils/define-page-meta) in each page you wish to validate. The `validate` property accepts the `route` as an argument. You can return a boolean value to determine whether or not this is a valid route to be rendered with this page. If you return `false`, and another match can't be found, this will cause a 404 error. You can also directly return an object with `statusCode`/`statusMessage` to respond immediately with an error (other matches will not be checked). @@ -143,3 +143,5 @@ definePageMeta({ }) ``` + +:read-more{to="/docs/api/utils/define-page-meta"} diff --git a/docs/1.getting-started/9.layers.md b/docs/1.getting-started/9.layers.md index 72417888f23d..d4b4f23fc2b1 100644 --- a/docs/1.getting-started/9.layers.md +++ b/docs/1.getting-started/9.layers.md @@ -9,14 +9,12 @@ One of the core features of Nuxt 3 is the layers and extending support. You can Some use cases: -::list{type="success"} - Share reusable configuration presets across projects using `nuxt.config` and `app.config` - Create a component library using [`components/` directory](/docs/guide/directory-structure/components) - Create utility and composable library using [`composables/` directory](/docs/guide/directory-structure/composables) and [`utils/` directory](/docs/guide/directory-structure/utils) - Create [Nuxt themes](https://github.com/nuxt-themes) - Create Nuxt module presets - Share standard setup across projects -:: You can extend a layer by adding the [extends](/docs/api/configuration/nuxt-config#extends) property to the [`nuxt.config.ts`](/docs/guide/directory-structure/nuxt.config) file. diff --git a/docs/2.guide/1.concepts/4.server-engine.md b/docs/2.guide/1.concepts/4.server-engine.md index db4940ffe2c3..5aafa3910504 100644 --- a/docs/2.guide/1.concepts/4.server-engine.md +++ b/docs/2.guide/1.concepts/4.server-engine.md @@ -2,14 +2,12 @@ Nuxt 3 is powered by a new server engine, [Nitro](https://nitro.unjs.io/). -::list{type=success} - Cross-platform support for Node.js, Browsers, service-workers and more. - Serverless support out-of-the-box. - API routes support. - Automatic code-splitting and async-loaded chunks. - Hybrid mode for static + serverless sites. - Development server with hot module reloading. -:: ## API Layer diff --git a/docs/2.guide/2.directory-structure/1.content.md b/docs/2.guide/2.directory-structure/1.content.md index beec4019f207..6739b88e11cd 100644 --- a/docs/2.guide/2.directory-structure/1.content.md +++ b/docs/2.guide/2.directory-structure/1.content.md @@ -9,15 +9,11 @@ description: The Content module reads the content/ directory to create a file-ba The [Nuxt Content module](https://content.nuxtjs.org) reads the [`content/` directory](/docs/guide/directory-structure/content) in your project and parses `.md`, `.yml`, `.csv` and `.json` files to create a file-based CMS for your application. -::list{type=success} - - Render your content with built-in components. - Query your content with a MongoDB-like API. - Use your Vue components in Markdown files with the MDC syntax. - Automatically generate your navigation. -:: - ## Get Started ### Installation diff --git a/docs/2.guide/3.going-further/3.modules.md b/docs/2.guide/3.going-further/3.modules.md index 2ad2f8b78f91..cf7dfd9c1152 100644 --- a/docs/2.guide/3.going-further/3.modules.md +++ b/docs/2.guide/3.going-further/3.modules.md @@ -171,7 +171,6 @@ export default defineNuxtModule({ Ultimately `defineNuxtModule` returns a wrapper function with the lower level `(inlineOptions, nuxt)` module signature. This wrapper function applies defaults and other necessary steps before calling your `setup` function: -::list - Support `defaults` and `meta.configKey` for automatically merging module options - Type hints and automated type inference - Add shims for basic Nuxt 2 compatibility @@ -181,7 +180,6 @@ Ultimately `defineNuxtModule` returns a wrapper function with the lower level `( - Expose `getOptions` and `getMeta` for internal usage of Nuxt - Ensuring backward and upward compatibility as long as the module is using `defineNuxtModule` from the latest version of `@nuxt/kit` - Integration with module builder tooling -:: #### Runtime Directory From 8c9fc13a2152fd00869967a84aba575054e26f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Tue, 10 Oct 2023 18:56:27 +0200 Subject: [PATCH 02/62] docs: update --- docs/1.getting-started/3.configuration.md | 6 +++--- docs/1.getting-started/5.seo-meta.md | 10 ++-------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/docs/1.getting-started/3.configuration.md b/docs/1.getting-started/3.configuration.md index 32e06758ace2..0b3abb0d173c 100644 --- a/docs/1.getting-started/3.configuration.md +++ b/docs/1.getting-started/3.configuration.md @@ -177,7 +177,7 @@ export default defineNuxtConfig({ }) ``` -:read-more{to="/docs/guide/directory-structure/nuxt.config#vue"} +:read-more{to="/docs/api/configuration/nuxt-config#vue"} ### With webpack @@ -195,7 +195,7 @@ export default defineNuxtConfig({ }) ``` -:read-more{to="/docs/guide/directory-structure/nuxt.config#loaders"} +:read-more{to="/docs/api/configuration/nuxt-config#loaders"} ### Enabling Experimental Vue Features @@ -210,4 +210,4 @@ export default defineNuxtConfig({ }) ``` -:read-more{to="/docs/guide/directory-structure/nuxt.config#vue-1"} +:read-more{to="/docs/api/configuration/nuxt-config#vue-1"} diff --git a/docs/1.getting-started/5.seo-meta.md b/docs/1.getting-started/5.seo-meta.md index 74cc43861fd0..c0b0f8de9ad5 100644 --- a/docs/1.getting-started/5.seo-meta.md +++ b/docs/1.getting-started/5.seo-meta.md @@ -1,19 +1,13 @@ --- -navigation.icon: uil:file-search-alt +title: SEO and Meta description: Improve your Nuxt app's SEO with powerful head config, composables and components. +navigation.icon: i-uil-file-search-alt --- -# SEO and Meta - -Improve your Nuxt app's SEO with powerful head config, composables and components. - ## Defaults Out-of-the-box, Nuxt provides sane defaults, which you can override if needed. -- `charset`: `utf-8` -- `viewport`: `width=device-width, initial-scale=1` - ```ts [nuxt.config.ts] export default defineNuxtConfig({ app: { From 16b5563516a874e9c75f9ad5e79e74bba9fa2ae1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Wed, 11 Oct 2023 15:03:48 +0200 Subject: [PATCH 03/62] chore: wip --- docs/1.getting-started/2.installation.md | 6 +- docs/1.getting-started/5.seo-meta.md | 16 +- docs/1.getting-started/5.transitions.md | 17 +- docs/1.getting-started/6.data-fetching.md | 58 +++--- docs/1.getting-started/7.state-management.md | 39 ++-- docs/1.getting-started/8.error-handling.md | 168 +++++++++++------- .../2.directory-structure/1.components.md | 2 +- .../2.directory-structure/1.composables.md | 3 +- .../2.directory-structure/1.layouts.md | 3 +- .../2.directory-structure/1.middleware.md | 3 +- docs/2.guide/2.directory-structure/1.pages.md | 3 +- docs/3.api/1.composables/use-cookie.md | 3 +- docs/3.api/1.composables/use-error.md | 38 ++-- docs/3.api/1.composables/use-fetch.md | 6 +- docs/3.api/2.components/4.nuxt-link.md | 3 +- docs/3.api/2.components/9.teleports.md | 3 +- docs/3.api/3.utils/clear-error.md | 3 +- docs/3.api/4.advanced/1.hooks.md | 10 +- 18 files changed, 203 insertions(+), 181 deletions(-) diff --git a/docs/1.getting-started/2.installation.md b/docs/1.getting-started/2.installation.md index d8e135f904b5..cc0eb9cb4323 100644 --- a/docs/1.getting-started/2.installation.md +++ b/docs/1.getting-started/2.installation.md @@ -8,9 +8,9 @@ navigation.icon: i-uil-play-circle You can start playing with Nuxt 3 in your browser using our online sandboxes: -::u-page-grid - :u-page-card[Open on StackBlitz]{icon="i-simple-icons-stackblitz" to="https://nuxt.new/s/v3" target="_blank"} - :u-page-card[Open on CodeSandbox]{icon="i-simple-icons-codesandbox" to="https://nuxt.new/c/v3" target="_blank"} +::card-group + :card{title="Open on StackBlitz" icon="i-simple-icons-stackblitz" to="https://nuxt.new/s/v3" target="_blank"} + :card{title="Open on CodeSandbox" icon="i-simple-icons-codesandbox" to="https://nuxt.new/c/v3" target="_blank"} :: Start with one of our starters and themes directly by opening [nuxt.new](https://nuxt.new). diff --git a/docs/1.getting-started/5.seo-meta.md b/docs/1.getting-started/5.seo-meta.md index c0b0f8de9ad5..94b4165c00ff 100644 --- a/docs/1.getting-started/5.seo-meta.md +++ b/docs/1.getting-started/5.seo-meta.md @@ -21,7 +21,7 @@ export default defineNuxtConfig({ Providing an [`app.head`](/docs/api/configuration/nuxt-config#head) property in your [`nuxt.config.ts`](/docs/guide/directory-structure/nuxt.config) allows you to customize the head for your entire app. -::alert{type=info} +::callout This method does not allow you to provide reactive data. We recommend to use `useHead()` in `app.vue`. :: @@ -51,9 +51,9 @@ useHead({ We recommend to take a look at the [`useHead`](/docs/api/composables/use-head) and [`useHeadSafe`](/docs/api/composables/use-head-safe) composables. -## `useSeoMeta` and `useServerSeoMeta` +## `useSeoMeta` -The `useSeoMeta` and [`useServerSeoMeta`](/docs/api/composables/use-server-seo-meta) composables let you define your site's SEO meta tags as a flat object with full TypeScript support. +The [`useSeoMeta`](/docs/api/composables/use-seo-meta) composable lets you define your site's SEO meta tags as a flat object with full TypeScript support. This helps you avoid typos and common mistakes, such as using `name` instead of `property`. @@ -70,7 +70,7 @@ useSeoMeta({ ``` -Read more on the [`useSeoMeta`](/docs/api/composables/use-seo-meta) and [`useServerSeoMeta`](/docs/api/composables/use-server-seo-meta) composables. +:read-more{to="/docs/api/composables/use-seo-meta"} ## Components @@ -220,7 +220,7 @@ Within your [`pages/` directory](/docs/guide/directory-structure/pages), you can For example, you can first set the current page title (this is extracted at build time via a macro, so it can't be set dynamically): -```vue{}[pages/some-page.vue] +```vue [pages/some-page.vue] ``` -:LinkExample{link="/docs/examples/features/meta-tags"} +:link-example{to="/docs/examples/features/meta-tags"} -:ReadMore{link="/docs/guide/directory-structure/pages/#page-metadata"} +:read-more{to="/docs/guide/directory-structure/pages/#page-metadata"} ### Dynamic Title diff --git a/docs/1.getting-started/5.transitions.md b/docs/1.getting-started/5.transitions.md index 29e2cdddc457..59d78dcd8ba2 100644 --- a/docs/1.getting-started/5.transitions.md +++ b/docs/1.getting-started/5.transitions.md @@ -1,11 +1,12 @@ --- -navigation.icon: uil:moon-eclipse -description: Nuxt leverages Vue's Transition component to apply transitions between pages and layouts. +title: 'Transitions' +description: Apply transitions between pages and layouts with Vue or native browser View Transitions. +navigation.icon: i-uil-moon-eclipse --- -# Transitions - +::callout Nuxt leverages Vue's [``](https://vuejs.org/guide/built-ins/transition.html#the-transition-component) component to apply transitions between pages and layouts. +:: ## Page transitions @@ -19,7 +20,7 @@ export default defineNuxtConfig({ }) ``` -::alert{type=warning} +::callout If you are changing layouts as well as page, the page transition you set here will not run. Instead, you should set a [layout transition](/docs/getting-started/transitions#layout-transitions). :: @@ -245,7 +246,7 @@ export default defineNuxtConfig({ }) ``` -::alert{type="info"} +::callout If you change the `name` property, you also have to rename the CSS classes accordingly. :: @@ -308,7 +309,7 @@ definePageMeta({ ``` -::alert{type="info"} +::callout Learn more about additional [JavaScript hooks](https://vuejs.org/guide/built-ins/transition.html#javascript-hooks) available in the `Transition` component. :: @@ -405,7 +406,7 @@ When `` is used in `app.vue`, transition-props can be passed directl ``` -::alert{type="warning"} +::callout Remember, this page transition cannot be overridden with `definePageMeta` on individual pages. :: diff --git a/docs/1.getting-started/6.data-fetching.md b/docs/1.getting-started/6.data-fetching.md index eadd169e8b05..f7182ee5f8c3 100644 --- a/docs/1.getting-started/6.data-fetching.md +++ b/docs/1.getting-started/6.data-fetching.md @@ -1,11 +1,12 @@ --- -navigation.icon: uil:channel +title: 'Data fetching' description: Nuxt provides composables to handle data fetching within your application. +navigation.icon: uil:channel --- -# Data fetching +Nuxt comes with two composables and a built-in library to perform data-fetching in browser or server environments: `useFetch`, [`useAsyncData`](/docs/api/composables/use-async-data) and `$fetch`. -Nuxt comes with two composables and a built-in library to perform data-fetching in browser or server environments: `useFetch`, [`useAsyncData`](/docs/api/composables/use-async-data) and `$fetch` . In a nutshell: +In a nutshell: - [`useFetch`](/docs/api/composables/use-fetch) is the most straightforward way to handle data fetching in a component setup function. - [`$fetch`](/docs/api/utils/dollarfetch) is great to make network requests based on user interaction. @@ -17,7 +18,7 @@ Before that, it's imperative to know why these composables exist in the first pl ## Why using specific composables? -When using a framework like Nuxt that can perform calls and render pages on both client and server environments, some challenges must be addressed. This is why Nuxt provides composables to wrap your queries, instead of letting the developer rely on `$fetch` calls alone. +When using a framework like Nuxt that can perform calls and render pages on both client and server environments, some challenges must be addressed. This is why Nuxt provides composables to wrap your queries, instead of letting the developer rely on [`$fetch`](/docs/api/utils/dollarfetch) calls alone. ### Network calls duplication @@ -25,18 +26,14 @@ The [`useFetch`](/docs/api/composables/use-fetch) and [`useAsyncData`](/docs/api The payload is a JavaScript object accessible through [`useNuxtApp().payload`](/docs/api/composables/use-nuxt-app#payload). It is used on the client to avoid refetching the same data when the code is executed in the browser. -::alert{icon=โš™๏ธ} -Use the [Nuxt DevTools](https://devtools.nuxt.com) to inspect this data in the payload tab. +::callout +Use the [Nuxt DevTools](https://devtools.nuxt.com) to inspect this data in the **Payload tab**. :: ### Suspense Nuxt uses Vueโ€™s [``](https://vuejs.org/guide/built-ins/suspense) component under the hood to prevent navigation before every async data is available to the view. The data fetching composables can help you leverage this feature and use what suits best on a per-calls basis. -::alert{icon=๐Ÿ‘‰} -These composables are auto-imported and can be used in `setup` functions or lifecycle hooks -:: - ## `useFetch` The [`useFetch`](/docs/api/composables/use-fetch) composable is the most straightforward way to perform data fetching. @@ -53,11 +50,9 @@ const { data: count } = await useFetch('/api/count') This composable is a wrapper around the [`useAsyncData`](/docs/api/composables/use-async-data) composable and `$fetch` utility. -::ReadMore{link="/docs/api/composables/use-fetch"} -:: +:read-more{to="/docs/api/composables/use-fetch"} -::LinkExample{link="/docs/examples/features/data-fetching"} -:: +:link-example{to="/docs/examples/features/data-fetching"} ## `$fetch` @@ -67,7 +62,7 @@ Nuxt includes the `ofetch` library, and is auto-imported as the `$fetch` alias g const users = await $fetch('/api/users').catch((error) => error.data) ``` -::alert{type="warning"} +::callout Beware that using only `$fetch` will not provide [network calls de-duplication and navigation prevention](#why-using-specific-composables). It is recommended to use `$fetch` when posting data to an event handler, when doing client-side only logic, or combined with `useAsyncData`. :: @@ -79,11 +74,12 @@ The `ofetch` library is built on top of [the `fetch` API](https://developer.mozi - Auto-retry - Interceptors -::alert{icon=๐Ÿ“˜} -[Read the full documentation of ofetch](https://github.com/unjs/ofetch) +::read-more{title="ofetch" to="https://github.com/unjs/ofetch" target="_blank"} +Read the full documentation of `ofetch` :: -::ReadMore{link="/docs/api/utils/dollarfetch"} +::read-more{to="/docs/api/utils/dollarfetch"} +Read more about `$fetch` :: ## `useAsyncData` @@ -123,7 +119,8 @@ const { data: discounts, pending } = await useAsyncData('cart-discount', async ( }) ``` -::ReadMore{link="/docs/api/composables/use-async-data"} +::read-more{to="/docs/api/composables/use-async-data"} +Read more about `useAsyncData` :: ## Options @@ -160,10 +157,12 @@ You can alternatively use [`useLazyFetch`](/docs/api/composables/use-lazy-fetch) const { pending, data: posts } = useLazyFetch('/api/posts') ``` -::ReadMore{link="/docs/api/composables/use-lazy-fetch"} +::read-more{to="/docs/api/composables/use-lazy-fetch"} +Read more about `useLazyFetch` :: -::ReadMore{link="/docs/api/composables/use-lazy-async-data"} +::read-more{to="/docs/api/composables/use-lazy-async-data"} +Read more about `useLazyAsyncData` :: ### Client-only fetching @@ -211,7 +210,7 @@ const { data: mountains } = await useFetch('/api/mountains', { }) ``` -::alert{type="warning"} +::callout Both `pick` and `transform` don't prevent the unwanted data from being fetched initially. But they will prevent unwanted data from being added to the payload transferred from server to client. :: @@ -224,7 +223,7 @@ Both `pick` and `transform` don't prevent the unwanted data from being fetched i - [`useFetch`](/docs/api/composables/use-fetch) uses the provided URL as a key. Alternatively, a `key` value can be provided in the `options` object passed as a last argument. - [`useAsyncData`](/docs/api/composables/use-async-data) uses its first argument as a key if it is a string. If the first argument is the handler function that performs the query, then a key that is unique to the file name and line number of the instance ofย `useAsyncData`ย will be generated for you. -::alert{icon=๐Ÿ“˜} +::callout To get the cached data by key, you can use [`useNuxtData`](/docs/api/composables/use-nuxt-data) :: @@ -247,7 +246,7 @@ const { data, error, execute, refresh } = await useFetch('/api/users') The `execute` function is an alias for `refresh` that works in exactly the same way but is more semantic for cases when the fetch is [not immediate](#not-immediate). -::alert{icon=๐Ÿ“˜} +::callout To globally refetch or invalidate cached data, see [`clearNuxtData`](/docs/api/utils/clear-nuxt-data) and [`refreshNuxtData`](/docs/api/utils/refresh-nuxt-data). :: @@ -315,7 +314,7 @@ const { data } = await useFetch('/api/me', { headers }) ``` -::alert{type="warning"} +::callout Be very careful before proxying headers to an external API and just include headers that you need. Not all headers are safe to be bypassed and might introduce unwanted behavior. Here is a list of common headers that are NOT to be proxied: - `host`, `accept` @@ -374,19 +373,18 @@ export default defineNuxtComponent({ ``` -::Alert +::callout Using ` + + +``` + +::callout +Although it is called an 'error page' it's not a route and shouldn't be placed in your `~/pages` directory. For the same reason, you shouldn't use `definePageMeta` within this page. +:: + +The error page has a single prop - `error` which contains an error for you to handle. + +The `error` object provides the fields: +```ts +{ + url: string + statusCode: number + statusMessage: string + message: string + description: string + data: any +} +``` + +If you have an error with custom fields they will be lost; you should assign them to `data` instead: -You can customize this error page by adding `~/error.vue` in the source directory of your application, alongside `app.vue`. Although it is called an 'error page' it's not a route and shouldn't be placed in your `~/pages` directory. For the same reason, you shouldn't use `definePageMeta` within this page. +```ts +throw createError({ + statusCode: 404, + statusMessage: 'Page Not Found', + data: { + myCustomField: true + } +}) +``` - The error page has a single prop - `error` which contains an error for you to handle. -The `error` object provides the fields: `url`, `statusCode`, `statusMessage`, `message`, `description` and `data`. If you have an error with custom fields they will be lost; you should assign them to `data` instead. For custom errors we highly recommend to use `onErrorCaptured` composable that can be called in a page/component setup function or `vue:error` runtime nuxt hook that can be configured in a nuxt plugin. +For custom errors we highly recommend to use `onErrorCaptured` composable that can be called in a page/component setup function or `vue:error` runtime nuxt hook that can be configured in a nuxt plugin. ```ts export default defineNuxtPlugin(nuxtApp => { @@ -88,56 +144,43 @@ export default defineNuxtPlugin(nuxtApp => { }) ``` -When you are ready to remove the error page, you can call the `clearError` helper function, which takes an optional path to redirect to (for example, if you want to navigate to a 'safe' page). +When you are ready to remove the error page, you can call the [`clearError`](/docs/api/utils/clear-error) helper function, which takes an optional path to redirect to (for example, if you want to navigate to a 'safe' page). -::alert{type="warning"} +::callout Make sure to check before using anything dependent on Nuxt plugins, such as `$route` or `useRouter`, as if a plugin threw an error, then it won't be re-run until you clear the error. :: -::alert{type="warning"} -If you are running on Node 16 and you set any cookies when rendering your error page, they will [overwrite cookies previously set](https://github.com/nuxt/nuxt/pull/20585). We recommend using a newer version of Node as Node 16 will reach end-of-life in September 2023. +::callout +If you are running on Node 16 and you set any cookies when rendering your error page, they will [overwrite cookies previously set](https://github.com/nuxt/nuxt/pull/20585). We recommend using a newer version of Node as Node 16 reached end-of-life in September 2023. :: -### Example - -```vue [error.vue] - - - -``` - -## Error Helper Methods +## Error Utils ### `useError` -* `function useError (): Ref` +```ts [TS Signature] +function useError (): Ref +``` This function will return the global Nuxt error that is being handled. -::ReadMore{link="/docs/api/composables/use-error"} +::read-more{to="/docs/api/composables/use-error"} +Read more about `useError` composable. :: ### `createError` -* `function createError (err: { cause, data, message, name, stack, statusCode, statusMessage, fatal }): Error` +```ts [TS Signature] +function createError (err: { cause, data, message, name, stack, statusCode, statusMessage, fatal }): Error +``` -You can use this function to create an error object with additional metadata. It is usable in both the Vue and Nitro portions of your app, and is meant to be thrown. +Create an error object with additional metadata. It is usable in both the Vue and Server portions of your app, and is meant to be thrown. If you throw an error created with `createError`: * on server-side, it will trigger a full-screen error page which you can clear with `clearError`. * on client-side, it will throw a non-fatal error for you to handle. If you need to trigger a full-screen error page, then you can do this by setting `fatal: true`. -### Example - ```vue [pages/movies/[slug\\].vue] ``` +::read-more{to="/docs/api/utils/create-error"} +Read more about `createError` util. +:: + ### `showError` -* `function showError (err: string | Error | { statusCode, statusMessage }): Error` +```ts [TS Signature] +function showError (err: string | Error | { statusCode, statusMessage }): Error +``` You can call this function at any point on client-side, or (on server side) directly within middleware, plugins or `setup()` functions. It will trigger a full-screen error page which you can clear with `clearError`. @@ -197,5 +246,4 @@ If you navigate to another route, the error will be cleared automatically. ``` -::LinkExample{link="/docs/examples/advanced/error-handling"} -:: +:link-example{to="/docs/examples/advanced/error-handling"} diff --git a/docs/2.guide/2.directory-structure/1.components.md b/docs/2.guide/2.directory-structure/1.components.md index a6fb461af3a0..e8531693ac11 100644 --- a/docs/2.guide/2.directory-structure/1.components.md +++ b/docs/2.guide/2.directory-structure/1.components.md @@ -456,4 +456,4 @@ export default defineNuxtConfig({ It will automatically import the components only if used and also support HMR when updating your components in `node_modules/awesome-ui/components/`. -:LinkExample{link="/docs/examples/features/auto-imports"} +:link-example{to="/docs/examples/features/auto-imports"} diff --git a/docs/2.guide/2.directory-structure/1.composables.md b/docs/2.guide/2.directory-structure/1.composables.md index 102f22e82683..f28538cb82de 100644 --- a/docs/2.guide/2.directory-structure/1.composables.md +++ b/docs/2.guide/2.directory-structure/1.composables.md @@ -46,8 +46,7 @@ const foo = useFoo() ``` -::LinkExample{link="/docs/examples/features/auto-imports"} -:: +:link-example{to="/docs/examples/features/auto-imports"} ## Examples diff --git a/docs/2.guide/2.directory-structure/1.layouts.md b/docs/2.guide/2.directory-structure/1.layouts.md index f6d961d08b98..867df1c69fc2 100644 --- a/docs/2.guide/2.directory-structure/1.layouts.md +++ b/docs/2.guide/2.directory-structure/1.layouts.md @@ -131,8 +131,7 @@ definePageMeta({ ``` -::LinkExample{link="/docs/examples/features/layouts"} -:: +:link-example{to="/docs/examples/features/layouts"} ## Overriding a Layout on a Per-page Basis diff --git a/docs/2.guide/2.directory-structure/1.middleware.md b/docs/2.guide/2.directory-structure/1.middleware.md index 5520b4eaa966..0dbd2138d8d4 100644 --- a/docs/2.guide/2.directory-structure/1.middleware.md +++ b/docs/2.guide/2.directory-structure/1.middleware.md @@ -170,5 +170,4 @@ definePageMeta({ Now, before navigation to that page can complete, the `auth` route middleware will be run. -::LinkExample{link="/docs/examples/routing/middleware"} -:: +:link-example{to="/docs/examples/routing/middleware"} diff --git a/docs/2.guide/2.directory-structure/1.pages.md b/docs/2.guide/2.directory-structure/1.pages.md index 3caab9c2aeb6..49939203d520 100644 --- a/docs/2.guide/2.directory-structure/1.pages.md +++ b/docs/2.guide/2.directory-structure/1.pages.md @@ -220,8 +220,7 @@ definePageMeta({ ``` -::LinkExample{link="/docs/examples/routing/pages"} -:: +:link-example{to="/docs/examples/routing/pages"} ## Page Metadata diff --git a/docs/3.api/1.composables/use-cookie.md b/docs/3.api/1.composables/use-cookie.md index 7cc84dbf267f..26823f78cae0 100644 --- a/docs/3.api/1.composables/use-cookie.md +++ b/docs/3.api/1.composables/use-cookie.md @@ -216,5 +216,4 @@ export default defineEventHandler(event => { }) ``` -::LinkExample{link="/docs/examples/advanced/use-cookie"} -:: +:link-example{to="/docs/examples/advanced/use-cookie"} diff --git a/docs/3.api/1.composables/use-error.md b/docs/3.api/1.composables/use-error.md index 385b8a6f91cd..45f43e19add4 100644 --- a/docs/3.api/1.composables/use-error.md +++ b/docs/3.api/1.composables/use-error.md @@ -3,35 +3,25 @@ title: "useError" description: useError composable returns the global Nuxt error that is being handled. --- -# `useError` - -`useError` composable returns the global Nuxt error that is being handled and it is available on both client and server. +The composable returns the global Nuxt error that is being handled and it is available on both client and server. ```ts const error = useError() ``` -`useError` sets an error in the state and creates a reactive as well as SSR-friendly global Nuxt error across components. Nuxt errors have the following properties: - -## Properties - -- **statusCode** - - Type: `Number` - - HTTP response status code - -- **statusMessage** +`useError` sets an error in the state and creates a reactive as well as SSR-friendly global Nuxt error across components. - Type: `String` +Nuxt errors have the following properties: - HTTP response status message - -- **message** - - Type: `String` - - Error message +```ts +interface { + // HTTP response status code + statusCode: number + // HTTP response status message + statusMessage: string + // Error message + message: string +} +``` -::ReadMore{link="/docs/getting-started/error-handling"} -:: +:read-more{to="/docs/getting-started/error-handling"} diff --git a/docs/3.api/1.composables/use-fetch.md b/docs/3.api/1.composables/use-fetch.md index b3bdc3cd1191..f6dbecb85d8f 100644 --- a/docs/3.api/1.composables/use-fetch.md +++ b/docs/3.api/1.composables/use-fetch.md @@ -140,10 +140,8 @@ const { data, pending, error, refresh } = await useFetch('/api/auth/login', { [`useFetch`](/docs/api/composables/use-fetch) is a reserved function name transformed by the compiler, so you should not name your own function `useFetch`. :: -::LinkExample{link="/docs/examples/advanced/use-custom-fetch-composable"} -:: +:link-example{to="/docs/examples/advanced/use-custom-fetch-composable"} :ReadMore{link="/docs/getting-started/data-fetching"} -::LinkExample{link="/docs/examples/features/data-fetching"} -:: +:link-example{to="/docs/examples/features/data-fetching"} diff --git a/docs/3.api/2.components/4.nuxt-link.md b/docs/3.api/2.components/4.nuxt-link.md index 00eb84a50c15..af98ffcd7180 100644 --- a/docs/3.api/2.components/4.nuxt-link.md +++ b/docs/3.api/2.components/4.nuxt-link.md @@ -118,5 +118,4 @@ defineNuxtLink({ - **prefetchedClass**: A default class to apply to links that have been prefetched. - **trailingSlash**: An option to either add or remove trailing slashes in the `href`. If unset or not matching the valid values `append` or `remove`, it will be ignored. -::LinkExample{link="/docs/examples/routing/pages"} -:: +:link-example{to="/docs/examples/routing/pages"} diff --git a/docs/3.api/2.components/9.teleports.md b/docs/3.api/2.components/9.teleports.md index bc3dd54071d1..c6d3dc2e87f9 100644 --- a/docs/3.api/2.components/9.teleports.md +++ b/docs/3.api/2.components/9.teleports.md @@ -37,5 +37,4 @@ The `to` target of [``](https://vuejs.org/guide/built-ins/teleport.htm ``` -::LinkExample{link="/docs/examples/advanced/teleport"} -:: +:link-example{to="/docs/examples/advanced/teleport"} diff --git a/docs/3.api/3.utils/clear-error.md b/docs/3.api/3.utils/clear-error.md index c62a73454948..dffb6d5eba8e 100644 --- a/docs/3.api/3.utils/clear-error.md +++ b/docs/3.api/3.utils/clear-error.md @@ -23,5 +23,4 @@ clearError({ redirect: '/homepage' }) Errors are set in state using [`useError()`](/docs/api/composables/use-error). The `clearError` composable will reset this state and calls the `app:error:cleared` hook with the provided options. -::ReadMore{link="/docs/getting-started/error-handling"} -:: +:read-more{to="/docs/getting-started/error-handling"} diff --git a/docs/3.api/4.advanced/1.hooks.md b/docs/3.api/4.advanced/1.hooks.md index d81f831935cd..f585483f417c 100644 --- a/docs/3.api/4.advanced/1.hooks.md +++ b/docs/3.api/4.advanced/1.hooks.md @@ -1,13 +1,11 @@ --- -title: "Lifecycle Hooks" +title: 'Lifecycle Hooks' description: Nuxt provides a powerful hooking system to expand almost every aspect using hooks. --- -# Lifecycle Hooks +:read-more{to="/docs/guide/going-further/hooks"} -:ReadMore{link="/docs/guide/going-further/hooks"} - -# App Hooks (runtime) +## App Hooks (runtime) Check the [app source code](https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/nuxt.ts#L27) for all available hooks. @@ -29,7 +27,7 @@ Hook | Arguments | Environment | Description `page:finish` | `pageComponent?` | Client | Called on [Suspense](https://vuejs.org/guide/built-ins/suspense.html#suspense) resolved event. `page:transition:finish`| `pageComponent?` | Client | After page transition [onAfterLeave](https://vuejs.org/guide/built-ins/transition.html#javascript-hooks) event. -# Nuxt Hooks (build time) +## Nuxt Hooks (build time) Check the [schema source code](https://github.com/nuxt/nuxt/blob/main/packages/schema/src/types/hooks.ts#L53) for all available hooks. From fb309e22dc71467924f330a51d81df6262db3ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Wed, 11 Oct 2023 17:35:52 +0200 Subject: [PATCH 04/62] docs: get-started ready --- docs/1.getting-started/10.deployment.md | 92 ++++++------- docs/1.getting-started/11.testing.md | 149 +++++++++------------ docs/1.getting-started/12.upgrade.md | 51 +++---- docs/1.getting-started/8.error-handling.md | 34 +++-- docs/1.getting-started/9.layers.md | 27 ++-- docs/6.bridge/1.overview.md | 2 +- docs/6.bridge/10.configuration.md | 2 +- docs/6.bridge/8.nitro.md | 2 +- docs/6.bridge/9.vite.md | 4 +- 9 files changed, 170 insertions(+), 193 deletions(-) diff --git a/docs/1.getting-started/10.deployment.md b/docs/1.getting-started/10.deployment.md index 675044c58621..eb09eaa908f0 100644 --- a/docs/1.getting-started/10.deployment.md +++ b/docs/1.getting-started/10.deployment.md @@ -1,14 +1,13 @@ --- +title: 'Deployment' +description: Learn how to deploy your Nuxt application to any hosting provider. navigation.icon: uil:rocket -description: Deploy on a Node.js server, pre-render for static hosting and to serverless or edge environments. --- -# Deployment - A Nuxt application can be deployed on a Node.js server, pre-rendered for static hosting, or deployed to serverless or edge (CDN) environments. -::alert{type=info} -If you are looking for a list of cloud providers that support Nuxt 3, see the [list below](#supported-hosting-providers). +::callout +If you are looking for a list of cloud providers that support Nuxt 3, see the [Hosting providers](#hosting-providers) section. :: ## Node.js Server @@ -23,26 +22,19 @@ Discover the Node.js server preset with Nitro to deploy on any Node hosting. When running `nuxt build` with the Node server preset, the result will be an entry point that launches a ready-to-run Node server. -```bash +```bash [Terminal] node .output/server/index.mjs ``` -### Example - -```bash -$ node .output/server/index.mjs -Listening on http://localhost:3000 -``` - -### Configuring Defaults at Runtime +This will launch your production Nuxt server that listens on port 3000 by default. -This preset will respect the following runtime environment variables: +It respects the following runtime environment variables: - `NITRO_PORT` or `PORT` (defaults to `3000`) - `NITRO_HOST` or `HOST` (defaults to `'0.0.0.0'`) - `NITRO_SSL_CERT` and `NITRO_SSL_KEY` - if both are present, this will launch the server in HTTPS mode. In the vast majority of cases, this should not be used other than for testing, and the Nitro server should be run behind a reverse proxy like nginx or Cloudflare which terminates SSL. -#### Using PM2 +### PM2 To use `pm2`, use an `ecosystem.config.js`: @@ -60,7 +52,7 @@ module.exports = { } ``` -#### Using Cluster Mode +### Cluster Mode You can use `NITRO_PRESET=node_cluster` in order to leverage multi-process performance using Node.js [cluster](https://nodejs.org/dist/latest/docs/api/cluster.html) module. @@ -68,14 +60,14 @@ By default, the workload gets distributed to the workers with the round robin st ### Learn More -:ReadMore{link="https://nitro.unjs.io/deploy/node" title="the Nitro documentation for node-server preset"} +:read-more{to="https://nitro.unjs.io/deploy/node" title="the Nitro documentation for node-server preset"} ## Static Hosting There are two ways to deploy a Nuxt application to any static hosting services: - Static site generation (SSG) with `ssr: true` pre-renders routes of your application at build time. (This is the default behavior when running `nuxi generate`.) It will also generate `/200.html` and `/404.html` single-page app fallback pages, which can render dynamic routes or 404 errors on the client (though you may need to configure this on your static host). -- Alternatively, you can prerender your site with `ssr: false` (static single-page app). This will produce HTML pages with an empty `
` where your Vue app would normally be rendered. You will lose many of the benefits of prerendering your site, so it is suggested instead to use `` to wrap the portions of your site that cannot be server rendered (if any). +- Alternatively, you can prerender your site with `ssr: false` (static single-page app). This will produce HTML pages with an empty `
` where your Vue app would normally be rendered. You will lose many SEO benefits of prerendering your site, so it is suggested instead to use [``](/docs/api/components/client-only) to wrap the portions of your site that cannot be server rendered (if any). ### Crawl-based Pre-rendering @@ -96,15 +88,15 @@ Working of the Nitro crawler: This is important to understand since pages that are not linked to a discoverable page can't be pre-rendered automatically. -::alert{type=info} -Read more about the [`nuxi generate` command](/docs/api/commands/generate#nuxi-generate). +::read-more{to="/docs/api/commands/generate#nuxi-generate"} +Read more about the `nuxi generate` command. :: ### Selective Pre-rendering You can manually specify routes that [Nitro](/docs/guide/concepts/server-engine) will fetch and pre-render during the build or ignore routes that you don't want to pre-render like `/dynamic` in the `nuxt.config` file: -```ts [nuxt.config.ts|js] +```ts [nuxt.config.ts] defineNuxtConfig({ nitro: { prerender: { @@ -117,7 +109,7 @@ defineNuxtConfig({ You can combine this with the `crawLinks` option to pre-render a set of routes that the crawler can't discover like your `/sitemap.xml` or `/robots.txt`: -```ts [nuxt.config.ts|js] +```ts [nuxt.config.ts] defineNuxtConfig({ nitro: { prerender: { @@ -130,27 +122,55 @@ defineNuxtConfig({ Setting `nitro.prerender` to `true` is similar to `nitro.prerender.crawlLinks` to `true`. -::alert{type=info} -Read more about [pre-rendering](https://nitro.unjs.io/config#prerender) in the Nitro documentation. +::read-more{to="https://nitro.unjs.io/config#prerender"} +Read more about pre-rendering in the Nitro documentation. :: ### Client-side Only Rendering If you don't want to pre-render your routes, another way of using static hosting is to set the `ssr` property to `false` in the `nuxt.config` file. The `nuxi generate` command will then output an `.output/public/index.html` entrypoint and JavaScript bundles like a classic client-side Vue.js application. -```ts [nuxt.config.ts|js] +```ts [nuxt.config.ts] defineNuxtConfig({ ssr: false }) ``` +## Hosting Providers + +Nuxt 3 can be deployed to several cloud providers with a minimal amount of configuration: + +::card-group + :card{title="AWS" icon="i-logos-aws" to="https://nitro.unjs.io/deploy/providers/aws" target="_blank"} + :card{title="Azure" icon="i-logos-microsoft-azure" to="https://nitro.unjs.io/deploy/providers/azure" target="_blank"} + :card{title="Cleavr" icon="i-ph-cloud-duotone" to="https://nitro.unjs.io/deploy/providers/cleavr" target="_blank"} + :card{title="CloudFlare" icon="i-logos-cloudflare" to="https://nitro.unjs.io/deploy/providers/cloudflare" target="_blank"} + :card{title="DigitalOcean" icon="i-logos-digital-ocean" to="https://nitro.unjs.io/deploy/providers/digitalocean" target="_blank"} + :card{title="Edgio" icon="i-logos-edgio-icon" to="https://nitro.unjs.io/deploy/providers/edgio" target="_blank"} + :card{title="Firebase" icon="i-logos-firebase" to="https://nitro.unjs.io/deploy/providers/firebase" target="_blank"} + :card{title="Heroku" icon="i-logos-heroku-icon" to="https://nitro.unjs.io/deploy/providers/heroku" target="_blank"} + :card{title="Lagon" icon="i-ph-cloud-duotone" to="https://nitro.unjs.io/deploy/providers/lagon" target="_blank"} + :card{title="Netlify" icon="i-logos-netlify-icon" to="https://nitro.unjs.io/deploy/providers/netlify" target="_blank"} + :card{title="Render" icon="i-simple-icons-render" to="https://nitro.unjs.io/deploy/providers/render" target="_blank"} + :card{title="Stormkit" icon="i-ph-cloud-duotone" to="https://nitro.unjs.io/deploy/providers/stormkit" target="_blank"} + ::card + --- + title: Vercel + icon: i-simple-icons-vercel + to: https://nitro.unjs.io/deploy/providers/vercel + target: _blank + ui.icon.base: 'text-black dark:text-white' + --- + :: +:: + ## Presets In addition to Node.js servers and static hosting services, a Nuxt 3 project can be deployed with several well-tested presets and minimal amount of configuration. You can explicitly set the desired preset in the [`nuxt.config`](/docs/guide/directory-structure/nuxt.config) file: -```js [nuxt.config.js|ts] +```js [nuxt.config.ts] export default { nitro: { preset: 'node-server' @@ -166,24 +186,6 @@ NITRO_PRESET=node-server nuxt build ๐Ÿ”Ž Check [the Nitro deployment](https://nitro.unjs.io/deploy) for all possible deployment presets and providers. -### Supported Hosting Providers - -Nuxt 3 can be deployed to several cloud providers with a minimal amount of configuration: - -- :icon{name="logos:aws" class="h-5 w-4 inline mb-2"} [AWS](https://nitro.unjs.io/deploy/providers/aws) -- :icon{name="logos:microsoft-azure" class="h-5 w-4 inline mb-2"} [Azure](https://nitro.unjs.io/deploy/providers/azure) -- :icon{name="ph:cloud-duotone" class="h-5 w-4 inline mb-2"} [Cleavr](https://nitro.unjs.io/deploy/providers/cleavr) -- :icon{name="logos:cloudflare" class="h-5 w-4 inline mb-2"} [Cloudflare](https://nitro.unjs.io/deploy/providers/cloudflare) -- :icon{name="logos:digital-ocean" class="h-5 w-4 inline mb-2"} [DigitalOcean](https://nitro.unjs.io/deploy/providers/digitalocean) -- :icon{name="ph:cloud-duotone" class="h-5 w-4 inline mb-2"} [Edgio](https://nitro.unjs.io/deploy/providers/edgio) -- :icon{name="logos:firebase" class="h-5 w-4 inline mb-2"} [Firebase](https://nitro.unjs.io/deploy/providers/firebase) -- :icon{name="logos:heroku-icon" class="h-5 w-4 inline mb-2"} [Heroku](https://nitro.unjs.io/deploy/providers/heroku) -- :icon{name="IconLagon" class="h-5 w-4 inline mb-2 text-black dark:text-white"} [Lagon](https://nitro.unjs.io/deploy/providers/lagon) -- :icon{name="logos:netlify" class="h-5 w-4 inline mb-2"} [Netlify](https://nitro.unjs.io/deploy/providers/netlify) -- :icon{name="simple-icons:render" class="h-5 w-4 inline mb-2"} [Render](https://nitro.unjs.io/deploy/providers/render) -- :icon{name="ph:cloud-duotone" class="h-5 w-4 inline mb-2"} [Stormkit](https://nitro.unjs.io/deploy/providers/stormkit) -- :icon{name="simple-icons:vercel" class="h-5 w-4 inline mb-2 text-black dark:text-white"} [Vercel](https://nitro.unjs.io/deploy/providers/vercel) - ## CDN Proxy In most cases, Nuxt can work with third-party content that is not generated or created by Nuxt itself. But sometimes such content can cause problems, especially Cloudflare's "Minification and Security Options". diff --git a/docs/1.getting-started/11.testing.md b/docs/1.getting-started/11.testing.md index 6ae12d8375ae..369948a1f572 100644 --- a/docs/1.getting-started/11.testing.md +++ b/docs/1.getting-started/11.testing.md @@ -1,12 +1,10 @@ --- -navigation.icon: uil:check-circle +title: Testing +description: How to test your Nuxt application. +navigation.icon: i-uil-check-circle --- -# Testing - -How to test your Nuxt application. - -::alert{icon=๐Ÿ‘‰} +::callout Test utils are still in development and the API and behavior may change. Currently, it is in preview stage but not yet ready for testing production apps. If you are a module author, you can find more specific information in the [Module Author's guide](/docs/guide/going-further/modules#testing) :: @@ -15,15 +13,26 @@ In Nuxt 3, we have a rewritten version of `@nuxt/test-utils`. We support [Vitest ## Installation -```bash +::code-group +```bash [yarn] yarn add --dev @nuxt/test-utils vitest ``` +```bash [yarn] +npm i --save-dev @nuxt/test-utils vitest +``` +```bash [pnpm] +pnpm add --dev @nuxt/test-utils vitest +``` +```bash [bun] +bun add --dev @nuxt/test-utils vitest +``` +:: ## Setup In each `describe` block where you are taking advantage of the `@nuxt/test-utils` helper methods, you will need to set up the test context before beginning. -```ts +```ts [test/my-test.spec.ts] import { describe, test } from 'vitest' import { setup, $fetch } from '@nuxt/test-utils' @@ -40,89 +49,55 @@ describe('My test', async () => { Behind the scenes, `setup` performs a number of tasks in `beforeAll`, `beforeEach`, `afterEach` and `afterAll` to set up the Nuxt test environment correctly. -## Options - -### Nuxt Configuration - -#### `rootDir` - -Path to a directory with a Nuxt app to be put under test. +Please the options below for the `setup` method. -* Type: `string` -* Default: `'.'` +### Nuxt Config -#### `configFile` - -Name of the configuration file. - -* Type: `string` -* Default: `'nuxt.config'` +- `rootDir`: Path to a directory with a Nuxt app to be put under test. + - Type: `string` + - Default: `'.'` +- `configFile`: Name of the configuration file. + - Type: `string` + - Default: `'nuxt.config'` - -### Setup Timings - -#### `setupTimeout` - -The amount of time (in milliseconds) to allow for `setupTest` to complete its work (which could include building or generating files for a Nuxt application, depending on the options that are passed). - -* Type: `number` -* Default: `60000` - -### Features to Enable - -#### `server` - -Whether to launch a server to respond to requests in the test suite. - -* Type: `boolean` -* Default: `true` - -#### `port` - -If provided, set the launched test server port to the value. - -* Type: `number | undefined` -* Default: `undefined` - -#### `build` - -Whether to run a separate build step. - -* Type: `boolean` -* Default: `true` (`false` if `browser` or `server` is disabled) - -#### `browser` - -Under the hood, Nuxt test utils uses [`playwright`](https://playwright.dev/) to carry out browser testing. If this option is set, a browser will be launched and can be controlled in the subsequent test suite. (More info can be found [here](/docs/getting-started/testing).) - -* Type: `boolean` -* Default: `false` - -#### `browserOptions` - -* Type: `object` with the following properties - * **type**: The type of browser to launch - either `chromium`, `firefox` or `webkit` - * **launch**: `object` of options that will be passed to playwright when launching the browser. See [full API reference](https://playwright.dev/docs/api/class-browsertype#browser-type-launch). - -#### `runner` - -Specify the runner for the test suite. Currently, [Vitest](https://vitest.dev/) is recommended. - -* Type: `'vitest' | 'jest'` -* Default: `'vitest'` +- `config`: Object with configuration overrides. + - Type: `NuxtConfig` + - Default: `{}` --> + +### Timings + +- `setupTimeout`: The amount of time (in milliseconds) to allow for `setupTest` to complete its work (which could include building or generating files for a Nuxt application, depending on the options that are passed). + - Type: `number` + - Default: `60000` + +### Features + +- `server`: Whether to launch a server to respond to requests in the test suite. + - Type: `boolean` + - Default: `true` + +- `port`: If provided, set the launched test server port to the value. + - Type: `number | undefined` + - Default: `undefined` + +- `build`: Whether to run a separate build step. + - Type: `boolean` + - Default: `true` (`false` if `browser` or `server` is disabled) +- `browser`: Under the hood, Nuxt test utils uses [`playwright`](https://playwright.dev/) to carry out browser testing. If this option is set, a browser will be launched and can be controlled in the subsequent test suite. + - Type: `boolean` + - Default: `false` +- `browserOptions` + - Type: `object` with the following properties + - `type`: The type of browser to launch - either `chromium`, `firefox` or `webkit` + - `launch`: `object` of options that will be passed to playwright when launching the browser. See [full API reference](https://playwright.dev/docs/api/class-browsertype#browser-type-launch). +- `runner`: Specify the runner for the test suite. Currently, [Vitest](https://vitest.dev/) is recommended. + - Type: `'vitest' | 'jest'` + - Default: `'vitest'` ## APIs -### APIs for Rendering Testing - -#### `$fetch(url)` +### `$fetch(url)` Get the HTML of a server-rendered page. @@ -132,7 +107,7 @@ import { $fetch } from '@nuxt/test-utils' const html = await $fetch('/') ``` -#### `fetch(url)` +### `fetch(url)` Get the response of a server-rendered page. @@ -143,7 +118,7 @@ const res = await fetch('/') const { body, headers } = res ``` -#### `url(path)` +### `url(path)` Get the full URL for a given page (including the port the test server is running on.) @@ -156,6 +131,6 @@ const pageUrl = url('/page') ## Testing in a Browser -::alert{icon=๐Ÿšง} +::callout We are working on it, stay tuned! :: diff --git a/docs/1.getting-started/12.upgrade.md b/docs/1.getting-started/12.upgrade.md index d5348dc6e6cd..5f79fa19f60b 100644 --- a/docs/1.getting-started/12.upgrade.md +++ b/docs/1.getting-started/12.upgrade.md @@ -1,14 +1,26 @@ --- -navigation.icon: uil:arrow-up -description: Have a Nuxt 2 project to migrate? Use these guides to upgrade your applications to Nuxt 3. +title: Upgrade Guide +description: 'Learn how to upgrade to the lastest Nuxt version.' +navigation.icon: i-uil-arrow-up --- -# Upgrade Guide -Have a Nuxt 2 project to migrate? Use these guides to upgrade your Nuxt applications to Nuxt 3 or take the first step in that direction with Nuxt Bridge. -If you are already using Nuxt 3 and want to upgrade to the latest release or test new features before their release, head over to the [Upgrading Nuxt 3](#upgrading-nuxt-3) section. +## Upgrading Nuxt 3 + +### Latest release + +To upgrade Nuxt 3 to the [latest release](https://github.com/nuxt/nuxt/releases), use the `nuxi upgrade` command. + +```bash [Terminal] +npx nuxi upgrade +``` + +### Edge release channel -## Feature Comparison +To use the latest Nuxt 3 nightly build and test features before their release, read the [Edge Release Channel](/docs/guide/going-further/edge-channel) guide. + + +## Nuxt 2 vs Nuxt 3 In the table below, there is a quick comparison between 3 versions of Nuxt: @@ -34,34 +46,15 @@ Static sites | โœ… | โœ… | โœ… The migration guide provides a step-by-step comparison of Nuxt 2 features to Nuxt 3 features and guidance to adapt your current application. -::alert{type=info} -๐Ÿ‘‰ Check out the [**guide to migrating from Nuxt 2 to Nuxt 3**](/docs/migration/overview). +::read-more{to="/docs/migration/overview"} +Check out the **guide to migrating from Nuxt 2 to Nuxt 3**. :: -::alert{type=info} -:rocket: Migrate with confidence with our [official Nuxt 2 to Nuxt 3 workshop](/support/workshop). -:: ## Nuxt 2 to Nuxt Bridge If you prefer to progressively migrate your Nuxt 2 application to Nuxt 3, you can use Nuxt Bridge. Nuxt Bridge is a compatibility layer that allows you to use Nuxt 3 features in Nuxt 2 with an opt-in mechanism. -::alert{type=info icon=๐Ÿ‘‰} -[**Migrate from Nuxt 2 to Nuxt Bridge**](/docs/bridge/overview) -:: - -## Upgrading Nuxt 3 - -### Latest release - -To upgrade Nuxt 3 to the [latest release](/docs/community/changelog), use the `nuxi upgrade` command. - -```bash -npx nuxi upgrade -``` - -### Edge release channel - -::alert{type=info icon=๐Ÿ‘‰} -To use the latest Nuxt 3 build and test features before their release, read the [edge release channel](/docs/guide/going-further/edge-channel) guide. +::read-more{to="/docs/bridge/overview"} +**Migrate from Nuxt 2 to Nuxt Bridge** :: diff --git a/docs/1.getting-started/8.error-handling.md b/docs/1.getting-started/8.error-handling.md index de8ab6c9e96b..20af62b08bd3 100644 --- a/docs/1.getting-started/8.error-handling.md +++ b/docs/1.getting-started/8.error-handling.md @@ -53,7 +53,7 @@ This includes: ## Nitro Server Lifecycle -You cannot currently define a server-side handler for these errors, but can render an error page (see the next section). +You cannot currently define a server-side handler for these errors, but can render an error page, see the [Render an Error Page](#error-page) section. ## Errors with JS chunks @@ -61,7 +61,7 @@ You might encounter chunk loading errors due to a network connectivity failure o You can change this behavior by setting `experimental.emitRouteChunkError` to `false` (to disable hooking into these errors at all) or to `manual` if you want to handle them yourself. If you want to handle chunk loading errors manually, you can check out the [the automatic implementation](https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/plugins/chunk-reload.client.ts) for ideas. -## Render an Error Page +## Error Page ::callout When Nuxt encounters a fatal error (any unhandled error on the server, or an error created with `fatal: true` on the client) it will either render a JSON response (if requested with `Accept: application/json` header) or trigger a full-screen error page. @@ -136,7 +136,7 @@ throw createError({ For custom errors we highly recommend to use `onErrorCaptured` composable that can be called in a page/component setup function or `vue:error` runtime nuxt hook that can be configured in a nuxt plugin. -```ts +```ts [plugins/error-handler.ts] export default defineNuxtPlugin(nuxtApp => { nuxtApp.hook('vue:error', (err) => { // @@ -178,15 +178,19 @@ Create an error object with additional metadata. It is usable in both the Vue an If you throw an error created with `createError`: -* on server-side, it will trigger a full-screen error page which you can clear with `clearError`. +* on server-side, it will trigger a full-screen error page which you can clear with [`clearError`](#clearerror). * on client-side, it will throw a non-fatal error for you to handle. If you need to trigger a full-screen error page, then you can do this by setting `fatal: true`. ```vue [pages/movies/[slug\\].vue] ``` @@ -201,36 +205,38 @@ Read more about `createError` util. function showError (err: string | Error | { statusCode, statusMessage }): Error ``` -You can call this function at any point on client-side, or (on server side) directly within middleware, plugins or `setup()` functions. It will trigger a full-screen error page which you can clear with `clearError`. +You can call this function at any point on client-side, or (on server side) directly within middleware, plugins or `setup()` functions. It will trigger a full-screen error page which you can clear with [`clearError`](#clearerror). It is recommended instead to use `throw createError()`. -::ReadMore{link="/docs/api/utils/show-error"} +::read-more{to="/docs/api/utils/show-error"} +Read more about `showError` util. :: ### `clearError` -* `function clearError (options?: { redirect?: string }): Promise` +```ts [TS Signature] +function clearError (options?: { redirect?: string }): Promise +``` This function will clear the currently handled Nuxt error. It also takes an optional path to redirect to (for example, if you want to navigate to a 'safe' page). -::ReadMore{link="/docs/api/utils/clear-error"} +::read-more{to="/docs/api/utils/clear-error"} +Read more about `clearError` util. :: -## Rendering Errors Within Your App +## Render Error in Component -Nuxt also provides a `` component that allows you to handle client-side errors within your app, without replacing your entire site with an error page. +Nuxt also provides a [``](/docs/api/components/nuxt-error-boundary) component that allows you to handle client-side errors within your app, without replacing your entire site with an error page. This component is responsible for handling errors that occur within its default slot. On client-side, it will prevent the error from bubbling up to the top level, and will render the `#error` slot instead. The `#error` slot will receive `error` as a prop. (If you set `error = null` it will trigger re-rendering the default slot; you'll need to ensure that the error is fully resolved first or the error slot will just be rendered a second time.) -::alert{type="info"} +::callout If you navigate to another route, the error will be cleared automatically. :: -### Example - ```vue [pages/index.vue] ``` -Server-only components use `` under the hood, meaning that `lazy` prop and `#fallback` slot are both passed down to ``. +Server-only components use [``](/docs/api/components/nuxt-island) under the hood, meaning that `lazy` prop and `#fallback` slot are both passed down to it. #### Server Component Context @@ -311,11 +275,11 @@ This means: Within an island component, you can access its island context through `nuxtApp.ssrContext.islandContext`. Note that while island components are still marked as experimental, the format of this context may change. -::alert{type=info} +::callout Slots can be interactive and are wrapped within a `
` with `display: contents;` :: -### Paired with a `.client` component +### Paired with a Client component In this case, the `.server` + `.client` components are two 'halves' of a component and can be used in advanced use cases for separate implementations of a component on server and client side. @@ -334,10 +298,50 @@ In this case, the `.server` + `.client` components are two 'halves' of a compone ``` -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} It is essential that the client half of the component can 'hydrate' the server-rendered HTML. That is, it should render the same HTML on initial load, or you will experience a hydration mismatch. :: +## `` Component + +Nuxt provides the [``](/docs/api/components/client-only) component for purposely rendering a component only on client side. + +```html [pages/example.vue] + +``` + +Use a slot as fallback until `` is mounted on client side. + +```html [pages/example.vue] + +``` + + + + ## `` Component Nuxt provides the `` component to render a component only during development. diff --git a/docs/2.guide/2.directory-structure/1.composables.md b/docs/2.guide/2.directory-structure/1.composables.md index fd13af2b4393..3d667e5a2b32 100644 --- a/docs/2.guide/2.directory-structure/1.composables.md +++ b/docs/2.guide/2.directory-structure/1.composables.md @@ -5,14 +5,6 @@ description: Use the composables/ directory to auto-import your Vue composables navigation.icon: i-ph-folder-duotone --- -# Composables Directory - -Nuxt 3 uses the [`composables/` directory](/docs/guide/directory-structure/composables) to automatically import your Vue composables into your application using [auto-imports](/docs/guide/concepts/auto-imports)! - -Under the hood, Nuxt auto generates the file `.nuxt/imports.d.ts` to declare the types. - -Be aware that you have to run `nuxi prepare`, `nuxi dev` or `nuxi build` in order to let Nuxt generate the types. If you create a composable without having the dev server running, TypeScript will throw an error, such as `Cannot find name 'useBar'.` - ## Usage **Method 1:** Using named export @@ -46,8 +38,20 @@ const foo = useFoo() ``` +:read-more{to="/docs/guide/concepts/auto-imports"} + :link-example{to="/docs/examples/features/auto-imports"} +## Types + +Under the hood, Nuxt auto generates the file `.nuxt/imports.d.ts` to declare the types. + +Be aware that you have to run [`nuxi prepare`](/docs/api/commands/prepare), [`nuxi dev`](/docs/api/commands/dev) or [`nuxi build`](/docs/api/commands/build) in order to let Nuxt generate the types. + +::callout +If you create a composable without having the dev server running, TypeScript will throw an error, such as `Cannot find name 'useBar'.` +:: + ## Examples ### Nested Composables diff --git a/docs/2.guide/2.directory-structure/1.content.md b/docs/2.guide/2.directory-structure/1.content.md index 0f40f1e9078d..0a39c4cc6e84 100644 --- a/docs/2.guide/2.directory-structure/1.content.md +++ b/docs/2.guide/2.directory-structure/1.content.md @@ -1,61 +1,32 @@ --- title: 'content' head.title: 'content/' -description: The Content module reads the content/ directory to create a file-based CMS for your application. +description: Use the content/ directory to create a file-based CMS for your application. navigation.icon: i-ph-folder-duotone --- -# Content Directory - -The [Nuxt Content module](https://content.nuxt.com) reads the [`content/` directory](/docs/guide/directory-structure/content) in your project and parses `.md`, `.yml`, `.csv` and `.json` files to create a file-based CMS for your application. +[Nuxt Content](https://content.nuxt.com) reads the [`content/` directory](/docs/guide/directory-structure/content) in your project and parses `.md`, `.yml`, `.csv` and `.json` files to create a file-based CMS for your application. - Render your content with built-in components. - Query your content with a MongoDB-like API. - Use your Vue components in Markdown files with the MDC syntax. - Automatically generate your navigation. -## Get Started - -### Installation - -Install the `@nuxt/content` module in your project: - -::code-group - - ```bash [yarn] - yarn add --dev @nuxt/content - ``` - - ```bash [npm] - npm install --save-dev @nuxt/content - ``` - - ```bash [pnpm] - pnpm add -D @nuxt/content - ``` - - ```bash [bun] - bun add -D @nuxt/content - ``` - +::read-more{to="https://content.nuxt.com" target="_blank"} +Learn more in **Nuxt Content** documentation. :: -Then, add `@nuxt/content` to the `modules` section of `nuxt.config.ts`: +## Enable Nuxt Content + +Install the `@nuxt/content` module in your project as well as adding it to your `nuxt.config.ts` with one command: -```ts [nuxt.config.ts] -export default defineNuxtConfig({ - modules: [ - '@nuxt/content' - ], - content: { - // https://content.nuxtjs.org/api/configuration - } -}) +```bash [Terminal] +npx nuxi module add content ``` -### Create Content +## Create Content -Place your markdown files inside the [`content/` directory](/docs/guide/directory-structure/content) in the root directory of your project: +Place your markdown files inside the `content/` directory: ```md [content/index.md] # Hello Content @@ -63,20 +34,20 @@ Place your markdown files inside the [`content/` directory](/docs/guide/director The module automatically loads and parses them. -### Render Pages +## Render Content -To render content pages, add a [catch-all route](/docs/guide/directory-structure/pages/#catch-all-route) using the `ContentDoc` component: +To render content pages, add a [catch-all route](/docs/guide/directory-structure/pages/#catch-all-route) using the [``](https://content.nuxt.com/components/content-doc) component: ```vue [pages/[...slug\\].vue] ``` ## Documentation -::alert{type=info} -Head over to to learn more about the Content module features, such as how to build queries and use Vue components in your Markdown files with the MDC syntax. +::callout +Head over to to learn more about the Content module features, such as how to build queries and use Vue components in your Markdown files with the MDC syntax. :: diff --git a/docs/2.guide/2.directory-structure/1.layouts.md b/docs/2.guide/2.directory-structure/1.layouts.md index ff24ee7bd25b..be4b56d5e58e 100644 --- a/docs/2.guide/2.directory-structure/1.layouts.md +++ b/docs/2.guide/2.directory-structure/1.layouts.md @@ -1,48 +1,62 @@ --- title: "layouts" -description: "Nuxt provides a layouts framework to extract common UI patterns into reusable layouts." head.title: "layouts/" +description: "Nuxt provides a layouts framework to extract common UI patterns into reusable layouts." navigation.icon: i-ph-folder-duotone --- -# Layouts Directory +::callout{icon="i-ph-rocket-launch-duotone"} +For best performance, components placed in this directory will be automatically loaded via asynchronous import when used. +:: -Nuxt provides a customizable layouts framework you can use throughout your application, ideal for extracting common UI or code patterns into reusable layout components. +## Enable Layouts -Layouts are placed in the [`layouts/` directory](/docs/guide/directory-structure/layouts) and will be automatically loaded via asynchronous import when used. Layouts are used by adding `` to your `app.vue`, and either setting a `layout` property as part of your page metadata (if you are using the `~/pages` integration), or by manually specifying it as a prop to ``. (**Note**: The layout name is normalized to kebab-case, so `someLayout` becomes `some-layout`.) +Layouts are enabled by adding [``](/docs/api/components/nuxt-layout) to your [`app.vue`](/docs/guide/directory-structure/app): -If you only have a single layout in your application, we recommend using [app.vue](/docs/guide/directory-structure/app) instead. +```vue [app.vue] + +``` + +To use a layout: +- Set a `layout` property in your with with [definePageMeta](/docs/api/utils/define-page-meta) +- Set the `name` prop of ``. + +::callout{color="blue" icon="i-ph-info-duotone"} +The layout name is normalized to kebab-case, so `someLayout` becomes `some-layout`. +:: + +::callout{color="blue" icon="i-ph-info-duotone"} +If not layout is specified, `layouts/default.vue` will be used. +:: + +::callout{icon="i-ph-lightbulb-duotone"} +If you only have a single layout in your application, we recommend using [`app.vue`](/docs/guide/directory-structure/app) instead. +:: -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} Unlike other components, your layouts must have a single root element to allow Nuxt to apply transitions between layout changes - and this root element cannot be a ``. :: -## Enabling the Default Layout +## Default Layout Add a `~/layouts/default.vue`: ```vue [layouts/default.vue] ``` -In a layout file, the content of the layout will be loaded in the ``, rather than using a special component. +In a layout file, the content of the page will be displayed in the `` component. -If you use a `app.vue` you will also need to add ``: - -```vue [app.vue] - -``` - -## Setting Another Layout +## Named Layout ```bash -| layouts/ @@ -50,69 +64,40 @@ If you use a `app.vue` you will also need to add ``: ---| custom.vue ``` -You can directly override the default layout like this: +Then you can use the `custom` layout in your page: -```vue{}[app.vue] +```vue [pages/about.vue] - - ``` -Alternatively, you can override the default layout per-page like this: +::read-more{to="/docs/guide/directory-structure/pages#page-metadata"} +Learn more about `definePageMeta`. +:: -::code-group +You can directly override the default layout for all pages using the `name` property of [``](/docs/api/components/nuxt-layout): -```vue{}[pages/index.vue] - -``` -```vue{}[app.vue] ``` -```vue [layouts/custom.vue] - -``` - -```vue [layouts/default.vue] - -``` - -:: - -::alert{type=info} -Learn more about [defining page meta](/docs/guide/directory-structure/pages#page-metadata). -:: +:link-example{to="/docs/examples/features/layouts"} ## Changing the Layout Dynamically -You can also use a ref or computed property for your layout. +You can also use the [`setPageLayout`](/docs/api/utils/set-page-layout) helper to change the layout dynamically: ```vue ``` -::alert{type="info"} -Learn more about [``](/docs/api/components/nuxt-link) usage. +::read-more{to="/docs/api/components/nuxt-link"} +Learn more about `` usage. :: ## Programmatic Navigation @@ -363,32 +359,32 @@ function navigate(){ As your app gets bigger and more complex, your routing might require more flexibility. For this reason, Nuxt directly exposes the router, routes and router options for customization in different ways. -:ReadMore{link="/docs/guide/going-further/custom-routing"} +:read-more{to="/docs/guide/going-further/custom-routing"} ## Multiple pages directories By default, all your pages should be in one `pages` directory at the root of your project. -However, you can use Layers to create groupings of your app's pages. -Example: +However, you can use [Nuxt Layers](/docs/getting-started/layers) to create groupings of your app's pages: -```bash --| nuxt.config.ts +```bash [Directory Structure] -| some-app/ ---| nuxt.config.ts ---| pages -----| app-page.vue +-| nuxt.config.ts ``` -```ts +```ts [some-app/nuxt.config.ts] // some-app/nuxt.config.ts export default defineNuxtConfig({ }) +``` -// nuxt.config.ts +```ts [nuxt.config.ts] export default defineNuxtConfig({ extends: ['./some-app'], }) ``` -:ReadMore{link="/docs/guide/going-further/layers"} +:read-more{to="/docs/guide/going-further/layers"} From 85a45181a2500eebee22c5b97a213bb7893d6d41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Sun, 15 Oct 2023 17:41:13 +0200 Subject: [PATCH 18/62] docs: progress --- docs/1.getting-started/6.data-fetching.md | 2 +- docs/2.guide/0.index.md | 18 +++ .../2.directory-structure/1.components.md | 3 +- .../2.directory-structure/1.plugins.md | 147 ++++++++++-------- docs/3.api/2.composables/use-nuxt-app.md | 2 +- docs/3.api/2.composables/use-route.md | 3 +- docs/3.api/2.composables/use-router.md | 85 ++++++---- docs/3.api/3.utils/on-before-route-leave.md | 7 +- docs/3.api/3.utils/on-before-route-update.md | 6 +- 9 files changed, 165 insertions(+), 108 deletions(-) create mode 100644 docs/2.guide/0.index.md diff --git a/docs/1.getting-started/6.data-fetching.md b/docs/1.getting-started/6.data-fetching.md index 3e47a361b281..ba3dfa91b9aa 100644 --- a/docs/1.getting-started/6.data-fetching.md +++ b/docs/1.getting-started/6.data-fetching.md @@ -383,7 +383,7 @@ Using ` +``` -The [`useRouter`](/docs/api/composables/use-router) composable returns the router instance and must be called in a setup function, plugin, or route middleware. -Within the template of a Vue component, you can access the router using `$router` instead. +If you only need the router instance within your template, use `$router`: -If you have a `pages/` folder, [`useRouter`](/docs/api/composables/use-router) is identical in behavior to the one provided by `vue-router`. Feel free to read the router documentation for more information on what each method does. +```vue [pages/index.vue] + +``` -::ReadMore{link="https://router.vuejs.org/api/interfaces/Router.html#Properties-currentRoute"} +If you have a `pages/` directory, `useRouter` is identical in behavior to the one provided by `vue-router`. + +::read-more{icon="i-simple-icons-vuedotjs" to="https://router.vuejs.org/api/interfaces/Router.html#Properties-currentRoute" target="_blank"} +Read `vue-router` documentation about the `Router` interface. :: ## Basic Manipulation -- **addRoute:** Add a new route to the router instance. `parentName` can be provided to add new route as the child of an existing route. -- **removeRoute:** Remove an existing route by its name. -- **getRoutes:** Get a full list of all the route records. -- **hasRoute:** Checks if a route with a given name exists. +- [`addRoute()`](https://router.vuejs.org/api/interfaces/Router.html#addRoute): Add a new route to the router instance. `parentName` can be provided to add new route as the child of an existing route. +- [`removeRoute()`](https://router.vuejs.org/api/interfaces/Router.html#removeRoute): Remove an existing route by its name. +- [`getRoutes()`](https://router.vuejs.org/api/interfaces/Router.html#getRoutes): Get a full list of all the route records. +- [`hasRoute()`](https://router.vuejs.org/api/interfaces/Router.html#hasRoute): Checks if a route with a given name exists. +- [`resolve()`](https://router.vuejs.org/api/interfaces/Router.html#resolve): Returns the normalized version of a route location. Also includes an `href` property that includes any existing base. + +```ts [Example] +const router = useRouter() + +router.addRoute({ name: 'home', path: '/home', component: Home }) +router.removeRoute('home') +router.getRoutes() +router.hasRoute('home') +router.resolve({ name: 'home' }) +``` + +::callout +`router.addRoute()` adds route details into an array of routes and it is useful while building [Nuxt plugins](/docs/guide/directory-structure/plugins) while `router.push()` on the other hand, triggers a new navigation immediately and it is useful in pages, Vue components and composable. +:: ## Based on History API -- **back:** Go back in history if possible, same as `router.go(-1)`. -- **forward:** Go forward in history if possible, same as `router.go(1)`. -- **go:** Move forward or backward through the history without the hierarchical restrictions enforced in `router.back()` and `router.forward()`. -- **push:** Programmatically navigate to a new URL by pushing an entry in the history stack. **It is recommended to use [`navigateTo`](/docs/api/utils/navigate-to) instead.** -- **replace:** Programmatically navigate to a new URL by replacing the current entry in the routes history stack. **It is recommended to use [`navigateTo`](/docs/api/utils/navigate-to) instead.** +- [`back()`](https://router.vuejs.org/api/interfaces/Router.html#back): Go back in history if possible, same as `router.go(-1)`. +- [`forward()`](https://router.vuejs.org/api/interfaces/Router.html#forward): Go forward in history if possible, same as `router.go(1)`. +- [`go()`](https://router.vuejs.org/api/interfaces/Router.html#go): Move forward or backward through the history without the hierarchical restrictions enforced in `router.back()` and `router.forward()`. +- [`push()`](https://router.vuejs.org/api/interfaces/Router.html#push): Programmatically navigate to a new URL by pushing an entry in the history stack. **It is recommended to use [`navigateTo`](/docs/api/utils/navigate-to) instead.** +- [`replace()`](https://router.vuejs.org/api/interfaces/Router.html#replace): Programmatically navigate to a new URL by replacing the current entry in the routes history stack. **It is recommended to use [`navigateTo`](/docs/api/utils/navigate-to) instead.** + -> TIP: `router.addRoute()` adds route details into an array of routes and it is useful while building Nuxt plugins while `router.push()` on the other hand, triggers a new navigation immediately and it is useful in Nuxt Page components, Vue components and composable. +```ts [Example] +const router = useRouter() -```js [js] -const router = useRouter(); -router.back(); -router.forward(); -router.go(); -router.push({ path: "/home" }); -router.replace({ hash: "#bio" }); -```` +router.back() +router.forward() +router.go(3) +router.push({ path: "/home" }) +router.replace({ hash: "#bio" }) +``` -::ReadMore{link="https://developer.mozilla.org/en-US/docs/Web/API/History"} +::read-more{icon="i-simple-icons-mdnwebdocs" to="https://developer.mozilla.org/en-US/docs/Web/API/History" target="_blank"} +Read more about the browser's History API. :: ## Navigation Guards @@ -49,17 +75,14 @@ router.replace({ hash: "#bio" }); However, Nuxt has a concept of **route middleware** that simplifies the implementation of navigation guards and provides a better developer experience. -::ReadMore{link="/docs/guide/directory-structure/middleware"} -:: +:read-more{to="/docs/guide/directory-structure/middleware"} ## Promise and Error Handling -- **isReady:** Returns a Promise that resolves when the router has completed the initial navigation. -- **onError:** Adds an error handler that is called every time a non caught error happens during navigation. -- **resolve:** Returns the normalized version of a route location. Also includes an `href` property that includes any existing base. +- [`isReady()`](https://router.vuejs.org/api/interfaces/Router.html#isReady): Returns a Promise that resolves when the router has completed the initial navigation. +- [`onError`](https://router.vuejs.org/api/interfaces/Router.html#onError): Adds an error handler that is called every time a non caught error happens during navigation. -::ReadMore{link="https://router.vuejs.org/api/interfaces/Router.html#Methods"} -:: +:read-more{icon="i-simple-icons-vuedotjs" to="https://router.vuejs.org/api/interfaces/Router.html#Methods" title="Vue Router Docs" target="_blank"} ## Universal Router Instance diff --git a/docs/3.api/3.utils/on-before-route-leave.md b/docs/3.api/3.utils/on-before-route-leave.md index af5cc5546917..0169f40c70f4 100644 --- a/docs/3.api/3.utils/on-before-route-leave.md +++ b/docs/3.api/3.utils/on-before-route-leave.md @@ -3,9 +3,4 @@ title: "onBeforeRouteLeave" description: The onBeforeRouteLeave composable allows registering a route guard within a component. --- -# `onBeforeRouteLeave` - -The `onBeforeRouteLeave` composable adds a navigation guard that triggers whenever the component for the current location is about to be left. - -::ReadMore{link="https://router.vuejs.org/api/#Functions-onBeforeRouteLeave"} -:: +:read-more{icon="i-simple-icons-vuedotjs" to="https://router.vuejs.org/api/#onBeforeRouteLeave" title="Vue Router Docs" target="_blank"} diff --git a/docs/3.api/3.utils/on-before-route-update.md b/docs/3.api/3.utils/on-before-route-update.md index c6886147e7db..43db40bf8ccb 100644 --- a/docs/3.api/3.utils/on-before-route-update.md +++ b/docs/3.api/3.utils/on-before-route-update.md @@ -3,9 +3,5 @@ title: "onBeforeRouteUpdate" description: The onBeforeRouteUpdate composable allows registering a route guard within a component. --- -# `onBeforeRouteUpdate` +:read-more{icon="i-simple-icons-vuedotjs" to="https://router.vuejs.org/api/#onBeforeRouteUpdate" title="Vue Router Docs" target="_blank"} -The `onBeforeRouteUpdate` composable adds a navigation guard that triggers whenever the component for the current location is about to be updated. - -::ReadMore{link="https://router.vuejs.org/api/#Functions-onBeforeRouteUpdate"} -:: From 43fd970eebea10723438460114b337c6a7530657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Sun, 15 Oct 2023 18:32:31 +0200 Subject: [PATCH 19/62] up --- .../2.directory-structure/1.plugins.md | 2 +- .../2.guide/2.directory-structure/1.public.md | 22 +- .../2.guide/2.directory-structure/1.server.md | 250 ++++++++++-------- 3 files changed, 152 insertions(+), 122 deletions(-) diff --git a/docs/2.guide/2.directory-structure/1.plugins.md b/docs/2.guide/2.directory-structure/1.plugins.md index d16349bd6b05..c92a8b233afe 100644 --- a/docs/2.guide/2.directory-structure/1.plugins.md +++ b/docs/2.guide/2.directory-structure/1.plugins.md @@ -254,7 +254,7 @@ export default defineNuxtPlugin((nuxtApp) => { }) ``` -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} If you register a Vue directive, you _must_ register it on both client and server side unless you are only using it when rendering one side. If the directive only makes sense from a client side, you can always move it to `~/plugins/my-directive.client.ts` and provide a 'stub' directive for the server in `~/plugins/my-directive.server.ts`. :: diff --git a/docs/2.guide/2.directory-structure/1.public.md b/docs/2.guide/2.directory-structure/1.public.md index 0976b6f4082f..29080d3370e5 100644 --- a/docs/2.guide/2.directory-structure/1.public.md +++ b/docs/2.guide/2.directory-structure/1.public.md @@ -5,10 +5,24 @@ head.title: "public/" navigation.icon: i-ph-folder-duotone --- -# Public Directory +The `public/` is served at the server root and contains public files that have to keep their names (e.g. `robots.txt`) _or_ likely won't change (e.g. `favicon.ico`). -The [`public/` directory](/docs/guide/directory-structure/public) is directly served at the server root and contains public files that have to keep their names (e.g. `robots.txt`) _or_ likely won't change (e.g. `favicon.ico`). +```bash [Directory structure] +-| public/ +---| favicon.ico +---| og-image.png +---| robots.txt +``` -::alert{icon=๐Ÿ’ก} -This is known as the [`static/` directory](https://nuxtjs.org/docs/directory-structure/static) in Nuxt 2. +```vue [app.vue] + +``` + + +::callout{to="https://v2.nuxt.com/docs/directory-structure/static" target="_blank"} +This is known as the [`static/`] directory in Nuxt 2. :: diff --git a/docs/2.guide/2.directory-structure/1.server.md b/docs/2.guide/2.directory-structure/1.server.md index 98720b33340c..d40da0f99698 100644 --- a/docs/2.guide/2.directory-structure/1.server.md +++ b/docs/2.guide/2.directory-structure/1.server.md @@ -5,19 +5,22 @@ description: The server/ directory is used to register API and server handlers t navigation.icon: i-ph-folder-duotone --- -# Server Directory +Nuxt automatically scans files inside these directories to register API and server handlers with HMR support. -Nuxt automatically scans files inside these directories to register API and server handlers with HMR support: -- `~/server/api` -- `~/server/routes` -- `~/server/middleware` +```bash [Directory structure] +-| server/ +---| api/ +-----| hello.ts # /api/hello +---| routes/ +-----| bonjour.ts # /bonjour +---| middleware/ +-----| log.ts # log all requests +``` Each file should export a default function defined with `defineEventHandler()` or `eventHandler()` (alias). The handler can directly return JSON data, a `Promise`, or use `event.node.res.end()` to send a response. -**Example:** Create the `/api/hello` route with `server/api/hello.ts` file: - ```ts [server/api/hello.ts] export default defineEventHandler((event) => { return { @@ -38,10 +41,6 @@ const { data } = await useFetch('/api/hello') ``` -Note that [h3 utilities](https://github.com/unjs/h3#utilities) are auto-imported. - -:ReadMore{link="https://nitro.unjs.io/guide/routing" title="Nitro Route Handling Docs"} - ## Server Routes Files inside the `~/server/api` are automatically prefixed with `/api` in their route. @@ -56,8 +55,8 @@ export default defineEventHandler(() => 'Hello World!') Given the example above, the `/hello` route will be accessible at . -::alert{type=info icon=๐Ÿ’ก} -Note that currently server routes do not support the full functionality of dynamic routes as [pages](https://nuxt.com/docs/guide/directory-structure/pages#dynamic-routes) do. +::callout +Note that currently server routes do not support the full functionality of dynamic routes as [pages](/docs/guide/directory-structure/pages#dynamic-routes) do. :: ## Server Middleware @@ -66,7 +65,7 @@ Nuxt will automatically read in any file in the `~/server/middleware` to create Middleware handlers will run on every request before any other server route to add or check headers, log requests, or extend the event's request object. -::alert{type=warning} +::callout Middleware handlers should not return anything (nor close or respond to the request) and only inspect or extend the request context or throw an error. :: @@ -96,13 +95,13 @@ export default defineNitroPlugin((nitroApp) => { }) ``` -:ReadMore{link="https://nitro.unjs.io/guide/plugins" title="Nitro Plugins"} +:read-more{to="https://nitro.unjs.io/guide/plugins" title="Nitro Plugins" target="_blank"} ## Server Utilities Server routes are powered by [unjs/h3](https://github.com/unjs/h3) which comes with a handy set of helpers. -:ReadMore{link="https://www.jsdocs.io/package/h3#package-index-functions" title="Available H3 Request Helpers"} +:read-more{to="https://www.jsdocs.io/package/h3#package-index-functions" title="Available H3 Request Helpers" target="_blank"} You can add more helpers yourself inside the `~/server/utils` directory. @@ -131,7 +130,7 @@ export const defineWrappedResponseHandler = ( ## Server Types -::alert{type="info"} +::callout This feature is available from Nuxt >= 3.5 :: @@ -143,24 +142,23 @@ To improve clarity within your IDE between the auto-imports from 'nitro' and 'vu } ``` -Although right now these values won't be respected when type checking (`nuxi typecheck`), you should get better type hints in your IDE. +Although right now these values won't be respected when type checking ([`nuxi typecheck`](/docs/api/commands/typecheck)), you should get better type hints in your IDE. -## Usage Examples +## Recipes -### Matching Route Parameters +### Route Parameters Server routes can use dynamic parameters within brackets in the file name like `/api/hello/[name].ts` and be accessed via `event.context.params`. -**Example:** - ```ts [server/api/hello/[name\\].ts] export default defineEventHandler((event) => { const name = getRouterParam(event, 'name') + return `Hello, ${name}!` }) ``` -You can now universally call this API using `await $fetch('/api/hello/nuxt')` and get `Hello, nuxt!`. +You can now universally call this API on `/api/hello/nuxt` and get `Hello, nuxt!`. ### Matching HTTP Method @@ -180,87 +178,99 @@ Given the example above, fetching `/test` with: - **POST** method: Returns `Test post handler` - Any other method: Returns 405 error -You can also use `index.[method].ts` inside a directory for structuring your code differently. - -**Example:** - -```ts [server/api/foo/index.ts] -export default defineEventHandler((event) => { - // handle the `api/foo` endpoint -}) -``` - -This is useful to create API namespaces. - -**Examples:** +You can also use `index.[method].ts` inside a directory for structuring your code differently, this is useful to create API namespaces. +::code-group ```ts [server/api/foo/index.get.ts] export default defineEventHandler((event) => { // handle GET requests for the `api/foo` endpoint }) ``` - ```ts [server/api/foo/index.post.ts] export default defineEventHandler((event) => { // handle POST requests for the `api/foo` endpoint }) ``` - ```ts [server/api/foo/bar.get.ts] export default defineEventHandler((event) => { // handle GET requests for the `api/foo/bar` endpoint }) ``` +:: ### Catch-all Route -Catch-all routes are helpful for fallback route handling. For example, creating a file named `~/server/api/foo/[...].ts` will register a catch-all route for all requests that do not match any route handler, such as `/api/foo/bar/baz`. +Catch-all routes are helpful for fallback route handling. -**Examples:** +For example, creating a file named `~/server/api/foo/[...].ts` will register a catch-all route for all requests that do not match any route handler, such as `/api/foo/bar/baz`. ```ts [server/api/foo/[...\\].ts] -export default defineEventHandler(() => `Default foo handler`) +export default defineEventHandler((event) => { + // event.context.path to get the route path: '/api/foo/bar/baz' + // event.context.params._ to get the route segment: 'bar/baz' + return `Default foo handler` +}) ``` -```ts [server/api/[...\\].ts] -export default defineEventHandler(() => `Default api handler`) +You can set a name for the catch-all route by using `~/server/api/foo/[...slug].ts` and access it via `event.context.params.slug`. + +```ts [server/api/foo/[...slug\\].ts] +export default defineEventHandler((event) => { + // event.context.params.slug to get the route segment: 'bar/baz' + return `Default foo handler` +}) ``` -### Handling Requests with Body +### Body Handling ```ts [server/api/submit.post.ts] export default defineEventHandler(async (event) => { - const body = await readBody(event) - return { body } + const body = await readBody(event) + return { body } }) ``` -You can now universally call this API using `$fetch('/api/submit', { method: 'post', body: { test: 123 } })`. +You can now universally call this API using: + +```vue [app.vue] + +``` -::alert{type=warning title=Attention} +::callout We are using `submit.post.ts` in the filename only to match requests with `POST` method that can accept the request body. When using `readBody` within a GET request, `readBody` will throw a `405 Method Not Allowed` HTTP error. :: -### Handling Requests With Query Parameters +### Query Parameters -Sample query `/api/query?param1=a¶m2=b` +Sample query `/api/query?foo=bar&baz=qux` ```ts [server/api/query.get.ts] export default defineEventHandler((event) => { const query = getQuery(event) - return { a: query.param1, b: query.param2 } + + return { a: query.foo, b: query.baz } }) ``` -### Error handling +### Error Handling + +If no errors are thrown, a status code of `200 OK` will be returned. -If no errors are thrown, a status code of `200 OK` will be returned. Any uncaught errors will return a `500 Internal Server Error` HTTP Error. +Any uncaught errors will return a `500 Internal Server Error` HTTP Error. -To return other error codes, throw an exception with `createError` +To return other error codes, throw an exception with [`createError`](/docs/api/utils/create-error): ```ts [server/api/validation/[id\\].ts] export default defineEventHandler((event) => { const id = parseInt(event.context.params.id) as number + if (!Number.isInteger(id)) { throw createError({ statusCode: 400, @@ -271,9 +281,9 @@ export default defineEventHandler((event) => { }) ``` -### Returning other status codes +### Status Codes -To return other status codes, you can use the `setResponseStatus` utility. +To return other status codes, use the [`setResponseStatus`](/docs/api/utils/set-response-status) utility. For example, to return `202 Accepted` @@ -283,32 +293,55 @@ export default defineEventHandler((event) => { }) ``` -### Accessing Runtime Config +### Runtime Config +::code-group ```ts [server/api/foo.ts] +export default defineEventHandler(async (event) => { + const config = useRuntimeConfig(event) -export default defineEventHandler((event) => { - const config = useRuntimeConfig() - return { key: config.KEY } + const repo = await $fetch('https://api.github.com/repos/nuxt/nuxt', { + headers: { + Authorization: `token ${config.githubToken}` + } + }) + + return repo }) ``` +```ts [nuxt.config.ts] +export default defineNuxtConfig({ + runtimeConfig: { + githubToken: '' + } +}) +``` +```bash [.env] +NUXT_GITHUB_TOKEN='' +``` +:: + +::callout +Giving `event` as argument to `useRuntimeConfig` is optional, but it is recommended to pass it to get the runtime config overwritten by [environment variables](/docs/guide/going-further/runtime-config#environment-variables) at runtime. +:: -### Accessing Request Cookies +### Request Cookies -```ts +```ts [server/api/cookies.ts] export default defineEventHandler((event) => { const cookies = parseCookies(event) + return { cookies } }) ``` -## Advanced Usage Examples +## Advanced Usage -### Nitro Configuration +### Nitro Config You can use `nitro` key in `nuxt.config` to directly set [Nitro configuration](https://nitro.unjs.io/config). -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} This is an advanced option. Custom config can affect production deployments, as the configuration interface might change over time when Nitro is upgraded in semver-minor versions of Nuxt. :: @@ -319,7 +352,9 @@ export default defineNuxtConfig({ }) ``` -### Using a Nested Router +:read-more{to="/docs/guide/concepts/server-engine"} + +### Nested Router ```ts [server/api/hello/[...slug\\].ts] import { createRouter, defineEventHandler, useBase } from 'h3' @@ -331,9 +366,11 @@ router.get('/test', defineEventHandler(() => 'Hello World')) export default useBase('/api/hello', router.handler) ``` -### Sending Streams (Experimental) +### Sending Streams -**Note:** This is an experimental feature and is only available within Node.js environments. +::callout +This is an experimental feature and is only available in all environments. +:: ```ts [server/api/foo.get.ts] import fs from 'node:fs' @@ -352,7 +389,7 @@ export default defineEventHandler(async (event) => { }) ``` -### Return a Legacy Handler or Middleware +### Legacy Handler or Middleware ```ts [server/api/legacy.ts] export default fromNodeMiddleware((req, res) => { @@ -360,7 +397,7 @@ export default fromNodeMiddleware((req, res) => { }) ``` -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} Legacy support is possible using [unjs/h3](https://github.com/unjs/h3), but it is advised to avoid legacy handlers as much as you can. :: @@ -371,15 +408,15 @@ export default fromNodeMiddleware((req, res, next) => { }) ``` -::alert{type=warning} -Never combine `next()` callback with a legacy middleware that is `async` or returns a `Promise`! +::callout{color="amber" icon="i-ph-warning-duotone"} +Never combine `next()` callback with a legacy middleware that is `async` or returns a `Promise`. :: ### Server Storage Nitro provides a cross-platform [storage layer](https://nitro.unjs.io/guide/storage). In order to configure additional storage mount points, you can use `nitro.storage`, or [server plugins](#server-plugins). -#### Example: Using Redis +**Example of adding a Redis storage:** Using `nitro.storage`: @@ -387,7 +424,7 @@ Using `nitro.storage`: export default defineNuxtConfig({ nitro: { storage: { - 'redis': { + redis: { driver: 'redis', /* redis connector options */ port: 6379, // Redis port @@ -402,10 +439,30 @@ export default defineNuxtConfig({ }) ``` -Alternatively, using server plugins: +Then in your API handler: -::code-group +```ts [server/api/storage/test.ts] +export default defineEventHandler(async (event) => { + // List all keys with + const keys = await useStorage('redis').getKeys() + + // Set a key with + await useStorage('redis').setItem('foo', 'bar') + // Remove a key with + await useStorage('redis').removeItem('foo') + + return {} +}) +``` + +::read-more{to="https://nitro.unjs.io/guide/storage" target="_blank"} +Read more about Nitro Storage Layer. +:: + +Alternatively, you can create a storage mount point using a server plugin and runtime config: + +::code-group ```ts [server/plugins/storage.ts] import redisDriver from 'unstorage/drivers/redis' @@ -436,45 +493,4 @@ export default defineNuxtConfig({ } }) ``` - :: - -Create a new file in `server/api/test.post.ts`: - -```ts [server/api/test.post.ts] -export default defineEventHandler(async (event) => { - const body = await readBody(event) - await useStorage().setItem('redis:test', body) - return 'Data is set' -}) -``` - -Create a new file in `server/api/test.get.ts`: - -```ts [server/api/test.get.ts] -export default defineEventHandler(async (event) => { - const data = await useStorage().getItem('redis:test') - return data -}) -``` - -Create a new file in `app.vue`: - -```vue [app.vue] - - - -``` - -::ReadMore{link="/docs/guide/directory-structure/server"} From 38c9eeb44fe9ab3fcaa3d3044c154c9744761ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Sun, 15 Oct 2023 20:02:23 +0200 Subject: [PATCH 20/62] docs: more progress --- docs/1.getting-started/6.data-fetching.md | 2 +- docs/2.guide/2.directory-structure/1.utils.md | 43 ++++++++++++++++--- docs/2.guide/2.directory-structure/2.env.md | 41 ++++++++++-------- .../2.directory-structure/2.gitignore.md | 2 +- .../2.directory-structure/2.nuxtignore.md | 14 +++--- .../2.directory-structure/3.app-config.md | 37 ++++++++-------- docs/2.guide/2.directory-structure/3.app.md | 24 +++++------ docs/3.api/2.composables/use-router.md | 2 +- 8 files changed, 100 insertions(+), 65 deletions(-) diff --git a/docs/1.getting-started/6.data-fetching.md b/docs/1.getting-started/6.data-fetching.md index ba3dfa91b9aa..467454149edc 100644 --- a/docs/1.getting-started/6.data-fetching.md +++ b/docs/1.getting-started/6.data-fetching.md @@ -383,7 +383,7 @@ Using ` ``` -### Manually Typing App Config +## Typing App Config -Nuxt tries to automatically generate a TypeScript interface from provided app config. +Nuxt tries to automatically generate a TypeScript interface from provided app config so you won't have to type it yourself. -It is also possible to type app config manually. There are two possible things you might want to type. +However, there are some cases where you might want to type it yourself. There are two possible things you might want to type. -#### Typing App Config Input +### App Config Input `AppConfigInput` might be used by module authors who are declaring what valid _input_ options are when setting app config. This will not affect the type of `useAppConfig()`. @@ -68,11 +66,11 @@ declare module 'nuxt/schema' { export {} ``` -#### Typing App Config Output +### App Config Output -If you want to type the result of calling `useAppConfig()`, then you will want to extend `AppConfig`. +If you want to type the result of calling [`useAppConfig()`](/docs/api/composables/use-app-config), then you will want to extend `AppConfig`. -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} Be careful when typing `AppConfig` as you will overwrite the types Nuxt infers from your actually defined app config. :: @@ -92,12 +90,13 @@ declare module 'nuxt/schema' { export {} ``` -### App Config Merging Strategy in Layers +## Merging Strategy + +Nuxt uses a custom merging strategy for the `AppConfig` within [the layers](/docs/getting-started/layers) of your application. -Nuxt uses a custom merging strategy for the `AppConfig` within the layers of your application. This strategy is implemented using a [Function Merger](https://github.com/unjs/defu#function-merger), which allows defining a custom merging strategy for every key in `app.config` that has an array as value. -::alert{type=warning} +::callout The Function Merger should only be used in the base `app.config` of your application. :: diff --git a/docs/2.guide/2.directory-structure/3.app.md b/docs/2.guide/2.directory-structure/3.app.md index b647821ab269..e56bea769149 100644 --- a/docs/2.guide/2.directory-structure/3.app.md +++ b/docs/2.guide/2.directory-structure/3.app.md @@ -1,15 +1,11 @@ --- title: "app.vue" -description: "The app.vue file is the main component in your Nuxt 3 applications." +description: "The app.vue file is the main component of your Nuxt application." head.title: "app.vue" navigation.icon: i-ph-file-duotone --- -# App file - -The `app.vue` file is the main component in your Nuxt 3 applications. - -## Minimal usage +## Minimal Usage With Nuxt 3, the [`pages/`](/docs/guide/directory-structure/pages) directory is optional. If not present, Nuxt won't include [vue-router](https://router.vuejs.org/) dependency. This is useful when working on a landing page or an application that does not need routing. @@ -19,9 +15,11 @@ With Nuxt 3, the [`pages/`](/docs/guide/directory-structure/pages) directory is ``` -## Usage With Pages +:link-example{to="/docs/examples/hello-world"} -If you have a [`pages/`](/docs/guide/directory-structure/pages) directory, to display the current page, use the `` component: +## Usage with Pages + +If you have a [`pages/`](/docs/guide/directory-structure/pages) directory, to display the current page, use the [``](/docs/api/components/nuxt-page) component: ```vue [app.vue] ``` -::alert{type=danger} -Since `` internally uses the [``](https://vuejs.org/guide/built-ins/suspense.html#suspense) component, `` cannot be set as a root element. +::callout{color="amber" icon="i-ph-warning-duotone"} +Since [``](/docs/api/components/nuxt-page) internally uses Vue's [``](https://vuejs.org/guide/built-ins/suspense.html#suspense) component, it cannot be set as a root element. :: -::alert{type=warning} +::callout{color="blue" icon="i-ph-info-duotone"} Remember that `app.vue` acts as the main component of your Nuxt application. Anything you add to it (JS and CSS) will be global and included in every page. :: -If you want to have the possibility to customize the structure around the page between pages, check out the [`layouts/`](/docs/guide/directory-structure/layouts) directory. +::read-more{to="/docs/guide/directory-structure/layouts"} +If you want to have the possibility to customize the structure around the page between pages, check out the `layouts/` directory. +:: diff --git a/docs/3.api/2.composables/use-router.md b/docs/3.api/2.composables/use-router.md index b4eb6b1b2e45..1c4c17471b5c 100644 --- a/docs/3.api/2.composables/use-router.md +++ b/docs/3.api/2.composables/use-router.md @@ -65,7 +65,7 @@ router.push({ path: "/home" }) router.replace({ hash: "#bio" }) ``` -::read-more{icon="i-simple-icons-mdnwebdocs" to="https://developer.mozilla.org/en-US/docs/Web/API/History" target="_blank"} +::read-more{icon="i-simple-icons-mdnwebdocs" color="gray" to="https://developer.mozilla.org/en-US/docs/Web/API/History" target="_blank"} Read more about the browser's History API. :: From cd2a9f20878241e06f7ac2a2ae3cce113f2ab7b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Sun, 15 Oct 2023 21:21:12 +0200 Subject: [PATCH 21/62] docs: more progress --- docs/2.guide/1.concepts/1.auto-imports.md | 4 + .../2.directory-structure/3.nuxt.config.md | 19 +- .../2.directory-structure/3.package.md | 27 ++- .../2.directory-structure/3.tsconfig.md | 14 +- .../1.experimental-features.md | 201 ++++++++++++++---- docs/2.guide/3.going-further/_dir.yml | 2 +- .../1.components/1.nuxt-client-fallback.md | 2 +- 7 files changed, 210 insertions(+), 59 deletions(-) diff --git a/docs/2.guide/1.concepts/1.auto-imports.md b/docs/2.guide/1.concepts/1.auto-imports.md index eb567817c340..8f0990894d68 100644 --- a/docs/2.guide/1.concepts/1.auto-imports.md +++ b/docs/2.guide/1.concepts/1.auto-imports.md @@ -60,6 +60,10 @@ That means that (with very few exceptions) you cannot use them outside a Nuxt pl If you get an error message like `Nuxt instance is unavailable` then it probably means you are calling a Nuxt composable in the wrong place in the Vue or Nuxt lifecycle. +::read-more{to="/docs/guide/going-further/experimental-features#asynccontext"} +Checkout the `asyncContext` experimental feature to use Nuxt composables in async functions. +:: + ::read-more{to="https://github.com/nuxt/nuxt/issues/14269#issuecomment-1397352832" target="_blank"} See the full explanation in this GitHub comment. :: diff --git a/docs/2.guide/2.directory-structure/3.nuxt.config.md b/docs/2.guide/2.directory-structure/3.nuxt.config.md index 271ed9dc5c29..e7a81c824055 100644 --- a/docs/2.guide/2.directory-structure/3.nuxt.config.md +++ b/docs/2.guide/2.directory-structure/3.nuxt.config.md @@ -5,9 +5,7 @@ head.title: "nuxt.config.ts" navigation.icon: i-ph-file-duotone --- -# Nuxt Config File - -Nuxt can be easily configured with a single `nuxt.config` file, which can have either a `.js`, `.ts` or `.mjs` extension. +The `nuxt.config` file extension can either be `.js`, `.ts` or `.mjs`. ```ts [nuxt.config.ts] export default defineNuxtConfig({ @@ -30,6 +28,17 @@ export default defineNuxtConfig({ }) ``` -To ensure your configuration is up to date, Nuxt will make a full restart when detecting changes in the main configuration file, the `.env`, `.nuxtignore` and `.nuxtrc` dotfiles. +::read-more{to="/docs/api/configuration/nuxt-config"} +Discover all the available options in the **Nuxt configuration** documentation. +:: + +To ensure your configuration is up to date, Nuxt will make a full restart when detecting changes in the main configuration file, the [`.env`](/docs/guide/directory-structure/env), [`.nuxtignore`](/docs/guide/directory-structure/nuxtignore) and `.nuxtrc` dotfiles. + + +The `.nuxtrc` file is a file that can be used to configure Nuxt with a fla syntax, it is based on [`unjs/rc9`](https://github.com/unjs/rc9). + +``` [.nuxtrc] +ssr=false +``` -:read-more{to="/docs/api/configuration/nuxt-config"} +If prevent the properties in `.nuxtrc` file will overwrite the properties in the `nuxt.config` file. diff --git a/docs/2.guide/2.directory-structure/3.package.md b/docs/2.guide/2.directory-structure/3.package.md index 6a0a3bc96963..ad5757fbf0b5 100644 --- a/docs/2.guide/2.directory-structure/3.package.md +++ b/docs/2.guide/2.directory-structure/3.package.md @@ -5,6 +5,29 @@ description: The package.json file contains all the dependencies and scripts for navigation.icon: i-ph-file-duotone --- -# Package.json File +The minimal `package.json` of your Nuxt application should looks like: -The `package.json` file contains all the dependencies and scripts for your application ([learn more](https://docs.npmjs.com/cli/configuring-npm/package-json)). +```json [package.json] +{ + "name": "nuxt-app", + "private": true, + "type": "module", + "scripts": { + "build": "nuxt build", + "dev": "nuxt dev", + "generate": "nuxt generate", + "preview": "nuxt preview", + "postinstall": "nuxt prepare" + }, + "devDependencies": { + "@nuxt/devtools": "latest", + "nuxt": "latest", + "vue": "latest", + "vue-router": "latest" + } +} +``` + +::read-more{icon="i-simple-icons-npm" color="gray" to="https://docs.npmjs.com/cli/configuring-npm/package-json" target="_blank"} +Read more about the `package.json` file. +:: diff --git a/docs/2.guide/2.directory-structure/3.tsconfig.md b/docs/2.guide/2.directory-structure/3.tsconfig.md index 7bbe8071a2a9..bea865aa35e6 100644 --- a/docs/2.guide/2.directory-structure/3.tsconfig.md +++ b/docs/2.guide/2.directory-structure/3.tsconfig.md @@ -5,14 +5,20 @@ head.title: "tsconfig.json" navigation.icon: i-ph-file-duotone --- -# TypeScript Configuration File +Nuxt [automatically generates](/docs/guide/concepts/typescript) a `.nuxt/tsconfig.json` file with the resolved aliases you are using in your Nuxt project, as well as with other sensible defaults. -Nuxt [automatically generates](/docs/guide/concepts/typescript) a `.nuxt/tsconfig.json` file with the resolved aliases you are using in your Nuxt project, as well as with other sensible defaults. You can benefit from this by creating a `tsconfig.json` in the root of your project with the following content: +You can benefit from this by creating a `tsconfig.json` in the root of your project with the following content: -```json +```json [tsconfig.json] { "extends": "./.nuxt/tsconfig.json" } ``` -As you need to, you can customize the contents of this file. However, it is recommended that you don't overwrite `target`, `module` and `moduleResolution`. Moreover, note that if you need to customize your `paths`, this will override the auto-generated path aliases. Instead, we recommend that you add any path aliases you need to the `alias` property within your `nuxt.config`, where they will get picked up and added to the auto-generated `tsconfig`. +::callout +As you need to, you can customize the contents of this file. However, it is recommended that you don't overwrite `target`, `module` and `moduleResolution`. +:: + +::callout +If you need to customize your `paths`, this will override the auto-generated path aliases. Instead, we recommend that you add any path aliases you need to the [`alias`](/docs/api/nuxt-config#alias) property within your `nuxt.config`, where they will get picked up and added to the auto-generated `tsconfig`. +:: diff --git a/docs/2.guide/3.going-further/1.experimental-features.md b/docs/2.guide/3.going-further/1.experimental-features.md index 6f77a2b8d2ca..7501fdee058a 100644 --- a/docs/2.guide/3.going-further/1.experimental-features.md +++ b/docs/2.guide/3.going-further/1.experimental-features.md @@ -1,31 +1,42 @@ --- title: "Experimental Features" -description: "Nuxt experimental features needs to be enabled manually." +description: "Enable Nuxt experimental features to unlock new possibilities." --- -# Experimental Features - The Nuxt experimental features can be enabled in the Nuxt configuration file. + Internally, Nuxt uses `@nuxt/schema` to define these experimental features. You can refer to the [API documentation](https://nuxt.com/docs/api/configuration/nuxt-config#experimental) or the [source code](https://github.com/nuxt/nuxt/blob/main/packages/schema/src/config/experimental.ts) for more information. -::alert{type=info icon=๐Ÿ’ก} +::callout Note that these features are experimental and could be removed or modified in the future. :: ## asyncContext -Enable native async context to be accessible for nested composables in Nuxt and in Nitro. See [full explanation in #20918](https://github.com/nuxt/nuxt/pull/20918). +Enable native async context to be accessible for nested composables in Nuxt and in Nitro. This opens the possibility to use composables inside async composables and reduce the chance to get the `Nuxt instance is unavailable` error. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { asyncContext: true } }) +export defineNuxtConfig({ + experimental: { + asyncContext: true + } +}) ``` +::read-more{icon="i-simple-icons-github" color="gray" to="https://github.com/nuxt/nuxt/pull/20918" target="_blank"} +See full explanation on the GitHub pull-request. +:: + ## asyncEntry Enables generation of an async entry point for the Vue bundle, aiding module federation support. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { asyncEntry: true } }) +export defineNuxtConfig({ + experimental: { + asyncEntry: true + } +}) ``` ## reactivityTransform @@ -33,56 +44,79 @@ export defineNuxtConfig({ experimental: { asyncEntry: true } }) Enables Vue's reactivity transform. Note that this feature has been marked as deprecated in Vue 3.3 and is planned to be removed from core in Vue 3.4. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { reactivityTransform: true } }) +export defineNuxtConfig({ + experimental: { + reactivityTransform: true + } +}) ``` -::ReadMore{link="/docs/getting-started/configuration#enabling-experimental-vue-features"} -:: +:read-more{to="/docs/getting-started/configuration#enabling-experimental-vue-features"} ## externalVue Externalizes `vue`, `@vue/*` and `vue-router` when building. + *Enabled by default.* + ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { externalVue: true } }) +export defineNuxtConfig({ + experimental: { + externalVue: true + } +}) ``` -::alert{type=warning icon=โš ๏ธ} -This feature will likely be removed in Nuxt 3.6. +::callout{color="amber" icon="i-ph-warning-duotone"} +This feature will likely be removed in a near future. :: ## treeshakeClientOnly Tree shakes contents of client-only components from server bundle. + *Enabled by default.* ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { treeshakeClientOnly: true } }) +export defineNuxtConfig({ + experimental: { + treeshakeClientOnly: true + } +}) ``` ## emitRouteChunkError Emits `app:chunkError` hook when there is an error loading vite/webpack chunks. Default behavior is to perform a hard reload of the new route when a chunk fails to load. + You can disable automatic handling by setting this to `false`, or handle chunk errors manually by setting it to `manual`. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { emitRouteChunkError: 'automatic' } }) // or 'manual' or false +export defineNuxtConfig({ + experimental: { + emitRouteChunkError: 'automatic' // or 'manual' or false + } +}) ``` ## restoreState -Allows Nuxt app state to be restored from `sessionStorage` when reloading the page after a chunk error or manual `reloadNuxtApp()` call. - To avoid hydration errors, it will be applied only after the Vue app has been mounted, - meaning there may be a flicker on initial load. +Allows Nuxt app state to be restored from `sessionStorage` when reloading the page after a chunk error or manual [`reloadNuxtApp()`](/docs/api/utils/reload-nuxt-app) call. -::alert{type=warning icon=โš ๏ธ} +To avoid hydration errors, it will be applied only after the Vue app has been mounted, meaning there may be a flicker on initial load. + +::callout{color="amber" icon="i-ph-warning-duotone"} Consider carefully before enabling this as it can cause unexpected behavior, and consider providing explicit keys to [`useState`](/docs/api/composables/use-state) as auto-generated keys may not match across builds. :: ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { restoreState: true } }) +export defineNuxtConfig({ + experimental: { + restoreState: true + } +}) ``` ## inlineSSRStyles @@ -91,7 +125,11 @@ Inlines styles when rendering HTML. This is currently available only when using You can also pass a function that receives the path of a Vue component and returns a boolean indicating whether to inline the styles for that component. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { inlineSSRStyles: true } }) // or a function to determine inlining +export defineNuxtConfig({ + experimental: { + inlineSSRStyles: true // or a function to determine inlining + } +}) ``` ## noScripts @@ -99,16 +137,25 @@ export defineNuxtConfig({ experimental: { inlineSSRStyles: true } }) // or a fun Disables rendering of Nuxt scripts and JS resource hints. Can also be configured granularly within `routeRules`. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { noScripts: true } }) +export defineNuxtConfig({ + experimental: { + noScripts: true + } +}) ``` ## renderJsonPayloads Allows rendering of JSON payloads with support for revivifying complex types. + *Enabled by default.* ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { renderJsonPayloads: true } }) +export defineNuxtConfig({ + experimental: { + renderJsonPayloads: true + } +}) ``` ## noVueServer @@ -116,7 +163,11 @@ export defineNuxtConfig({ experimental: { renderJsonPayloads: true } }) Disables Vue server renderer endpoint within Nitro. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { noVueServer: true } }) +export defineNuxtConfig({ + experimental: { + noVueServer: true + } +}) ``` ## payloadExtraction @@ -124,15 +175,23 @@ export defineNuxtConfig({ experimental: { noVueServer: true } }) Enables extraction of payloads of pages generated with `nuxt generate`. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { payloadExtraction: true } }) +export defineNuxtConfig({ + experimental: { + payloadExtraction: true + } +}) ``` ## clientFallback -Enables the experimental `` component for rendering content on the client if there's an error in SSR. +Enables the experimental [``](/docs/api/components/nuxt-client-fallback) component for rendering content on the client if there's an error in SSR. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { clientFallback: true } }) +export defineNuxtConfig({ + experimental: { + clientFallback: true + } +}) ``` ## crossOriginPrefetch @@ -140,18 +199,33 @@ export defineNuxtConfig({ experimental: { clientFallback: true } }) Enables cross-origin prefetch using the Speculation Rules API. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { crossOriginPrefetch: true } }) +export defineNuxtConfig({ + experimental: { + crossOriginPrefetch: true + } +}) ``` +::read-more{icon="i-simple-icons-w3c" color="gray" to="https://wicg.github.io/nav-speculation/prefetch.html" target="_blank"} +Read more about the **Speculation Rules API**. +:: + ## viewTransition Enables View Transition API integration with client-side router. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { viewTransition: true } }) +export defineNuxtConfig({ + experimental: { + viewTransition: true + } +}) ``` -::ReadMore{link="/docs/getting-started/transitions#view-transitions-api-experimental"} +:link-example{to="https://stackblitz.com/edit/nuxt-view-transitions?file=app.vue" target="_blank"} + +::read-more{icon="i-simple-icons-mdnwebdocs" color="gray" to="https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API" target="_blank"} +Read more about the **View Transition API**. :: ## writeEarlyHints @@ -159,29 +233,43 @@ export defineNuxtConfig({ experimental: { viewTransition: true } }) Enables writing of early hints when using node server. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { writeEarlyHints: true } }) +export defineNuxtConfig({ + experimental: { + writeEarlyHints: true + } +}) ``` ## componentIslands -Enables experimental component islands support with `` and `.island.vue` files. +Enables experimental component islands support with [``](/docs/api/components/nuxt-island) and `.island.vue` files. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { componentIslands: true } }) +export defineNuxtConfig({ + experimental: { + componentIslands: true + } +}) ``` -::ReadMore{link="/docs/guide/directory-structure/components#server-components"} -:: +:read-more{to="/docs/guide/directory-structure/components#server-components"} -You can follow the server components roadmap on [GitHub](https://github.com/nuxt/nuxt/issues/19772). +::read-more{icon="i-simple-icons-github" color="gray" to="https://github.com/nuxt/nuxt/issues/19772" target="_blank"} +You can follow the server components roadmap on GitHub. +:: ## configSchema Enables config schema support. + *Enabled by default.* ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { configSchema: true } }) +export defineNuxtConfig({ + experimental: { + configSchema: true + } +}) ``` ## polyfillVueUseHead @@ -189,7 +277,11 @@ export defineNuxtConfig({ experimental: { configSchema: true } }) Adds a compatibility layer for modules, plugins, or user code relying on the old `@vueuse/head` API. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { polyfillVueUseHead: false } }) +export defineNuxtConfig({ + experimental: { + polyfillVueUseHead: false + } +}) ``` ## respectNoSSRHeader @@ -197,42 +289,59 @@ export defineNuxtConfig({ experimental: { polyfillVueUseHead: false } }) Allow disabling Nuxt SSR responses by setting the `x-nuxt-no-ssr` header. ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { respectNoSSRHeader: false } }) +export defineNuxtConfig({ + experimental: { + respectNoSSRHeader: false + } +}) ``` ## localLayerAliases Resolve `~`, `~~`, `@` and `@@` aliases located within layers with respect to their layer source and root directories. + *Enabled by default.* ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { localLayerAliases: true } }) +export defineNuxtConfig({ + experimental: { + localLayerAliases: true + } +}) ``` ## typedPages -Enable the new experimental typed router using [unplugin-vue-router](https://github.com/posva/unplugin-vue-router). +Enable the new experimental typed router using [`unplugin-vue-router`](https://github.com/posva/unplugin-vue-router). ```ts [nuxt.config.ts] -export defineNuxtConfig({ experimental: { typedPages: false } }) +export defineNuxtConfig({ + experimental: { + typedPages: false + } +}) ``` -Out of the box, this will enable typed usage of `navigateTo`, ``, `router.push()` and more. +Out of the box, this will enable typed usage of [`navigateTo`](/docs/api/utils/navigate-to), [``](/docs/api/components/nuxt-link), [`router.push()`](/docs/api/composables/use-router) and more. + You can even get typed params within a page by using `const route = useRoute('route-name')`. ## watcher Set an alternative watcher that will be used as the watching service for Nuxt. + Nuxt uses `chokidar-granular` by default, which will ignore top-level directories (like `node_modules` and `.git`) that are excluded from watching. + You can set this instead to `parcel` to use `@parcel/watcher`, which may improve performance in large projects or on Windows platforms. + You can also set this to `chokidar` to watch all files in your source directory. ```ts [nuxt.config.ts] export defineNuxtConfig({ - experimental: { - watcher: 'chokidar-granular' // 'chokidar' or 'parcel' are also options - } + experimental: { + watcher: 'chokidar-granular' // 'chokidar' or 'parcel' are also options + } }) ``` diff --git a/docs/2.guide/3.going-further/_dir.yml b/docs/2.guide/3.going-further/_dir.yml index 6c41c559494c..dabbe70727a4 100644 --- a/docs/2.guide/3.going-further/_dir.yml +++ b/docs/2.guide/3.going-further/_dir.yml @@ -1,3 +1,3 @@ -title: Going further +title: Going Further titleTemplate: '%s ยท Nuxt Advanced' navigation.icon: i-ph-star-duotone diff --git a/docs/3.api/1.components/1.nuxt-client-fallback.md b/docs/3.api/1.components/1.nuxt-client-fallback.md index 4abdc0d4970a..d0b5ba5cc58c 100644 --- a/docs/3.api/1.components/1.nuxt-client-fallback.md +++ b/docs/3.api/1.components/1.nuxt-client-fallback.md @@ -7,7 +7,7 @@ description: "Nuxt provides `` component to render its conte Nuxt provides a `` component to render its content on the client if any of its children trigger an error in SSR. -::alert{type=warning} +::callout{to="/docs/guide/going-further/experimental-features#clientfallback"} This component is experimental and in order to use it you must enable the `experimental.clientFallback` option in your `nuxt.config`. :: From 53a7420d57b85dac417c92ebcf7f0caca3ef1d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Sun, 15 Oct 2023 21:41:19 +0200 Subject: [PATCH 22/62] update --- docs/1.getting-started/10.deployment.md | 4 +- docs/1.getting-started/4.styling.md | 2 +- docs/2.guide/1.concepts/7.esm.md | 4 +- .../2.directory-structure/1.components.md | 10 ++-- .../2.directory-structure/1.composables.md | 12 ++--- .../2.directory-structure/1.layouts.md | 2 +- .../2.directory-structure/1.middleware.md | 2 +- docs/2.guide/2.directory-structure/1.pages.md | 4 +- docs/2.guide/3.going-further/1.internals.md | 9 ++-- docs/2.guide/3.going-further/2.hooks.md | 34 ++++++------- docs/2.guide/3.going-further/3.modules.md | 48 +++++++++---------- docs/2.guide/3.going-further/7.layers.md | 6 +-- docs/3.api/4.commands/add.md | 16 +++---- docs/3.api/5.advanced/1.hooks.md | 2 +- docs/5.community/4.contribution.md | 2 +- docs/5.community/5.framework-contribution.md | 2 +- docs/6.bridge/1.overview.md | 2 +- docs/6.bridge/8.nitro.md | 2 +- docs/7.migration/2.configuration.md | 2 +- 19 files changed, 79 insertions(+), 86 deletions(-) diff --git a/docs/1.getting-started/10.deployment.md b/docs/1.getting-started/10.deployment.md index 047232d8dff9..a0bfbff5c95e 100644 --- a/docs/1.getting-started/10.deployment.md +++ b/docs/1.getting-started/10.deployment.md @@ -73,7 +73,7 @@ There are two ways to deploy a Nuxt application to any static hosting services: Use the [`nuxi generate` command](/docs/api/commands/generate) to build and pre-render your application using the [Nitro](/docs/guide/concepts/server-engine) crawler. This command is similar to `nuxt build` with the `nitro.static` option set to `true`, or running `nuxt build --prerender`. -```bash +```bash [Terminal] npx nuxi generate ``` @@ -303,7 +303,7 @@ export default { ... or use the `NITRO_PRESET` environment variable when running `nuxt build`: -```bash +```bash [Terminal] NITRO_PRESET=node-server nuxt build ``` diff --git a/docs/1.getting-started/4.styling.md b/docs/1.getting-started/4.styling.md index 03bd0b031dc8..f322b834f171 100644 --- a/docs/1.getting-started/4.styling.md +++ b/docs/1.getting-started/4.styling.md @@ -77,7 +77,7 @@ h1 { You can also reference stylesheets that are distributed through npm. Let's use the popular `animate.css` library as an example. -```bash +```bash [Terminal] npm install animate.css ``` diff --git a/docs/2.guide/1.concepts/7.esm.md b/docs/2.guide/1.concepts/7.esm.md index fbee7f6d4539..10078d46e58f 100644 --- a/docs/2.guide/1.concepts/7.esm.md +++ b/docs/2.guide/1.concepts/7.esm.md @@ -75,7 +75,7 @@ For a long time module authors have been producing ESM-syntax builds but using c However, if you try to import a package with an `.esm.js` file in a Node.js ESM context, it won't work, and you'll get an error like: -```bash +```bash [Terminal] (node:22145) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension. /path/to/index.js:1 @@ -92,7 +92,7 @@ SyntaxError: Unexpected token 'export' You might also get this error if you have a named import from an ESM-syntax build that Node.js thinks is CJS: -```bash +```bash [Terminal] file:///path/to/index.mjs:5 import { named } from 'sample-library' ^^^^^ diff --git a/docs/2.guide/2.directory-structure/1.components.md b/docs/2.guide/2.directory-structure/1.components.md index d05333c65d15..47509d489e82 100644 --- a/docs/2.guide/2.directory-structure/1.components.md +++ b/docs/2.guide/2.directory-structure/1.components.md @@ -27,7 +27,7 @@ Nuxt automatically imports any components in this directory (along with componen If you have a component in nested directories such as: -```bash +```bash [Directory Structure] | components/ --| base/ ----| foo/ @@ -190,7 +190,7 @@ export default defineNuxtConfig({ If a component is meant to be rendered only client-side, you can add the `.client` suffix to your component. -```bash +```bash [Directory Structure] | components/ --| Comments.client.vue ``` @@ -244,7 +244,7 @@ export default defineNuxtConfig({ Now you can register server-only components with the `.server` suffix and use them anywhere in your application automatically. -```bash +```bash [Directory Structure] | components/ --| HighlightedMarkdown.server.vue ``` @@ -284,7 +284,7 @@ Slots can be interactive and are wrapped within a `
` with `display: content In this case, the `.server` + `.client` components are two 'halves' of a component and can be used in advanced use cases for separate implementations of a component on server and client side. -```bash +```bash [Directory Structure] | components/ --| Comments.client.vue --| Comments.server.vue @@ -393,7 +393,7 @@ You can use the `components:dirs` hook to extend the directory list without requ Imagine a directory structure like this: -```bash +```bash [Directory Structure] | node_modules/ ---| awesome-ui/ ------| components/ diff --git a/docs/2.guide/2.directory-structure/1.composables.md b/docs/2.guide/2.directory-structure/1.composables.md index 3d667e5a2b32..5b672d1fb0b8 100644 --- a/docs/2.guide/2.directory-structure/1.composables.md +++ b/docs/2.guide/2.directory-structure/1.composables.md @@ -80,12 +80,12 @@ export const useHello = () => { Nuxt only scans files at the top level of the [`composables/` directory](/docs/guide/directory-structure/composables), e.g.: -```bash -composables - | - index.ts // scanned - | - useFoo.ts // scanned - | - nested - | --- utils.ts // not scanned +```bash [Directory Structure] +| composables/ +---| index.ts // scanned +---| useFoo.ts // scanned +-----| nested/ +-------| utils.ts // not scanned ``` Only `composables/index.ts` and `composables/useFoo.ts` would be searched for imports. diff --git a/docs/2.guide/2.directory-structure/1.layouts.md b/docs/2.guide/2.directory-structure/1.layouts.md index be4b56d5e58e..935f1b33865c 100644 --- a/docs/2.guide/2.directory-structure/1.layouts.md +++ b/docs/2.guide/2.directory-structure/1.layouts.md @@ -58,7 +58,7 @@ In a layout file, the content of the page will be displayed in the `` co ## Named Layout -```bash +```bash [Directory Structure] -| layouts/ ---| default.vue ---| custom.vue diff --git a/docs/2.guide/2.directory-structure/1.middleware.md b/docs/2.guide/2.directory-structure/1.middleware.md index ecc2fc81feab..2d7f55c43ca8 100644 --- a/docs/2.guide/2.directory-structure/1.middleware.md +++ b/docs/2.guide/2.directory-structure/1.middleware.md @@ -152,7 +152,7 @@ export default defineNuxtPlugin(() => { ## Example -```bash +```bash [Directory Structure] -| middleware/ ---| auth.ts ``` diff --git a/docs/2.guide/2.directory-structure/1.pages.md b/docs/2.guide/2.directory-structure/1.pages.md index a7e63042e3b9..2830793cdccf 100644 --- a/docs/2.guide/2.directory-structure/1.pages.md +++ b/docs/2.guide/2.directory-structure/1.pages.md @@ -97,7 +97,7 @@ If you place anything within square brackets, it will be turned into a [dynamic If you want a parameter to be _optional_, you must enclose it in double square brackets - for example, `~/pages/[[slug]]/index.vue` or `~/pages/[[slug]].vue` will match both `/` and `/test`. -```bash +```bash [Directory Structure] -| pages/ ---| index.vue ---| users-[group]/ @@ -156,7 +156,7 @@ It is possible to display [nested routes](https://next.router.vuejs.org/guide/es Example: -```bash +```bash [Directory Structure] -| pages/ ---| parent/ ------| child.vue diff --git a/docs/2.guide/3.going-further/1.internals.md b/docs/2.guide/3.going-further/1.internals.md index ea1134b960b7..0e047ec5a428 100644 --- a/docs/2.guide/3.going-further/1.internals.md +++ b/docs/2.guide/3.going-further/1.internals.md @@ -3,13 +3,11 @@ title: "How Nuxt Works?" description: "Nuxt is a minimal but highly customizable framework to build web applications." --- -# How Nuxt Works? - -Nuxt is a minimal but highly customizable framework to build web applications. This guide helps you better understand Nuxt internals to develop new solutions and module integrations on top of Nuxt. +This guide helps you better understand Nuxt internals to develop new solutions and module integrations on top of Nuxt. ## The Nuxt Interface -When you start Nuxt in development mode with `nuxi dev` or building a production application with `nuxi build`, +When you start Nuxt in development mode with [`nuxi dev`](/docs/api/commands/dev) or building a production application with [`nuxi build`](/docs/api/commands/build), a common context will be created, referred to as `nuxt` internally. It holds normalized options merged with `nuxt.config` file, some internal state, and a powerful [hooking system](/docs/api/advanced/hooks) powered by [unjs/hookable](https://github.com/unjs/hookable) allowing different components to communicate with each other. You can think of it as **Builder Core**. @@ -78,5 +76,4 @@ While both areas can be extended, that runtime context is isolated from build-ti `nuxt.config` and [Nuxt Modules](/docs/guide/going-further/modules) can be used to extend the build context, and [Nuxt Plugins](/docs/guide/directory-structure/plugins) can be used to extend runtime. -When building an application for production, `nuxi build` will generate a standalone build - in the `.output` directory, independent of `nuxt.config` and [Nuxt modules](/docs/guide/going-further/modules). +When building an application for production, `nuxi build` will generate a standalone build in the `.output` directory, independent of `nuxt.config` and [Nuxt modules](/docs/guide/going-further/modules). diff --git a/docs/2.guide/3.going-further/2.hooks.md b/docs/2.guide/3.going-further/2.hooks.md index 9b630f7d085e..50df4ed23639 100644 --- a/docs/2.guide/3.going-further/2.hooks.md +++ b/docs/2.guide/3.going-further/2.hooks.md @@ -3,25 +3,25 @@ title: "Lifecycle Hooks" description: "Nuxt provides a powerful hooking system to expand almost every aspect using hooks." --- -# Lifecycle Hooks - -Nuxt provides a powerful hooking system to expand almost every aspect using hooks. This feature is powered by [unjs/hookable](https://github.com/unjs/hookable). +::callout +The hooking system is powered by [unjs/hookable](https://github.com/unjs/hookable). +:: ## Nuxt Hooks (Build Time) These hooks are available for [Nuxt Modules](/docs/guide/going-further/modules) and build context. -### Usage with `nuxt.config` +### Within `nuxt.config` ```js [nuxt.config] export default defineNuxtConfig({ hooks: { - 'close': () => { } + close: () => { } } }) ``` -### Usage with Nuxt Modules +### Within Nuxt Modules ```js import { defineNuxtModule } from '@nuxt/kit' @@ -33,12 +33,14 @@ export default defineNuxtModule({ }) ``` +::read-more{to="/docs/api/advanced/hooks#nuxt-hooks-build-time"} +Explore all available Nuxt hooks. +:: + ## App Hooks (Runtime) App hooks can be mainly used by [Nuxt Plugins](/docs/guide/directory-structure/plugins) to hook into rendering lifecycle but could also be used in Vue composables. -### Usage with Plugins - ```js [plugins/test.ts] export default defineNuxtPlugin((nuxtApp) => { nuxtApp.hook('page:start', () => { @@ -47,15 +49,13 @@ export default defineNuxtPlugin((nuxtApp) => { }) ``` -::alert{icon=๐Ÿ‘‰} -Learn more about [available lifecycle hooks](/docs/api/advanced/hooks) +::read-more{to="/docs/api/advanced/hooks#app-hooks-runtime"} +Explore all available App hooks. :: -## Nitro App Hooks (Runtime) - -These hooks are available for [Nitro plugins](https://nitro.unjs.io/guide/plugins) to hook into Nitro's runtime behavior. +## Server Hooks (Runtime) -### Usage within a Nitro Plugin +These hooks are available for [server plugins](/docs/guide/directory-structure/server#server-plugins) to hook into Nitro's runtime behavior. ```js [~/server/plugins/test.ts] export default defineNitroPlugin((nitroApp) => { @@ -70,11 +70,11 @@ export default defineNitroPlugin((nitroApp) => { }) ``` -::alert{icon=๐Ÿ‘‰} -Learn more about available [Nitro lifecycle hooks](/docs/api/advanced/hooks#nitro-app-hooks-runtime-server-side). +::read-more{to="/docs/api/advanced/hooks#nitro-app-hooks-runtime-server-side"} +Learn more about available Nitro lifecycle hooks. :: -## Add additional hooks +## Additional Hooks You can add additional hooks by augmenting the types provided by Nuxt. This can be useful for modules. diff --git a/docs/2.guide/3.going-further/3.modules.md b/docs/2.guide/3.going-further/3.modules.md index 06f77e5475cd..f300e6489725 100644 --- a/docs/2.guide/3.going-further/3.modules.md +++ b/docs/2.guide/3.going-further/3.modules.md @@ -4,10 +4,6 @@ description: "Learn how to create a Nuxt Module to integrate, enhance or extend image: '/socials/module-author-guide.jpg' --- -# Module Author Guide - -Learn how to create a Nuxt Module to integrate, enhance or extend any Nuxt applications. - Nuxt's [configuration](/docs/api/nuxt-config) and [hooks](/docs/guide/going-further/hooks) systems make it possible to customize every aspect of Nuxt and add any integration you might need (Vue plugins, CMS, server routes, components, logging, etc.). **Nuxt Modules** are functions that sequentially run when starting Nuxt in development mode using `nuxi dev` or building a project for production with `nuxi build`. @@ -17,7 +13,7 @@ With modules, you can encapsulate, properly test, and share custom solutions as We recommend you get started with Nuxt Modules using our [starter template](https://github.com/nuxt/starter/tree/module): -```bash +```bash [Terminal] npx nuxi init -t module my-module ``` @@ -43,7 +39,7 @@ You can interact with the playground like with any Nuxt application. - Launch its development server with `npm run dev`, it should reload itself as you make changes to your module in the `src` directory - Build it with `npm run dev:build` -::alert{type=info} +::callout{color="blue" icon="i-ph-info-duotone"} All other `nuxi` commands can be used against the `playground` directory (e.g. `nuxi playground`). Feel free to declare additional `dev:*` scripts within your `package.json` referencing them for convenience. :: @@ -54,7 +50,7 @@ The module starter comes with a basic test suite: - A linter powered by [ESLint](https://eslint.org), run it with `npm run lint` - A test runner powered by [Vitest](https://vitest.dev), run it with `npm run test` or `npm run test:watch` -::alert{type=info} +::callout Feel free to augment this default test strategy to better suit your needs. :: @@ -64,13 +60,13 @@ Nuxt Modules come with their own builder provided by [`@nuxt/module-builder`](ht You can build your module by running `npm run prepack`. -::alert{type=info} +::callout While building your module can be useful in some cases, most of the time you won't need to build it on your own: the `playground` takes care of it while developing, and the release script also has you covered when publishing. :: #### How to Publish -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} Before publishing your module to npm, makes sure you have an [npmjs.com](https://www.npmjs.com) account and that you're authenticated to it locally with `npm login`. :: @@ -89,7 +85,7 @@ When running the release script, the following will happen: - Publishing the module to npm (for that purpose, the module will be built again to ensure its updated version number is taken into account in the published artifact) - Pushing a git tag representing the newly published version to your git remote origin -::alert{type=info} +::callout As with other scripts, feel free to fine-tune the default `release` script in your `package.json` to better suit your need. :: @@ -108,7 +104,7 @@ In either case, their anatomy is similar. #### Module Definition -::alert{type=info} +::callout When using the starter, your module definition is available at `src/module.ts`. :: @@ -116,7 +112,7 @@ The module definition is the entry point of your module. It's what gets loaded b At a low level, a Nuxt Module definition is a simple, potentially asynchronous, function accepting inline user options and a `nuxt` object to interact with Nuxt. -```js +```ts export default function (inlineOptions, nuxt) { // You can do whatever you like here.. console.log(inlineOptions.token) // `123` @@ -129,7 +125,7 @@ export default function (inlineOptions, nuxt) { You can get type-hint support for this function using the higher-level `defineNuxtModule` helper provided by [Nuxt Kit](/docs/api/advanced/kit). -```js +```ts import { defineNuxtModule } from '@nuxt/kit' export default defineNuxtModule((options, nuxt) => { @@ -143,7 +139,7 @@ However, **we do not recommend** using this low-level function definition. Inste This helper makes writing Nuxt Module more straightforward by implementing many common patterns seen in modules, guaranteeing future compatibility, and improving your module author developer experience and the one of your module users. -```js +```ts import { defineNuxtModule } from '@nuxt/kit' export default defineNuxtModule({ @@ -183,7 +179,7 @@ Ultimately `defineNuxtModule` returns a wrapper function with the lower level `( #### Runtime Directory -::alert{type=info} +::callout When using the starter, the runtime directory is available at `src/runtime`. :: @@ -207,11 +203,11 @@ Or any other kind of asset you want to inject in users' Nuxt applications: You'll then be able to inject all those assets inside the application from your [module definition](#module-definition). -::alert{type=info} +::callout Learn more about asset injection in [the recipes section](#recipes). :: -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} Published modules cannot leverage auto-imports for assets within their runtime directory. Instead, they have to import them explicitly from `#imports` or alike. Indeed, auto-imports are not enabled for files within `node_modules` (the location where a published module will eventually live) for performance reasons. That's why the module starter [deliberately disables them](https://github.com/nuxt/starter/blob/module/.nuxtrc#L1) while developing a module. @@ -231,7 +227,7 @@ Modules come with a set of first-party tools to help you with their development. [Nuxt Kit](/docs/guide/going-further/kit) provides composable utilities to help your module interact with Nuxt applications. It's recommended to use Nuxt Kit utilities over manual alternatives whenever possible to ensure better compatibility and code readability of your module. -:ReadMore{link="/docs/api/advanced/kit" title="API > Advanced > Kit"} +:read-more{to="/docs/api/advanced/kit"} #### `@nuxt/test-utils` @@ -286,11 +282,11 @@ You can then access your module options in a plugin, component, the application const options = useRuntimeConfig().public.myModule ``` -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} Be careful not to expose any sensitive module configuration on the public runtime config, such as private API keys, as they will end up in the public bundle. :: -:ReadMore{link="/docs/guide/going-further/runtime-config" title="Guide > Going Further > Runtime Config"} +:read-more{to="/docs/guide/going-further/runtime-config"} #### Injecting Plugins With `addPlugin` @@ -309,7 +305,7 @@ export default defineNuxtModule({ }) ``` -:ReadMore{link="/docs/api/advanced/kit" title="API > Advanced > Kit"} +:read-more{to="/docs/api/advanced/kit"} #### Injecting Vue Components With `addComponent` @@ -497,9 +493,9 @@ export default defineNuxtModule({ }) ``` -:ReadMore{link="/docs/api/advanced/hooks" title="API > Advanced > Hooks"} +:read-more{to="/docs/api/advanced/hooks"} -::alert{type=info} +::callout **Module cleanup** If your module opens, handles, or starts a watcher, you should close it when the Nuxt lifecycle is done. The `close` hook is available for this. @@ -593,7 +589,7 @@ Testing helps ensuring your module works as expected given various setup. Find i #### Unit and Integration -::alert{type=info} +::callout We're still discussing and exploring how to ease unit and integration testing on Nuxt Modules. [Check out this RFC to join the conversation](https://github.com/nuxt/nuxt/discussions/18399). @@ -649,7 +645,7 @@ describe('ssr', async () => { describe('csr', async () => { /* ... */ }) ``` -::alert{type=info} +::callout An example of such a workflow is available on [the module starter](https://github.com/nuxt/starter/blob/module/test/basic.test.ts). :: @@ -671,7 +667,7 @@ As we've seen, Nuxt Modules can be asynchronous. For example, you may want to de However, be careful with asynchronous behaviors as Nuxt will wait for your module to setup before going to the next module and starting the development server, build process, etc. Prefer deferring time-consuming logic to Nuxt hooks. -::alert{type="warning"} +::callout{color="amber" icon="i-ph-warning-duotone"} If your module takes more than **1 second** to setup, Nuxt will emit a warning about it. :: diff --git a/docs/2.guide/3.going-further/7.layers.md b/docs/2.guide/3.going-further/7.layers.md index ef3325bf129a..9301aa22b7bd 100644 --- a/docs/2.guide/3.going-further/7.layers.md +++ b/docs/2.guide/3.going-further/7.layers.md @@ -69,16 +69,16 @@ If you're interested in deepening your understanding about layers, consider exam To get started you can initialize a layer with the [nuxt/starter/layer template](https://github.com/nuxt/starter/tree/layer). This will create a basic structure you can build upon. Execute this command within the terminal to get started: -```bash +```bash [Terminal] npx nuxi init --template layer nuxt-layer ``` Follow up on the README instructions for the next steps. -::alert +::callout Check [nuxt-themes/starter](https://github.com/nuxt-themes/starter) for a more opinionated starter for authoring Nuxt themes. It can be initialized with: -```bash +```bash [Terminal] npx nuxi init --template gh:nuxt-themes/starter my-theme ``` diff --git a/docs/3.api/4.commands/add.md b/docs/3.api/4.commands/add.md index b94e56d5456b..25e8b4b669f5 100644 --- a/docs/3.api/4.commands/add.md +++ b/docs/3.api/4.commands/add.md @@ -28,7 +28,7 @@ Some templates support additional modifier flags to add a suffix (like `.client` Example: -```bash +```bash [Terminal] # Generates `components/TheHeader.vue` npx nuxi add component TheHeader ``` @@ -37,7 +37,7 @@ npx nuxi add component TheHeader Example: -```bash +```bash [Terminal] # Generates `composables/foo.ts` npx nuxi add composable foo ``` @@ -46,7 +46,7 @@ npx nuxi add composable foo Example: -```bash +```bash [Terminal] # Generates `layouts/custom.vue` npx nuxi add layout custom ``` @@ -57,7 +57,7 @@ npx nuxi add layout custom Example: -```bash +```bash [Terminal] # Generates `plugins/analytics.ts` npx nuxi add plugin analytics ``` @@ -66,12 +66,12 @@ npx nuxi add plugin analytics Example: -```bash +```bash [Terminal] # Generates `pages/about.vue` npx nuxi add page about ``` -```bash +```bash [Terminal] # Generates `pages/category/[id].vue` npx nuxi add page "category/[id]" ``` @@ -82,7 +82,7 @@ npx nuxi add page "category/[id]" Example: -```bash +```bash [Terminal] # Generates `middleware/auth.ts` npx nuxi add middleware auth ``` @@ -93,7 +93,7 @@ npx nuxi add middleware auth Example: -```bash +```bash [Terminal] # Generates `server/api/hello.ts` npx nuxi add api hello ``` diff --git a/docs/3.api/5.advanced/1.hooks.md b/docs/3.api/5.advanced/1.hooks.md index f585483f417c..667c9646d300 100644 --- a/docs/3.api/5.advanced/1.hooks.md +++ b/docs/3.api/5.advanced/1.hooks.md @@ -81,7 +81,7 @@ Hook | Arguments | Description `webpack:done` | - | Called on `allDone` on WebpackBar. `webpack:progress` | `statesArray` | Called on `progress` on WebpackBar. -# Nitro App Hooks (runtime, server-side) +## Nitro App Hooks (runtime, server-side) Hook | Arguments | Description | Types -----------------------|-----------------------|--------------------------------------|------------------ diff --git a/docs/5.community/4.contribution.md b/docs/5.community/4.contribution.md index cf0f7b2a4ee5..fc6096afad9b 100644 --- a/docs/5.community/4.contribution.md +++ b/docs/5.community/4.contribution.md @@ -170,7 +170,7 @@ It is important to enable Corepack to ensure you are on the same version of the To enable it, run -```bash +```bash [Terminal] corepack enable ``` diff --git a/docs/5.community/5.framework-contribution.md b/docs/5.community/5.framework-contribution.md index 4c3f4b364e37..593bb83e0c46 100644 --- a/docs/5.community/5.framework-contribution.md +++ b/docs/5.community/5.framework-contribution.md @@ -122,7 +122,7 @@ To contribute to Nuxt, you need to set up a local environment. 1. Check out a branch where you can work and commit your changes: -```bash +```bash [Terminal] git checkout -b my-new-branch ``` diff --git a/docs/6.bridge/1.overview.md b/docs/6.bridge/1.overview.md index 9dc667757b38..38bfaad24473 100644 --- a/docs/6.bridge/1.overview.md +++ b/docs/6.bridge/1.overview.md @@ -29,7 +29,7 @@ Then, reinstall your dependencies: ::code-group -```bash [Yarn] +```bash [yarn] yarn install ``` diff --git a/docs/6.bridge/8.nitro.md b/docs/6.bridge/8.nitro.md index ac073727e3bf..c2690f8c774e 100644 --- a/docs/6.bridge/8.nitro.md +++ b/docs/6.bridge/8.nitro.md @@ -26,7 +26,7 @@ Install `nuxi` as a development dependency: ::code-group -```bash [Yarn] +```bash [yarn] yarn add --dev nuxi ``` diff --git a/docs/7.migration/2.configuration.md b/docs/7.migration/2.configuration.md index e7099b122568..f4a7e9f67c59 100644 --- a/docs/7.migration/2.configuration.md +++ b/docs/7.migration/2.configuration.md @@ -140,7 +140,7 @@ A simple way to provide global state management with pinia would be: Install the [`@pinia/nuxt`](https://nuxt.com/modules/pinia) module: -```bash +```bash [Terminal] yarn add pinia @pinia/nuxt ``` From d7bd5d1d2ba75f3e7cb2519c44f4d6c5968b9dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Sun, 15 Oct 2023 22:56:21 +0200 Subject: [PATCH 23/62] guide ready --- .../2.guide/2.directory-structure/1.server.md | 2 +- docs/2.guide/3.going-further/1.internals.md | 2 +- .../3.going-further/10.runtime-config.md | 75 ++++++++++--------- .../11.nightly-release-channel.md | 28 ++++--- docs/2.guide/3.going-further/4.kit.md | 11 +-- docs/2.guide/3.going-further/6.nuxt-app.md | 38 ++++++---- docs/2.guide/3.going-further/7.layers.md | 46 ++++++------ .../3.going-further/8.custom-routing.md | 22 +++--- docs/2.guide/3.going-further/9.debugging.md | 2 +- 9 files changed, 126 insertions(+), 100 deletions(-) diff --git a/docs/2.guide/2.directory-structure/1.server.md b/docs/2.guide/2.directory-structure/1.server.md index d40da0f99698..e31ee0a5651b 100644 --- a/docs/2.guide/2.directory-structure/1.server.md +++ b/docs/2.guide/2.directory-structure/1.server.md @@ -322,7 +322,7 @@ NUXT_GITHUB_TOKEN='' :: ::callout -Giving `event` as argument to `useRuntimeConfig` is optional, but it is recommended to pass it to get the runtime config overwritten by [environment variables](/docs/guide/going-further/runtime-config#environment-variables) at runtime. +Giving the `event` as argument to `useRuntimeConfig` is optional, but it is recommended to pass it to get the runtime config overwritten by [environment variables](/docs/guide/going-further/runtime-config#environment-variables) at runtime for server routes. :: ### Request Cookies diff --git a/docs/2.guide/3.going-further/1.internals.md b/docs/2.guide/3.going-further/1.internals.md index 0e047ec5a428..b406272a4230 100644 --- a/docs/2.guide/3.going-further/1.internals.md +++ b/docs/2.guide/3.going-further/1.internals.md @@ -25,7 +25,7 @@ When rendering a page in the browser or on the server, a shared context will be This context keeps vue instance, runtime hooks, and internal states like ssrContext and payload for hydration. You can think of it as **Runtime Core**. -This context can be accessed using `useNuxtApp()` composable within Nuxt plugins and ` ``` -::alert +::callout Be careful not to use both `useNuxt2Meta()` and the Options API `head()` within the same component, as behavior may be unpredictable. :: diff --git a/docs/6.bridge/6.meta.md b/docs/6.bridge/6.meta.md index b8f0456de033..e15a8b514365 100644 --- a/docs/6.bridge/6.meta.md +++ b/docs/6.bridge/6.meta.md @@ -1,4 +1,7 @@ -# Meta Tags +--- +title: Meta Tags +description: 'Learn how to migrate from Nuxt 2 to Nuxt Bridge new meta tags.' +--- If you need to access the component state with `head`, you should migrate to using [`useHead`](/docs/api/composables/use-head) . @@ -66,11 +69,11 @@ useHead({ ``` -::alert +::callout This [`useHead`](/docs/api/composables/use-head) composable uses `@unhead/vue` under the hood (rather than `vue-meta`) to manipulate your ``. :: -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} We recommend not using the native Nuxt 2 `head()` properties in addition to [`useHead`](/docs/api/composables/use-head) , as they may conflict. :: diff --git a/docs/6.bridge/7.runtime-config.md b/docs/6.bridge/7.runtime-config.md index 11d9e397b726..70c0f065796e 100644 --- a/docs/6.bridge/7.runtime-config.md +++ b/docs/6.bridge/7.runtime-config.md @@ -1,6 +1,9 @@ -# Runtime Config +--- +title: Runtime Config +description: 'Nuxt provides a runtime config API to expose configuration and secrets within your application.' +--- -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} When using `runtimeConfig` option, [nitro](/docs/bridge/nitro) must have been configured. :: diff --git a/docs/6.bridge/8.nitro.md b/docs/6.bridge/8.nitro.md index c2690f8c774e..e2bd72a32248 100644 --- a/docs/6.bridge/8.nitro.md +++ b/docs/6.bridge/8.nitro.md @@ -1,4 +1,7 @@ -# Nitro +--- +title: Nitro +description: 'Activate Nitro to your Nuxt 2 application with Nuxt Bridge.' +--- ## Remove Modules @@ -53,7 +56,7 @@ Nuxt 3 introduced the new Nuxt CLI command [`nuxi`](/docs/api/commands/add). Upd } ``` -::alert +::callout If `nitro: false`, use the `nuxt2` command. :: diff --git a/docs/6.bridge/9.vite.md b/docs/6.bridge/9.vite.md index 68d67e387ffc..cb4457011872 100644 --- a/docs/6.bridge/9.vite.md +++ b/docs/6.bridge/9.vite.md @@ -1,6 +1,9 @@ -# Vite +--- +title: Vite +description: 'Activate Vite to your Nuxt 2 application with Nuxt Bridge.' +--- -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} When using `vite`, [nitro](/docs/bridge/nitro) must have been configured. :: From 5b1451fd940585ea4742ca2c32e2c93f93f7e095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= Date: Mon, 16 Oct 2023 10:10:39 +0200 Subject: [PATCH 25/62] migration done --- docs/6.bridge/_dir.yml | 1 + docs/7.migration/1.overview.md | 19 ++-- docs/7.migration/10.bundling.md | 15 ++- docs/7.migration/11.server.md | 15 ++- docs/7.migration/2.configuration.md | 6 +- docs/7.migration/20.module-authors.md | 19 ++-- docs/7.migration/3.auto-imports.md | 11 +- docs/7.migration/4.meta.md | 27 ++--- docs/7.migration/5.plugins-and-middleware.md | 19 ++-- docs/7.migration/6.pages-and-layouts.md | 104 ++++++++++--------- docs/7.migration/7.component-options.md | 45 +++++--- docs/7.migration/8.runtime-config.md | 18 ++-- docs/7.migration/_dir.yml | 1 + 13 files changed, 171 insertions(+), 129 deletions(-) diff --git a/docs/6.bridge/_dir.yml b/docs/6.bridge/_dir.yml index ede4ad45937f..f2a37c2daadd 100644 --- a/docs/6.bridge/_dir.yml +++ b/docs/6.bridge/_dir.yml @@ -1,2 +1,3 @@ titleTemplate: 'Migrate to Nuxt Bridge: %s' title: 'Migrate to Nuxt Bridge' +icon: i-ph-bridge-duotone diff --git a/docs/7.migration/1.overview.md b/docs/7.migration/1.overview.md index f19d6826c286..cef7bc52e47e 100644 --- a/docs/7.migration/1.overview.md +++ b/docs/7.migration/1.overview.md @@ -1,16 +1,11 @@ -# Overview +--- +title: Overview +description: Nuxt 3 is a complete rewrite of Nuxt 2, and also based on a new set of underlying technologies. +--- -Nuxt 3 is a complete rewrite of Nuxt 2, and also based on a new set of underlying technologies. +There are significant changes when migrating a Nuxt 2 app to Nuxt 3, although you can expect migration to become more straightforward as we move toward a stable release. -That means there will be significant changes when migrating a Nuxt 2 app to Nuxt 3, although you can expect migration to become more straightforward as we move toward a stable release. - - - -::alert{type=info} +::callout This migration guide is under progress to align with the development of Nuxt 3. :: @@ -20,7 +15,7 @@ Some of these significant changes include: 1. Moving from webpack 4 and Babel to Vite or webpack 5 and esbuild. 1. Moving from a runtime Nuxt dependency to a minimal, standalone server compiled with nitropack. -::alert{type=info} +::callout If you need to remain on Nuxt 2, but want to benefit from Nuxt 3 features in Nuxt 2, you can alternatively check out [how to get started with Bridge](/docs/bridge/overview). :: diff --git a/docs/7.migration/10.bundling.md b/docs/7.migration/10.bundling.md index d71237e67b96..d4830cf4ddf8 100644 --- a/docs/7.migration/10.bundling.md +++ b/docs/7.migration/10.bundling.md @@ -1,4 +1,7 @@ -# Build Tooling +--- +title: Build Tooling +description: 'Learn how to migrate from Nuxt 2 to Nuxt 3 build tooling.' +--- We use the following build tools by default: @@ -11,13 +14,15 @@ For this reason, most of your previous `build` configuration in `nuxt.config` wi If you need to configure any of Nuxt's build tools, you can do so in your `nuxt.config`, using the new top-level `vite`, `webpack` and `postcss` keys. -In addition, Nuxt ships with TypeScript support. [Find out more](/docs/guide/concepts/typescript). +In addition, Nuxt ships with TypeScript support. + +:read-more{to="/docs/guide/concepts/typescript"} ## Steps 1. Remove `@nuxt/typescript-build` and `@nuxt/typescript-runtime` from your dependencies and modules. -1. Remove any unused babel dependencies from your project. -1. Remove any explicit core-js dependencies. -1. Migrate `require` to `import`. +2. Remove any unused babel dependencies from your project. +3. Remove any explicit core-js dependencies. +4. Migrate `require` to `import`. diff --git a/docs/7.migration/11.server.md b/docs/7.migration/11.server.md index 9dd6f560eccb..6e7e36aa4672 100644 --- a/docs/7.migration/11.server.md +++ b/docs/7.migration/11.server.md @@ -1,12 +1,17 @@ -# Server +--- +title: Server +description: 'Learn how to migrate from Nuxt 2 to Nuxt 3 server.' +--- In a built Nuxt 3 application, there is no runtime Nuxt dependency. That means your site will be highly performant, and ultra-slim. But it also means you can no longer hook into runtime Nuxt server hooks. -[Read more about the Nitro server engine](/docs/guide/concepts/server-engine). +:read-more{to="/docs/guide/concepts/server-engine"} ## Steps 1. Remove the `render` key in your `nuxt.config`. -1. Any files in `~/server/api` and `~/server/middleware` will be automatically registered; you can remove them from your `serverMiddleware` array. -1. Update any other items in your `serverMiddleware` array to point to files or npm packages directly, rather than using inline functions. -1. If you are adding any server hooks, such as `server:` or `vue-renderer:` you will need to remove these and wait for [nitropack](https://github.com/unjs/nitropack) support for runtime hooks and plugins. +2. Any files in `~/server/api` and `~/server/middleware` will be automatically registered; you can remove them from your `serverMiddleware` array. +3. Update any other items in your `serverMiddleware` array to point to files or npm packages directly, rather than using inline functions. + +:read-more{to="/docs/guide/directory-structure/server"} +:read-more{to="/docs/guide/going-further/hooks#server-hooks-runtime"} diff --git a/docs/7.migration/2.configuration.md b/docs/7.migration/2.configuration.md index f4a7e9f67c59..3e2704102a9b 100644 --- a/docs/7.migration/2.configuration.md +++ b/docs/7.migration/2.configuration.md @@ -7,7 +7,7 @@ description: 'Learn how to migrate from Nuxt 2 to Nuxt 3 new configuration.' The starting point for your Nuxt app remains your `nuxt.config` file. -::alert{icon=๐Ÿ“ฆ} +::callout Nuxt configuration will be loaded using [`unjs/jiti`](https://github.com/unjs/jiti) and [`unjs/c12`](https://github.com/unjs/c12). :: @@ -91,7 +91,7 @@ Nuxt and Nuxt Modules are now build-time-only. }) ``` -::alert +::callout If you are a module author, you can check out [more information about module compatibility](/docs/migration/module-authors) and [our module author guide](/docs/guide/going-further/modules). :: @@ -99,7 +99,7 @@ If you are a module author, you can check out [more information about module com The `static/` (for storing static assets) has been renamed to `public/`. You can either rename your `static` directory to `public`, or keep the name by setting `dir.public` in your `nuxt.config`. -:read-more{link="/docs/guide/directory-structure/public"} +:read-more{to="/docs/guide/directory-structure/public"} ## TypeScript diff --git a/docs/7.migration/20.module-authors.md b/docs/7.migration/20.module-authors.md index 0536e713b790..6c6df5e796a1 100644 --- a/docs/7.migration/20.module-authors.md +++ b/docs/7.migration/20.module-authors.md @@ -1,4 +1,7 @@ -# Modules +--- +title: Modules +description: 'Learn how to migrate from Nuxt 2 to Nuxt 3 modules.' +--- ## Module Compatibility @@ -6,14 +9,16 @@ Nuxt 3 has a basic backward compatibility layer for Nuxt 2 modules using `@nuxt/ We have prepared a [Dedicated Guide](/docs/guide/going-further/modules) for authoring Nuxt 3 ready modules using `@nuxt/kit`. Currently best migration path is to follow it and rewrite your modules. Rest of this guide includes preparation steps if you prefer to avoid a full rewrite yet making modules compatible with Nuxt 3. -::alert -You can check for a list of Nuxt 3 ready modules from [Nuxt Modules](/modules). +::callout{icon="i-ph-puzzle-piece-duotone" to="/modules"} +Explore Nuxt 3 compatible modules. :: ### Plugin Compatibility Nuxt 3 plugins are **not** fully backward compatible with Nuxt 2. +:read-more{to="/docs/guide/directory-structure/plugins"} + ### Vue Compatibility Plugins or components using the Composition API need exclusive Vue 2 or Vue 3 support. @@ -72,18 +77,18 @@ Your module should work even if it's only added to [`buildModules`](/docs/guide/ (*) Unless it is for `nuxt dev` purpose only and guarded with `if (nuxt.options.dev) { }`. -::alert{type=info icon=๐Ÿ”Ž} -Continue reading about Nuxt 3 modules in the [Modules guide](/docs/guide/going-further/modules). +::callout +Continue reading about Nuxt 3 modules in the [Modules Author Guide](/docs/guide/going-further/modules). :: ### Use TypeScript (Optional) While it is not essential, most of the Nuxt ecosystem is shifting to use TypeScript, so it is highly recommended to consider migration. -::alert{icon=๐Ÿ’ก} +::callout You can start migration by renaming `.js` files, to `.ts`. TypeScript is designed to be progressive! :: -::alert{icon=๐Ÿ’ก} +::callout You can use TypeScript syntax for Nuxt 2 and 3 modules and plugins without any extra dependencies. :: diff --git a/docs/7.migration/3.auto-imports.md b/docs/7.migration/3.auto-imports.md index 55fe2b2aa4e4..ddfb19208fa1 100644 --- a/docs/7.migration/3.auto-imports.md +++ b/docs/7.migration/3.auto-imports.md @@ -1,8 +1,9 @@ -# Auto Imports +--- +title: Auto Imports +description: Nuxt 3 adopts a minimal friction approach, meaning wherever possible components and composables are auto-imported. +--- -Nuxt 3 adopts a minimal friction approach, meaning wherever possible components and composables are auto-imported. - -::alert{type=info} +::callout In the rest of the migration documentation, you will notice that key Nuxt and Vue utilities do not have explicit imports. This is not a typo; Nuxt will automatically import them for you, and you should get full type hinting if you have followed [the instructions](/docs/migration/configuration#typescript) to use Nuxt's TypeScript support. :: @@ -12,6 +13,6 @@ In the rest of the migration documentation, you will notice that key Nuxt and Vu 1. If you have been using `@nuxt/components` in Nuxt 2, you can remove `components: true` in your `nuxt.config`. If you had a more complex setup, then note that the component options have changed somewhat. See the [components documentation](/docs/guide/directory-structure/components) for more information. -::alert{type=info} +::callout You can look at `.nuxt/types/components.d.ts` and `.nuxt/types/imports.d.ts` to see how Nuxt has resolved your components and composable auto-imports. :: diff --git a/docs/7.migration/4.meta.md b/docs/7.migration/4.meta.md index cc5986423072..d46509d5d347 100644 --- a/docs/7.migration/4.meta.md +++ b/docs/7.migration/4.meta.md @@ -1,26 +1,28 @@ -# Meta Tags - -Nuxt 3 provides several different ways to manage your meta tags. +--- +title: Meta Tags +description: Manage your meta tags, from Nuxt 2 to Nuxt 3. +--- +Nuxt 3 provides several different ways to manage your meta tags: 1. Through your `nuxt.config`. 2. Through the [`useHead`](/docs/api/composables/use-head) [composable](/docs/getting-started/seo-meta) 3. Through [global meta components](/docs/getting-started/seo-meta) You can customize `title`, `titleTemplate`, `base`, `script`, `noscript`, `style`, `meta`, `link`, `htmlAttrs` and `bodyAttrs`. -::alert{icon=๐Ÿ“ฆ} +::callout Nuxt currently uses [`vueuse/head`](https://github.com/vueuse/head) to manage your meta tags, but implementation details may change. :: -[Read more about meta tags](/docs/getting-started/seo-meta). +:read-more{to="/docs/getting-started/seo-meta"} ## Migration 1. In your `nuxt.config`, rename `head` to `meta`. Consider moving this shared meta configuration into your `app.vue` instead. (Note that objects no longer have a `hid` key for deduplication.) -1. If you need to access the component state with `head`, you should migrate to using [`useHead`](/docs/api/composables/use-head) . You might also consider using the built-in meta-components. -1. If you need to use the Options API, there is a `head()` method you can use when you use `defineNuxtComponent`. +2. If you need to access the component state with `head`, you should migrate to using [`useHead`](/docs/api/composables/use-head) . You might also consider using the built-in meta-components. +3. If you need to use the Options API, there is a `head()` method you can use when you use `defineNuxtComponent`. -### Example: useHead +### useHead ::code-group @@ -63,7 +65,7 @@ useHead({ :: -### Example: Built-in Meta-components +### Meta-components Nuxt 3 also provides meta components that you can use to accomplish the same task. While these components look similar to HTML tags, they are provided by Nuxt and have similar functionality. @@ -100,13 +102,12 @@ export default { :: -::alert{icon=๐Ÿ‘‰} - +::callout 1. Make sure you use capital letters for these component names to distinguish them from native HTML elements (`` rather than `<title>`). -1. You can place these components anywhere in your template for your page. +2. You can place these components anywhere in your template for your page. :: -### Example: Options API +### Options API ```vue [Nuxt 3 (Options API)] <script> diff --git a/docs/7.migration/5.plugins-and-middleware.md b/docs/7.migration/5.plugins-and-middleware.md index 4fde72ab483d..cbc31d0e2588 100644 --- a/docs/7.migration/5.plugins-and-middleware.md +++ b/docs/7.migration/5.plugins-and-middleware.md @@ -1,8 +1,11 @@ -# Plugins and Middleware +--- +title: Plugins and Middleware +description: 'Learn how to migrate from Nuxt 2 to Nuxt 3 plugins and middleware.' +--- ## Plugins -Plugins now have a different format, and take only one argument (`nuxtApp`). Read more in [the docs](/docs/guide/directory-structure/plugins). +Plugins now have a different format, and take only one argument (`nuxtApp`). ::code-group @@ -28,14 +31,16 @@ export default defineNuxtPlugin(nuxtApp => { :: -::alert{icon=๐Ÿ‘‰} -You can read more about the format of `nuxtApp` in [the docs](/docs/api/composables/use-nuxt-app). +:read-more{to="/docs/guide/directory-structure/plugins"} + +::read-more{to="/docs/api/composables/use-nuxt-app"} +Read more about the format of `nuxtApp`. :: ### Migration 1. Migrate your plugins to use the `defineNuxtPlugin` helper function. -1. Remove any entries in your `nuxt.config` plugins array that are located in your `plugins/` folder. All files in this directory at the top level (and any index files in any subdirectories) will be automatically registered. Instead of setting `mode` to `client` or `server`, you can indicate this in the file name. For example, `~/plugins/my-plugin.client.ts` will only be loaded on client-side. +2. Remove any entries in your `nuxt.config` plugins array that are located in your `plugins/` folder. All files in this directory at the top level (and any index files in any subdirectories) will be automatically registered. Instead of setting `mode` to `client` or `server`, you can indicate this in the file name. For example, `~/plugins/my-plugin.client.ts` will only be loaded on client-side. ## Route Middleware @@ -65,7 +70,9 @@ export default defineNuxtRouteMiddleware((to, from) => { Much like Nuxt 2, route middleware placed in your `~/middleware` folder is automatically registered. You can then specify it by name in a component. However, this is done with `definePageMeta` rather than as a component option. -`navigateTo` is one of a number of route helper functions, which you can read more about in [the documentation about route middleware](/docs/guide/directory-structure/middleware). +`navigateTo` is one of a number of route helper functions. + +:read-more{to="/docs/guide/directory-structure/middleware"} ### Migration diff --git a/docs/7.migration/6.pages-and-layouts.md b/docs/7.migration/6.pages-and-layouts.md index 0169e6737bd5..aa7a29436596 100644 --- a/docs/7.migration/6.pages-and-layouts.md +++ b/docs/7.migration/6.pages-and-layouts.md @@ -1,16 +1,25 @@ -# Pages and Layouts +--- +title: Pages and Layouts +description: Learn how to migrate from Nuxt 2 to Nuxt 3 pages and layouts. +--- ## `app.vue` -Nuxt 3 provides a central entry point to your app via `~/app.vue`. If you don't have an `app.vue` file in your source directory, Nuxt will use its own default version. +Nuxt 3 provides a central entry point to your app via `~/app.vue`. + +::callout +If you don't have an `app.vue` file in your source directory, Nuxt will use its own default version. +:: This file is a great place to put any custom code that needs to be run once when your app starts up, as well as any components that are present on every page of your app. For example, if you only have one layout, you can move this to `app.vue` instead. -[Read more about `app.vue`](/docs/guide/directory-structure/app). +:read-more{to="/docs/guide/directory-structure/app"} + +:link-example{to="/docs/examples/hello-world"} ### Migration -1. Consider creating an `app.vue` file and including any logic that needs to run once at the top-level of your app. You can check out [an example here](/docs/guide/directory-structure/app). +Consider creating an `app.vue` file and including any logic that needs to run once at the top-level of your app. You can check out [an example here](/docs/guide/directory-structure/app). ## Layouts @@ -23,55 +32,50 @@ You will also need to change how you define the layout used by a page using the ### Migration 1. Replace `<Nuxt />` with `<slot />` -1. Use `definePageMeta` to select the layout used by your page. -1. Move `~/layouts/_error.vue` to `~/error.vue`. See [the error handling docs](/docs/getting-started/error-handling). If you want to ensure that this page uses a layout, you can use [the `<NuxtLayout>` component](/docs/guide/directory-structure/layouts) directly within `error.vue`: - - ```vue - <template> - <div> - <NuxtLayout name="default"> - <!-- --> - </NuxtLayout> - </div> - </template> - ``` - -### Example: `~/layouts/custom.vue` - -::code-group + ```diff [layouts/custom.vue] + <template> + <div id="app-layout"> + <main> + - <Nuxt /> + + <slot /> + </main> + </div> + </template> + ``` +2. Use [`definePageMeta`](/docs/api/utils/define-page-meta) to select the layout used by your page. + ```diff [pages/index.vue] + <script> + + definePageMeta({ + + layout: 'custom' + + }) + - export default { + - layout: 'custom' + - } + </script> + ``` +3. Move `~/layouts/_error.vue` to `~/error.vue`. See [the error handling docs](/docs/getting-started/error-handling). If you want to ensure that this page uses a layout, you can use [`<NuxtLayout>`](/docs/guide/directory-structure/layouts) directly within `error.vue`: + ```vue [error.vue] + <template> + <div> + <NuxtLayout name="default"> + <!-- --> + </NuxtLayout> + </div> + </template> + ``` -```diff [layouts/custom.vue] - <template> - <div id="app-layout"> - <main> -- <Nuxt /> -+ <slot /> - </main> - </div> - </template> -``` -```diff [pages/index.vue] - <script> -+ definePageMeta({ layout: 'custom' }) - export default { -- layout: 'custom' - } - </script> -``` - -:: ## Pages -Nuxt 3 ships with an optional `vue-router` integration triggered by the existence of a [`pages/` directory](/docs/guide/directory-structure/pages) in your source directory. If you only have a single page, you may consider instead moving it to `app.vue` for a lighter build. +Nuxt 3 ships with an optional `vue-router` integration triggered by the existence of a [`pages/`](/docs/guide/directory-structure/pages) directory in your source directory. If you only have a single page, you may consider instead moving it to `app.vue` for a lighter build. ### Dynamic Routes The format for defining dynamic routes in Nuxt 3 is slightly different from Nuxt 2, so you may need to rename some of the files within `pages/`. 1. Where you previously used `_id` to define a dynamic route parameter you now use `[id]`. -1. Where you previously used `_.vue` to define a catch-all route, you now use `[...slug].vue`. +2. Where you previously used `_.vue` to define a catch-all route, you now use `[...slug].vue`. ### Nested Routes @@ -81,19 +85,19 @@ In Nuxt 2, you will have defined any nested routes (with parent and child compon If you were passing a custom page key or keep-alive props to `<Nuxt>`, you will now use `definePageMeta` to set these options. -See [more about migrating Nuxt component hooks](/docs/migration/component-options). +:read-more{to="/docs/migration/component-options"} ### Page and Layout Transitions If you have been defining transitions for your page or layout directly in your component options, you will now need to use `definePageMeta` to set the transition. Since Vue 3, [-enter and -leave CSS classes have been renamed](https://v3-migration.vuejs.org/breaking-changes/transition.html). The `style` prop from `<Nuxt>` no longer applies to transition when used on `<slot>`, so move the styles to your `-active` class. -[Read more about `pages/`](/docs/guide/directory-structure/pages). +:read-more{to="/docs/getting-started/transitions"} ### Migration 1. Rename any pages with dynamic parameters to match the new format. -1. Update `<Nuxt>` and `<NuxtChild>` to be `<NuxtPage>`. -1. If you're using the Composition API, you can also migrate `this.$route` and `this.$router` to use [`useRoute`](/docs/api/composables/use-route) and [`useRouter`](/docs/api/composables/use-router) composables. +2. Update `<Nuxt>` and `<NuxtChild>` to be `<NuxtPage>`. +3. If you're using the Composition API, you can also migrate `this.$route` and `this.$router` to use [`useRoute`](/docs/api/composables/use-route) and [`useRouter`](/docs/api/composables/use-router) composables. #### Example: Dynamic Routes @@ -181,13 +185,17 @@ definePageMeta({ Most of the syntax and functionality are the same for the global [NuxtLink](/docs/api/components/nuxt-link) component. If you have been using the shortcut `<NLink>` format, you should update this to use `<NuxtLink>`. -`<NuxtLink>` is now a drop-in replacement for _all_ links, even external ones. You can read more about it, and how to extend it to provide your own link component, [in the docs](/docs/api/components/nuxt-link). +`<NuxtLink>` is now a drop-in replacement for _all_ links, even external ones. You can read more about it, and how to extend it to provide your own link component. + +:read-more{to="/docs/api/components/nuxt-link"} ## Programmatic Navigation When migrating from Nuxt 2 to Nuxt 3, you will have to update how you programmatically navigate your users. In Nuxt 2, you had access to the underlying Vue Router with `this.$router`. In Nuxt 3, you can use the `navigateTo()` utility method which allows you to pass a route and parameters to Vue Router. -**Note:** Ensure to always `await` on `navigateTo` or chain it's result by returning from functions. +::callout{color="amber" icon="i-ph-warning-duotone"} +Ensure to always `await` on [`navigateTo`](/docs/api/utils/navigate-to) or chain it's result by returning from functions. +:: ::code-group diff --git a/docs/7.migration/7.component-options.md b/docs/7.migration/7.component-options.md index af3dc28b8a3c..68d9f8c08089 100644 --- a/docs/7.migration/7.component-options.md +++ b/docs/7.migration/7.component-options.md @@ -1,6 +1,9 @@ -# Component Options +--- +title: Component Options +description: 'Learn how to migrate from Nuxt 2 components options to Nuxt 3 composables.' +--- -## `asyncData` and `fetch` component options +## `asyncData` and `fetch` Nuxt 3 provides new options for [fetching data from an API](/docs/getting-started/data-fetching). @@ -11,7 +14,7 @@ Nuxt 3 provides new options for [fetching data from an API](/docs/getting-starte In Nuxt 2 you might use `@nuxtjs/axios` or `@nuxt/http` to fetch your data - or just the polyfilled global `fetch`. -In Nuxt 3 you can use a globally available `fetch` method that has the same API as [the Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch) or `$fetch` method which is using [unjs/ofetch](https://github.com/unjs/ofetch). It has a number of benefits, including: +In Nuxt 3 you can use a globally available `fetch` method that has the same API as [the Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch) or [`$fetch`](/docs/api/utils/dollarfetch) method which is using [unjs/ofetch](https://github.com/unjs/ofetch). It has a number of benefits, including: 1. It will handle 'smartly' making [direct API calls](/docs/guide/concepts/server-engine#direct-api-calls) if it's running on the server, or making a client-side call to your API if it's running on the client. (It can also handle calling third-party APIs.) @@ -19,7 +22,7 @@ In Nuxt 3 you can use a globally available `fetch` method that has the same API You can read more [about direct API calls](/docs/guide/concepts/server-engine#direct-api-calls) or [fetching data](/docs/getting-started/data-fetching). -### Using Composables +### Composables Nuxt 3 provides new composables for fetching data: [`useAsyncData`](/docs/api/composables/use-async-data) and `useFetch`. They each have 'lazy' variants (`useLazyAsyncData` and `useLazyFetch`), which do not block client-side navigation. @@ -53,22 +56,22 @@ const { data: post, refresh } = await useFetch(`https://api.nuxtjs.dev/posts/${p You can now use `post` inside of your Nuxt 3 template, or call `refresh` to update the data. -::alert{type=info} +::callout Despite the names, [`useFetch`](/docs/api/composables/use-fetch) is not a direct replacement of the `fetch()` hook. Rather, [`useAsyncData`](/docs/api/composables/use-async-data) replaces both hooks and is more customizable; it can do more than simply fetching data from an endpoint. [`useFetch`](/docs/api/composables/use-fetch) is a convenience wrapper around [`useAsyncData`](/docs/api/composables/use-async-data) for simply fetching data from an endpoint. :: ### Migration 1. Replace the `asyncData` hook with [`useAsyncData`](/docs/api/composables/use-async-data) or [`useFetch`](/docs/api/composables/use-fetch) in your page/component. -1. Replace the `fetch` hook with [`useAsyncData`](/docs/api/composables/use-async-data) or [`useFetch`](/docs/api/composables/use-fetch) in your component. +2. Replace the `fetch` hook with [`useAsyncData`](/docs/api/composables/use-async-data) or [`useFetch`](/docs/api/composables/use-fetch) in your component. ## `head` -See [meta tag migration](/docs/migration/meta). +:read-more{to="/docs/migration/meta"} ## `key` -You can now define a key within the `definePageMeta` compiler macro. +You can now define a key within the [`definePageMeta`](/docs/api/utils/define-page-meta) compiler macro. ```diff [pages/index.vue] - <script> @@ -83,16 +86,12 @@ You can now define a key within the `definePageMeta` compiler macro. + // or a method + // key: route => route.fullPath + }) - </script> +</script> ``` -### Migration - -1. Migrate `key` from component options to `definePageMeta`. - ## `layout` -See [layout migration](/docs/migration/pages-and-layouts). +:read-more{to="/docs/migration/pages-and-layouts"} ## `loading` @@ -100,15 +99,29 @@ This feature is not yet supported in Nuxt 3. ## `middleware` -See [middleware migration](/docs/migration/plugins-and-middleware). +:read-more{to="/docs/migration/plugins-and-middleware"} ## `scrollToTop` This feature is not yet supported in Nuxt 3. If you want to overwrite the default scroll behavior of `vue-router`, you can do so in `~/app/router.options.ts` (see [docs](/docs/guide/going-further/custom-routing#router-options)) for more info. +Similar to `key`, specify it within the [`definePageMeta`](/docs/api/utils/define-page-meta) compiler macro. + +```diff [pages/index.vue] +- <script> +- export default { +- scrollToTop: false +- } ++ <script setup> ++ definePageMeta({ ++ scrollToTop: false ++ }) +</script> +``` + ## `transition` -See [layout migration](/docs/migration/pages-and-layouts). +:read-more{to="/docs/getting-started/transitions"} ## `validate` diff --git a/docs/7.migration/8.runtime-config.md b/docs/7.migration/8.runtime-config.md index ce75cc62e877..1cf95231c054 100644 --- a/docs/7.migration/8.runtime-config.md +++ b/docs/7.migration/8.runtime-config.md @@ -1,4 +1,7 @@ -# Runtime Config +--- +title: Runtime Config +description: 'Learn how to migrate from Nuxt 2 to Nuxt 3 runtime config.' +--- If you wish to reference environment variables within your Nuxt 3 app, you will need to use runtime config. @@ -6,14 +9,12 @@ When referencing these variables within your components, you will have to use th In the `server/` portion of your app, you can use [`useRuntimeConfig`](/docs/api/composables/use-runtime-config) without any import. -[Read more about runtime config](/docs/guide/going-further/runtime-config). +:read-more{to="/docs/guide/going-further/runtime-config"} ## Migration 1. Add any environment variables that you use in your app to the `runtimeConfig` property of the `nuxt.config` file. -1. Migrate `process.env` to [`useRuntimeConfig`](/docs/api/composables/use-runtime-config) throughout the Vue part of your app. - -## Example +2. Migrate `process.env` to [`useRuntimeConfig`](/docs/api/composables/use-runtime-config) throughout the Vue part of your app. ::code-group @@ -40,13 +41,12 @@ console.log(config.public.apiBase) ``` ```ts [server/api/hello.ts] -const config = useRuntimeConfig() - -export default (req, res) => { +export default defineEventhandler((event) => { + const config = useRuntimeConfig(event) // In server, you can now access config.apiSecret, in addition to config.public console.log(config.apiSecret) console.log(config.public.apiBase) -} +}) ``` ```ini [.env] diff --git a/docs/7.migration/_dir.yml b/docs/7.migration/_dir.yml index 6721af028c9f..54585df393cf 100644 --- a/docs/7.migration/_dir.yml +++ b/docs/7.migration/_dir.yml @@ -1,2 +1,3 @@ titleTemplate: 'Migrate to Nuxt 3: %s' title: 'Migrate to Nuxt 3' +icon: i-ph-arrow-circle-up-duotone From 7572da95114f164a6592a3848606eec231cb268f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 10:59:57 +0200 Subject: [PATCH 26/62] docs: title template and community section --- docs/2.guide/0.index.md | 1 + docs/2.guide/2.directory-structure/_dir.yml | 3 +- docs/2.guide/3.going-further/_dir.yml | 2 +- docs/2.guide/_dir.yml | 1 + docs/3.api/1.components/_dir.yml | 1 + docs/3.api/2.composables/_dir.yml | 1 + docs/3.api/3.utils/_dir.yml | 1 + docs/3.api/4.commands/_dir.yml | 2 + docs/3.api/5.kit/_dir.yml | 1 + docs/3.api/6.nuxt-config.md | 1 + docs/3.api/_dir.yml | 1 + docs/3.api/index.md | 1 + docs/5.community/1.nuxt-community.md | 210 ------------------- docs/5.community/2.getting-help.md | 8 +- docs/5.community/3.reporting-bugs.md | 8 +- docs/5.community/4.contribution.md | 8 +- docs/5.community/5.framework-contribution.md | 9 +- docs/5.community/6.roadmap.md | 44 ++-- docs/5.community/7.changelog.md | 13 +- docs/5.community/_contributors.yml | 4 - docs/5.community/_dir.yml | 2 + docs/5.community/index.md | 5 - 22 files changed, 59 insertions(+), 268 deletions(-) delete mode 100644 docs/5.community/1.nuxt-community.md delete mode 100644 docs/5.community/_contributors.yml delete mode 100644 docs/5.community/index.md diff --git a/docs/2.guide/0.index.md b/docs/2.guide/0.index.md index 015487ddeed9..af767967eb61 100644 --- a/docs/2.guide/0.index.md +++ b/docs/2.guide/0.index.md @@ -1,5 +1,6 @@ --- title: 'Nuxt Guide' +titleTemplate: '%s' description: 'Lean how Nuxt works with in-depth guides.' navigation: false surround: false diff --git a/docs/2.guide/2.directory-structure/_dir.yml b/docs/2.guide/2.directory-structure/_dir.yml index 082fa247413e..4d663658ada9 100644 --- a/docs/2.guide/2.directory-structure/_dir.yml +++ b/docs/2.guide/2.directory-structure/_dir.yml @@ -1,4 +1,3 @@ title: Directory Structure titleTemplate: '%s ยท Nuxt Directory Structure' -navigation.icon: i-ph-folders-duotone -image: '/socials/directory-structure.jpg' +icon: i-ph-folders-duotone diff --git a/docs/2.guide/3.going-further/_dir.yml b/docs/2.guide/3.going-further/_dir.yml index dabbe70727a4..20cbae3d0165 100644 --- a/docs/2.guide/3.going-further/_dir.yml +++ b/docs/2.guide/3.going-further/_dir.yml @@ -1,3 +1,3 @@ title: Going Further titleTemplate: '%s ยท Nuxt Advanced' -navigation.icon: i-ph-star-duotone +icon: i-ph-star-duotone diff --git a/docs/2.guide/_dir.yml b/docs/2.guide/_dir.yml index cb004c70d143..39506eabf0db 100644 --- a/docs/2.guide/_dir.yml +++ b/docs/2.guide/_dir.yml @@ -1 +1,2 @@ +title: 'Guide' icon: i-ph-book-open-duotone diff --git a/docs/3.api/1.components/_dir.yml b/docs/3.api/1.components/_dir.yml index bd24a4ecafa9..d78fe4060a4f 100644 --- a/docs/3.api/1.components/_dir.yml +++ b/docs/3.api/1.components/_dir.yml @@ -1,2 +1,3 @@ +title: 'Components' titleTemplate: '%s ยท Nuxt Components' icon: i-ph-cube-duotone diff --git a/docs/3.api/2.composables/_dir.yml b/docs/3.api/2.composables/_dir.yml index 2a61a2e760dd..35d41bbd10c4 100644 --- a/docs/3.api/2.composables/_dir.yml +++ b/docs/3.api/2.composables/_dir.yml @@ -1,2 +1,3 @@ +title: 'Composables' titleTemplate: '%s ยท Nuxt Composables' icon: i-ph-arrows-left-right-duotone diff --git a/docs/3.api/3.utils/_dir.yml b/docs/3.api/3.utils/_dir.yml index 47ee2607fc6f..50d20caf25c4 100644 --- a/docs/3.api/3.utils/_dir.yml +++ b/docs/3.api/3.utils/_dir.yml @@ -1,2 +1,3 @@ +title: 'Utils' titleTemplate: '%s ยท Nuxt Utils' navigation.icon: i-ph-function-duotone diff --git a/docs/3.api/4.commands/_dir.yml b/docs/3.api/4.commands/_dir.yml index 3b26a67854de..b1123168e02f 100644 --- a/docs/3.api/4.commands/_dir.yml +++ b/docs/3.api/4.commands/_dir.yml @@ -1 +1,3 @@ +title: 'Commands' icon: i-ph-terminal-window-duotone +titleTemplate: '%s ยท Nuxt Commands' diff --git a/docs/3.api/5.kit/_dir.yml b/docs/3.api/5.kit/_dir.yml index 3e500970a8c6..dda66db56e4d 100644 --- a/docs/3.api/5.kit/_dir.yml +++ b/docs/3.api/5.kit/_dir.yml @@ -1,2 +1,3 @@ title: Nuxt Kit navigation.icon: i-ph-toolbox-duotone +titleTemplate: '%s ยท Nuxt Kit' diff --git a/docs/3.api/6.nuxt-config.md b/docs/3.api/6.nuxt-config.md index 7500075a0fc9..027f73fe32a0 100644 --- a/docs/3.api/6.nuxt-config.md +++ b/docs/3.api/6.nuxt-config.md @@ -1,5 +1,6 @@ --- title: Nuxt Configuration +titleTemplate: '%s' description: Discover all the options you can use in your nuxt.config.ts file. navigation.icon: i-ph-gear-duotone --- diff --git a/docs/3.api/_dir.yml b/docs/3.api/_dir.yml index 225c7faa60ee..6d08bfd7c884 100644 --- a/docs/3.api/_dir.yml +++ b/docs/3.api/_dir.yml @@ -1,2 +1,3 @@ title: API icon: i-ph-code +titleTemplate: '%s ยท Nuxt API' diff --git a/docs/3.api/index.md b/docs/3.api/index.md index 038b66b54f62..f0b12b742563 100644 --- a/docs/3.api/index.md +++ b/docs/3.api/index.md @@ -1,5 +1,6 @@ --- title: 'Nuxt API Reference' +titleTemplate: '%s' description: 'Explore all Nuxt Internals: Components, Composables, Utils, Commands and more.' navigation: false surround: false diff --git a/docs/5.community/1.nuxt-community.md b/docs/5.community/1.nuxt-community.md deleted file mode 100644 index a63868067dc0..000000000000 --- a/docs/5.community/1.nuxt-community.md +++ /dev/null @@ -1,210 +0,0 @@ ---- -navigation.icon: ph:users-bold ---- -<!-- markdownlint-disable --> -<!-- @case-police-disable --> - -::docs-hero ---- -image: - path: '/assets/docs/getting-started/nuxt-community/nuxt-community' - width: '437' - height: '236' - format: 'png' ---- -#title -Nuxt Community -#description -Nuxt would not be what it is today without its community of maintainers, contributors and users. -#extra -:newsletter-form -:: - -::community-section -#title -The journey of an [Open Source Project]{.text-transparent .bg-clip-text .bg-gradient-to-r .from-green-400 .to-teal-400} -#description -The development of Nuxt and its ecosystem is led by an international team. Our committed team and community work every day to move Nuxt forward. -#extra - ::docs-community-journey-section{.dark:bg-gray-900} - --- - fontSizeClass: 'text-2xl' - --- - #extraTitle - Since the creation of Nuxt 3 - ::card-list - --- - cardListClass: 'grid grid-cols-1 gap-1 sm:gap-8 sm:grid-cols-2 lg:grid-cols-4 border-gray-200 dark:border-gray-800 rounded-xl' - backgroundImage: - path: '/assets/docs/getting-started/nuxt-community/map-nuxters' - width: '582' - height: '187' - format: 'png' - --- - :::card-item - --- - gradientBorder: false - titleClass: 'text-3xl font-semibold sm:text-5xl u-text-gray-900 mb-2 mt-2' - descriptionClass: 'u-text-gray-500 text-lg font-medium' - backgroundColor: 'bg-transparent' - border: false - contentClass: 'gap-y-0' - --- - #title - 60M - #description - npm downloads - ::: - :::card-item - --- - gradientBorder: false - titleClass: 'text-3xl font-semibold sm:text-5xl u-text-gray-900 mb-2 mt-2' - descriptionClass: 'u-text-gray-500 text-lg font-medium' - border: false - backgroundColor: 'bg-transparent' - contentClass: 'gap-y-0' - --- - #title - 75K - #description - Stars - ::: - :::card-item - --- - gradientBorder: false - titleClass: 'text-3xl font-semibold sm:text-5xl u-text-gray-900 mb-2 mt-2' - descriptionClass: 'u-text-gray-500 text-lg font-medium' - border: false - backgroundColor: 'bg-transparent' - contentClass: 'gap-y-0' - --- - #title - 330 - #description - Contributors - ::: - :::card-item - --- - gradientBorder: false - titleClass: 'text-3xl font-semibold sm:text-5xl u-text-gray-900 mb-2 mt-2' - descriptionClass: 'u-text-gray-500 text-lg font-medium' - backgroundColor: 'bg-transparent' - border: false - contentClass: 'gap-y-0' - --- - #title - 1K - #description - Forks - ::: - :: - :: -:: - -::community-section -#title -From users to [Contributors]{.text-transparent .bg-clip-text .bg-gradient-to-r .from-green-400 .to-teal-400} -#description -From contributors to advocates, the community is made of members with different horizons and skills. We are happy to see new members every day and encourage anyone to help in any way (answering questions, giving a talk, creating modules and contributing to the core). -#extra - ::contributors-card - #title - Sharing is caring - #default - 1. Hundreds of conferences, meetups and workshop all around the world since the creation of Nuxt. - 2. An active contribution on the framework but also on the different Nuxt open source projects: bug fixes, pull requests... - 3. A lovely and precious help to teach you, help you and nuxtify the world. - :: -:: - - -::community-section -#title -Join the [journey]{.text-transparent .bg-clip-text .bg-gradient-to-r .from-green-400 .to-teal-400} -#description -From user to contributor, these guides will help you get the best out of Nuxt. -#extra - ::card-list - --- - cardListClass: 'grid grid-cols-1 pt-6 gap-y-4 sm:gap-y-0 sm:grid-cols-2 border-gray-200 dark:border-gray-800 rounded-lg overflow-hidden' - --- - ::card-item{ .pl-1 .border .dark:bg-gray-900 .dark:border-gray-800 .sm:rounded-bl-none .sm:rounded-r-none .sm:rounded-br-none .sm:rounded-tl-lg } - --- - border: false - rounded: 'sm' - ringClass: 'ring-0' - gradientBorder: false - descriptionClass: 'w-full sm:w-2/3' - backgroundImageClass: 'hidden sm:block absolute bottom-0 right-0' - backgroundImage: - path: '/assets/docs/getting-started/nuxt-community/community-contribute' - width: '88' - height: '88' - format: 'png' - titleClass: 'text-base font-semibold u-text-gray-900' - --- - #title - [How to contribute?](/docs/community/contribution) - #description - Nuxt is a community project - and so we love contributions of all kinds! โค๏ธ - :: - ::card-item{ .rounded-md .dark:bg-gray-900 .border .dark:border-gray-800 .sm:rounded-l-none .sm:rounded-br-none .sm:rounded-tr-lg } - --- - border: false - ringClass: 'ring-0' - gradientBorder: false - descriptionClass: 'w-full sm:w-2/3' - backgroundImageClass: 'hidden sm:block absolute bottom-0 right-0' - backgroundImage: - path: '/assets/docs/getting-started/nuxt-community/roadmap' - width: '88' - height: '88' - format: 'png' - titleClass: 'text-base font-semibold u-text-gray-900' - --- - #title - [Discover our roadmap](/docs/community/roadmap) - #description - Nuxt is constantly evolving, with new features and modules being added all the time. - :: - ::card-item{ .pl-1 .dark:bg-gray-900 .border .dark:border-gray-800 .sm:rounded-tl-none .sm:rounded-r-none .sm:rounded-bl-lg } - --- - ringClass: 'ring-0' - border: false - rounded: 'sm' - gradientBorder: false - descriptionClass: 'w-full sm:w-2/3' - backgroundImageClass: 'hidden sm:block absolute bottom-0 right-0' - backgroundImage: - path: '/assets/docs/getting-started/nuxt-community/bugs' - width: '88' - height: '88' - format: 'png' - titleClass: 'text-base font-semibold u-text-gray-900' - --- - #title - [Reporting Bugs](/docs/community/reporting-bugs) - #description - One of the most valuable roles in open source is taking the time to report bugs helpfully. - :: - ::card-item{ .rounded-md .dark:bg-gray-900 .border .dark:border-gray-800 .sm:rounded-l-none .sm:rounded-br-lg .sm:rounded-tr-none} - --- - ringClass: 'ring-0' - border: false - gradientBorder: false - descriptionClass: 'w-full sm:w-2/3' - backgroundImageClass: 'hidden sm:block absolute bottom-0 right-0' - backgroundImage: - path: '/assets/docs/getting-started/nuxt-community/help' - width: '88' - height: '88' - format: 'png' - titleClass: 'text-base font-semibold u-text-gray-900' - --- - #title - [Getting Help](/docs/community/getting-help) - #description - We're a friendly community of developers and we'd love to help you! - :: - :: -:: diff --git a/docs/5.community/2.getting-help.md b/docs/5.community/2.getting-help.md index d8807bf37f3c..647ad30c2fcb 100644 --- a/docs/5.community/2.getting-help.md +++ b/docs/5.community/2.getting-help.md @@ -1,11 +1,9 @@ --- -navigation.icon: uil:life-ring +title: 'Getting Help' +description: "We're a friendly community of developers and we'd love to help." +navigation.icon: i-ph-lifebuoy-duotone --- -# Getting Help - -We're a friendly community of developers and we'd love to help. - At some point, you may find that there's an issue you need some help with. But don't worry! We're a friendly community of developers and we'd love to help. diff --git a/docs/5.community/3.reporting-bugs.md b/docs/5.community/3.reporting-bugs.md index 7f8337a0a938..5c984428b2ab 100644 --- a/docs/5.community/3.reporting-bugs.md +++ b/docs/5.community/3.reporting-bugs.md @@ -1,11 +1,9 @@ --- -navigation.icon: uil:bug +title: 'Reporting Bugs' +description: 'One of the most valuable roles in open source is taking the time to report bugs helpfully.' +navigation.icon: i-ph-bug-duotone --- -# Reporting Bugs - -One of the most valuable roles in open source is taking the time to report bugs helpfully. - Try as we might, we will never completely eliminate bugs. Even if you can't fix the underlying code, reporting a bug well can enable someone else with a bit more familiarity with the codebase to spot a pattern or make a quick fix. diff --git a/docs/5.community/4.contribution.md b/docs/5.community/4.contribution.md index fc6096afad9b..b16103dbe177 100644 --- a/docs/5.community/4.contribution.md +++ b/docs/5.community/4.contribution.md @@ -1,11 +1,9 @@ --- -navigation.icon: octicon:code-of-conduct-24 +title: 'Contribution' +description: 'Nuxt is a community project - and so we love contributions of all kinds! โค๏ธ' +navigation.icon: i-ph-git-pull-request-duotone --- -# Contribution - -Nuxt is a community project - and so we love contributions of all kinds! โค๏ธ - There is a range of different ways you might be able to contribute to the Nuxt ecosystem. ## Ecosystem diff --git a/docs/5.community/5.framework-contribution.md b/docs/5.community/5.framework-contribution.md index 593bb83e0c46..10315f96c14c 100644 --- a/docs/5.community/5.framework-contribution.md +++ b/docs/5.community/5.framework-contribution.md @@ -1,11 +1,10 @@ --- -navigation.icon: octicon:repo-24 -description: Some specific points about contributions to the nuxt/nuxt repository. +title: 'Framework' +navigation.icon: i-ph-github-logo-duotone +description: Some specific points about contributions to the framework repository. --- -# nuxt/nuxt - -Once you've read the [general contribution guide](/docs/community/contribution), here are some specific points to make about contributions to the `nuxt/nuxt` repository. +Once you've read the [general contribution guide](/docs/community/contribution), here are some specific points to make about contributions to the [`nuxt/nuxt`](https://github.com/nuxt/nuxt) repository. ## Monorepo Guide diff --git a/docs/5.community/6.roadmap.md b/docs/5.community/6.roadmap.md index c1c651638f5a..4701743f0552 100644 --- a/docs/5.community/6.roadmap.md +++ b/docs/5.community/6.roadmap.md @@ -1,24 +1,32 @@ --- -navigation.icon: uil:directions +title: 'Roadmap' +description: 'Nuxt is constantly evolving, with new features and modules being added all the time.' +navigation.icon: i-ph-map-trifold-duotone --- -# Roadmap +::read-more{to="/blog"} +See our blog for the latest framework and ecosystem announcements. +:: -Nuxt is constantly evolving, with new features and modules being added all the time. +## Status Reports -See [our blog](/blog) for the latest framework and ecosystem announcements. +::read-more{icon="i-simple-icons-github" color="gray" to="https://github.com/nuxt/nuxt/issues/13653" target="_blank"} +Documentation Progress +:: +::read-more{icon="i-simple-icons-github" color="gray" to="https://github.com/nuxt/nuxt/discussions/16119" target="_blank"} +Rendering Optimizations: Today and Tomorrow +:: +::read-more{icon="i-simple-icons-github" color="gray" to="https://github.com/nuxt/nuxt/discussions/16119" target="_blank"} +Nuxt Image: Performance and Status +:: -## ๐Ÿ“ Status Reports - -- [Documentation Progress](https://github.com/nuxt/nuxt/issues/13653) -- [Rendering Optimizations: Today and Tomorrow](https://github.com/nuxt/nuxt/discussions/16119) -- [Nuxt Image: Performance and Status](https://github.com/nuxt/nuxt/discussions/16119) - -## ๐Ÿ›ฃ๏ธ Roadmap +## Roadmap In roadmap below are some features we are planning or working on at the moment. -๐Ÿ’ก Check [Discussions](https://github.com/nuxt/nuxt/discussions) and [RFCs](https://github.com/nuxt/nuxt/discussions/categories/rfcs) for more upcoming features and ideas. +::callout{icon="i-ph-lightbulb-duotone" color="yellow"} +Check [Discussions](https://github.com/nuxt/nuxt/discussions) and [RFCs](https://github.com/nuxt/nuxt/discussions/categories/rfcs) for more upcoming features and ideas. +:: Milestone | Expected date | Notes | Description -------------|---------------|------------------------------------------------------------------------|----------------------- @@ -30,7 +38,7 @@ Assets | 2023 | [nuxt/nuxt#22012](https://github.com/nuxt/nuxt/di A11y | 2023 | [nuxt/nuxt#23255](https://github.com/nuxt/nuxt/issues/23255) | Accessibility hinting and utilties Translations | - | [nuxt/translations#4](https://github.com/nuxt/translations/discussions/4) ([request access](https://github.com/nuxt/nuxt/discussions/16054)) | A collaborative project for a stable translation process for Nuxt 3 docs. Currently pending for ideas and documentation tooling support (content v2 with remote sources). -## ๐Ÿ“ฆ Core Modules +## Core Modules In addition to the Nuxt framework, there are modules that are vital for the ecosystem. Their status will be updated below. @@ -40,7 +48,7 @@ Auth | Planned | 3.x | `nuxt/auth` to be announce Image | Active | 2.x and 3.x | [nuxt/image](https://github.com/nuxt/image) | Nuxt 3 support is in progress: [nuxt/image#548](https://github.com/nuxt/image/discussions/548) I18n | Active | 2.x and 3.x | [nuxt-modules/i18n](https://github.com/nuxt-modules/i18n) | See [nuxt-modules/i18n#1287](https://github.com/nuxt-modules/i18n/discussions/1287) for Nuxt 3 support -### Release Cycle +## Release Cycle Since January 2023, we've adopted a consistent release cycle for **Nuxt 3**, following [semver](https://semver.org/). We aim for major framework releases every year, with an expectation of patch releases every week or so and minor releases every month or so. They should never contain breaking changes except within options clearly marked as `experimental`. @@ -59,11 +67,11 @@ Each active version has its own nightly releases which are generated automatical Release | | Initial release | End Of Life | Docs ----------------------------------------|---------------------------------------------------------------------------------------------------|-----------------|--------------|------- **4.x** (scheduled) | | 2024 Q1 | | -<strong>3.x</strong> (stable) | <a href="https://npmjs.com/package/nuxt"><img src="https://flat.badgen.net/npm/v/nuxt?label="></a> | 2022-11-16 | TBA | [nuxt.com](https://nuxt.com/docs) -<strong>2.x</strong> (maintenance) | <a href="https://www.npmjs.com/package/nuxt?activeTab=versions"><img src="https://flat.badgen.net/npm/v/nuxt/2x?label="></a> | 2018-09-21 | 2023-12-31 | [v2.nuxt.com](https://v2.nuxt.com/docs) -<strong>1.x</strong> (unsupported) | <a href="https://www.npmjs.com/package/nuxt?activeTab=versions"><img src="https://flat.badgen.net/npm/v/nuxt/1x?label="></a> | 2018-01-08 | 2019-09-21 | +**3.x** (stable) | <a href="https://npmjs.com/package/nuxt"><img src="https://flat.badgen.net/npm/v/nuxt?label="></a> | 2022-11-16 | TBA | [nuxt.com](https://nuxt.com/docs) +**2.x** (maintenance) | <a href="https://www.npmjs.com/package/nuxt?activeTab=versions"><img src="https://flat.badgen.net/npm/v/nuxt/2x?label="></a> | 2018-09-21 | 2023-12-31 | [v2.nuxt.com](https://v2.nuxt.com/docs) +**1.x** (unsupported) | <a href="https://www.npmjs.com/package/nuxt?activeTab=versions"><img src="https://flat.badgen.net/npm/v/nuxt/1x?label="></a> | 2018-01-08 | 2019-09-21 | -##### Support Status +### Support Status Status | Description ------------|---------------------------------------------------------------------------------- diff --git a/docs/5.community/7.changelog.md b/docs/5.community/7.changelog.md index 12b8158470c9..681942bc91a1 100644 --- a/docs/5.community/7.changelog.md +++ b/docs/5.community/7.changelog.md @@ -1,12 +1,9 @@ --- -toc: false -navigation.icon: heroicons-outline:newspaper -description: Discover the latest Nuxt 3 updates. +title: 'Releases' +description: Discover the latest Nuxt 3 releases. +navigation.icon: i-ph-notification-duotone --- -# Releases - -Discover the latest Nuxt updates. - -::releases +::read-more{icon="i-simple-icons-github" color="gray" to="https://github.com/nuxt/nuxt/releases" target="_blank"} +Discover the latest Nuxt releases on GitHub :: diff --git a/docs/5.community/_contributors.yml b/docs/5.community/_contributors.yml deleted file mode 100644 index 645dba9d6508..000000000000 --- a/docs/5.community/_contributors.yml +++ /dev/null @@ -1,4 +0,0 @@ -contributors: - name: '' - link: '' - diff --git a/docs/5.community/_dir.yml b/docs/5.community/_dir.yml index e6b5157428a0..1330352c110a 100644 --- a/docs/5.community/_dir.yml +++ b/docs/5.community/_dir.yml @@ -1 +1,3 @@ +title: 'Community' +titleTemplate: '%s ยท Nuxt Community' icon: i-ph-chats-teardrop-duotone diff --git a/docs/5.community/index.md b/docs/5.community/index.md deleted file mode 100644 index 4d0f7783f39a..000000000000 --- a/docs/5.community/index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -navigation: false -title: "Community" -redirect: /community/getting-help ---- From cd2762b189fb013772d66acfff799b14f6745072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 12:11:32 +0200 Subject: [PATCH 27/62] docs: more progress --- docs/3.api/1.components/1.client-only.md | 15 ++-- .../1.components/1.nuxt-client-fallback.md | 23 +++--- docs/3.api/1.components/2.nuxt-page.md | 72 ++++++++++------- docs/3.api/1.components/3.nuxt-layout.md | 64 +++++++++------ docs/3.api/1.components/4.nuxt-link.md | 81 ++++++++++--------- docs/3.api/5.kit/1.modules.md | 1 + docs/3.api/5.kit/10.templates.md | 1 + docs/3.api/5.kit/11.nitro.md | 1 + docs/3.api/5.kit/12.resolving.md | 1 + docs/3.api/5.kit/13.logging.md | 1 + docs/3.api/5.kit/14.builder.md | 1 + docs/3.api/5.kit/2.programmatic.md | 1 + docs/3.api/5.kit/4.autoimports.md | 1 + docs/3.api/5.kit/5.components.md | 1 + docs/3.api/5.kit/6.context.md | 1 + docs/3.api/5.kit/7.pages.md | 1 + docs/3.api/5.kit/8.layout.md | 1 + docs/3.api/5.kit/9.plugins.md | 1 + 18 files changed, 158 insertions(+), 110 deletions(-) diff --git a/docs/3.api/1.components/1.client-only.md b/docs/3.api/1.components/1.client-only.md index 8c1efe587378..682a3a924688 100644 --- a/docs/3.api/1.components/1.client-only.md +++ b/docs/3.api/1.components/1.client-only.md @@ -1,14 +1,19 @@ --- -description: The <ClientOnly> component renders its slot only in client-side. +title: '<ClientOnly>' +description: Render components only in client-side with the <ClientOnly> component. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/client-only.ts + size: xs --- -# `<ClientOnly>` The `<ClientOnly>` component renders its slot only in client-side. To import a component only on the client, register the component in a client-side only plugin. ## Props -- **placeholderTag** | **fallbackTag**: specify a tag to be rendered server-side. -- **placeholder** | **fallback**: specify a content to be rendered server-side. +- `placeholderTag` | `fallbackTag`: specify a tag to be rendered server-side. +- `placeholder` | `fallback`: specify a content to be rendered server-side. ```vue <template> @@ -23,7 +28,7 @@ The `<ClientOnly>` component renders its slot only in client-side. To import a c ## Slots -- **#fallback**: specify a content to be displayed server-side. +- `#fallback`: specify a content to be displayed server-side. ```vue <template> diff --git a/docs/3.api/1.components/1.nuxt-client-fallback.md b/docs/3.api/1.components/1.nuxt-client-fallback.md index d0b5ba5cc58c..b25ed785030a 100644 --- a/docs/3.api/1.components/1.nuxt-client-fallback.md +++ b/docs/3.api/1.components/1.nuxt-client-fallback.md @@ -1,19 +1,24 @@ --- title: "<NuxtClientFallback>" description: "Nuxt provides `<NuxtClientFallback>` component to render its content on the client if any of its children trigger an error in SSR" +links: + - label: Source Code (client) + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/client-fallback.client.ts + size: xs + - label: Source Code (server) + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/client-fallback.server.ts + size: xs --- -# `<NuxtClientFallback>` - -Nuxt provides a `<NuxtClientFallback>` component to render its content on the client if any of its children trigger an error in SSR. - ::callout{to="/docs/guide/going-further/experimental-features#clientfallback"} This component is experimental and in order to use it you must enable the `experimental.clientFallback` option in your `nuxt.config`. :: ## Events -- **`@ssr-error`**: Event emitted when a child triggers an error in SSR. Note that this will only be triggered on the server. +- `@ssr-error`: Event emitted when a child triggers an error in SSR. Note that this will only be triggered on the server. ```vue <template> @@ -25,12 +30,12 @@ This component is experimental and in order to use it you must enable the `exper ## Props -- **placeholderTag** | **fallbackTag**: Specify a fallback tag to be rendered if the slot fails to render. +- `placeholderTag` | `fallbackTag`: Specify a fallback tag to be rendered if the slot fails to render. - **type**: `string` - **default**: `div` -- **placeholder** | **fallback**: Specify fallback content to be rendered if the slot fails to render. +- `placeholder` | `fallback`: Specify fallback content to be rendered if the slot fails to render. - **type**: `string` -- **keepFallback**: Keep the fallback content if it failed to render server-side. +- `keepFallback`: Keep the fallback content if it failed to render server-side. - **type**: `boolean` - **default**: `false` @@ -45,7 +50,7 @@ This component is experimental and in order to use it you must enable the `exper ## Slots -- **#fallback**: specify content to be displayed server-side if the slot fails to render. +- `#fallback`: specify content to be displayed server-side if the slot fails to render. ```vue <template> diff --git a/docs/3.api/1.components/2.nuxt-page.md b/docs/3.api/1.components/2.nuxt-page.md index 9d050c5c8696..f6d9ca93eaab 100644 --- a/docs/3.api/1.components/2.nuxt-page.md +++ b/docs/3.api/1.components/2.nuxt-page.md @@ -1,48 +1,56 @@ --- title: "<NuxtPage>" -description: The NuxtPage component is required to display pages located in the pages/ directory. +description: The <NuxtPage> component is required to display pages located in the pages/ directory. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/pages/runtime/page.ts + size: xs --- -# `<NuxtPage>` +`<NuxtPage>` is a built-in component that comes with Nuxt. It lets you display top-level or nested pages located in the [`pages/`](/docs/guide/directory-structure/pages) directory. -`<NuxtPage>` is a built-in component that comes with Nuxt. `NuxtPage` is required to display top-level or nested pages located in the [`pages/` directory](/docs/guide/directory-structure/pages). - -`NuxtPage` is a wrapper around [`<RouterView>`](https://router.vuejs.org/api/interfaces/RouterViewProps.html#interface-routerviewprops) component from Vue Router. `NuxtPage` component accepts same `name` and `route` props. - -- **name:** type: `string` - -`name` helps `RouterView` render the component with the corresponding name in the matched route record's components option. - -- **route:** type: `RouteLocationNormalized` - -`route` is a route location that has all of its components resolved. - -> **Nuxt automatically resolves the `name` and `route` by scanning and rendering all Vue component files found in the `/pages` directory.** +::callout +`<NuxtPage>` is a wrapper around [`<RouterView>`](https://router.vuejs.org/api/interfaces/RouterViewProps.html#interface-routerviewprops) component from Vue Router. :br +It accepts same `name` and `route` props. +:: -Apart from the `name` and `route`, `NuxtPage` component also accepts `pageKey` props. +## Props -- **pageKey:** type: `string` or `function` +- `name`: tells `RouterView` to render the component with the corresponding name in the matched route record's components option. + - type: `string` +- `route`: route location that has all of its components resolved. + - type: `RouteLocationNormalized` +- `pageKey:` control when the `NuxtPage` component is re-rendered. + - type: `string` or `function` -`pageKey` helps control when the `NuxtPage` component is re-rendered. +::callout +Nuxt automatically resolves the `name` and `route` by scanning and rendering all Vue component files found in the `/pages` directory. +:: ## Example For example, passing `static` key, `NuxtPage` component is rendered only once when it is mounted. -```html -<!-- static key --> -<NuxtPage page-key="static" /> +```vue [app.vue] +<template> + <NuxtPage page-key="static" /> +</template> ``` -You can also use a dynamic key based on the current route. (Don't use `$route` object here as it can cause problems with how `<NuxtPage>` renders pages with `<Suspense>`.) +You can also use a dynamic key based on the current route: ```html <NuxtPage :page-key="route => route.fullPath" /> ``` -Alternatively, `pageKey` can be passed as a `key` value via `definePageMeta` from the `<script>` section of your Vue component in the `/pages` directory. +::callout{color="amber" icon="i-ph-warning-duotone"} +Don't use `$route` object here as it can cause problems with how `<NuxtPage>` renders pages with `<Suspense>`. +:: + +Alternatively, `pageKey` can be passed as a `key` value via [`definePageMeta`](/docs/api/utils/define-page-meta) from the `<script>` section of your Vue component in the `/pages` directory. -```js +```vue [pages/my-page.vue] <script setup lang="ts"> definePageMeta({ key: route => route.fullPath @@ -50,15 +58,16 @@ definePageMeta({ </script> ``` -:button-link[Open on StackBlitz]{href="https://stackblitz.com/github/nuxt/examples/tree/main/routing/pages?file=app.vue" blank} +:link-example{to="/docs/examples/routing/pages"} -## Accessing a page's component ref +## Page's Ref -To get the ref of a page component, access it through `ref.value.pageRef` +To get the `ref` of a page component, access it through `ref.value.pageRef` -````html +````vue [app.vue] <script setup lang="ts"> const page = ref() + function logFoo () { page.value.pageRef.foo() } @@ -71,7 +80,9 @@ function logFoo () { ## Custom Props -In addition, `NuxtPage` also accepts custom props that you may need to pass further down the hierarchy. These custom props are accessible via `attrs` in the Nuxt app. +In addition, `<NuxtPage>` also accepts custom props that you may need to pass further down the hierarchy. + +These custom props are accessible via `attrs` in the Nuxt app. ```html <NuxtPage :foobar="123" /> @@ -79,5 +90,4 @@ In addition, `NuxtPage` also accepts custom props that you may need to pass furt For example, in the above example, the value of `foobar` will be available using `$attrs.foobar` in the template or `useAttrs().foobar` in `<script setup>`. -::ReadMore{link="/docs/guide/directory-structure/app"} -:: +:read-more{to="/docs/guide/directory-structure/pages"} diff --git a/docs/3.api/1.components/3.nuxt-layout.md b/docs/3.api/1.components/3.nuxt-layout.md index 2ec82b88d3f5..495026c3b23d 100644 --- a/docs/3.api/1.components/3.nuxt-layout.md +++ b/docs/3.api/1.components/3.nuxt-layout.md @@ -1,12 +1,16 @@ --- title: "<NuxtLayout>" +description: "Nuxt provides the <NuxtLayout> component to show layouts on pages and error pages." +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-layout.ts + size: xs --- -# `<NuxtLayout>` +You can use `<NuxtLayout />` component to activate the `default` layout on `app.vue` or `error.vue`. -You can use `<NuxtLayout />` component to activate `default` layout on `app.vue` or `error.vue`. - -```vue [/app.vue] +```vue [app.vue] <template> <NuxtLayout> some page content @@ -14,13 +18,13 @@ You can use `<NuxtLayout />` component to activate `default` layout on `app.vue` </template> ``` -`<NuxtLayout />` can be used to override `default` layout on `app.vue`, `error.vue` or even page components found in the `/pages` directory. - -## `name` prop +:read-more{to="/docs/guide/directory-structure/layouts"} -`<NuxtLayout />` component accepts the `name` prop, which you can pass to use a non-default layout, where `name` can be a static string, reactive reference or a computed property. It **must** match the name of the corresponding layout file in the `/layouts` directory. +## Props -### Examples +- `name`: Specify a layout name to be rendered, can be a string, reactive reference or a computed property. It **must** match the name of the corresponding layout file in the [`layouts/`](/docs/guide/directory-structure/layouts) directory. + - **type**: `string` + - **default**: `default` ```vue [pages/index.vue] <script setup lang="ts"> @@ -35,11 +39,11 @@ const layout = 'custom' </template> ``` -::alert{icon=๐Ÿ‘‰} +::callout Please note the layout name is normalized to kebab-case, so if your layout file is named `errorLayout.vue`, it will become `error-layout` when passed as a `name` property to `<NuxtLayout />`. :: -```vue [/error.vue] +```vue [error.vue] <template> <NuxtLayout name="error-layout"> <NuxtPage /> @@ -47,27 +51,35 @@ Please note the layout name is normalized to kebab-case, so if your layout file </template> ``` -## Passing Additional Props +::read-more{to="/docs/guide/directory-structure/layouts"} +Read more about dynamic layouts. +:: + +## Additional Props `NuxtLayout` also accepts any additional props that you may need to pass to the layout. These custom props are then made accessible as attributes. -```vue[pages/some-page.vue] -<div> - <NuxtLayout name="custom" title="I am a custom layout"> - </NuxtLayout> -</div> +```vue [pages/some-page.vue] +<template> + <div> + <NuxtLayout name="custom" title="I am a custom layout"> + <-- ... --> + </NuxtLayout> + </div> +</template> ``` In the above example, the value of `title` will be available using `$attrs.title` in the template or `useAttrs().title` in `<script setup>` at custom.vue. -```vue[layouts/custom.vue] +```vue [layouts/custom.vue] <script setup lang="ts"> - const layoutCustomProps = useAttrs() - console.log(layoutCustomProps.title) // I am a custom layout +const layoutCustomProps = useAttrs() + +console.log(layoutCustomProps.title) // I am a custom layout </script> ``` -## Layout and Transition +## Transitions `<NuxtLayout />` renders incoming content via `<slot />`, which is then wrapped around Vueโ€™s `<Transition />` component to activate layout transition. For this to work as expected, it is recommended that `<NuxtLayout />` is **not** the root element of the page component. @@ -81,13 +93,16 @@ In the above example, the value of `title` will be available using `$attrs.title </template> ``` -## Accessing a layout's component ref +:read-more{to="/docs/getting-started/transitions"} + +## Layout's Ref To get the ref of a layout component, access it through `ref.value.layoutRef` -````html +````vue [app.vue] <script setup lang="ts"> const layout = ref() + function logFoo () { layout.value.layoutRef.foo() } @@ -98,5 +113,4 @@ function logFoo () { </template> ```` -::ReadMore{link="/docs/guide/directory-structure/layouts"} -:: +:read-more{to="/docs/guide/directory-structure/layouts"} diff --git a/docs/3.api/1.components/4.nuxt-link.md b/docs/3.api/1.components/4.nuxt-link.md index af98ffcd7180..01619fdf1103 100644 --- a/docs/3.api/1.components/4.nuxt-link.md +++ b/docs/3.api/1.components/4.nuxt-link.md @@ -1,43 +1,44 @@ --- title: "<NuxtLink>" description: "Nuxt provides <NuxtLink> component to handle any kind of links within your application." +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-link.ts + size: xs --- -# `<NuxtLink>` - -Nuxt provides `<NuxtLink>` component to handle any kind of links within your application. - +::callout `<NuxtLink>` is a drop-in replacement for both Vue Router's `<RouterLink>` component and HTML's `<a>` tag. It intelligently determines whether the link is _internal_ or _external_ and renders it accordingly with available optimizations (prefetching, default attributes, etc.) +:: -## Examples - -### Basic Usage +## Internal Routing -In this example, we use `<NuxtLink>` component to link to a website. +In this example, we use `<NuxtLink>` component to link to another page of the application. -```vue [app.vue] +```vue [pages/index.vue] <template> - <NuxtLink to="https://nuxtjs.org"> - Nuxt website + <NuxtLink to="/about"> + About page </NuxtLink> - <!-- <a href="https://nuxtjs.org" rel="noopener noreferrer">...</a> --> + <!-- <a href="/about">...</a> (+Vue Router & prefetching) --> </template> ``` -### Internal Routing +## External Routing -In this example, we use `<NuxtLink>` component to link to another page of the application. +In this example, we use `<NuxtLink>` component to link to a website. -```vue [pages/index.vue] +```vue [app.vue] <template> - <NuxtLink to="/about"> - About page + <NuxtLink to="https://nuxtjs.org"> + Nuxt website </NuxtLink> - <!-- <a href="/about">...</a> (+Vue Router & prefetching) --> + <!-- <a href="https://nuxtjs.org" rel="noopener noreferrer">...</a> --> </template> ``` -### `target` and `rel` Attributes +## `target` and `rel` Attributes In this example, we use `<NuxtLink>` with `target`, `rel`, and `noRel` props. @@ -67,21 +68,21 @@ In this example, we use `<NuxtLink>` with `target`, `rel`, and `noRel` props. ## Props -- **to**: Any URL or a [route location object](https://router.vuejs.org/api/interfaces/RouteLocation.html) from Vue Router -- **href**: An alias for `to`. If used with `to`, `href` will be ignored -- **target**: A `target` attribute value to apply on the link -- **rel**: A `rel` attribute value to apply on the link. Defaults to `"noopener noreferrer"` for external links. -- **noRel**: If set to `true`, no `rel` attribute will be added to the link -- **activeClass**: A class to apply on active links. Works the same as [Vue Router's `active-class` prop](https://router.vuejs.org/api/interfaces/RouterLinkProps.html#Properties-activeClass) on internal links. Defaults to Vue Router's default (`"router-link-active"`) -- **exactActiveClass**: A class to apply on exact active links. Works the same as [Vue Router's `exact-active-class` prop](https://router.vuejs.org/api/interfaces/RouterLinkProps.html#Properties-exactActiveClass) on internal links. Defaults to Vue Router's default `"router-link-exact-active"`) -- **replace**: Works the same as [Vue Router's `replace` prop](https://router.vuejs.org/api/interfaces/RouteLocationOptions.html#Properties-replace) on internal links -- **ariaCurrentValue**: An `aria-current` attribute value to apply on exact active links. Works the same as [Vue Router's `aria-current-value` prop](https://router.vuejs.org/api/interfaces/RouterLinkProps.html#Properties-ariaCurrentValue) on internal links -- **external**: Forces the link to be considered as external (`true`) or internal (`false`). This is helpful to handle edge-cases -- **prefetch** and **noPrefetch**: Whether to enable prefetching assets for links that enter the view port. -- **prefetchedClass**: A class to apply to links that have been prefetched. -- **custom**: Whether `<NuxtLink>` should wrap its content in an `<a>` element. It allows taking full control of how a link is rendered and how navigation works when it is clicked. Works the same as [Vue Router's `custom` prop](https://router.vuejs.org/api/interfaces/RouterLinkProps.html#Properties-custom) - -::alert{icon=๐Ÿ‘‰} +- `to`: Any URL or a [route location object](https://router.vuejs.org/api/interfaces/RouteLocation.html) from Vue Router +- `href`: An alias for `to`. If used with `to`, `href` will be ignored +- `target`: A `target` attribute value to apply on the link +- `rel`: A `rel` attribute value to apply on the link. Defaults to `"noopener noreferrer"` for external links. +- `noRel`: If set to `true`, no `rel` attribute will be added to the link +- `activeClass`: A class to apply on active links. Works the same as [Vue Router's `active-class` prop](https://router.vuejs.org/api/interfaces/RouterLinkProps.html#Properties-activeClass) on internal links. Defaults to Vue Router's default (`"router-link-active"`) +- `exactActiveClass`: A class to apply on exact active links. Works the same as [Vue Router's `exact-active-class` prop](https://router.vuejs.org/api/interfaces/RouterLinkProps.html#Properties-exactActiveClass) on internal links. Defaults to Vue Router's default `"router-link-exact-active"`) +- `replace`: Works the same as [Vue Router's `replace` prop](https://router.vuejs.org/api/interfaces/RouteLocationOptions.html#Properties-replace) on internal links +- `ariaCurrentValue`: An `aria-current` attribute value to apply on exact active links. Works the same as [Vue Router's `aria-current-value` prop](https://router.vuejs.org/api/interfaces/RouterLinkProps.html#Properties-ariaCurrentValue) on internal links +- `external`: Forces the link to be considered as external (`true`) or internal (`false`). This is helpful to handle edge-cases +- `prefetch` and **noPrefetch**: Whether to enable prefetching assets for links that enter the view port. +- `prefetchedClass`: A class to apply to links that have been prefetched. +- `custom`: Whether `<NuxtLink>` should wrap its content in an `<a>` element. It allows taking full control of how a link is rendered and how navigation works when it is clicked. Works the same as [Vue Router's `custom` prop](https://router.vuejs.org/api/interfaces/RouterLinkProps.html#Properties-custom) + +::callout Defaults can be overwritten, see [overwriting defaults](#overwriting-defaults) if you want to change them. :: @@ -111,11 +112,11 @@ defineNuxtLink({ }) => Component ``` -- **componentName**: A name for the defined `<NuxtLink>` component. -- **externalRelAttribute**: A default `rel` attribute value applied on external links. Defaults to `"noopener noreferrer"`. Set it to `""` to disable -- **activeClass**: A default class to apply on active links. Works the same as [Vue Router's `linkActiveClass` option](https://router.vuejs.org/api/interfaces/RouterOptions.html#Properties-linkActiveClass). Defaults to Vue Router's default (`"router-link-active"`) -- **exactActiveClass**: A default class to apply on exact active links. Works the same as [Vue Router's `linkExactActiveClass` option](https://router.vuejs.org/api/interfaces/RouterOptions.html#Properties-linkExactActiveClass). Defaults to Vue Router's default (`"router-link-exact-active"`) -- **prefetchedClass**: A default class to apply to links that have been prefetched. -- **trailingSlash**: An option to either add or remove trailing slashes in the `href`. If unset or not matching the valid values `append` or `remove`, it will be ignored. +- `componentName`: A name for the defined `<NuxtLink>` component. +- `externalRelAttribute`: A default `rel` attribute value applied on external links. Defaults to `"noopener noreferrer"`. Set it to `""` to disable +- `activeClass`: A default class to apply on active links. Works the same as [Vue Router's `linkActiveClass` option](https://router.vuejs.org/api/interfaces/RouterOptions.html#Properties-linkActiveClass). Defaults to Vue Router's default (`"router-link-active"`) +- `exactActiveClass`: A default class to apply on exact active links. Works the same as [Vue Router's `linkExactActiveClass` option](https://router.vuejs.org/api/interfaces/RouterOptions.html#Properties-linkExactActiveClass). Defaults to Vue Router's default (`"router-link-exact-active"`) +- `prefetchedClass`: A default class to apply to links that have been prefetched. +- `trailingSlash`: An option to either add or remove trailing slashes in the `href`. If unset or not matching the valid values `append` or `remove`, it will be ignored. :link-example{to="/docs/examples/routing/pages"} diff --git a/docs/3.api/5.kit/1.modules.md b/docs/3.api/5.kit/1.modules.md index b4960e711f5c..91c5e7525332 100644 --- a/docs/3.api/5.kit/1.modules.md +++ b/docs/3.api/5.kit/1.modules.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/module + size: xs --- Modules are the building blocks of Nuxt. Kit provides a set of utilities to help you create and use modules. You can use these utilities to create your own modules or to reuse existing modules. For example, you can use the `defineNuxtModule` function to define a module and the `installModule` function to install a module programmatically. diff --git a/docs/3.api/5.kit/10.templates.md b/docs/3.api/5.kit/10.templates.md index c919ee5034ed..aecee202596a 100644 --- a/docs/3.api/5.kit/10.templates.md +++ b/docs/3.api/5.kit/10.templates.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/template.ts + size: xs --- Templates allows to generate extra files during development and build time. These files will be available in virtual filesystem and can be used in plugins, layouts, components, etc. `addTemplate` and `addTypeTemplate` allow you to add templates to the Nuxt application. `updateTemplates` allows you to regenerate templates that match the filter. diff --git a/docs/3.api/5.kit/11.nitro.md b/docs/3.api/5.kit/11.nitro.md index 28ebf66287aa..9ea274ef00a7 100644 --- a/docs/3.api/5.kit/11.nitro.md +++ b/docs/3.api/5.kit/11.nitro.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/nitro.ts + size: xs --- Nitro is an open source TypeScript framework to build ultra-fast web servers. Nuxt 3 (and, optionally, Nuxt Bridge) uses Nitro as its server engine. You can use `useNitro` to access the Nitro instance, `addServerHandler` to add a server handler, `addDevServerHandler` to add a server handler to be used only in development mode, `addServerPlugin` to add a plugin to extend Nitro's runtime behavior, and `addPrerenderRoutes` to add routes to be prerendered by Nitro. diff --git a/docs/3.api/5.kit/12.resolving.md b/docs/3.api/5.kit/12.resolving.md index 4d9fc5f76260..4c7bfe84ba98 100644 --- a/docs/3.api/5.kit/12.resolving.md +++ b/docs/3.api/5.kit/12.resolving.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/resolve.ts + size: xs --- Sometimes you need to resolve a paths: relative to the current module, with unknown name or extension. For example, you may want to add a plugin that is located in the same directory as the module. To handle this cases, nuxt provides a set of utilities to resolve paths. `resolvePath` and `resolveAlias` are used to resolve paths relative to the current module. `findPath` is used to find first existing file in given paths. `createResolver` is used to create resolver relative to base path. diff --git a/docs/3.api/5.kit/13.logging.md b/docs/3.api/5.kit/13.logging.md index de61038f7524..f63d507388cd 100644 --- a/docs/3.api/5.kit/13.logging.md +++ b/docs/3.api/5.kit/13.logging.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/logger.ts + size: xs --- Nuxt provides a logger instance that you can use to log messages with extra features. `useLogger` allows you to get a logger instance. diff --git a/docs/3.api/5.kit/14.builder.md b/docs/3.api/5.kit/14.builder.md index d29c56da1f68..fe0f4da56b0c 100644 --- a/docs/3.api/5.kit/14.builder.md +++ b/docs/3.api/5.kit/14.builder.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/build.ts + size: xs --- Nuxt have builders based on [webpack](https://github.com/nuxt/nuxt/tree/main/packages/webpack) and [vite](https://github.com/nuxt/nuxt/tree/main/packages/vite). You can extend the config passed to each one using `extendWebpackConfig` and `extendViteConfig` functions. You can also add additional plugins via `addVitePlugin`, `addWebpackPlugin` and `addBuildPlugin`. diff --git a/docs/3.api/5.kit/2.programmatic.md b/docs/3.api/5.kit/2.programmatic.md index 01d4f457c698..78390b5546e4 100644 --- a/docs/3.api/5.kit/2.programmatic.md +++ b/docs/3.api/5.kit/2.programmatic.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/loader + size: xs --- Programmatic usage can be helpful when you want to use Nuxt programmatically, for example, when building a [CLI tool](https://github.com/nuxt/cli) or [test utils](https://github.com/nuxt/nuxt/tree/main/packages/test-utils). diff --git a/docs/3.api/5.kit/4.autoimports.md b/docs/3.api/5.kit/4.autoimports.md index 8aaee9082ff6..cb8c6822a842 100644 --- a/docs/3.api/5.kit/4.autoimports.md +++ b/docs/3.api/5.kit/4.autoimports.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/imports.ts + size: xs --- # Auto-imports diff --git a/docs/3.api/5.kit/5.components.md b/docs/3.api/5.kit/5.components.md index 4b7ba38c6be4..293d0015d8e6 100644 --- a/docs/3.api/5.kit/5.components.md +++ b/docs/3.api/5.kit/5.components.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/components.ts + size: xs --- Components are the building blocks of your Nuxt application. They are reusable Vue instances that can be used to create a user interface. In Nuxt, components from the components directory are automatically imported by default. However, if you need to import components from an alternative directory or wish to selectively import them as needed, `@nuxt/kit` provides the `addComponentsDir` and `addComponent` methods. These utils allow you to customize the component configuration to better suit your needs. diff --git a/docs/3.api/5.kit/6.context.md b/docs/3.api/5.kit/6.context.md index 67deff595d80..ae302d23e8d3 100644 --- a/docs/3.api/5.kit/6.context.md +++ b/docs/3.api/5.kit/6.context.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/context.ts + size: xs --- Nuxt modules allow you to enhance Nuxt's capabilities. They offer a structured way to keep your code organized and modular. If you're looking to break down your module into smaller components, Nuxt offers the `useNuxt` and `tryUseNuxt` functions. These functions enable you to conveniently access the Nuxt instance from the context without having to pass it as argument. diff --git a/docs/3.api/5.kit/7.pages.md b/docs/3.api/5.kit/7.pages.md index 4434154f5bca..3fdcc1e83a14 100644 --- a/docs/3.api/5.kit/7.pages.md +++ b/docs/3.api/5.kit/7.pages.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/pages.ts + size: xs --- ## `extendPages` diff --git a/docs/3.api/5.kit/8.layout.md b/docs/3.api/5.kit/8.layout.md index 44dd95da813d..cf2f5fc7c256 100644 --- a/docs/3.api/5.kit/8.layout.md +++ b/docs/3.api/5.kit/8.layout.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/layout.ts + size: xs --- Layouts is used to be a wrapper around your pages. It can be used to wrap your pages with common components, for example, a header and a footer. Layouts can be registered using `addLayout` utility. diff --git a/docs/3.api/5.kit/9.plugins.md b/docs/3.api/5.kit/9.plugins.md index 665c5c9de9a7..320bc59cbd2f 100644 --- a/docs/3.api/5.kit/9.plugins.md +++ b/docs/3.api/5.kit/9.plugins.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/plugin.ts + size: xs --- Plugins are self-contained code that usually add app-level functionality to Vue. In Nuxt, plugins are automatically imported from the `plugins` directory. However, if you need to ship a plugin with your module, Nuxt Kit provides the `addPlugin` and `addPluginTemplate` methods. These utils allow you to customize the plugin configuration to better suit your needs. From e432aae09399e0c9610c0498b5a300046ee8c82c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 13:54:56 +0200 Subject: [PATCH 28/62] docs: update changelog --- docs/5.community/7.changelog.md | 69 +++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/docs/5.community/7.changelog.md b/docs/5.community/7.changelog.md index 681942bc91a1..ec5eda02ed33 100644 --- a/docs/5.community/7.changelog.md +++ b/docs/5.community/7.changelog.md @@ -1,9 +1,72 @@ --- title: 'Releases' -description: Discover the latest Nuxt 3 releases. +description: Discover the latest releases of Nuxt & Nuxt official modules. navigation.icon: i-ph-notification-duotone --- -::read-more{icon="i-simple-icons-github" color="gray" to="https://github.com/nuxt/nuxt/releases" target="_blank"} -Discover the latest Nuxt releases on GitHub +::card-group + ::card + --- + icon: i-simple-icons-github + title: nuxt/nuxt + to: https://github.com/nuxt/nuxt/releases + target: _blank + ui.icon.base: text-black dark:text-white + --- + Nuxt framework releases. + :: + ::card + --- + icon: i-simple-icons-github + title: nuxt/cli + to: https://github.com/nuxt/cli/releases + target: _blank + ui.icon.base: text-black dark:text-white + --- + Nuxt CLI (`nuxi`) releases. + :: + ::card + --- + icon: i-simple-icons-github + title: nuxt/content + to: https://github.com/nuxt/content/releases + target: _blank + ui.icon.base: text-black dark:text-white + --- + Nuxt Content releases. + :: + ::card + --- + icon: i-simple-icons-github + title: nuxt/devtools + to: https://github.com/nuxt/devtools/releases + target: _blank + ui.icon.base: text-black dark:text-white + --- + Nuxt Devtools releases. + :: + ::card + --- + icon: i-simple-icons-github + title: nuxt/image + to: https://github.com/nuxt/image/releases + target: _blank + ui.icon.base: text-black dark:text-white + --- + Nuxt Image releases. + :: + ::card + --- + icon: i-simple-icons-github + title: nuxt/ui + to: https://github.com/nuxt/ui/releases + target: _blank + ui.icon.base: text-black dark:text-white + --- + Nuxt UI releases. + :: +:: + +::read-more{icon="i-simple-icons-github" color="gray" to="https://github.com/nuxt" target="_blank"} +Discover the `nuxt` organization on GitHub :: From 1ac87fd88426f5cb56e1c479168c1ce6342075e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 15:25:47 +0200 Subject: [PATCH 29/62] docs: lint --- .markdownlint.yml | 3 + .markdownlintignore | 3 + docs/1.getting-started/12.upgrade.md | 1 - docs/1.getting-started/8.error-handling.md | 32 ++-- .../2.directory-structure/1.layouts.md | 2 +- .../2.guide/2.directory-structure/1.public.md | 1 - .../2.directory-structure/3.tsconfig.md | 2 +- .../1.experimental-features.md | 1 - .../3.going-further/10.runtime-config.md | 4 +- docs/3.api/2.composables/use-router.md | 2 - docs/3.api/3.utils/on-before-route-update.md | 1 - docs/5.community/3.reporting-bugs.md | 20 +- docs/5.community/4.contribution.md | 24 ++- docs/5.community/5.framework-contribution.md | 175 +++++++++--------- docs/5.community/6.roadmap.md | 4 +- docs/7.migration/6.pages-and-layouts.md | 2 - docs/7.migration/7.component-options.md | 1 - docs/README.md | 4 +- 18 files changed, 140 insertions(+), 142 deletions(-) diff --git a/.markdownlint.yml b/.markdownlint.yml index c1fac0779d21..389466720200 100644 --- a/.markdownlint.yml +++ b/.markdownlint.yml @@ -14,3 +14,6 @@ MD033: false MD032: false MD046: style: fenced +MD034: false +MD031: false +MD007: false diff --git a/.markdownlintignore b/.markdownlintignore index 76059468f394..4b7de8a82a30 100644 --- a/.markdownlintignore +++ b/.markdownlintignore @@ -3,3 +3,6 @@ docs/0.index.md docs/1.getting-started/1.introduction.md docs/**/*.nuxt.config.md +docs/5.community/7.changelog.md +docs/1.getting-started/10.deployment.md +docs/2.guide/1.concepts/3.rendering.md diff --git a/docs/1.getting-started/12.upgrade.md b/docs/1.getting-started/12.upgrade.md index 2e34b3c86b38..99ddd7195c95 100644 --- a/docs/1.getting-started/12.upgrade.md +++ b/docs/1.getting-started/12.upgrade.md @@ -49,7 +49,6 @@ The migration guide provides a step-by-step comparison of Nuxt 2 features to Nux Check out the **guide to migrating from Nuxt 2 to Nuxt 3**. :: - ## Nuxt 2 to Nuxt Bridge If you prefer to progressively migrate your Nuxt 2 application to Nuxt 3, you can use Nuxt Bridge. Nuxt Bridge is a compatibility layer that allows you to use Nuxt 3 features in Nuxt 2 with an opt-in mechanism. diff --git a/docs/1.getting-started/8.error-handling.md b/docs/1.getting-started/8.error-handling.md index b1a280b25f55..c5e026f50c05 100644 --- a/docs/1.getting-started/8.error-handling.md +++ b/docs/1.getting-started/8.error-handling.md @@ -45,11 +45,11 @@ Note that the `vue:error` hook is based on [`onErrorCaptured`](https://vuejs.org Nuxt will call the `app:error` hook if there are any errors in starting your Nuxt application. This includes: -* running [Nuxt plugins](/docs/guide/directory-structure/plugins) -* processing `app:created` and `app:beforeMount` hooks -* rendering your Vue app to HTML (during SSR) -* mounting the app (on client-side), though you should handle this case with `onErrorCaptured` or with `vue:error` -* processing the `app:mounted` hook +- running [Nuxt plugins](/docs/guide/directory-structure/plugins) +- processing `app:created` and `app:beforeMount` hooks +- rendering your Vue app to HTML (during SSR) +- mounting the app (on client-side), though you should handle this case with `onErrorCaptured` or with `vue:error` +- processing the `app:mounted` hook ## Nitro Server Lifecycle @@ -68,17 +68,15 @@ When Nuxt encounters a fatal error (any unhandled error on the server, or an err :: An error may occur during the server lifecycle when: - -* processing your Nuxt plugins -* rendering your Vue app into HTML -* a server API route throws an error +- processing your Nuxt plugins +- rendering your Vue app into HTML +- a server API route throws an error It can also occur on the client side when: - -* processing your Nuxt plugins -* before mounting the application (`app:beforeMount` hook) -* mounting your app if the error was not handled with `onErrorCaptured` or `vue:error` hook -* the Vue app is initialized and mounted in browser (`app:mounted`). +- processing your Nuxt plugins +- before mounting the application (`app:beforeMount` hook) +- mounting your app if the error was not handled with `onErrorCaptured` or `vue:error` hook +- the Vue app is initialized and mounted in browser (`app:mounted`). ::read-more{to="/docs/api/advanced/hooks"} Discover all the Nuxt lifecycle hooks. @@ -133,7 +131,6 @@ throw createError({ }) ``` - For custom errors we highly recommend to use `onErrorCaptured` composable that can be called in a page/component setup function or `vue:error` runtime nuxt hook that can be configured in a nuxt plugin. ```ts [plugins/error-handler.ts] @@ -177,9 +174,8 @@ function createError (err: { cause, data, message, name, stack, statusCode, stat Create an error object with additional metadata. It is usable in both the Vue and Server portions of your app, and is meant to be thrown. If you throw an error created with `createError`: - -* on server-side, it will trigger a full-screen error page which you can clear with [`clearError`](#clearerror). -* on client-side, it will throw a non-fatal error for you to handle. If you need to trigger a full-screen error page, then you can do this by setting `fatal: true`. +- on server-side, it will trigger a full-screen error page which you can clear with [`clearError`](#clearerror). +- on client-side, it will throw a non-fatal error for you to handle. If you need to trigger a full-screen error page, then you can do this by setting `fatal: true`. ```vue [pages/movies/[slug\\].vue] <script setup lang="ts"> diff --git a/docs/2.guide/2.directory-structure/1.layouts.md b/docs/2.guide/2.directory-structure/1.layouts.md index 935f1b33865c..a80d730cd44b 100644 --- a/docs/2.guide/2.directory-structure/1.layouts.md +++ b/docs/2.guide/2.directory-structure/1.layouts.md @@ -6,7 +6,7 @@ navigation.icon: i-ph-folder-duotone --- ::callout{icon="i-ph-rocket-launch-duotone"} -For best performance, components placed in this directory will be automatically loaded via asynchronous import when used. +For best performance, components placed in this directory will be automatically loaded via asynchronous import when used. :: ## Enable Layouts diff --git a/docs/2.guide/2.directory-structure/1.public.md b/docs/2.guide/2.directory-structure/1.public.md index 29080d3370e5..01c3f12c3590 100644 --- a/docs/2.guide/2.directory-structure/1.public.md +++ b/docs/2.guide/2.directory-structure/1.public.md @@ -22,7 +22,6 @@ useSeoMeta({ </script> ``` - ::callout{to="https://v2.nuxt.com/docs/directory-structure/static" target="_blank"} This is known as the [`static/`] directory in Nuxt 2. :: diff --git a/docs/2.guide/2.directory-structure/3.tsconfig.md b/docs/2.guide/2.directory-structure/3.tsconfig.md index bea865aa35e6..edcc1a7cbce0 100644 --- a/docs/2.guide/2.directory-structure/3.tsconfig.md +++ b/docs/2.guide/2.directory-structure/3.tsconfig.md @@ -5,7 +5,7 @@ head.title: "tsconfig.json" navigation.icon: i-ph-file-duotone --- -Nuxt [automatically generates](/docs/guide/concepts/typescript) a `.nuxt/tsconfig.json` file with the resolved aliases you are using in your Nuxt project, as well as with other sensible defaults. +Nuxt [automatically generates](/docs/guide/concepts/typescript) a `.nuxt/tsconfig.json` file with the resolved aliases you are using in your Nuxt project, as well as with other sensible defaults. You can benefit from this by creating a `tsconfig.json` in the root of your project with the following content: diff --git a/docs/2.guide/3.going-further/1.experimental-features.md b/docs/2.guide/3.going-further/1.experimental-features.md index 7501fdee058a..b32fb9dedab7 100644 --- a/docs/2.guide/3.going-further/1.experimental-features.md +++ b/docs/2.guide/3.going-further/1.experimental-features.md @@ -59,7 +59,6 @@ Externalizes `vue`, `@vue/*` and `vue-router` when building. *Enabled by default.* - ```ts [nuxt.config.ts] export defineNuxtConfig({ experimental: { diff --git a/docs/2.guide/3.going-further/10.runtime-config.md b/docs/2.guide/3.going-further/10.runtime-config.md index c828658a06df..abf141b4301e 100644 --- a/docs/2.guide/3.going-further/10.runtime-config.md +++ b/docs/2.guide/3.going-further/10.runtime-config.md @@ -48,8 +48,7 @@ Nuxi CLI has built-in support for reading your `.env` file in development, build :read-more{to="/docs/guide/directory-structure/env"} :: - -Runtime config values are **automatically replaced by matching environment variables at runtime**. +Runtime config values are **automatically replaced by matching environment variables at runtime**. There are two key requirements: @@ -89,7 +88,6 @@ The behavior is different between the client-side and server-side: - On server-side, the entire runtime config is available on the server-side, but it is read-only to avoid context sharing. :: - ```vue [pages/index.vue] <script setup lang="ts"> const config = useRuntimeConfig() diff --git a/docs/3.api/2.composables/use-router.md b/docs/3.api/2.composables/use-router.md index 1c4c17471b5c..dd16ff4c69ca 100644 --- a/docs/3.api/2.composables/use-router.md +++ b/docs/3.api/2.composables/use-router.md @@ -9,7 +9,6 @@ const router = useRouter() </script> ``` - If you only need the router instance within your template, use `$router`: ```vue [pages/index.vue] @@ -54,7 +53,6 @@ router.resolve({ name: 'home' }) - [`push()`](https://router.vuejs.org/api/interfaces/Router.html#push): Programmatically navigate to a new URL by pushing an entry in the history stack. **It is recommended to use [`navigateTo`](/docs/api/utils/navigate-to) instead.** - [`replace()`](https://router.vuejs.org/api/interfaces/Router.html#replace): Programmatically navigate to a new URL by replacing the current entry in the routes history stack. **It is recommended to use [`navigateTo`](/docs/api/utils/navigate-to) instead.** - ```ts [Example] const router = useRouter() diff --git a/docs/3.api/3.utils/on-before-route-update.md b/docs/3.api/3.utils/on-before-route-update.md index 43db40bf8ccb..5c56fcddaa21 100644 --- a/docs/3.api/3.utils/on-before-route-update.md +++ b/docs/3.api/3.utils/on-before-route-update.md @@ -4,4 +4,3 @@ description: The onBeforeRouteUpdate composable allows registering a route guard --- :read-more{icon="i-simple-icons-vuedotjs" to="https://router.vuejs.org/api/#onBeforeRouteUpdate" title="Vue Router Docs" target="_blank"} - diff --git a/docs/5.community/3.reporting-bugs.md b/docs/5.community/3.reporting-bugs.md index 5c984428b2ab..b895671f5486 100644 --- a/docs/5.community/3.reporting-bugs.md +++ b/docs/5.community/3.reporting-bugs.md @@ -24,24 +24,30 @@ It's important to be able to reproduce the bug reliably - in a minimal way and a Start with the Nuxt 3 or Nuxt Bridge sandbox and add the **minimum** amount of code necessary to reproduce the bug you're experiencing. -::alert +::callout If your issue concerns Vue 3 or Vite, please try to reproduce it first with the Vue 3 SSR starter. :: **Nuxt 3**: -:button-link[Nuxt 3 on StackBlitz]{href="https://stackblitz.com/github/nuxt/starter/tree/v3-stackblitz" blank .mr-2} -:button-link[Nuxt 3 on CodeSandbox]{href="https://codesandbox.io/s/github/nuxt/starter/v3-codesandbox" blank} +::card-group + :card{title="Nuxt 3 on StackBlitz" icon="i-simple-icons-stackblitz" to="https://nuxt.new/s/v3" target="_blank"} + :card{title="Nuxt 3 on CodeSandbox" icon="i-simple-icons-codesandbox" to="https://nuxt.new/c/v3" target="_blank"} +:: **Nuxt Bridge**: -:button-link[Nuxt Bridge on CodeSandbox]{href="https://codesandbox.io/s/github/nuxt/starter/v2-bridge-codesandbox" blank} +::card-group + :card{title="Nuxt Bridge on CodeSandbox" icon="i-simple-icons-codesandbox" to="https://codesandbox.io/s/github/nuxt/starter/v2-bridge-codesandbo" target="_blank"} +:: **Vue 3**: -:button-link[Vue 3 SSR on StackBlitz]{href="https://stackblitz.com/github/nuxt-contrib/vue3-ssr-starter/tree/main?terminal=dev" blank .mr-2} -:button-link[Vue 3 SSR on CodeSandbox]{href="https://codesandbox.io/s/github/nuxt-contrib/vue3-ssr-starter/main" blank .mr-2} -:button-link[Vue 3 SSR Template]{href="https://github.com/nuxt-contrib/vue3-ssr-starter/generate" blank} +::card-group + :card{title="Vue 3 SSR on StackBlitz" icon="i-simple-icons-stackblitz" to="https://stackblitz.com/github/nuxt-contrib/vue3-ssr-starter/tree/main?terminal=dev" target="_blank"} + :card{title="Vue 3 SSR on CodeSandbox" icon="i-simple-icons-codesandbox" to="https://codesandbox.io/s/github/nuxt-contrib/vue3-ssr-starter/main" target="_blank"} + :card{title="Vue 3 SSR Template on GitHub" icon="i-simple-icons-github" to="https://github.com/nuxt-contrib/vue3-ssr-starter/generate" target="_blank"} +:: Once you've reproduced the issue, remove as much code from your reproduction as you can (while still recreating the bug). The time spent making the reproduction as minimal as possible will make a huge difference to whoever sets out to fix the issue. diff --git a/docs/5.community/4.contribution.md b/docs/5.community/4.contribution.md index b16103dbe177..629f0037ca98 100644 --- a/docs/5.community/4.contribution.md +++ b/docs/5.community/4.contribution.md @@ -8,7 +8,7 @@ There is a range of different ways you might be able to contribute to the Nuxt e ## Ecosystem -The Nuxt ecosystem includes many different projects and organizations. For example: +The Nuxt ecosystem includes many different projects and organizations: * [nuxt/](https://github.com/nuxt) - core repositories for the Nuxt framework itself. [**nuxt/nuxt**](https://github.com/nuxt/nuxt) contains the Nuxt framework (both versions 2 and 3). * [nuxt-modules/](https://github.com/nuxt-modules) - community-contributed and maintained modules and libraries. There is a [process to migrate a module](/docs/guide/going-further/modules/#joining-nuxt-modules-and-nuxtjs) to `nuxt-modules`. While these modules have individual maintainers, they are not dependent on a single person. @@ -174,7 +174,7 @@ corepack enable You only need to do this one time, after Node.js is installed on your computer. -## Writing Documentation +## Documentation Style Guide Documentation is an essential part of Nuxt. We aim to be an intuitive framework - and a big part of that is making sure that both the developer experience and the docs are perfect across the ecosystem. ๐Ÿ‘Œ @@ -184,20 +184,24 @@ Here are some tips that may help improve your documentation: Keep in mind your readers can have different backgrounds and experiences. Therefore, these words don't convey meaning and can be harmful. - ::alert{icon=โŒ} - **Avoid:** "Simply make sure the function returns a promise." + ::callout{color="red" icon="i-ph-x-circle-duotone"} + Simply make sure the function returns a promise. :: - ::alert{icon=โœ…} - **Prefer:** "Make sure the function returns a [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)." + ::callout{color="green" icon="i-ph-check-circle-duotone"} + Make sure the function returns a [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). :: * Prefer [active voice](https://developers.google.com/tech-writing/one/active-voice). - ::alert{icon=โŒ} - **Avoid:** "An error will be thrown by Nuxt." + ::callout{color="red" icon="i-ph-x-circle-duotone"} + An error will be thrown by Nuxt. :: - ::alert{icon=โœ…} - **Prefer:** "Nuxt will throw an error." + ::callout{color="green" icon="i-ph-check-circle-duotone"} + Nuxt will throw an error. :: + +::read-more{to="/docs/community/framework-contribution#documentation-guide"} +Learn how to contribute to the documentation. +:: diff --git a/docs/5.community/5.framework-contribution.md b/docs/5.community/5.framework-contribution.md index 10315f96c14c..ab40d80902a9 100644 --- a/docs/5.community/5.framework-contribution.md +++ b/docs/5.community/5.framework-contribution.md @@ -8,71 +8,88 @@ Once you've read the [general contribution guide](/docs/community/contribution), ## Monorepo Guide -### `packages/kit` +- `packages/kit`: Toolkit for authoring Nuxt Modules, published as [`@nuxt/kit`](https://npmjs.com/package/@nuxt/kit). +- `packages/nuxt`: The core of Nuxt, published as [`nuxt`](https://npmjs.com/package/nuxt). +- `packages/schema`: Cross-version Nuxt typedefs and defaults, published as [`@nuxt/schema`](https://npmjs.com/package/@nuxt/schema). +- `packages/test-utils`: Test utilities for Nuxt, published as [`@nuxt/test-utils`](https://npmjs.com/package/@nuxt/test-utils). +- `packages/vite`: The [Vite](https://vitejs.dev) bundler for Nuxt, published as [`@nuxt/vite-builder`](https://npmjs.com/package/@nuxt/vite-builder). +- `packages/webpack`: The [webpack](https://webpack.js.org) bundler for Nuxt 3, published as [`@nuxt/webpack-builder`](https://npmjs.com/package/@nuxt/webpack-builder). -> Toolkit for authoring Nuxt Modules +## Setup -- Published as: `@nuxt/kit` -- [Learn more about this package](/docs/guide/going-further/kit). - -### `packages/nuxi` - -> Nuxt Command Line Interface - -- Published as: `nuxi` -- [Learn more about this package](/docs/api/commands/add). - -### `packages/nuxt` - -> The core of Nuxt 3 - -- Published as: `nuxt` - -### `packages/schema` - -> Cross-version Nuxt typedefs and defaults - -- Published as: `@nuxt/schema` - -### `packages/test-utils` - -> Test utilities for Nuxt. - -- Published as: `@nuxt/test-utils` - -### `packages/vite` - -> The [Vite](https://vitejs.dev) bundler for Nuxt 3. +To contribute to Nuxt, you need to set up a local environment. -- Published as: `@nuxt/vite-builder` -- [Learn more about this package](/docs/api/nuxt-config#vite). +1. [Fork](https://help.github.com/articles/fork-a-repo/) the [`nuxt/nuxt`](https://github.com/nuxt/nuxt) repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device. +2. Ensure using the latest [Node.js](https://nodejs.org/en) (20.x) +3. Enable [Corepack](https://github.com/nodejs/corepack) to have `pnpm` and `yarn` + ```bash [Terminal] + corepack enable + ``` +4. Run `pnpm install` to Install the dependencies with pnpm: + ```bash [Terminal] + pnpm install + ``` + ::callout + If you are adding a dependency, please use `pnpm add`. :br + The `pnpm-lock.yaml` file is the source of truth for all Nuxt dependencies. + :: +5. Activate the passive development system + ```bash [Terminal] + pnpm build:stub + ``` +6. Check out a branch where you can work and commit your changes: + ```bash [Terminal] + git checkout -b my-new-branch + ``` + +Then, test your changes against the [playground](#playground) and [test(#testing) your changes before submitting a pull request. + +### Playground + +While working on a pull request, you will likely want to check if your changes are working correctly. + +You can modify the example app in `playground/`, and run: -### `packages/webpack` +```bash [Terminal] +pnpm dev +``` -> The [webpack](https://webpack.js.org) bundler for Nuxt 3 +::callout{color="amber" icon="i-ph-warning-duotone"} +Please make sure not to commit it to your branch, but it could be helpful to add some example code to your PR description. This can help reviewers and other Nuxt users understand the feature you've built in-depth. +:: -- Published as: `@nuxt/webpack-builder` -- [Learn more about this package](/docs/api/nuxt-config#webpack-1). +### Testing -## Using the Playground +Every new feature should have a corresponding unit test (if possible). The `test/` directory in this repository is currently a work in progress, but do your best to create a new test following the example of what's already there. -While working on a PR, you will likely want to check if your changes are working correctly. +Before creating a PR or marking it as ready-to-review, ensure that all tests pass by running: -You can modify the example app in `playground/`, and run it with `pnpm dev`. Please make sure not to commit it to your branch, but it could be helpful to add some example code to your PR description. This can help reviewers and other Nuxt users understand the feature you've built in-depth. +```bash [Terminal] +pnpm test +``` -## Testing +### Linting -Every new feature should have a corresponding unit test (if possible). The `test` folder in this repository is currently a work in progress, but do your best to create a new test following the example of what's already there. +You might have noticed already that we use ESLint to enforce a coding standard. -Before creating a PR or marking it as ready-to-review, ensure that all tests pass by running `pnpm test` locally. +Before committing your changes, to verify that the code style is correct, run: -## Linting +```bash [Terminal] +pnpm lint +``` -You might have noticed already that we use ESLint to enforce a coding standard. Please run `yarn lint` before committing your changes to verify that the code style is correct. If not, you can use `yarn lint --fix` to fix most of the style changes. If there are still errors left, you must correct them manually. +::callout +You can use `pnpm lint --fix` to fix most of the style changes. :br +If there are still errors left, you must correct them manually. +:: ### Documentation -If you are adding a new feature or refactoring or changing the behavior of Nuxt in any other manner, you'll likely want to document the changes. Please include any changes to the docs in the same PR. You don't have to write documentation up on the first commit (but please do so as soon as your pull request is mature enough). Make sure to make changes according to the [Documentation Guide](/docs/community/contribution#writing-documentation). +If you are adding a new feature or refactoring or changing the behavior of Nuxt in any other manner, you'll likely want to document the changes. Please include any changes to the docs in the same PR. You don't have to write documentation up on the first commit (but please do so as soon as your pull request is mature enough). + +::callout +Make sure to make changes according to the [Documentation Style Guide](/docs/community/contribution#documentation-style-guide). +:: ### Final Checklist @@ -82,64 +99,44 @@ When submitting your PR, there is a simple template that you have to fill out. P If you spot an area where we can improve documentation or error messages, please do open a PR - even if it's just to fix a typo! +::callout +Make sure to make changes according to the [Documentation Style Guide](/docs/community/contribution#documentation-style-guide). +:: + ### Quick Edits -If you spot a typo or want to rephrase a sentence, you can click on the **Edit this page on GitHub** link located after the content of every page. +If you spot a typo or want to rephrase a sentence, you can click on the **Edit this page** link located on the right aside in the **Community** section. Make the change directly in the GitHub interface and open a Pull Request. ### Longer Edits -The documentation content is inside the `docs/` directory of the [nuxt/nuxt repository](https://github.com/nuxt/nuxt) and written in markdown. +The documentation content is inside the `docs/` directory of the [nuxt/nuxt](https://github.com/nuxt/nuxt) repository and written in markdown. -To contribute, fork the repository and follow [these steps](#set-up-documentation-website-in-local-environment) and start docs in development mode. - -After making your changes: +::callout{icon="i-ph-info-duotone" color="blue"} +To preview the docs locally, follow the steps on [nuxt/nuxt.com](https://github.com/nuxt/nuxt.com) repository. +:: -- Lint the documentation with the `lint:docs` command. -- Open a Pull Request. Please make sure your PR title adheres to the [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) guidelines. +::callout +We recommend that you install the [MDC extension](https://marketplace.visualstudio.com/items?itemName=Nuxt.mdc) for VS Code. +:: ### Linting Docs Documentation is linted using [MarkdownLint](https://github.com/DavidAnson/markdownlint/) and [case police](https://github.com/antfu/case-police) to keep the documentation cohesive. -## Set Up Your Local Development Environment - -To contribute to Nuxt, you need to set up a local environment. - -1. [Fork](https://help.github.com/articles/fork-a-repo/) the [nuxt/nuxt repository](https://github.com/nuxt/nuxt) to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device. - -1. Ensure using the latest Node.js (20.x) - -1. Enable [Corepack](https://github.com/nodejs/corepack) using `corepack enable` to have `pnpm` and `yarn` - -1. Run `pnpm install` to install the dependencies. - - > If you are adding a dependency, please use `pnpm add`. The `pnpm-lock.yaml` file is the source of truth for all Nuxt dependencies. - -1. Run `pnpm build:stub` to activate the passive development system - -1. Check out a branch where you can work and commit your changes: - ```bash [Terminal] -git checkout -b my-new-branch +pnpm lint:docs ``` -### Set Up Documentation Website in Local Environment - -The Nuxt documentation is currently deployed within [nuxt/nuxt.com](https://github.com/nuxt/nuxt.com) as a layer. +::callout +You can also run `pnpm lint:docs:fix` to highlight and resolve any lint issues. +:: -- Run `pnpm build:stub` once in the root directory -- Go into the `.website` directory: `cd .website` -- Install dependencies using `pnpm install` -<!-- TODO: make 2 previous steps transparent by running pnpm docs:dev from root directory --> -- Run `pnpm dev` to start docs in development mode -- Before opening a PR, run `pnpm lint:docs:fix` to highlight and resolve any lint issues +### Open a PR -::alert -๐Ÿšง This repository will be open-sourced shortly. Until then, you will need to open a pull request to see a preview of your changes. -:: +Please make sure your PR title adheres to the [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) guidelines. -::alert -We recommend that you install the [MDC extension](https://marketplace.visualstudio.com/items?itemName=Nuxt.mdc) for VS Code. -:: +```bash [Example of PR title] +docs: update the section about the nuxt.config.ts file +``` diff --git a/docs/5.community/6.roadmap.md b/docs/5.community/6.roadmap.md index 4701743f0552..dfc255a5bc43 100644 --- a/docs/5.community/6.roadmap.md +++ b/docs/5.community/6.roadmap.md @@ -52,11 +52,11 @@ I18n | Active | 2.x and 3.x | [nuxt-modules/i18n](https: Since January 2023, we've adopted a consistent release cycle for **Nuxt 3**, following [semver](https://semver.org/). We aim for major framework releases every year, with an expectation of patch releases every week or so and minor releases every month or so. They should never contain breaking changes except within options clearly marked as `experimental`. -#### ๐Ÿ“… Ongoing Support for Nuxt +### Ongoing Support for Nuxt Going forward from v3, we commit to support each major version of Nuxt for a minimum of a year after the last release, and to providing an upgrade path for current users at that point. -##### Current Packages +### Current Packages The current active version of [Nuxt](https://nuxt.com) is **v3** which is available as `nuxt` on npm with the `latest` tag. diff --git a/docs/7.migration/6.pages-and-layouts.md b/docs/7.migration/6.pages-and-layouts.md index aa7a29436596..75d850c1925e 100644 --- a/docs/7.migration/6.pages-and-layouts.md +++ b/docs/7.migration/6.pages-and-layouts.md @@ -64,8 +64,6 @@ You will also need to change how you define the layout used by a page using the </template> ``` - - ## Pages Nuxt 3 ships with an optional `vue-router` integration triggered by the existence of a [`pages/`](/docs/guide/directory-structure/pages) directory in your source directory. If you only have a single page, you may consider instead moving it to `app.vue` for a lighter build. diff --git a/docs/7.migration/7.component-options.md b/docs/7.migration/7.component-options.md index 68d9f8c08089..245e42fd43ad 100644 --- a/docs/7.migration/7.component-options.md +++ b/docs/7.migration/7.component-options.md @@ -118,7 +118,6 @@ Similar to `key`, specify it within the [`definePageMeta`](/docs/api/utils/defin </script> ``` - ## `transition` :read-more{to="/docs/getting-started/transitions"} diff --git a/docs/README.md b/docs/README.md index 0aa5c18050d6..4d778da91197 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,8 +4,8 @@ navigation: false # Nuxt Docs -This repository contains the documentation of Nuxt hosted on https://nuxt.com. +This repository contains the documentation of Nuxt hosted on <https://nuxt.com/docs> ## Contributing -Have a look at https://github.com/nuxt/nuxt.com to run the website locally. +Have a look at <https://github.com/nuxt/nuxt.com> to run the website locally. From 0ef3948f5e322a61aba663bdc02ae6a67b811491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 16:19:23 +0200 Subject: [PATCH 30/62] docs: components ready --- .../1.experimental-features.md | 2 +- .../1.components/5.nuxt-loading-indicator.md | 37 ++++++++++--------- .../1.components/6.nuxt-error-boundary.md | 18 +++++---- docs/3.api/1.components/7.nuxt-welcome.md | 21 ++++++++--- docs/3.api/1.components/8.nuxt-island.md | 32 ++++++++-------- docs/3.api/1.components/9.teleports.md | 10 ++--- docs/3.api/1.components/index.md | 5 --- docs/3.api/5.kit/3.compatibility.md | 1 + 8 files changed, 70 insertions(+), 56 deletions(-) delete mode 100644 docs/3.api/1.components/index.md diff --git a/docs/2.guide/3.going-further/1.experimental-features.md b/docs/2.guide/3.going-further/1.experimental-features.md index b32fb9dedab7..d61ce4fca945 100644 --- a/docs/2.guide/3.going-further/1.experimental-features.md +++ b/docs/2.guide/3.going-further/1.experimental-features.md @@ -246,7 +246,7 @@ Enables experimental component islands support with [`<NuxtIsland>`](/docs/api/c ```ts [nuxt.config.ts] export defineNuxtConfig({ experimental: { - componentIslands: true + componentIslands: true // false or 'local+remote' } }) ``` diff --git a/docs/3.api/1.components/5.nuxt-loading-indicator.md b/docs/3.api/1.components/5.nuxt-loading-indicator.md index 17b96d611186..693b6405b398 100644 --- a/docs/3.api/1.components/5.nuxt-loading-indicator.md +++ b/docs/3.api/1.components/5.nuxt-loading-indicator.md @@ -1,12 +1,16 @@ -# `<NuxtLoadingIndicator>` +--- +title: '<NuxtLoadingIndicator>' +description: 'Display a progress bar between page navigations.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-loading-indicator.ts + size: xs +--- -The `<NuxtLoadingIndicator>` component displays a progress bar on page navigation. +## Usage -## Examples - -### Basic Usage - -Add `<NuxtLoadingIndicator/>` in your `app.vue` or layouts. +Add `<NuxtLoadingIndicator/>` in your [`app.vue`](/docs/guide/directory-structure/app) or [`layouts/`](/docs/guide/directory-structure/layouts). ```vue [app.vue] <template> @@ -19,11 +23,7 @@ Add `<NuxtLoadingIndicator/>` in your `app.vue` or layouts. </template> ``` -:button-link[Open on StackBlitz]{href="https://stackblitz.com/github/nuxt/examples/tree/main/routing/pages?file=app.vue&terminal=dev" blank} - -::alert{type=warning} -If you are changing layouts as well as page, the page transition you set here will not run. Instead, you should set a layout transition. -:: +:link-example{to="/docs/examples/routing/pages"} ## Slots @@ -31,11 +31,12 @@ You can pass custom HTML or components through the loading indicator's default s ## Props -- **color**: The color of the loading bar. It can be set to `false` to turn off explicit color styling. -- **height**: Height of the loading bar, in pixels (default `3`). -- **duration**: Duration of the loading bar, in milliseconds (default `2000`). -- **throttle**: Throttle the appearing and hiding, in milliseconds (default `200`). +- `color`: The color of the loading bar. It can be set to `false` to turn off explicit color styling. +- `height`: Height of the loading bar, in pixels (default `3`). +- `duration`: Duration of the loading bar, in milliseconds (default `2000`). +- `throttle`: Throttle the appearing and hiding, in milliseconds (default `200`). -::alert{type=info icon=๐Ÿ”Ž} -This component is completely optional. To achieve full customization, you can implement your own one based on [this file](https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-loading-indicator.ts). +::callout +This component is optional. :br +To achieve full customization, you can implement your own one based on [its source code](https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-loading-indicator.ts). :: diff --git a/docs/3.api/1.components/6.nuxt-error-boundary.md b/docs/3.api/1.components/6.nuxt-error-boundary.md index cd65b850431a..11d7dc22b688 100644 --- a/docs/3.api/1.components/6.nuxt-error-boundary.md +++ b/docs/3.api/1.components/6.nuxt-error-boundary.md @@ -1,15 +1,20 @@ --- title: "<NuxtErrorBoundary>" description: The <NuxtErrorBoundary> component handles client-side errors happening in its default slot. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-error-boundary.ts + size: xs --- -# `<NuxtErrorBoundary>` - -The `<NuxtErrorBoundary>` component handles client-side errors happening in its default slot, using Vue's [`onErrorCaptured` hook.](https://vuejs.org/api/composition-api-lifecycle.html#onerrorcaptured) +::callout +The `<NuxtErrorBoundary>` uses Vue's [`onErrorCaptured`](https://vuejs.org/api/composition-api-lifecycle.html#onerrorcaptured) hook under the hood. +:: ## Events -- **`@error`**: Event emitted when the default slot of the component throws an error. +- `@error`: Event emitted when the default slot of the component throws an error. ```vue <template> @@ -21,7 +26,7 @@ The `<NuxtErrorBoundary>` component handles client-side errors happening in its ## Slots -- **#error**: Specify a fallback content to display in case of error. +- `#error`: Specify a fallback content to display in case of error. ```vue <template> @@ -34,5 +39,4 @@ The `<NuxtErrorBoundary>` component handles client-side errors happening in its </template> ``` -::ReadMore{link="/docs/getting-started/error-handling"} -:: +:read-more{to="/docs/getting-started/error-handling"} diff --git a/docs/3.api/1.components/7.nuxt-welcome.md b/docs/3.api/1.components/7.nuxt-welcome.md index 87cfff0b4951..161be3601a91 100644 --- a/docs/3.api/1.components/7.nuxt-welcome.md +++ b/docs/3.api/1.components/7.nuxt-welcome.md @@ -1,14 +1,25 @@ --- +title: '<NuxtWelcome>' description: The `<NuxtWelcome>` component greets users in new projects made from the starter template. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/assets/blob/main/packages/templates/templates/welcome/index.html + size: xs --- -# `<NuxtWelcome>` +It includes links to the Nuxt documentation, source code, and social media accounts. -The `<NuxtWelcome>` component greets users in new projects made from the starter template. It includes links to the Nuxt documentation, source code, and social media accounts. +```vue [app.vue] +<template> + <NuxtWelcome /> +</template> +``` -::alert{type=info icon=๐Ÿ”Ž} -This component is part of [@nuxt/ui](https://github.com/nuxt/ui) +::read-more{to="https://templates.ui.nuxtjs.org/templates/welcome" target="_blank"} +Preview the `<NuxtWelcome />` component. :: -::ReadMore{link="https://github.com/nuxt/ui" title="@nuxt/ui"} +::callout +This component is part of [nuxt/assets](https://github.com/nuxt/assets). :: diff --git a/docs/3.api/1.components/8.nuxt-island.md b/docs/3.api/1.components/8.nuxt-island.md index 639103c49678..9549d803ddd9 100644 --- a/docs/3.api/1.components/8.nuxt-island.md +++ b/docs/3.api/1.components/8.nuxt-island.md @@ -1,45 +1,47 @@ --- title: "<NuxtIsland>" description: "Nuxt provides `<NuxtIsland>` component to render a non-interactive component without any client JS" +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-island.ts + size: xs --- -# `<NuxtIsland>` - -Nuxt provide `<NuxtIsland>` to render components only server side. - When rendering an island component, the content of the island component is static, thus no JS is downloaded client-side. + Changing the island component props triggers a refetch of the island component to re-render it again. -::alert{type=warning} +::read-more{to="/docs/guide/going-further/experimental-features#componentislands"} This component is experimental and in order to use it you must enable the `experimental.componentIslands` option in your `nuxt.config`. :: -::alert{type=info} -Global styles of your application are sent with the response +::callout +Global styles of your application are sent with the response. :: -::alert{type=info} +::callout Server only components use `<NuxtIsland>` under the hood :: ## Props -- **name** : Name of the component to render. +- `name` : Name of the component to render. - **type**: `string` - **required** -- **lazy**: Make the component non-blocking. +- `lazy`: Make the component non-blocking. - **type**: `boolean` - **default**: `false` -- **props**: Props to send to the component to render. +- `props`: Props to send to the component to render. - **type**: `Record<string, any>` -- **source**: Remote source to call the island to render. +- `source`: Remote source to call the island to render. - **type**: `string` -::alert{type=warning} +::callout{color="blue" icon="i-ph-info-duotone"} Remote islands need `experimental.componentIslands` to be `'local+remote'` in your `nuxt.config`. :: -## `Slots` +## Slots Slots can be passed to an island component if declared. @@ -47,4 +49,4 @@ Every slot is interactive since the parent component is the one providing it. Some slots are reserved to `NuxtIsland` for special cases. -- **fallback**: Specify the content to be rendered before the island loads (if the component is lazy) or if `NuxtIsland` fails to fetch the component. +- `#fallback`: Specify the content to be rendered before the island loads (if the component is lazy) or if `NuxtIsland` fails to fetch the component. diff --git a/docs/3.api/1.components/9.teleports.md b/docs/3.api/1.components/9.teleports.md index c6d3dc2e87f9..23dc7068d08f 100644 --- a/docs/3.api/1.components/9.teleports.md +++ b/docs/3.api/1.components/9.teleports.md @@ -1,13 +1,13 @@ --- +title: '<Teleport>' description: The <Teleport> component teleports a component to a different location in the DOM. --- -# `<Teleport>` - -The `<Teleport>` component teleports a component to a different location in the DOM. +::callout{color="amber" icon="i-ph-warning-duotone"} The `to` target of [`<Teleport>`](https://vuejs.org/guide/built-ins/teleport.html) expects a CSS selector string or an actual DOM node. Nuxt currently has SSR support for teleports to `body` only, with client-side support for other targets using a `<ClientOnly>` wrapper. +:: -## Example: `body` Teleport +## Body Teleport ```vue <template> @@ -25,7 +25,7 @@ The `to` target of [`<Teleport>`](https://vuejs.org/guide/built-ins/teleport.htm </template> ``` -## Example: Client-side Teleport +## Client-side Teleport ```vue <template> diff --git a/docs/3.api/1.components/index.md b/docs/3.api/1.components/index.md deleted file mode 100644 index b3ff4c1eefe2..000000000000 --- a/docs/3.api/1.components/index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Components" -navigation: false -redirect: /api/components/nuxt-page ---- diff --git a/docs/3.api/5.kit/3.compatibility.md b/docs/3.api/5.kit/3.compatibility.md index cea1e3ac50d5..13a0086270ca 100644 --- a/docs/3.api/5.kit/3.compatibility.md +++ b/docs/3.api/5.kit/3.compatibility.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/compatibility.ts + size: xs --- Nuxt Kit utilities can be used in Nuxt 3, Nuxt 2 with Bridge and even Nuxt 2 without Bridge. To make sure your module is compatible with all versions, you can use the `checkNuxtCompatibility`, `assertNuxtCompatibility` and `hasNuxtCompatibility` functions. They will check if the current Nuxt version meets the constraints you provide. Also you can use `isNuxt2`, `isNuxt3` and `getNuxtVersion` functions for more granular checks. From 6406497e2daef67d7b5966dd4c7142accdeee1cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 17:52:19 +0200 Subject: [PATCH 31/62] docs: composables done --- docs/2.guide/2.directory-structure/0.nuxt.md | 8 +- .../2.guide/2.directory-structure/0.output.md | 8 +- docs/2.guide/2.directory-structure/2.env.md | 4 + docs/3.api/2.composables/use-app-config.md | 18 +- docs/3.api/2.composables/use-async-data.md | 146 +++++++------ docs/3.api/2.composables/use-cookie.md | 61 +++--- docs/3.api/2.composables/use-error.md | 5 + docs/3.api/2.composables/use-fetch.md | 198 +++++++++--------- docs/3.api/2.composables/use-head-safe.md | 12 +- docs/3.api/2.composables/use-head.md | 87 +++----- docs/3.api/2.composables/use-hydration.md | 42 ++-- .../2.composables/use-lazy-async-data.md | 25 ++- docs/3.api/2.composables/use-lazy-fetch.md | 24 ++- docs/3.api/2.composables/use-nuxt-app.md | 145 +++++++------ docs/3.api/2.composables/use-nuxt-data.md | 61 +++--- docs/3.api/2.composables/use-request-event.md | 15 +- .../2.composables/use-request-headers.md | 17 +- docs/3.api/2.composables/use-request-url.md | 14 +- docs/3.api/2.composables/use-route.md | 29 +-- docs/3.api/2.composables/use-router.md | 5 + .../3.api/2.composables/use-runtime-config.md | 42 ++-- docs/3.api/2.composables/use-seo-meta.md | 19 +- .../2.composables/use-server-seo-meta.md | 22 +- docs/3.api/2.composables/use-state.md | 37 ++-- docs/3.api/3.utils/abort-navigation.md | 5 + docs/3.api/3.utils/add-route-middleware.md | 5 + docs/3.api/3.utils/clear-error.md | 5 + docs/3.api/3.utils/clear-nuxt-data.md | 8 + docs/3.api/3.utils/create-error.md | 5 + docs/3.api/3.utils/navigate-to.md | 5 + docs/3.api/3.utils/on-before-route-leave.md | 5 + docs/3.api/3.utils/on-before-route-update.md | 5 + docs/3.api/3.utils/prerender-routes.md | 5 + docs/3.api/3.utils/refresh-nuxt-data.md | 5 + docs/3.api/3.utils/set-page-layout.md | 5 + docs/3.api/3.utils/set-response-status.md | 6 + docs/3.api/3.utils/show-error.md | 8 + 37 files changed, 640 insertions(+), 476 deletions(-) diff --git a/docs/2.guide/2.directory-structure/0.nuxt.md b/docs/2.guide/2.directory-structure/0.nuxt.md index e93f5d0e09f4..1b959435291d 100644 --- a/docs/2.guide/2.directory-structure/0.nuxt.md +++ b/docs/2.guide/2.directory-structure/0.nuxt.md @@ -5,6 +5,10 @@ head.title: ".nuxt/" navigation.icon: i-ph-folder-duotone --- +::callout{icon="i-ph-warning-duotone" color="amber"} +This directory should be added to your [`.gitignore`](/docs/guide/directory-structure/gitignore) file to avoid pushing the dev build output to your repository. +:: + This directory is interesting if you want to learn more about the files Nuxt generates based on your directory structure. Nuxt also provides a Virtual File System (VFS) for modules to add templates to this directory without writing them to disk. @@ -14,7 +18,3 @@ You can explore the generated files by opening the [Nuxt Devtools](https://devto ::callout{icon="i-ph-warning-duotone" color="amber"} You should not touch any files inside since the whole directory will be re-created when running [`nuxt dev`](/docs/api/commands/dev). :: - -::callout -This directory should be added to your [`.gitignore`](/docs/guide/directory-structure/gitignore) file to avoid pushing the dev build output to your repository. -:: diff --git a/docs/2.guide/2.directory-structure/0.output.md b/docs/2.guide/2.directory-structure/0.output.md index e5f4ba4ab268..56ce88aa15b0 100644 --- a/docs/2.guide/2.directory-structure/0.output.md +++ b/docs/2.guide/2.directory-structure/0.output.md @@ -5,14 +5,14 @@ head.title: ".output/" navigation.icon: i-ph-folder-duotone --- +::callout{icon="i-ph-warning-duotone" color="amber"} +This directory should be added to your [`.gitignore`](/docs/guide/directory-structure/gitignore) file to avoid pushing the build output to your repository. +:: + Use this directory to deploy your Nuxt application to production. :read-more{to="/docs/getting-started/deployment"} -::callout -This directory should be added to your [`.gitignore`](/docs/guide/directory-structure/gitignore) file to avoid pushing the build output to your repository. -:: - ::callout{icon="i-ph-warning-duotone" color="amber"} You should not touch any files inside since the whole directory will be re-created when running [`nuxt build`](/docs/api/commands/build). :: diff --git a/docs/2.guide/2.directory-structure/2.env.md b/docs/2.guide/2.directory-structure/2.env.md index c60561d7b9f6..03adf2ffa42f 100644 --- a/docs/2.guide/2.directory-structure/2.env.md +++ b/docs/2.guide/2.directory-structure/2.env.md @@ -5,6 +5,10 @@ head.title: ".env" navigation.icon: i-ph-file-duotone --- +::callout{icon="i-ph-warning-duotone" color="amber"} +This file should be added to your [`.gitignore`](/docs/guide/directory-structure/gitignore) file to avoid pushing secrets to your repository. +:: + ## Dev, Build and Generate Time Nuxt CLI has built-in [dotenv](https://github.com/motdotla/dotenv) support in development mode and when running [`nuxi build`](/docs/api/commands/build) and [`nuxi generate`](/docs/api/commands/generate). diff --git a/docs/3.api/2.composables/use-app-config.md b/docs/3.api/2.composables/use-app-config.md index 4aa90feaa41c..b585a3aeb7b2 100644 --- a/docs/3.api/2.composables/use-app-config.md +++ b/docs/3.api/2.composables/use-app-config.md @@ -1,13 +1,21 @@ -# `useAppConfig` +--- +title: 'useAppConfig' +description: 'Access the reactive app config defined in the project.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/config.ts + size: xs +--- -Access the reactive [app config](/docs/guide/directory-structure/app-config) defined in the project. +:read-more{to="/docs/guide/directory-structure/app-config"} -**Usage:** +## Usage -```js +```ts const appConfig = useAppConfig() console.log(appConfig) ``` -::ReadMore{link="/docs/guide/directory-structure/app-config"} +:read-more{to="/docs/guide/directory-structure/app-config"} diff --git a/docs/3.api/2.composables/use-async-data.md b/docs/3.api/2.composables/use-async-data.md index 866705e69a82..203bfd7789f7 100644 --- a/docs/3.api/2.composables/use-async-data.md +++ b/docs/3.api/2.composables/use-async-data.md @@ -1,14 +1,91 @@ --- -description: useAsyncData provides access to data that resolves asynchronously. +title: 'useAsyncData' +description: useAsyncData provides access to data that resolves asynchronously in a SSR-friendly composable. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts + size: xs --- -# useAsyncData Within your pages, components, and plugins you can use useAsyncData to get access to data that resolves asynchronously. -::alert{type=warning} +::callout [`useAsyncData`](/docs/api/composables/use-async-data) is a composable meant to be called directly in a setup function, plugin, or route middleware. It returns reactive composables and handles adding responses to the Nuxt payload so they can be passed from server to client without re-fetching the data on client side when the page hydrates. :: +## Usage + +```vue [pages/index.vue] +<script setup> +const { data, pending, error, refresh } = await useAsyncData( + 'mountains', + () => $fetch('https://api.nuxtjs.dev/mountains') +) +</script> +``` + +### Watch Params + +The built-in `watch` option allows automatically rerunning the fetcher function when any changes are detected. + +```vue [pages/index.vue] +<script setup> +const page = ref(1) +const { data: posts } = await useAsyncData( + 'posts', + () => $fetch('https://fakeApi.com/posts', { + params: { + page: page.value + } + }), { + watch: [page] + } +) +</script> +``` + +::callout{color="amber" icon="i-ph-warning-duotone"} +[`useAsyncData`](/docs/api/composables/use-async-data) is a reserved function name transformed by the compiler, so you should not name your own function [`useAsyncData`](/docs/api/composables/use-async-data) . +:: + +:read-more{to="/docs/getting-started/data-fetching#useasyncdata"} + +## Params + +- `key`: a unique key to ensure that data fetching can be properly de-duplicated across requests. If you do not provide a key, then a key that is unique to the file name and line number of the instance of `useAsyncData` will be generated for you. +- `handler`: an asynchronous function that must return a truthy value (for example, it should not be `undefined` or `null`) or the request may be duplicated on the client side +- `options`: + - `server`: whether to fetch the data on the server (defaults to `true`) + - `lazy`: whether to resolve the async function after loading the route, instead of blocking client-side navigation (defaults to `false`) + - `immediate`: when set to `false`, will prevent the request from firing immediately. (defaults to `true`) + - `default`: a factory function to set the default value of the `data`, before the async function resolves - useful with the `lazy: true` or `immediate: false` option + - `transform`: a function that can be used to alter `handler` function result after resolving + - `pick`: only pick specified keys in this array from the `handler` function result + - `watch`: watch reactive sources to auto-refresh + +::callout +Under the hood, `lazy: false` uses `<Suspense>` to block the loading of the route before the data has been fetched. Consider using `lazy: true` and implementing a loading state instead for a snappier user experience. +:: + +::read-more{to="/docs/api/composables/use-lazy-async-data"} +You can use `useLazyAsyncData` to have the same behavior as `lazy: true` with `useAsyncData`. +:: + +## Return Values + +- `data`: the result of the asynchronous function that is passed in. +- `pending`: a boolean indicating whether the data is still being fetched. +- `refresh`/`execute`: a function that can be used to refresh the data returned by the `handler` function. +- `error`: an error object if the data fetching failed. +- `status`: a string indicating the status of the data request (`"idle"`, `"pending"`, `"success"`, `"error"`). + +By default, Nuxt waits until a `refresh` is finished before it can be executed again. + +::callout +If you have not fetched data on the server (for example, with `server: false`), then the data _will not_ be fetched until hydration completes. This means even if you await [`useAsyncData`](/docs/api/composables/use-async-data) on the client side, `data` will remain `null` within `<script setup>`. +:: + ## Type ```ts [Signature] @@ -48,65 +125,4 @@ interface AsyncDataExecuteOptions { type AsyncDataRequestStatus = 'idle' | 'pending' | 'success' | 'error' ``` -## Params - -* **key**: a unique key to ensure that data fetching can be properly de-duplicated across requests. If you do not provide a key, then a key that is unique to the file name and line number of the instance of [`useAsyncData`](/docs/api/composables/use-async-data) will be generated for you. -* **handler**: an asynchronous function that must return a truthy value (for example, it should not be `undefined` or `null`) or the request may be duplicated on the client side -* **options**: - * _server_: whether to fetch the data on the server (defaults to `true`) - * _lazy_: whether to resolve the async function after loading the route, instead of blocking client-side navigation (defaults to `false`) - * _immediate_: when set to `false`, will prevent the request from firing immediately. (defaults to `true`) - * _default_: a factory function to set the default value of the `data`, before the async function resolves - useful with the `lazy: true` or `immediate: false` option - * _transform_: a function that can be used to alter `handler` function result after resolving - * _pick_: only pick specified keys in this array from the `handler` function result - * _watch_: watch reactive sources to auto-refresh - -Under the hood, `lazy: false` uses `<Suspense>` to block the loading of the route before the data has been fetched. Consider using `lazy: true` and implementing a loading state instead for a snappier user experience. - -## Return Values - -* **data**: the result of the asynchronous function that is passed in. -* **pending**: a boolean indicating whether the data is still being fetched. -* **refresh**/**execute**: a function that can be used to refresh the data returned by the `handler` function. -* **error**: an error object if the data fetching failed. -* **status**: a string indicating the status of the data request (`"idle"`, `"pending"`, `"success"`, `"error"`). - -By default, Nuxt waits until a `refresh` is finished before it can be executed again. - -::alert{type=warning} -If you have not fetched data on the server (for example, with `server: false`), then the data _will not_ be fetched until hydration completes. This means even if you await [`useAsyncData`](/docs/api/composables/use-async-data) on the client side, `data` will remain `null` within `<script setup>`. -:: - -## Example - -```ts -const { data, pending, error, refresh } = await useAsyncData( - 'mountains', - () => $fetch('https://api.nuxtjs.dev/mountains') -) -``` - -## Example with watching params change - -The built-in `watch` option allows automatically rerunning the fetcher function when any changes are detected. - -```ts -const page = ref(1) -const { data: posts } = await useAsyncData( - 'posts', - () => $fetch('https://fakeApi.com/posts', { - params: { - page: page.value - } - }), { - watch: [page] - } -) -``` - -::alert{type=warning} -[`useAsyncData`](/docs/api/composables/use-async-data) is a reserved function name transformed by the compiler, so you should not name your own function [`useAsyncData`](/docs/api/composables/use-async-data) . -:: - -::ReadMore{link="/docs/getting-started/data-fetching"} -:: +:read-more{to="/docs/getting-started/data-fetching"} diff --git a/docs/3.api/2.composables/use-cookie.md b/docs/3.api/2.composables/use-cookie.md index 26823f78cae0..58689e20c781 100644 --- a/docs/3.api/2.composables/use-cookie.md +++ b/docs/3.api/2.composables/use-cookie.md @@ -1,20 +1,20 @@ --- +title: 'useCookie' description: useCookie is an SSR-friendly composable to read and write cookies. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/cookie.ts + size: xs --- -# `useCookie` - Within your pages, components and plugins you can use `useCookie`, an SSR-friendly composable to read and write cookies. -```js +```ts const cookie = useCookie(name, options) ``` -::alert{icon=๐Ÿ‘‰} -`useCookie` only works during `setup` or `Lifecycle Hooks`. -:: - -::alert{icon=๐Ÿ˜Œ} +::callout `useCookie` ref will automatically serialize and deserialize cookie value to JSON. :: @@ -22,9 +22,10 @@ const cookie = useCookie(name, options) The example below creates a cookie called `counter`. If the cookie doesn't exist, it is initially set to a random value. Whenever we update the `counter` variable, the cookie will be updated accordingly. -```vue +```vue [app.vue] <script setup lang="ts"> const counter = useCookie('counter') + counter.value = counter.value || Math.round(Math.random() * 1000) </script> @@ -38,7 +39,7 @@ counter.value = counter.value || Math.round(Math.random() * 1000) </template> ``` -:button-link[Open on StackBlitz]{href="https://stackblitz.com/github/nuxt/examples/tree/main/advanced/use-cookie?terminal=dev&file=app.vue" blank} +:link-example{to="/docs/examples/advanced/use-cookie"} ## Options @@ -48,20 +49,22 @@ Most of the options will be directly passed to the [cookie](https://github.com/j ### `maxAge` / `expires` -**`maxAge`** Specifies the `number` (in seconds) to be the value for the [`Max-Age` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.2). +Use these options to set the expiration of the cookie. + +`maxAge`: Specifies the `number` (in seconds) to be the value for the [`Max-Age` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.2). The given number will be converted to an integer by rounding down. By default, no maximum age is set. -**`expires`**: Specifies the `Date` object to be the value for the [`Expires` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.1). +`expires`: Specifies the `Date` object to be the value for the [`Expires` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.1). By default, no expiration is set. Most clients will consider this a "non-persistent cookie" and will delete it on a condition like exiting a web browser application. -::alert{icon=๐Ÿ’ก} -**Note:** The [cookie storage model specification](https://tools.ietf.org/html/rfc6265#section-5.3) states that if both `expires` and +::callout +The [cookie storage model specification](https://tools.ietf.org/html/rfc6265#section-5.3) states that if both `expires` and `maxAge` is set, then `maxAge` takes precedence, but not all clients may obey this, so if both are set, they should point to the same date and time! :: -::alert +::callout If neither of `expires` and `maxAge` is set, the cookie will be session-only and removed when the user closes their browser. :: @@ -70,8 +73,8 @@ If neither of `expires` and `maxAge` is set, the cookie will be session-only and Specifies the `boolean` value for the [`HttpOnly` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.6). When truthy, the `HttpOnly` attribute is set; otherwise it is not. By default, the `HttpOnly` attribute is not set. -::alert{icon=๐Ÿ’ก} -**Note:** Be careful when setting this to `true`, as compliant clients will not allow client-side +::callout +Be careful when setting this to `true`, as compliant clients will not allow client-side JavaScript to see the cookie in `document.cookie`. :: @@ -80,20 +83,18 @@ JavaScript to see the cookie in `document.cookie`. Specifies the `boolean` value for the [`Secure` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.5). When truthy, the `Secure` attribute is set; otherwise it is not. By default, the `Secure` attribute is not set. -::alert{icon=๐Ÿ’ก} -**Note:** Be careful when setting this to `true`, as compliant clients will not send the cookie back to +::callout +Be careful when setting this to `true`, as compliant clients will not send the cookie back to the server in the future if the browser does not have an HTTPS connection. This can lead to hydration errors. :: ### `domain` -Specifies the value for the [`Domain` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.3). By default, no -domain is set, and most clients will consider applying the cookie only to the current domain. +Specifies the value for the [`Domain` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.3). By default, no domain is set, and most clients will consider applying the cookie only to the current domain. ### `path` -Specifies the value for the [`Path` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.4). By default, the path -is considered the ["default path"](https://tools.ietf.org/html/rfc6265#section-5.1.4). +Specifies the value for the [`Path` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.4). By default, the path is considered the ["default path"](https://tools.ietf.org/html/rfc6265#section-5.1.4). ### `sameSite` @@ -123,8 +124,8 @@ a previously encoded cookie value into a JavaScript string or other object. The default decoder is `decodeURIComponent` + [destr](https://github.com/unjs/destr). -::alert{icon=๐Ÿ’ก} -**Note:** If an error is thrown from this function, the original, non-decoded cookie value will +::callout +If an error is thrown from this function, the original, non-decoded cookie value will be returned as the cookie's value. :: @@ -136,9 +137,9 @@ Specifies a function that returns the cookie's default value. The function can a Specifies the `boolean` or `string` value for [watch](https://vuejs.org/api/reactivity-core.html#watch) cookie ref data. -- `true` - Will watch cookie ref data changes and its nested properties. (default) +- `true` - Will watch cookie ref data changes and its nested properties (default). - `shallow` - Will watch cookie ref data changes for only top level properties -- `false` Will not watch cookie ref data changes. +- `false` - Will not watch cookie ref data changes. **Example 1:** @@ -197,13 +198,11 @@ function save() { </template> ``` -## Handling Cookies in API Routes +## Cookies in API Routes You can use `getCookie` and `setCookie` from [`h3`](https://github.com/unjs/h3) package to set cookies in server API routes. -**Example:** - -```js +```ts [server/api/counter.ts] export default defineEventHandler(event => { // Read counter cookie let counter = getCookie(event, 'counter') || 0 diff --git a/docs/3.api/2.composables/use-error.md b/docs/3.api/2.composables/use-error.md index 45f43e19add4..19fb75a37869 100644 --- a/docs/3.api/2.composables/use-error.md +++ b/docs/3.api/2.composables/use-error.md @@ -1,6 +1,11 @@ --- title: "useError" description: useError composable returns the global Nuxt error that is being handled. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/error.ts + size: xs --- The composable returns the global Nuxt error that is being handled and it is available on both client and server. diff --git a/docs/3.api/2.composables/use-fetch.md b/docs/3.api/2.composables/use-fetch.md index f6dbecb85d8f..319c19e93574 100644 --- a/docs/3.api/2.composables/use-fetch.md +++ b/docs/3.api/2.composables/use-fetch.md @@ -1,108 +1,32 @@ -# `useFetch` +--- +title: 'useFetch' +description: 'Fetch data from an API endpoint with a SSR-friendly composable.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/fetch.ts + size: xs +--- This composable provides a convenient wrapper around [`useAsyncData`](/docs/api/composables/use-async-data) and [`$fetch`](/docs/api/utils/dollarfetch). It automatically generates a key based on URL and fetch options, provides type hints for request url based on server routes, and infers API response type. -::alert{type=warning} -[`useFetch`](/docs/api/composables/use-fetch) is a composable meant to be called directly in a setup function, plugin, or route middleware. It returns reactive composables and handles adding responses to the Nuxt payload so they can be passed from server to client without re-fetching the data on client side when the page hydrates. +::callout +`useFetch` is a composable meant to be called directly in a setup function, plugin, or route middleware. It returns reactive composables and handles adding responses to the Nuxt payload so they can be passed from server to client without re-fetching the data on client side when the page hydrates. :: -## Type - -```ts [Signature] -function useFetch<DataT, ErrorT>( - url: string | Request | Ref<string | Request> | () => string | Request, - options?: UseFetchOptions<DataT> -): Promise<AsyncData<DataT, ErrorT>> +## Usage -type UseFetchOptions<DataT> = { - key?: string - method?: string - query?: SearchParams - params?: SearchParams - body?: RequestInit['body'] | Record<string, any> - headers?: Record<string, string> | [key: string, value: string][] | Headers - baseURL?: string - server?: boolean - lazy?: boolean - immediate?: boolean - default?: () => DataT - transform?: (input: DataT) => DataT - pick?: string[] - watch?: WatchSource[] | false -} - -type AsyncData<DataT, ErrorT> = { - data: Ref<DataT | null> - pending: Ref<boolean> - refresh: (opts?: AsyncDataExecuteOptions) => Promise<void> - execute: (opts?: AsyncDataExecuteOptions) => Promise<void> - error: Ref<ErrorT | null> - status: Ref<AsyncDataRequestStatus> -} - -interface AsyncDataExecuteOptions { - dedupe?: boolean -} - -type AsyncDataRequestStatus = 'idle' | 'pending' | 'success' | 'error' -``` - -## Params - -* **URL**: The URL to fetch. -* **Options (extends [unjs/ofetch](https://github.com/unjs/ofetch) options & [AsyncDataOptions](/docs/api/composables/use-async-data#params))**: - * `method`: Request method. - * `query`: Adds query search params to URL using [ufo](https://github.com/unjs/ufo) - * `params`: Alias for `query` - * `body`: Request body - automatically stringified (if an object is passed). - * `headers`: Request headers. - * `baseURL`: Base URL for the request. - -::alert{type=info} -All fetch options can be given a `computed` or `ref` value. These will be watched and new requests made automatically with any new values if they are updated. -:: - -* **Options (from `useAsyncData`)**: - * `key`: a unique key to ensure that data fetching can be properly de-duplicated across requests, if not provided, it will be generated based on the static code location where `useAsyncData` is used. - * `server`: whether to fetch the data on the server (defaults to `true`) - * `lazy`: whether to resolve the async function after loading the route, instead of blocking client-side navigation (defaults to `false`) - * `immediate`: when set to `false`, will prevent the request from firing immediately. (defaults to `true`) - * `default`: a factory function to set the default value of the `data`, before the async function resolves - useful with the `lazy: true` or `immediate: false` option - * `transform`: a function that can be used to alter `handler` function result after resolving - * `pick`: only pick specified keys in this array from the `handler` function result - * `watch`: watch an array of reactive sources and auto-refresh the fetch result when they change. Fetch options and URL are watched by default. You can completely ignore reactive sources by using `watch: false`. Together with `immediate: false`, this allows for a fully-manual `useFetch`. - -::alert{type=warning} -If you provide a function or ref as the `url` parameter, or if you provide functions as arguments to the `options` parameter, then the [`useFetch`](/docs/api/composables/use-fetch) call will not match other [`useFetch`](/docs/api/composables/use-fetch) calls elsewhere in your codebase, even if the options seem to be identical. If you wish to force a match, you may provide your own key in `options`. -:: - -## Return Values - -* **data**: the result of the asynchronous function that is passed in. -* **pending**: a boolean indicating whether the data is still being fetched. -* **refresh**/**execute**: a function that can be used to refresh the data returned by the `handler` function. -* **error**: an error object if the data fetching failed. -* **status**: a string indicating the status of the data request (`"idle"`, `"pending"`, `"success"`, `"error"`). - -By default, Nuxt waits until a `refresh` is finished before it can be executed again. - -::alert{type=warning} -If you have not fetched data on the server (for example, with `server: false`), then the data _will not_ be fetched until hydration completes. This means even if you await [`useFetch`](/docs/api/composables/use-fetch) on client-side, `data` will remain null within `<script setup>`. -:: - -## Example - -```ts +```vue [pages/index.vue] +<script setup> const route = useRoute() const { data, pending, error, refresh } = await useFetch(`https://api.nuxtjs.dev/mountains/${route.params.slug}`, { pick: ['title'] }) +</script> ``` -Adding Query Search Params: - Using the `query` option, you can add search parameters to your query. This option is extended from [unjs/ofetch](https://github.com/unjs/ofetch) and is using [unjs/ufo](https://github.com/unjs/ufo) to create the URL. Objects are automatically stringified. ```ts @@ -114,7 +38,7 @@ const { data, pending, error, refresh } = await useFetch('https://api.nuxtjs.dev Results in `https://api.nuxtjs.dev/mountains?param1=value1¶m2=value2` -Using [interceptors](https://github.com/unjs/ofetch#%EF%B8%8F-interceptors): +You can also use [interceptors](https://github.com/unjs/ofetch#%EF%B8%8F-interceptors): ```ts const { data, pending, error, refresh } = await useFetch('/api/auth/login', { @@ -136,12 +60,96 @@ const { data, pending, error, refresh } = await useFetch('/api/auth/login', { }) ``` -::alert{type=warning} -[`useFetch`](/docs/api/composables/use-fetch) is a reserved function name transformed by the compiler, so you should not name your own function `useFetch`. +::callout{color="amber" icon="i-ph-warning-duotone"} +`useFetch` is a reserved function name transformed by the compiler, so you should not name your own function `useFetch`. :: :link-example{to="/docs/examples/advanced/use-custom-fetch-composable"} -:ReadMore{link="/docs/getting-started/data-fetching"} +:read-more{to="/docs/getting-started/data-fetching"} :link-example{to="/docs/examples/features/data-fetching"} + +## Params + +- `URL`: The URL to fetch. +- `Options` (extends [unjs/ofetch](https://github.com/unjs/ofetch) options & [AsyncDataOptions](/docs/api/composables/use-async-data#params)): + - `method`: Request method. + - `query`: Adds query search params to URL using [ufo](https://github.com/unjs/ufo) + - `params`: Alias for `query` + - `body`: Request body - automatically stringified (if an object is passed). + - `headers`: Request headers. + - `baseURL`: Base URL for the request. + +::callout +All fetch options can be given a `computed` or `ref` value. These will be watched and new requests made automatically with any new values if they are updated. +:: + +- `Options` (from [`useAsyncData`](/docs/api/composables/use-async-data)): + - `key`: a unique key to ensure that data fetching can be properly de-duplicated across requests, if not provided, it will be generated based on the static code location where `useAsyncData` is used. + - `server`: whether to fetch the data on the server (defaults to `true`) + - `lazy`: whether to resolve the async function after loading the route, instead of blocking client-side navigation (defaults to `false`) + - `immediate`: when set to `false`, will prevent the request from firing immediately. (defaults to `true`) + - `default`: a factory function to set the default value of the `data`, before the async function resolves - useful with the `lazy: true` or `immediate: false` option + - `transform`: a function that can be used to alter `handler` function result after resolving + - `pick`: only pick specified keys in this array from the `handler` function result + - `watch`: watch an array of reactive sources and auto-refresh the fetch result when they change. Fetch options and URL are watched by default. You can completely ignore reactive sources by using `watch: false`. Together with `immediate: false`, this allows for a fully-manual `useFetch`. + +::callout +If you provide a function or ref as the `url` parameter, or if you provide functions as arguments to the `options` parameter, then the `useFetch` call will not match other `useFetch` calls elsewhere in your codebase, even if the options seem to be identical. If you wish to force a match, you may provide your own key in `options`. +:: + +## Return Values + +- `data`: the result of the asynchronous function that is passed in. +- `pending`: a boolean indicating whether the data is still being fetched. +- `refresh`/`execute`: a function that can be used to refresh the data returned by the `handler` function. +- `error`: an error object if the data fetching failed. +- `status`: a string indicating the status of the data request (`"idle"`, `"pending"`, `"success"`, `"error"`). + +By default, Nuxt waits until a `refresh` is finished before it can be executed again. + +::callout +If you have not fetched data on the server (for example, with `server: false`), then the data _will not_ be fetched until hydration completes. This means even if you await `useFetch` on client-side, `data` will remain null within `<script setup>`. +:: + +## Type + +```ts [Signature] +function useFetch<DataT, ErrorT>( + url: string | Request | Ref<string | Request> | () => string | Request, + options?: UseFetchOptions<DataT> +): Promise<AsyncData<DataT, ErrorT>> + +type UseFetchOptions<DataT> = { + key?: string + method?: string + query?: SearchParams + params?: SearchParams + body?: RequestInit['body'] | Record<string, any> + headers?: Record<string, string> | [key: string, value: string][] | Headers + baseURL?: string + server?: boolean + lazy?: boolean + immediate?: boolean + default?: () => DataT + transform?: (input: DataT) => DataT + pick?: string[] + watch?: WatchSource[] | false +} + +type AsyncData<DataT, ErrorT> = { + data: Ref<DataT | null> + pending: Ref<boolean> + refresh: (opts?: AsyncDataExecuteOptions) => Promise<void> + execute: (opts?: AsyncDataExecuteOptions) => Promise<void> + error: Ref<ErrorT | null> + status: Ref<AsyncDataRequestStatus> +} + +interface AsyncDataExecuteOptions { + dedupe?: boolean +} + +type AsyncDataRequestStatus = 'idle' | 'pending' | 'success' | 'error' +``` diff --git a/docs/3.api/2.composables/use-head-safe.md b/docs/3.api/2.composables/use-head-safe.md index 62dc5c2f3e83..962dd15ebbcb 100644 --- a/docs/3.api/2.composables/use-head-safe.md +++ b/docs/3.api/2.composables/use-head-safe.md @@ -1,9 +1,13 @@ --- +title: useHeadSafe description: The recommended way to provide head data with user input. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/unjs/unhead/blob/main/packages/unhead/src/composables/useHeadSafe.ts + size: xs --- -# `useHeadSafe` - The `useHeadSafe` composable is a wrapper around the [`useHead`](/docs/api/composables/use-head) composable that restricts the input to only allow safe values. ## Usage @@ -24,7 +28,9 @@ useHeadSafe({ // <meta content="0;javascript:alert(1)"> ``` -Read more on [unhead documentation](https://unhead.unjs.io/usage/composables/use-head-safe). +::read-more{to="https://unhead.unjs.io/usage/composables/use-head-safe" target="_blank"} +Read more on `unhead` documentation. +:: ## Type diff --git a/docs/3.api/2.composables/use-head.md b/docs/3.api/2.composables/use-head.md index 6a03e5ada0e0..02b48cada89f 100644 --- a/docs/3.api/2.composables/use-head.md +++ b/docs/3.api/2.composables/use-head.md @@ -1,12 +1,16 @@ --- +title: useHead description: useHead customizes the head properties of individual pages of your Nuxt app. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/unjs/unhead/blob/main/packages/unhead/src/composables/useHead.ts + size: xs --- -# useHead - The [`useHead`](/docs/api/composables/use-head) composable function allows you to manage your head tags in a programmatic and reactive way, powered by [Unhead](https://unhead.unjs.io/). If the data comes from a user or other untrusted source, we recommend you check out [`useHeadSafe`](/docs/api/composables/use-head-safe) -:ReadMore{link="/docs/getting-started/seo-meta"} +:read-more{to="/docs/getting-started/seo-meta"} ## Type @@ -33,11 +37,11 @@ interface MetaObject { See [@unhead/schema](https://github.com/unjs/unhead/blob/main/packages/schema/src/schema.ts) for more detailed types. -::alert{type=info} -The properties of [`useHead`](/docs/api/composables/use-head) can be dynamic, accepting `ref`, `computed` and `reactive` properties. `meta` parameter can also accept a function returning an object to make the entire object reactive. +::callout +The properties of `useHead` can be dynamic, accepting `ref`, `computed` and `reactive` properties. `meta` parameter can also accept a function returning an object to make the entire object reactive. :: -## Parameters +## Params ### `meta` @@ -45,56 +49,21 @@ The properties of [`useHead`](/docs/api/composables/use-head) can be dynamic, ac An object accepting the following head metadata: -- `meta` - - **Type**: `Array<Record<string, any>>` - - Each element in the array is mapped to a newly-created `<meta>` tag, where object properties are mapped to the corresponding attributes. - -- `link` - - **Type**: `Array<Record<string, any>>` - - Each element in the array is mapped to a newly-created `<link>` tag, where object properties are mapped to the corresponding attributes. - -- `style` - - **Type**: `Array<Record<string, any>>` - - Each element in the array is mapped to a newly-created `<style>` tag, where object properties are mapped to the corresponding attributes. - -- `script` - - **Type**: `Array<Record<string, any>>` - - Each element in the array is mapped to a newly-created `<script>` tag, where object properties are mapped to the corresponding attributes. - -- `noscript` - - **Type**: `Array<Record<string, any>>` - - Each element in the array is mapped to a newly-created `<noscript>` tag, where object properties are mapped to the corresponding attributes. - -- `titleTemplate` - - **Type**: `string` | `((title: string) => string)` - - Configures dynamic template to customize the page title on an individual page. - -- `title` - - **Type**: `string` - - Sets static page title on an individual page. - -- `bodyAttrs` - - **Type**: `Record<string, any>` - - Sets attributes of the `<body>` tag. Each object property is mapped to the corresponding attribute. - -- `htmlAttrs` - - **Type**: `Record<string, any>` - - Sets attributes of the `<html>` tag. Each object property is mapped to the corresponding attribute. +- `meta`: Each element in the array is mapped to a newly-created `<meta>` tag, where object properties are mapped to the corresponding attributes. + - **Type**: `Array<Record<string, any>>` +- `link`: Each element in the array is mapped to a newly-created `<link>` tag, where object properties are mapped to the corresponding attributes. + - **Type**: `Array<Record<string, any>>` +- `style`: Each element in the array is mapped to a newly-created `<style>` tag, where object properties are mapped to the corresponding attributes. + - **Type**: `Array<Record<string, any>>` +- `script`: Each element in the array is mapped to a newly-created `<script>` tag, where object properties are mapped to the corresponding attributes. + - **Type**: `Array<Record<string, any>>` +- `noscript`: Each element in the array is mapped to a newly-created `<noscript>` tag, where object properties are mapped to the corresponding attributes. + - **Type**: `Array<Record<string, any>>` +- `titleTemplate`: Configures dynamic template to customize the page title on an individual page. + - **Type**: `string` | `((title: string) => string)` +- `title`: Sets static page title on an individual page. + - **Type**: `string` +- `bodyAttrs`: Sets attributes of the `<body>` tag. Each object property is mapped to the corresponding attribute. + - **Type**: `Record<string, any>` +- `htmlAttrs`: Sets attributes of the `<html>` tag. Each object property is mapped to the corresponding attribute. + - **Type**: `Record<string, any>` diff --git a/docs/3.api/2.composables/use-hydration.md b/docs/3.api/2.composables/use-hydration.md index 288d9de9ea54..b06f1a6b1242 100644 --- a/docs/3.api/2.composables/use-hydration.md +++ b/docs/3.api/2.composables/use-hydration.md @@ -1,9 +1,19 @@ -# `useHydration` - -Allows full control of the hydration cycle to set and receive data from the server. +--- +title: 'useHydration' +description: 'Allows full control of the hydration cycle to set and receive data from the server.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/hydrate.ts + size: xs +--- `useHydration` is a built-in composable that provides a way to set data on the server side every time a new HTTP request is made and receive that data on the client side. This way `useHydration` allows you to take full control of the hydration cycle. +::callout +This is an advanced composable and is mostly used internally (`useAsyncData`) or by Nuxt modules. +:: + ## Type ```ts [signature] @@ -14,25 +24,13 @@ You can use `useHydration()` within composables, plugins and components. `useHydration` accepts three parameters: -- `key` - - **Type**: `String` - - `key` is a unique key that identifies the data in your Nuxt application - -- `get` - - **Type**: `Function` - - `get` is a function that returns the value to set the initial data - -- `set` - - **Type**: `Function` - - `set` a function that receives the data on the client-side +- `key`: unique key that identifies the data in your Nuxt application + - **Type**: `String` +- `get`: function that returns the value to set the initial data + - **Type**: `Function` +- `set`: function that receives the data on the client-side + - **Type**: `Function` Once the initial data is returned using the `get` function on the server side, you can access that data within `nuxtApp.payload` using the unique key that is passed as the first parameter in `useHydration` composable. -::ReadMore{link="/docs/getting-started/data-fetching"} -:: +:read-more{to="/docs/getting-started/data-fetching"} diff --git a/docs/3.api/2.composables/use-lazy-async-data.md b/docs/3.api/2.composables/use-lazy-async-data.md index ed96635962ff..a32f52d685cc 100644 --- a/docs/3.api/2.composables/use-lazy-async-data.md +++ b/docs/3.api/2.composables/use-lazy-async-data.md @@ -1,22 +1,27 @@ --- +title: useLazyAsyncData description: This wrapper around useAsyncData triggers navigation immediately. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts + size: xs --- -# `useLazyAsyncData` - -`useLazyAsyncData` provides a wrapper around [`useAsyncData`](/docs/api/composables/use-async-data) that triggers navigation before the handler is resolved by setting the `lazy` option to `true`. - ## Description -By default, [useAsyncData](/docs/api/composables/use-async-data) blocks navigation until its async handler is resolved. +By default, [`useAsyncData`](/docs/api/composables/use-async-data) blocks navigation until its async handler is resolved. `useLazyAsyncData` provides a wrapper around [`useAsyncData`](/docs/api/composables/use-async-data) that triggers navigation before the handler is resolved by setting the `lazy` option to `true`. -> `useLazyAsyncData` has the same signature as [`useAsyncData`](/docs/api/composables/use-async-data) . -:ReadMore{link="/docs/api/composables/use-async-data"} +::callout +`useLazyAsyncData` has the same signature as [`useAsyncData`](/docs/api/composables/use-async-data). +:: + +:read-more{to="/docs/api/composables/use-async-data"} ## Example -```vue +```vue [pages/index.vue] <script setup lang="ts"> /* Navigation will occur before fetching is complete. Handle pending and error states directly within your component's template @@ -36,8 +41,8 @@ watch(count, (newCount) => { </template> ``` -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} `useLazyAsyncData` is a reserved function name transformed by the compiler, so you should not name your own function `useLazyAsyncData`. :: -:ReadMore{link="/docs/getting-started/data-fetching#uselazyasyncdata"} +:read-more{to="/docs/getting-started/data-fetching#uselazyasyncdata"} diff --git a/docs/3.api/2.composables/use-lazy-fetch.md b/docs/3.api/2.composables/use-lazy-fetch.md index c79f9be1b509..7883af9c5539 100644 --- a/docs/3.api/2.composables/use-lazy-fetch.md +++ b/docs/3.api/2.composables/use-lazy-fetch.md @@ -1,22 +1,26 @@ --- +title: 'useLazyFetch' description: This wrapper around useFetch triggers navigation immediately. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/fetch.ts + size: xs --- -# `useLazyFetch` - -`useLazyFetch` provides a wrapper around [`useFetch`](/docs/api/composables/use-fetch) that triggers navigation before the handler is resolved by setting the `lazy` option to `true`. - ## Description -By default, [useFetch](/docs/api/composables/use-fetch) blocks navigation until its async handler is resolved. +By default, [`useFetch`](/docs/api/composables/use-fetch) blocks navigation until its async handler is resolved. `useLazyFetch` provides a wrapper around [`useFetch`](/docs/api/composables/use-fetch) that triggers navigation before the handler is resolved by setting the `lazy` option to `true`. -> [`useLazyFetch`](/docs/api/composables/use-lazy-fetch) has the same signature as `useFetch`. +::callout +`useLazyFetch` has the same signature as [`useFetch`](/docs/api/composables/use-fetch). +:: -:ReadMore{link="/docs/api/composables/use-fetch"} +:read-more{to="/docs/api/composables/use-fetch"} ## Example -```vue +```vue [pages/index.vue] <script setup lang="ts"> /* Navigation will occur before fetching is complete. Handle pending and error states directly within your component's template @@ -40,8 +44,8 @@ watch(posts, (newPosts) => { </template> ``` -::alert{type=warning} +::callout `useLazyFetch` is a reserved function name transformed by the compiler, so you should not name your own function `useLazyFetch`. :: -:ReadMore{link="/docs/getting-started/data-fetching#uselazyfetch"} +:read-more{to="/docs/getting-started/data-fetching"} diff --git a/docs/3.api/2.composables/use-nuxt-app.md b/docs/3.api/2.composables/use-nuxt-app.md index 126ae266212a..428dfb9b56ec 100644 --- a/docs/3.api/2.composables/use-nuxt-app.md +++ b/docs/3.api/2.composables/use-nuxt-app.md @@ -1,9 +1,15 @@ -# `useNuxtApp` +--- +title: 'useNuxtApp' +description: 'Access the shared runtime context of the Nuxt Application.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/nuxt.ts + size: xs +--- `useNuxtApp` is a built-in composable that provides a way to access shared runtime context of Nuxt, which is available on both client and server side. It helps you access the Vue app instance, runtime hooks, runtime config variables and internal states, such as `ssrContext` and `payload`. -You can use `useNuxtApp()` within composables, plugins and components. - ```vue [app.vue] <script setup lang="ts"> const nuxtApp = useNuxtApp() @@ -18,8 +24,6 @@ const nuxtApp = useNuxtApp() `provide` function accepts `name` and `value` parameters. -**Example:** - ```js const nuxtApp = useNuxtApp() nuxtApp.provide('hello', (name) => `Hello ${name}!`) @@ -38,7 +42,7 @@ Hooks available in `nuxtApp` allows you to customize the runtime aspects of your See [Runtime Hooks](/docs/api/advanced/hooks#app-hooks-runtime) for available runtime hooks called by Nuxt. -```js [plugins/test.ts] +```ts [plugins/test.ts] export default defineNuxtPlugin((nuxtApp) => { nuxtApp.hook('page:start', () => { /* your code goes here */ @@ -56,7 +60,7 @@ export default defineNuxtPlugin((nuxtApp) => { `callHook` returns a promise when called with any of the existing hooks. -```js +```ts await nuxtApp.callHook('my-plugin:init') ``` @@ -66,72 +70,79 @@ await nuxtApp.callHook('my-plugin:init') ### `vueApp` -`vueApp` is the global Vue.js [application instance](https://vuejs.org/api/application.html#application-api) that you can access through `nuxtApp`. Some useful methods: +`vueApp` is the global Vue.js [application instance](https://vuejs.org/api/application.html#application-api) that you can access through `nuxtApp`. -- [**component()**](https://vuejs.org/api/application.html#app-component) - Registers a global component if passing both a name string and a component definition, or retrieves an already registered one if only the name is passed. -- [**directive()**](https://vuejs.org/api/application.html#app-directive) - Registers a global custom directive if passing both a name string and a directive definition, or retrieves an already registered one if only the name is passed[(example)](/docs/guide/directory-structure/plugins#vue-directives). -- [**use()**](https://vuejs.org/api/application.html#app-use) - Installs a **[Vue.js Plugin](https://vuejs.org/guide/reusability/plugins.html)** [(example)](/docs/guide/directory-structure/plugins#vue-plugins). +Some useful methods: +- [`component()`](https://vuejs.org/api/application.html#app-component) - Registers a global component if passing both a name string and a component definition, or retrieves an already registered one if only the name is passed. +- [`directive()`](https://vuejs.org/api/application.html#app-directive) - Registers a global custom directive if passing both a name string and a directive definition, or retrieves an already registered one if only the name is passed[(example)](/docs/guide/directory-structure/plugins#vue-directives). +- [`use()`](https://vuejs.org/api/application.html#app-use) - Installs a **[Vue.js Plugin](https://vuejs.org/guide/reusability/plugins.html)** [(example)](/docs/guide/directory-structure/plugins#vue-plugins). -:read-more{icon="i-simple-icons-vuedotjs" link="https://vuejs.org/api/application.html#application-api"} +:read-more{icon="i-simple-icons-vuedotjs" to="https://vuejs.org/api/application.html#application-api"} ### `ssrContext` -`ssrContext` is generated during server-side rendering and it is only available on the server side. Nuxt exposes the following properties through `ssrContext`: +`ssrContext` is generated during server-side rendering and it is only available on the server side. -- **`url`** (string) - Current request url. -- **`event`** ([unjs/h3](https://github.com/unjs/h3) request event) - Access to `req` and `res` objects for the current request. -- **`payload`** (object) - NuxtApp payload object. +Nuxt exposes the following properties through `ssrContext`: +- `url` (string) - Current request url. +- `event` ([unjs/h3](https://github.com/unjs/h3) request event) - Access the request & response of the current route. +- `payload` (object) - NuxtApp payload object. ### `payload` `payload` exposes data and state variables from server side to client side. The following keys will be available on the client after they have been passed from the server side: -- **serverRendered** (boolean) - Indicates if response is server-side-rendered. -- **data** (object) - When you fetch the data from an API endpoint using either [`useFetch`](/docs/api/composables/use-fetch) or [`useAsyncData`](/docs/api/composables/use-async-data) , resulting payload can be accessed from the `payload.data`. This data is cached and helps you prevent fetching the same data in case an identical request is made more than once. - -```vue [app.vue] -<script setup lang="ts"> -const { data } = await useAsyncData('count', () => $fetch('/api/count')) -</script> -``` +- `serverRendered` (boolean) - Indicates if response is server-side-rendered. +- `data` (object) - When you fetch the data from an API endpoint using either [`useFetch`](/docs/api/composables/use-fetch) or [`useAsyncData`](/docs/api/composables/use-async-data) , resulting payload can be accessed from the `payload.data`. This data is cached and helps you prevent fetching the same data in case an identical request is made more than once. + + ::code-group + ```vue [app.vue] + <script setup lang="ts"> + const { data } = await useAsyncData('count', () => $fetch('/api/count')) + </script> + ``` + ```ts [server/api/count.ts] + export default defineEventHandler(event => { + return { count: 1 } + }) + ``` + :: -After fetching the value of `count` using [`useAsyncData`](/docs/api/composables/use-async-data) in the example above, if you access `payload.data`, you will see `{ count: 1 }` recorded there. The value of `count` is updated whenever the page count increases. + After fetching the value of `count` using [`useAsyncData`](/docs/api/composables/use-async-data) in the example above, if you access `payload.data`, you will see `{ count: 1 }` recorded there. -When accessing the same `payload.data` from [ssrcontext](#ssrcontext), you can access the same value on the server side as well. + When accessing the same `payload.data` from [`ssrcontext`](#ssrcontext), you can access the same value on the server side as well. -- **state** (object) - When you use [`useState`](/docs/api/composables/use-state) composable in Nuxt to set shared state, this state data is accessed through `payload.state.[name-of-your-state]`. +- `state` (object) - When you use [`useState`](/docs/api/composables/use-state) composable in Nuxt to set shared state, this state data is accessed through `payload.state.[name-of-your-state]`. -```js [plugins/my-plugin.ts] -export const useColor = () => useState<string>('color', () => 'pink') + ```ts [plugins/my-plugin.ts] + export const useColor = () => useState<string>('color', () => 'pink') -export default defineNuxtPlugin((nuxtApp) => { - if (process.server) { - const color = useColor() - } -}) -``` + export default defineNuxtPlugin((nuxtApp) => { + if (process.server) { + const color = useColor() + } + }) + ``` -It is also possible to use more advanced types, such as `ref`, `reactive`, `shallowRef`, `shallowReactive` and `NuxtError`. + It is also possible to use more advanced types, such as `ref`, `reactive`, `shallowRef`, `shallowReactive` and `NuxtError`. -You can also add your own types, with a special plugin helper: + You can also add your own types, with a special plugin helper: -```ts [plugins/custom-payload.ts] - /** - * This kind of plugin runs very early in the Nuxt lifecycle, before we revive the payload. - * You will not have access to the router or other Nuxt-injected properties. - */ -export default definePayloadPlugin((nuxtApp) => { - definePayloadReducer('BlinkingText', data => data === '<blink>' && '_') - definePayloadReviver('BlinkingText', () => '<blink>') -}) -``` + ```ts [plugins/custom-payload.ts] + /** + * This kind of plugin runs very early in the Nuxt lifecycle, before we revive the payload. + * You will not have access to the router or other Nuxt-injected properties. + */ + export default definePayloadPlugin((nuxtApp) => { + definePayloadReducer('BlinkingText', data => data === '<blink>' && '_') + definePayloadReviver('BlinkingText', () => '<blink>') + }) + ``` ### `isHydrating` Use `nuxtApp.isHydrating` (boolean) to check if the Nuxt app is hydrating on the client side. -**Example:** - ```ts [components/nuxt-error-boundary.ts] export default defineComponent({ setup (_props, { slots, emit }) { @@ -147,23 +158,13 @@ export default defineComponent({ ### `runWithContext` -::alert - -<p> - -You are likely here because you got a "Nuxt instance unavailable" message. Please use this method sparingly, and report -examples that are causing issues, so that it can ultimately be solved at the framework level. - -</p> - +::callout +You are likely here because you got a "Nuxt instance unavailable" message. Please use this method sparingly, and report examples that are causing issues, so that it can ultimately be solved at the framework level. :: -The `runWithContext` method is meant to be used to call a function and give it an explicit Nuxt context. Typically, the -Nuxt context is passed around implicitly and you do not need to worry about this. However, when working with complex -`async`/`await` scenarios in middleware/plugins, you can run into instances where the current instance has been unset -after an async call. +The `runWithContext` method is meant to be used to call a function and give it an explicit Nuxt context. Typically, the Nuxt context is passed around implicitly and you do not need to worry about this. However, when working with complex `async`/`await` scenarios in middleware/plugins, you can run into instances where the current instance has been unset after an async call. -```js +```ts [middleware/auth.ts] export default defineNuxtRouteMiddleware(async (to, from) => { const nuxtApp = useNuxtApp() let user @@ -186,18 +187,12 @@ export default defineNuxtRouteMiddleware(async (to, from) => { const result = nuxtApp.runWithContext(() => functionWithContext()) ``` -##### `functionWithContext` - -Any function that requires the context of the current Nuxt application. This context will be correctly applied automatically. - -##### Return value +- `functionWithContext`: Any function that requires the context of the current Nuxt application. This context will be correctly applied automatically. `runWithContext` will return whatever is returned by `functionWithContext`. #### A Deeper Explanation of Context -##### Background - Vue.js Composition API (and Nuxt composables similarly) work by depending on an implicit context. During the lifecycle, Vue sets the temporary instance of the current component (and Nuxt temporary instance of nuxtApp) to a global variable and unsets it in same tick. When rendering on the server side, there are multiple requests from different users and nuxtApp running in a same global context. Because of this, Nuxt and Vue immediately unset this global instance to avoid leaking a shared reference between two users or components. What it does mean? The Composition API and Nuxt Composables are only available during lifecycle and in same tick before any async operation: @@ -230,7 +225,7 @@ getCurrentInstance() // Still works! For a better description of what Vue actually does, see [unjs/unctx#2 (comment)](https://github.com/unjs/unctx/issues/2#issuecomment-942193723). -##### Solution +#### Solution This is where `runWithContext` can be used to restore context, similarly to how `<script setup>` works. @@ -240,16 +235,16 @@ Nuxt composables have the same design as the Vue Composition API and therefore n Vue currently only supports async context restoration for `<script setup>` for async/await usage. In Nuxt 3, the transform support for `defineNuxtPlugin()` and `defineNuxtRouteMiddleware()` was added, which means when you use them Nuxt automatically transforms them with context restoration. -##### Remaining Issues +#### Remaining Issues The `unjs/unctx` transformation to automatically restore context seems buggy with `try/catch` statements containing `await` which ultimately needs to be solved in order to remove the requirement of the workaround suggested above. -##### Native Async Context +#### Native Async Context Using a new experimental feature, it is possible to enable native async context support using [Node.js `AsyncLocalStorage`](https://nodejs.org/api/async_context.html#class-asynclocalstorage) and new unctx support to make async context available **natively** to **any nested async composable** without needing a transform or manual passing/calling with context. -::alert{type=warning} +::callout Native async context support works currently in Bun and Node. :: -:ReadMore{link="/docs/guide/going-further/experimental-features#asynccontext"} +:read-more{to="/docs/guide/going-further/experimental-features#asynccontext"} diff --git a/docs/3.api/2.composables/use-nuxt-data.md b/docs/3.api/2.composables/use-nuxt-data.md index aa9fd8c2b66e..e73300a65edf 100644 --- a/docs/3.api/2.composables/use-nuxt-data.md +++ b/docs/3.api/2.composables/use-nuxt-data.md @@ -1,47 +1,54 @@ -# `useNuxtData` - +--- +title: 'useNuxtData' +description: 'Access the current cached value of data fetching composables.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts + size: xs +--- + +::callout `useNuxtData` gives you access to the current cached value of [`useAsyncData`](/docs/api/composables/use-async-data) , `useLazyAsyncData`, [`useFetch`](/docs/api/composables/use-fetch) and [`useLazyFetch`](/docs/api/composables/use-lazy-fetch) with explicitly provided key. +:: -## Type - -```ts -useNuxtData<DataT = any> (key: string): { data: Ref<DataT | null> } -``` - -## Examples - -### Show stale data while fetching in the background +## Usage The example below shows how you can use cached data as a placeholder while the most recent data is being fetched from the server. -```ts [archive.vue] +```vue [pages/posts.vue] +<script setup> // We can access same data later using 'posts' key const { data } = await useFetch('/api/posts', { key: 'posts' }) +</script> ``` -```ts [single.vue] -// Access to the cached value of useFetch in archive.vue +```ts [pages/posts/[id\\].vue] +// Access to the cached value of useFetch in posts.vue (parent route) +const { id } = useRoute().params const { data: posts } = useNuxtData('posts') - -const { data } = await useFetch(`/api/posts/${postId}`, { - key: `post-${postId}`, - default: () => { +const { data } = useLazyFetch(`/api/posts/${id}`, { + key: `post-${id}`, + default() { // Find the individual post from the cache and set it as the default value. - return posts.value.find(post => post.id === postId) + return posts.value.find(post => post.id === id) } }) ``` -### Optimistic Updates +## Optimistic Updates We can leverage the cache to update the UI after a mutation, while the data is being invalidated in the background. -```ts [todos.vue] +```vue [pages/todos.vue] +<script setup> // We can access same data later using 'todos' key -const { data } = await useFetch('/api/todos', { key: 'todos' }) +const { data } = await useAsyncData('todos', () => $fetch('/api/todos')) +</script> ``` -```ts [add-todo.vue] +```vue [components/NewTodo.vue] +<script setup> const newTodo = ref('') const previousTodos = ref([]) @@ -49,7 +56,6 @@ const previousTodos = ref([]) const { data: todos } = useNuxtData('todos') const { data } = await useFetch('/api/addTodo', { - key: 'addTodo', method: 'post', body: { todo: newTodo.value @@ -66,4 +72,11 @@ const { data } = await useFetch('/api/addTodo', { await refreshNuxtData('todos') // Invalidate todos in the background if the request succeeded. } }) +</script> +``` + +## Type + +```ts +useNuxtData<DataT = any> (key: string): { data: Ref<DataT | null> } ``` diff --git a/docs/3.api/2.composables/use-request-event.md b/docs/3.api/2.composables/use-request-event.md index 68ddeeec8511..597c42bcffd5 100644 --- a/docs/3.api/2.composables/use-request-event.md +++ b/docs/3.api/2.composables/use-request-event.md @@ -1,13 +1,16 @@ --- -title: "useRequestEvent" -description: "You can use useRequestEvent to access the incoming request." +title: 'useRequestEvent' +description: 'Access the incoming request event with the useRequestEvent composable.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ssr.ts + size: xs --- -# `useRequestEvent` - Within your pages, components, and plugins you can use `useRequestEvent` to access the incoming request. -```js +```ts // Get underlying request event const event = useRequestEvent() @@ -15,6 +18,6 @@ const event = useRequestEvent() const url = event.path ``` -::alert{icon=๐Ÿ‘‰} +::callout In the browser, `useRequestEvent` will return `undefined`. :: diff --git a/docs/3.api/2.composables/use-request-headers.md b/docs/3.api/2.composables/use-request-headers.md index 7a89b69f07ec..2b286f0d5057 100644 --- a/docs/3.api/2.composables/use-request-headers.md +++ b/docs/3.api/2.composables/use-request-headers.md @@ -1,10 +1,13 @@ --- title: "useRequestHeaders" description: "Use useRequestHeaders to access the incoming request headers." +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ssr.ts + size: xs --- -# `useRequestHeaders` - You can use built-in [`useRequestHeaders`](/docs/api/composables/use-request-headers) composable to access the incoming request headers within your pages, components, and plugins. ```js @@ -15,13 +18,13 @@ const headers = useRequestHeaders() const headers = useRequestHeaders(['cookie']) ``` -::alert{icon=๐Ÿ‘‰} -In the browser, [`useRequestHeaders`](/docs/api/composables/use-request-headers) will return an empty object. +::callout +In the browser, `useRequestHeaders` will return an empty object. :: ## Example -We can use [`useRequestHeaders`](/docs/api/composables/use-request-headers) to access and proxy the initial request's `authorization` header to any future internal requests during SSR. +We can use `useRequestHeaders` to access and proxy the initial request's `authorization` header to any future internal requests during SSR. The example below adds the `authorization` request header to an isomorphic `$fetch` call. @@ -32,7 +35,3 @@ const { data } = await useFetch('/api/confidential', { }) </script> ``` - -::alert{icon=๐Ÿ‘‰} -[Another example](/docs/getting-started/data-fetching#example-pass-client-headers-to-the-api) shows how we can pass cookies from the initial request to another API route. -:: diff --git a/docs/3.api/2.composables/use-request-url.md b/docs/3.api/2.composables/use-request-url.md index ff2b4975238f..2faabcb7646f 100644 --- a/docs/3.api/2.composables/use-request-url.md +++ b/docs/3.api/2.composables/use-request-url.md @@ -1,4 +1,12 @@ -# useRequestURL +--- +title: 'useRequestURL' +description: 'Access the incoming request URL with the useRequestURL composable.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/url.ts + size: xs +--- `useRequestURL` is a helper function that returns an [URL object](https://developer.mozilla.org/en-US/docs/Web/API/URL/URL) working on both server-side and client-side. @@ -22,4 +30,6 @@ const url = useRequestURL() :: -You can find the list of the [URL instance properties](https://developer.mozilla.org/en-US/docs/Web/API/URL#instance_properties) on the MDN documentation. +::callout{icon="i-simple-icons-mdnwebdocs" color="gray" to="https://developer.mozilla.org/en-US/docs/Web/API/URL#instance_properties" target="_blank"} +Read about the URL instance properties on the MDN documentation. +:: diff --git a/docs/3.api/2.composables/use-route.md b/docs/3.api/2.composables/use-route.md index d4e35827b431..10bcdb4de99b 100644 --- a/docs/3.api/2.composables/use-route.md +++ b/docs/3.api/2.composables/use-route.md @@ -1,13 +1,16 @@ --- title: "useRoute" description: The useRoute composable returns the current route. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts + size: xs --- -# `useRoute` - -The [`useRoute`](/docs/api/composables/use-route) composable returns the current route and must be called in a `setup` function, plugin, or route middleware. - +::callout Within the template of a Vue component, you can access the route using `$route`. +:: ## Example @@ -16,7 +19,7 @@ In the following example, we call an API via [`useFetch`](/docs/api/composables/ ```html [~/pages/[slug\\].vue] <script setup lang="ts"> const route = useRoute() -const { data: mountain } = await useFetch(`https://api.nuxtjs.dev/mountains/${route.params.slug}`) +const { data: mountain } = await useFetch(`/api/mountains/${route.params.slug}`) </script> <template> @@ -29,14 +32,16 @@ const { data: mountain } = await useFetch(`https://api.nuxtjs.dev/mountains/${ro If you need to access the route query parameters (for example `example` in the path `/test?example=true`), then you can use `useRoute().query` instead of `useRoute().params`. +## API + Apart from dynamic parameters and query parameters, `useRoute()` also provides the following computed references related to the current route: -* **fullPath**: encoded URL associated with the current route that contains path, query and hash -* **hash**: decoded hash section of the URL that starts with a # -* **matched**: array of normalized matched routes with current route location -* **meta**: custom data attached to the record -* **name**: unique name for the route record -* **path**: encoded pathname section of the URL -* **redirectedFrom**: route location that was attempted to access before ending up on the current route location +- `fullPath`: encoded URL associated with the current route that contains path, query and hash +- `hash`: decoded hash section of the URL that starts with a # +- `matched`: array of normalized matched routes with current route location +- `meta`: custom data attached to the record +- `name`: unique name for the route record +- `path`: encoded pathname section of the URL +- `redirectedFrom`: route location that was attempted to access before ending up on the current route location :read-more{icon="i-simple-icons-vuedotjs" to="https://router.vuejs.org/api/interfaces/RouteLocationNormalizedLoaded.html"} diff --git a/docs/3.api/2.composables/use-router.md b/docs/3.api/2.composables/use-router.md index dd16ff4c69ca..a034f91a1039 100644 --- a/docs/3.api/2.composables/use-router.md +++ b/docs/3.api/2.composables/use-router.md @@ -1,6 +1,11 @@ --- title: "useRouter" description: "The useRouter composable returns the router instance." +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts + size: xs --- ```vue [pages/index.vue] diff --git a/docs/3.api/2.composables/use-runtime-config.md b/docs/3.api/2.composables/use-runtime-config.md index 88b3c5091268..a1dbb7f3e147 100644 --- a/docs/3.api/2.composables/use-runtime-config.md +++ b/docs/3.api/2.composables/use-runtime-config.md @@ -1,6 +1,12 @@ -# `useRuntimeConfig` - -The [`useRuntimeConfig`](/docs/api/composables/use-runtime-config) composable is used to expose config variables within your app. +--- +title: 'useRuntimeConfig' +description: 'Access runtime config variables with the useRuntimeConfig composable.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts + size: xs +--- ## Usage @@ -12,10 +18,12 @@ const config = useRuntimeConfig() ```ts [server/api/foo.ts] export default defineEventHandler((event) => { - const config = useRuntimeConfig() + const config = useRuntimeConfig(event) }) ``` +:read-more{to="/docs/guide/going-further/runtime-config"} + ## Define Runtime Config The example below shows how to set a public API base URL and a secret API token that is only accessible on the server. @@ -36,20 +44,19 @@ export default defineNuxtConfig({ }) ``` -::alert +::callout Variables that need to be accessible on the server are added directly inside `runtimeConfig`. Variables that need to be accessible on both the client and the server are defined in `runtimeConfig.public`. :: -::ReadMore{link="/docs/guide/going-further/runtime-config"} -:: +:read-more{to="/docs/guide/going-further/runtime-config"} ## Access Runtime Config To access runtime config, we can use `useRuntimeConfig()` composable: ```ts [server/api/test.ts] -export default async () => { - const config = useRuntimeConfig() +export default defineEventHandler((event) => { + const config = useRuntimeConfig(event) // Access public variables const result = await $fetch(`/test`, { @@ -69,8 +76,7 @@ In this example, since `apiBase` is defined within the `public` namespace, it is It is possible to update runtime config values using a matching environment variable name prefixed with `NUXT_`. -::ReadMore{link="/docs/guide/going-further/runtime-config"} -:: +:read-more{to="/docs/guide/going-further/runtime-config"} ### Using the `.env` File @@ -81,23 +87,21 @@ NUXT_PUBLIC_API_BASE = "https://api.localhost:5555" NUXT_API_SECRET = "123" ``` -::alert{type=info} +::callout Any environment variables set within `.env` file are accessed using `process.env` in the Nuxt app during **development** and **build/generate**. :: -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} In **production runtime**, you should use platform environment variables and `.env` is not used. :: -::alert{type=warning} -When using git, make sure to add `.env` to the `.gitignore` file to avoid leaking secrets to the git history. -:: +:read-more{to="/docs/guide/directory-structure/env"} ## `app` namespace Nuxt uses `app` namespace in runtime-config with keys including `baseURL` and `cdnURL`. You can customize their values at runtime by setting environment variables. -::alert{type=info} +::callout This is a reserved namespace. You should not introduce additional keys inside `app`. :: @@ -135,5 +139,5 @@ export default defineEventHandler((event) => { }) ``` -::ReadMore{link="/docs/guide/going-further/runtime-config"} -:: +:read-more{to="/docs/guide/going-further/runtime-config"} + diff --git a/docs/3.api/2.composables/use-seo-meta.md b/docs/3.api/2.composables/use-seo-meta.md index 8a5cbac2d180..4426b08081bc 100644 --- a/docs/3.api/2.composables/use-seo-meta.md +++ b/docs/3.api/2.composables/use-seo-meta.md @@ -1,17 +1,22 @@ --- +title: 'useSeoMeta' description: The useSeoMeta composable lets you define your site's SEO meta tags as a flat object with full TypeScript support. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/unjs/unhead/blob/main/packages/unhead/src/composables/useSeoMeta.ts + size: xs --- -# `useSeoMeta` - -The `useSeoMeta` composable lets you define your site's SEO meta tags as a flat object with full TypeScript support. - This helps you avoid common mistakes, such as using `name` instead of `property`, as well as typos - with over 100+ meta tags fully typed. +::callout This is the recommended way to add meta tags to your site as it is XSS safe and has full TypeScript support. -:ReadMore{link="/docs/getting-started/seo-meta"} +:: -## Example +:read-more{to="/docs/getting-started/seo-meta"} + +## Usage ```vue [app.vue] <script setup lang="ts"> @@ -42,3 +47,5 @@ useSeoMeta({ ## Parameters There are over 100 parameters. See the [full list of parameters in the source code](https://github.com/harlan-zw/zhead/blob/main/src/metaFlat.ts). + +:read-more{to="/docs/getting-started/seo-meta"} diff --git a/docs/3.api/2.composables/use-server-seo-meta.md b/docs/3.api/2.composables/use-server-seo-meta.md index 60b8f940606c..4a98275206e0 100644 --- a/docs/3.api/2.composables/use-server-seo-meta.md +++ b/docs/3.api/2.composables/use-server-seo-meta.md @@ -1,11 +1,27 @@ --- +title: 'useServerSeoMeta' description: The useServerSeoMeta composable lets you define your site's SEO meta tags as a flat object with full TypeScript support. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/unjs/unhead/blob/main/packages/unhead/src/composables/useServerSeoMeta.ts + size: xs --- -# `useServerSeoMeta` +Just like [`useSeoMeta`](/docs/api/composables/use-seo-meta), `useServerSeoMeta` composable lets you define your site's SEO meta tags as a flat object with full TypeScript support. -Just like [`useSeoMeta`](/docs/api/composables/use-seo-meta), [`useServerSeoMeta`](/docs/api/composables/use-server-seo-meta) composable lets you define your site's SEO meta tags as a flat object with full TypeScript support. -:ReadMore{link="/docs/api/composables/use-seo-meta"} +:read-more{to="/docs/api/composables/use-seo-meta"} In most instances, the meta doesn't need to be reactive as robots will only scan the initial load. So we recommend using [`useServerSeoMeta`](/docs/api/composables/use-server-seo-meta) as a performance-focused utility that will not do anything (or return a `head` object) on the client. + +```vue [app.vue] +<script setup lang="ts"> +useServerSeoMeta({ + robots: 'index, follow' +}) +</script> +``` + Parameters are exactly the same as with [`useSeoMeta`](/docs/api/composables/use-seo-meta) + +:read-more{to="/docs/getting-started/seo-meta"} diff --git a/docs/3.api/2.composables/use-state.md b/docs/3.api/2.composables/use-state.md index e33472ca057c..40b8bf9c7775 100644 --- a/docs/3.api/2.composables/use-state.md +++ b/docs/3.api/2.composables/use-state.md @@ -1,26 +1,39 @@ --- title: "useState" description: The useState composable creates a reactive and SSR-friendly shared state. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/state.ts + size: xs --- -# `useState` +## Usage ```ts -useState<T>(init?: () => T | Ref<T>): Ref<T> -useState<T>(key: string, init?: () => T | Ref<T>): Ref<T> +// Create a reactive state and set default value +const count = useState('counter', () => Math.round(Math.random() * 100)) + ``` -* **key**: A unique key ensuring that data fetching is properly de-duplicated across requests. If you do not provide a key, then a key that is unique to the file and line number of the instance of [`useState`](/docs/api/composables/use-state) will be generated for you. -* **init**: A function that provides initial value for the state when not initiated. This function can also return a `Ref`. -* **T**: (typescript only) Specify the type of state +:read-more{to="/docs/getting-started/state-management"} -::alert{type=warning} -Because the data inside [`useState`](/docs/api/composables/use-state) will be serialized to JSON, it is important that it does not contain anything that cannot be serialized, such as classes, functions or symbols. +::callout +Because the data inside `useState` will be serialized to JSON, it is important that it does not contain anything that cannot be serialized, such as classes, functions or symbols. :: -::alert{type=warning} -[`useState`](/docs/api/composables/use-state) is a reserved function name transformed by the compiler, so you should not name your own function `useState`. +::callout{color="amber" icon="i-ph-warning-duotone"} +`useState` is a reserved function name transformed by the compiler, so you should not name your own function `useState`. :: -::ReadMore{link="/docs/getting-started/state-management"} -:: + +## Type + +```ts +useState<T>(init?: () => T | Ref<T>): Ref<T> +useState<T>(key: string, init?: () => T | Ref<T>): Ref<T> +``` + +- `key`: A unique key ensuring that data fetching is properly de-duplicated across requests. If you do not provide a key, then a key that is unique to the file and line number of the instance of [`useState`](/docs/api/composables/use-state) will be generated for you. +- `init`: A function that provides initial value for the state when not initiated. This function can also return a `Ref`. +- `T`: (typescript only) Specify the type of state diff --git a/docs/3.api/3.utils/abort-navigation.md b/docs/3.api/3.utils/abort-navigation.md index 375f9aa63244..9667fb60a2e3 100644 --- a/docs/3.api/3.utils/abort-navigation.md +++ b/docs/3.api/3.utils/abort-navigation.md @@ -1,5 +1,10 @@ --- title: "abortNavigation" +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts + size: xs --- # `abortNavigation` diff --git a/docs/3.api/3.utils/add-route-middleware.md b/docs/3.api/3.utils/add-route-middleware.md index 4e45d16aab46..ed8bf78a8bec 100644 --- a/docs/3.api/3.utils/add-route-middleware.md +++ b/docs/3.api/3.utils/add-route-middleware.md @@ -1,6 +1,11 @@ --- title: "addRouteMiddleware" description: addRouteMiddleware() is a helper function to dynamically add middleware in your application. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts + size: xs --- # `addRouteMiddleware` diff --git a/docs/3.api/3.utils/clear-error.md b/docs/3.api/3.utils/clear-error.md index dffb6d5eba8e..5b4e97c3dad2 100644 --- a/docs/3.api/3.utils/clear-error.md +++ b/docs/3.api/3.utils/clear-error.md @@ -1,6 +1,11 @@ --- title: "clearError" description: "The clearError composable clears all handled errors." +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/error.ts + size: xs --- # `clearError` diff --git a/docs/3.api/3.utils/clear-nuxt-data.md b/docs/3.api/3.utils/clear-nuxt-data.md index 1518fb66b550..eb2ae69cd35f 100644 --- a/docs/3.api/3.utils/clear-nuxt-data.md +++ b/docs/3.api/3.utils/clear-nuxt-data.md @@ -1,3 +1,11 @@ +--- +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts + size: xs +--- + # `clearNuxtData` Delete cached data, error status and pending promises of [`useAsyncData`](/docs/api/composables/use-async-data) and `useFetch`. diff --git a/docs/3.api/3.utils/create-error.md b/docs/3.api/3.utils/create-error.md index 7bec2377fece..f45793e8cde1 100644 --- a/docs/3.api/3.utils/create-error.md +++ b/docs/3.api/3.utils/create-error.md @@ -1,5 +1,10 @@ --- description: You can use this function to create an error object with additional metadata. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/error.ts + size: xs --- # `createError` diff --git a/docs/3.api/3.utils/navigate-to.md b/docs/3.api/3.utils/navigate-to.md index e2dc246e91e2..876d4ecb1ccb 100644 --- a/docs/3.api/3.utils/navigate-to.md +++ b/docs/3.api/3.utils/navigate-to.md @@ -1,6 +1,11 @@ --- title: "navigateTo" description: navigateTo is a helper function that programmatically navigates users. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts + size: xs --- # `navigateTo` diff --git a/docs/3.api/3.utils/on-before-route-leave.md b/docs/3.api/3.utils/on-before-route-leave.md index 0169f40c70f4..90209d9b8e29 100644 --- a/docs/3.api/3.utils/on-before-route-leave.md +++ b/docs/3.api/3.utils/on-before-route-leave.md @@ -1,6 +1,11 @@ --- title: "onBeforeRouteLeave" description: The onBeforeRouteLeave composable allows registering a route guard within a component. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts + size: xs --- :read-more{icon="i-simple-icons-vuedotjs" to="https://router.vuejs.org/api/#onBeforeRouteLeave" title="Vue Router Docs" target="_blank"} diff --git a/docs/3.api/3.utils/on-before-route-update.md b/docs/3.api/3.utils/on-before-route-update.md index 5c56fcddaa21..2e9ba922ec46 100644 --- a/docs/3.api/3.utils/on-before-route-update.md +++ b/docs/3.api/3.utils/on-before-route-update.md @@ -1,6 +1,11 @@ --- title: "onBeforeRouteUpdate" description: The onBeforeRouteUpdate composable allows registering a route guard within a component. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts + size: xs --- :read-more{icon="i-simple-icons-vuedotjs" to="https://router.vuejs.org/api/#onBeforeRouteUpdate" title="Vue Router Docs" target="_blank"} diff --git a/docs/3.api/3.utils/prerender-routes.md b/docs/3.api/3.utils/prerender-routes.md index f672364210eb..1e4bd578cb73 100644 --- a/docs/3.api/3.utils/prerender-routes.md +++ b/docs/3.api/3.utils/prerender-routes.md @@ -1,5 +1,10 @@ --- description: prerenderRoutes hints to Nitro to prerender an additional route. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ssr.ts + size: xs --- # `prerenderRoutes` diff --git a/docs/3.api/3.utils/refresh-nuxt-data.md b/docs/3.api/3.utils/refresh-nuxt-data.md index 2150d61670be..540ffced1cf4 100644 --- a/docs/3.api/3.utils/refresh-nuxt-data.md +++ b/docs/3.api/3.utils/refresh-nuxt-data.md @@ -1,6 +1,11 @@ --- title: "refreshNuxtData" description: refreshNuxtData refetches all data from the server and updates the page. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts + size: xs --- # `refreshNuxtData` diff --git a/docs/3.api/3.utils/set-page-layout.md b/docs/3.api/3.utils/set-page-layout.md index 41ca0f02d935..64c167f0e871 100644 --- a/docs/3.api/3.utils/set-page-layout.md +++ b/docs/3.api/3.utils/set-page-layout.md @@ -1,5 +1,10 @@ --- description: setPageLayout allows you to dynamically change the layout of a page. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts + size: xs --- # `setPageLayout` diff --git a/docs/3.api/3.utils/set-response-status.md b/docs/3.api/3.utils/set-response-status.md index 946a715815c7..4841c55012a2 100644 --- a/docs/3.api/3.utils/set-response-status.md +++ b/docs/3.api/3.utils/set-response-status.md @@ -1,6 +1,12 @@ --- description: setResponseStatus sets the statusCode (and optionally the statusMessage) of the response. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ssr.ts + size: xs --- + # `setResponseStatus` Nuxt provides composables and utilities for first-class server-side-rendering support. diff --git a/docs/3.api/3.utils/show-error.md b/docs/3.api/3.utils/show-error.md index 51eae9ad7729..1a9b04473439 100644 --- a/docs/3.api/3.utils/show-error.md +++ b/docs/3.api/3.utils/show-error.md @@ -1,3 +1,11 @@ +--- +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/error.ts + size: xs +--- + # `showError` Nuxt provides a quick and simple way to show a full screen error page if needed. From 218e4c4771246dbac8d866ed1faad021e4e955ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 18:05:38 +0200 Subject: [PATCH 32/62] progress on api --- docs/3.api/3.utils/$fetch.md | 21 ++++++++++----- docs/3.api/3.utils/abort-navigation.md | 9 +++---- docs/3.api/3.utils/add-route-middleware.md | 30 ++++++++++++---------- docs/3.api/3.utils/clear-nuxt-data.md | 8 +++--- docs/3.api/3.utils/clear-nuxt-state.md | 16 +++++++++--- docs/3.api/3.utils/create-error.md | 20 +++++++-------- 6 files changed, 59 insertions(+), 45 deletions(-) diff --git a/docs/3.api/3.utils/$fetch.md b/docs/3.api/3.utils/$fetch.md index c780897eee9e..0c0c507d2099 100644 --- a/docs/3.api/3.utils/$fetch.md +++ b/docs/3.api/3.utils/$fetch.md @@ -1,19 +1,26 @@ --- title: "$fetch" description: Nuxt uses ofetch to expose globally the $fetch helper for making HTTP requests. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/entry.ts + size: xs --- -# `$fetch` - Nuxt uses [ofetch](https://github.com/unjs/ofetch) to expose globally the `$fetch` helper for making HTTP requests within your Vue app or API routes. +::callout{icon="i-ph-rocket-launch-duotone"} During server-side rendering, calling `$fetch` to fetch your internal [API routes](/docs/guide/directory-structure/server) will directly call the relevant function (emulating the request), **saving an additional API call**. +:: -However, using `$fetch` in components without wrapping it with [`useAsyncData`](/docs/api/composables/use-async-data) causes fetching the data twice: initially on the server, then again on the client-side during hydration, because `$fetch` does not transfer state from the server to the client. Thus, the fetch will be executed on both sides because the client has to get the data again. +::callout{color="blue" icon="i-ph-info-duotone"} +Using `$fetch` in components without wrapping it with [`useAsyncData`](/docs/api/composables/use-async-data) causes fetching the data twice: initially on the server, then again on the client-side during hydration, because `$fetch` does not transfer state from the server to the client. Thus, the fetch will be executed on both sides because the client has to get the data again. +:: We recommend to use [`useFetch`](https://nuxt.com/docs/api/composables/use-fetch) or [`useAsyncData`](https://nuxt.com/docs/api/composables/use-async-data) + `$fetch` to prevent double data fetching when fetching the component data. -```vue +```vue [app.vue] <script setup lang="ts"> // During SSR data is fetched twice, once on the server and once on the client. const dataTwice = await $fetch('/api/item') @@ -26,11 +33,11 @@ const { data } = await useFetch('/api/item') </script> ``` -:ReadMore{link="/docs/getting-started/data-fetching"} +:read-more{to="/docs/getting-started/data-fetching"} You can use `$fetch` for any method that are executed only on client-side. -```vue +```vue [pages/contact.vue] <script setup lang="ts"> function contactForm() { $fetch('/api/contact', { @@ -45,4 +52,6 @@ function contactForm() { </template> ``` +::callout `$fetch` is the preferred way to make HTTP calls in Nuxt instead of [@nuxt/http](https://github.com/nuxt/http) and [@nuxtjs/axios](https://github.com/nuxt-community/axios-module) that are made for Nuxt 2. +:: diff --git a/docs/3.api/3.utils/abort-navigation.md b/docs/3.api/3.utils/abort-navigation.md index 9667fb60a2e3..5eba6c7d611a 100644 --- a/docs/3.api/3.utils/abort-navigation.md +++ b/docs/3.api/3.utils/abort-navigation.md @@ -1,5 +1,6 @@ --- -title: "abortNavigation" +title: 'abortNavigation' +description: 'abortNavigation is a helper function that prevents navigation from taking place and throws an error if one is set as a parameter.' links: - label: Source Code icon: i-simple-icons-github @@ -7,11 +8,7 @@ links: size: xs --- -# `abortNavigation` - -`abortNavigation` is a helper function that prevents navigation from taking place and throws an error if one is set as a parameter. - -::alert{type="warning"} +::callout{color="amber" icon="i-ph-warning-duotone"} `abortNavigation` is only usable inside a [route middleware handler](/docs/guide/directory-structure/middleware). :: diff --git a/docs/3.api/3.utils/add-route-middleware.md b/docs/3.api/3.utils/add-route-middleware.md index ed8bf78a8bec..3bc2a7b5b94d 100644 --- a/docs/3.api/3.utils/add-route-middleware.md +++ b/docs/3.api/3.utils/add-route-middleware.md @@ -1,6 +1,6 @@ --- -title: "addRouteMiddleware" -description: addRouteMiddleware() is a helper function to dynamically add middleware in your application. +title: 'addRouteMiddleware' +description: 'addRouteMiddleware() is a helper function to dynamically add middleware in your application.' links: - label: Source Code icon: i-simple-icons-github @@ -8,33 +8,35 @@ links: size: xs --- -# `addRouteMiddleware` - -`addRouteMiddleware()` is a helper function to dynamically add route middleware in your Nuxt application. - -::alert{type=info} +::callout Route middleware are navigation guards stored in the [`middleware/`](/docs/guide/directory-structure/middleware) directory of your Nuxt application (unless [set otherwise](/docs/api/nuxt-config#middleware)). :: -## Usage +## Type -```js +```ts addRouteMiddleware (name: string | RouteMiddleware, middleware?: RouteMiddleware, options: AddRouteMiddlewareOptions = {}) ``` -`addRouteMiddleware()` takes three arguments: +## Parameters + +### `name` -- **name** `type: string | RouteMiddleware` +- **Type:** `string` | `RouteMiddleware` -`name` can be either a string or a function of type `RouteMiddleware`. Function takes the next route `to` as the first argument and the current route `from` as the second argument, both of which are Vue route objects. +Can be either a string or a function of type `RouteMiddleware`. Function takes the next route `to` as the first argument and the current route `from` as the second argument, both of which are Vue route objects. Learn more about available properties of [route objects](/docs/api/composables/use-route). -- **middleware** `type: RouteMiddleware` +### `middleware` + +- **Type:** `RouteMiddleware` The second argument is a function of type `RouteMiddleware`. Same as above, it provides `to` and `from` route objects. It becomes optional if the first argument in `addRouteMiddleware()` is already passed as a function. -- **options** `type: AddRouteMiddlewareOptions` +### `options` + +- **Type:** `AddRouteMiddlewareOptions` An optional `options` argument lets you set the value of `global` to `true` to indicate whether the router middleware is global or not (set to `false` by default). diff --git a/docs/3.api/3.utils/clear-nuxt-data.md b/docs/3.api/3.utils/clear-nuxt-data.md index eb2ae69cd35f..e191137e0b51 100644 --- a/docs/3.api/3.utils/clear-nuxt-data.md +++ b/docs/3.api/3.utils/clear-nuxt-data.md @@ -1,4 +1,6 @@ --- +title: 'clearNuxtData' +description: Delete cached data, error status and pending promises of useAsyncData and useFetch. links: - label: Source Code icon: i-simple-icons-github @@ -6,11 +8,9 @@ links: size: xs --- -# `clearNuxtData` - -Delete cached data, error status and pending promises of [`useAsyncData`](/docs/api/composables/use-async-data) and `useFetch`. - +::callout This method is useful if you want to invalidate the data fetching for another page. +:: ## Type diff --git a/docs/3.api/3.utils/clear-nuxt-state.md b/docs/3.api/3.utils/clear-nuxt-state.md index 14a8be322b33..e53c66468fac 100644 --- a/docs/3.api/3.utils/clear-nuxt-state.md +++ b/docs/3.api/3.utils/clear-nuxt-state.md @@ -1,8 +1,16 @@ -# `clearNuxtState` - -Delete cached state of `useState`. +--- +title: 'clearNuxtState' +description: Delete the cached state of useState. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/state.ts + size: xs +--- +::callout This method is useful if you want to invalidate the state of `useState`. +:: ## Type @@ -12,4 +20,4 @@ clearNuxtState (keys?: string | string[] | ((key: string) => boolean)): void ## Parameters -* `keys`: One or an array of keys that are used in [`useState`](/docs/api/composables/use-state) to delete their cached state. If no keys are provided, **all state** will be invalidated. +- `keys`: One or an array of keys that are used in [`useState`](/docs/api/composables/use-state) to delete their cached state. If no keys are provided, **all state** will be invalidated. diff --git a/docs/3.api/3.utils/create-error.md b/docs/3.api/3.utils/create-error.md index f45793e8cde1..2178980a27ea 100644 --- a/docs/3.api/3.utils/create-error.md +++ b/docs/3.api/3.utils/create-error.md @@ -1,5 +1,6 @@ --- -description: You can use this function to create an error object with additional metadata. +title: 'createError' +description: Create an error object with additional metadata. links: - label: Source Code icon: i-simple-icons-github @@ -7,20 +8,18 @@ links: size: xs --- -# `createError` - You can use this function to create an error object with additional metadata. It is usable in both the Vue and Nitro portions of your app, and is meant to be thrown. -**Parameters:** +## Parameters -* err: { cause, data, message, name, stack, statusCode, statusMessage, fatal } +- `err`: `{ cause, data, message, name, stack, statusCode, statusMessage, fatal }` -## Throwing Errors in Your Vue App +## In Vue App If you throw an error created with `createError`: -* on server-side, it will trigger a full-screen error page which you can clear with `clearError`. -* on client-side, it will throw a non-fatal error for you to handle. If you need to trigger a full-screen error page, then you can do this by setting `fatal: true`. +- on server-side, it will trigger a full-screen error page which you can clear with `clearError`. +- on client-side, it will throw a non-fatal error for you to handle. If you need to trigger a full-screen error page, then you can do this by setting `fatal: true`. ### Example @@ -34,7 +33,7 @@ if (!data.value) { </script> ``` -## Throwing Errors in API Routes +## In API Routes Use `createError` to trigger error handling in server API routes. @@ -49,5 +48,4 @@ export default eventHandler(() => { }) ``` -::ReadMore{link="/docs/getting-started/error-handling"} -:: +:read-more{to="/docs/getting-started/error-handling"} From 2e8f4ba44772ce87ff94eaa62d496b53c77ff917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 18:39:33 +0200 Subject: [PATCH 33/62] docs: api done --- docs/3.api/3.utils/define-nuxt-component.md | 15 +- .../3.utils/define-nuxt-route-middleware.md | 12 +- docs/3.api/3.utils/define-page-meta.md | 15 +- docs/3.api/3.utils/index.md | 5 - docs/3.api/3.utils/navigate-to.md | 145 +++++++++--------- docs/3.api/3.utils/on-nuxt-ready.md | 18 ++- docs/3.api/3.utils/prefetch-components.md | 23 +-- docs/3.api/3.utils/preload-components.md | 20 +-- .../3.api/3.utils/preload-route-components.md | 27 ++-- docs/3.api/3.utils/prerender-routes.md | 7 +- docs/3.api/3.utils/refresh-nuxt-data.md | 15 +- docs/3.api/3.utils/reload-nuxt-app.md | 17 +- docs/3.api/3.utils/set-page-layout.md | 10 +- docs/3.api/3.utils/set-response-status.md | 9 +- docs/3.api/3.utils/show-error.md | 18 ++- docs/3.api/3.utils/update-app-config.md | 18 ++- 16 files changed, 201 insertions(+), 173 deletions(-) delete mode 100644 docs/3.api/3.utils/index.md diff --git a/docs/3.api/3.utils/define-nuxt-component.md b/docs/3.api/3.utils/define-nuxt-component.md index 8ac2b97a7f00..7d7577b8e641 100644 --- a/docs/3.api/3.utils/define-nuxt-component.md +++ b/docs/3.api/3.utils/define-nuxt-component.md @@ -1,17 +1,22 @@ --- title: "defineNuxtComponent" description: defineNuxtComponent() is a helper function for defining type safe components with Options API. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/component.ts + size: xs --- -# `defineNuxtComponent` - -`defineNuxtComponent()` is a helper function for defining type safe Vue components using options API similar to [defineComponent()](https://vuejs.org/api/general.html#definecomponent). `defineNuxtComponent()` wrapper also adds support for `asyncData` and `head` component options. +::callout +`defineNuxtComponent()` is a helper function for defining type safe Vue components using options API similar to [`defineComponent()`](https://vuejs.org/api/general.html#definecomponent). `defineNuxtComponent()` wrapper also adds support for `asyncData` and `head` component options. +:: -::Alert +::callout{color="blue" icon="i-ph-info-duotone"} Using `<script setup lang="ts">` is the recommended way of declaring Vue components in Nuxt 3. :: -:ReadMore{link=/docs/getting-started/data-fetching#options-api-support} +:read-more{to=/docs/getting-started/data-fetching} ## `asyncData()` diff --git a/docs/3.api/3.utils/define-nuxt-route-middleware.md b/docs/3.api/3.utils/define-nuxt-route-middleware.md index db6fbd2e290c..d197eab9e6f2 100644 --- a/docs/3.api/3.utils/define-nuxt-route-middleware.md +++ b/docs/3.api/3.utils/define-nuxt-route-middleware.md @@ -1,12 +1,14 @@ --- title: "defineNuxtRouteMiddleware" +description: "Create named route middleware using defineNuxtRouteMiddleware helper function." +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts + size: xs --- -# `defineNuxtRouteMiddleware` - -Create named route middleware using `defineNuxtRouteMiddleware` helper function. - -Route middleware are stored in the [`middleware/` directory](/docs/guide/directory-structure/middleware) of your Nuxt application (unless [set otherwise](/docs/api/nuxt-config#middleware)). +Route middleware are stored in the [`middleware/`](/docs/guide/directory-structure/middleware) of your Nuxt application (unless [set otherwise](/docs/api/nuxt-config#middleware)). ## Type diff --git a/docs/3.api/3.utils/define-page-meta.md b/docs/3.api/3.utils/define-page-meta.md index bcfd4802918d..d4b6a1be7307 100644 --- a/docs/3.api/3.utils/define-page-meta.md +++ b/docs/3.api/3.utils/define-page-meta.md @@ -1,10 +1,14 @@ --- -title: "definePageMeta" +title: 'definePageMeta' +description: 'Define metadata for your page components.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/pages/runtime/composables.ts + size: xs --- -# `definePageMeta` - -`definePageMeta` is a compiler macro that you can use to set metadata for your **page** components located in the [`pages/` directory](/docs/guide/directory-structure/pages) (unless [set otherwise](/docs/api/nuxt-config#pages)). This way you can set custom metadata for each static or dynamic route of your Nuxt application. +`definePageMeta` is a compiler macro that you can use to set metadata for your **page** components located in the [`pages/`](/docs/guide/directory-structure/pages) directory (unless [set otherwise](/docs/api/nuxt-config#pages)). This way you can set custom metadata for each static or dynamic route of your Nuxt application. ```vue [pages/some-page.vue] <script setup lang="ts"> @@ -14,8 +18,7 @@ definePageMeta({ </script> ``` -::ReadMore{link="/docs/guide/directory-structure/pages/#page-metadata"} -:: +:read-more{to="/docs/guide/directory-structure/pages/#page-metadata"} ## Type diff --git a/docs/3.api/3.utils/index.md b/docs/3.api/3.utils/index.md deleted file mode 100644 index a9369a314b16..000000000000 --- a/docs/3.api/3.utils/index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Utils" -navigation: false -redirect: /api/utils/ ---- diff --git a/docs/3.api/3.utils/navigate-to.md b/docs/3.api/3.utils/navigate-to.md index 876d4ecb1ccb..ac96417c24f8 100644 --- a/docs/3.api/3.utils/navigate-to.md +++ b/docs/3.api/3.utils/navigate-to.md @@ -8,11 +8,79 @@ links: size: xs --- -# `navigateTo` +::callout +`navigateTo` is available on both server side and client side. +:: + + +## Usage + +### Within a Vue Component + +```vue +<script setup lang="ts"> +// passing 'to' as a string +await navigateTo('/search') + +// ... or as a route object +await navigateTo({ path: '/search' }) + +// ... or as a route object with query parameters +await navigateTo({ + path: '/search', + query: { + page: 1, + sort: 'asc' + } +}) +</script> +``` + +### Within Route Middleware -`navigateTo` is a router helper function that allows programmatically navigating users through your Nuxt application. +```ts +export default defineNuxtRouteMiddleware((to, from) => { + if (to.path !== '/search') { + // setting the redirect code to '301 Moved Permanently' + return navigateTo('/search', { redirectCode: 301 }) + } +}) +``` + +:read-more{to="/docs/guide/directory-structure/middleware"} + +### External URL + +```vue +<script setup lang="ts"> +// will throw an error; +// navigating to an external URL is not allowed by default +await navigateTo('https://nuxt.com') + +// will redirect successfully with the 'external' parameter set to 'true' +await navigateTo('https://nuxt.com', { + external: true +}) +</script> +``` + +### Using open() + +```vue +<script setup lang="ts"> +// will open 'https://nuxt.com' in a new tab +await navigateTo('https://nuxt.com', { + open: { + target: '_blank', + windowFeatures: { + width: 500, + height: 500 + } + } +}) +</script> +``` -`navigateTo` is available on both server side and client side. It can be used within plugins, middleware or can be called directly to perform page navigation. ## Type @@ -27,7 +95,7 @@ interface NavigateToOptions { } ``` -::alert{type="warning"} +::callout{color="amber" icon="i-ph-warning-duotone"} Make sure to always use `await` or `return` on result of `navigateTo` when calling it. :: @@ -126,72 +194,3 @@ An object accepting the following properties: **Type**: `boolean` Refer to the [documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/open) for more detailed information on the **windowFeatures** properties. - -## Examples - -### Navigating Within a Vue Component - -```vue -<script setup lang="ts"> -// passing 'to' as a string -await navigateTo('/search') - -// ... or as a route object -await navigateTo({ path: '/search' }) - -// ... or as a route object with query parameters -await navigateTo({ - path: '/search', - query: { - page: 1, - sort: 'asc' - } -}) -</script> -``` - -### Navigating Within Route Middleware - -```ts -export default defineNuxtRouteMiddleware((to, from) => { - if (to.path !== '/search') { - // setting the redirect code to '301 Moved Permanently' - return navigateTo('/search', { redirectCode: 301 }) - } -}) -``` - -::ReadMore{link="/docs/guide/directory-structure/middleware"} -:: - -### Navigating to an External URL - -```vue -<script setup lang="ts"> -// will throw an error; -// navigating to an external URL is not allowed by default -await navigateTo('https://nuxt.com') - -// will redirect successfully with the 'external' parameter set to 'true' -await navigateTo('https://nuxt.com', { - external: true -}) -</script> -``` - -### Navigating using open() - -```vue -<script setup lang="ts"> -// will open 'https://nuxt.com' in a new tab -await navigateTo('https://nuxt.com', { - open: { - target: '_blank', - windowFeatures: { - width: 500, - height: 500 - } - } -}) -</script> -``` diff --git a/docs/3.api/3.utils/on-nuxt-ready.md b/docs/3.api/3.utils/on-nuxt-ready.md index 9990cbebc2ac..1b1932b775b7 100644 --- a/docs/3.api/3.utils/on-nuxt-ready.md +++ b/docs/3.api/3.utils/on-nuxt-ready.md @@ -1,13 +1,19 @@ --- title: "onNuxtReady" description: The onNuxtReady composable allows running a callback after your app has finished initializing. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ready.ts + size: xs --- -# `onNuxtReady` - -The `onNuxtReady` composable allows running a callback after your app has finished initializing. It is ideal for running code that should not block the initial rendering of your app. +::callout +`onNuxtReady` only runs on the client-side. :br +It is ideal for running code that should not block the initial rendering of your app. +:: -```ts +```ts [plugins/ready.client.ts] export default defineNuxtPlugin(() => { onNuxtReady(async () => { const myAnalyticsLibrary = await import('my-big-analytics-library') @@ -17,7 +23,3 @@ export default defineNuxtPlugin(() => { ``` It is 'safe' to run even after your app has initialized. In this case, then the code will be registered to run in the next idle callback. - -::alert -`onNuxtReady` only runs on the client-side. -:: diff --git a/docs/3.api/3.utils/prefetch-components.md b/docs/3.api/3.utils/prefetch-components.md index f61bd3c784f9..a06d16ad04cd 100644 --- a/docs/3.api/3.utils/prefetch-components.md +++ b/docs/3.api/3.utils/prefetch-components.md @@ -1,25 +1,28 @@ --- -description: Nuxt provides utilities to give you control over prefetching and preloading components. +title: 'prefetchComponents' +description: Nuxt provides utilities to give you control over prefetching components. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/preload.ts + size: xs --- -# `prefetchComponents` -Nuxt provides composables and utilities to give you fine-grained control over prefetching and preloading components. +Prefetching component downloads the code in the background, this is based on the assumption that the component will likely be used for rendering, enabling the component to load instantly if and when the user requests it. The component is downloaded and cached for anticipated future use without the user making an explicit request for it. -> Prefetching component downloads the code in the background, this is based on the assumption that the component will likely be used for rendering, enabling the component to load instantly if and when the user requests it. The component is downloaded and cached for anticipated future use without the user making an explicit request for it. +Use `prefetchComponents` to manually prefetch individual components that have been registered globally in your Nuxt app. By default Nuxt registers these as async components. You must use the Pascal-cased version of the component name. -Use `prefetchComponents` to manually prefetch individual components that have been registered globally in your Nuxt app. (By default Nuxt registers these as async components.) You must use the Pascal-cased version of the component name. - -```js +```ts await prefetchComponents('MyGlobalComponent') await prefetchComponents(['MyGlobalComponent1', 'MyGlobalComponent2']) ``` -::alert{icon=๐Ÿ‘‰} +::callout Current implementation behaves exactly the same as [`preloadComponents`](/docs/api/utils/preload-components) by preloading components instead of just prefetching we are working to improve this behavior. :: -::alert{icon=๐Ÿ‘‰} -Currently, on server, `prefetchComponents` will have no effect. +::callout +On server, `prefetchComponents` will have no effect. :: diff --git a/docs/3.api/3.utils/preload-components.md b/docs/3.api/3.utils/preload-components.md index 9d85800aba69..eb0d0f8c3a0b 100644 --- a/docs/3.api/3.utils/preload-components.md +++ b/docs/3.api/3.utils/preload-components.md @@ -1,14 +1,16 @@ --- -description: Nuxt provides utilities to give you control over prefetching and preloading components. +title: 'preloadComponents' +description: Nuxt provides utilities to give you control over preloading components. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/preload.ts + size: xs --- -# `preloadComponents` +Preloading components loads components that your page will need very soon, which you want to start loading early in rendering lifecycle. This ensures they are available earlier and are less likely to block the page's render, improving performance. -Nuxt provides composables and utilities to give you fine-grained control over prefetching and preloading components. - -> Preloading components loads components that your page will need very soon, which you want to start loading early in rendering lifecycle. This ensures they are available earlier and are less likely to block the page's render, improving performance. - -Use `preloadComponents` to manually preload individual components that have been registered globally in your Nuxt app. (By default Nuxt registers these as async components.) You must use the Pascal-cased version of the component name. +Use `preloadComponents` to manually preload individual components that have been registered globally in your Nuxt app. By default Nuxt registers these as async components. You must use the Pascal-cased version of the component name. ```js await preloadComponents('MyGlobalComponent') @@ -16,6 +18,6 @@ await preloadComponents('MyGlobalComponent') await preloadComponents(['MyGlobalComponent1', 'MyGlobalComponent2']) ``` -::alert{icon=๐Ÿ‘‰} -Currently, on server, `preloadComponents` will have no effect. +::callout +On server, `preloadComponents` will have no effect. :: diff --git a/docs/3.api/3.utils/preload-route-components.md b/docs/3.api/3.utils/preload-route-components.md index 8ad0f2924713..1e092ac3fbfd 100644 --- a/docs/3.api/3.utils/preload-route-components.md +++ b/docs/3.api/3.utils/preload-route-components.md @@ -1,18 +1,20 @@ --- -title: "preloadRouteComponents" +title: 'preloadRouteComponents' +description: preloadRouteComponents allows you to manually preload individual pages in your Nuxt app. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/preload.ts + size: xs --- -# `preloadRouteComponents` +Preloading routes loads the components of a given route that the user might navigate to in future. This ensures that the components are available earlier and less likely to block the navigation, improving performance. -`preloadRouteComponents` allows you to manually preload individual pages in your Nuxt app. - -> Preloading routes loads the components of a given route that the user might navigate to in future. This ensures that the components are available earlier and less likely to block the navigation, improving performance. - -::alert +::callout{color="green" icon="i-ph-rocket-launch-duotone"} Nuxt already automatically preloads the necessary routes if you're using the `NuxtLink` component. :: -::ReadMore{link="/docs/api/components/nuxt-link"} -:: + +:read-more{to="/docs/api/components/nuxt-link"} ## Example @@ -32,9 +34,8 @@ const submit = async () => { } ``` -::ReadMore{link="/docs/api/utils/navigate-to"} -:: +:read-more{to="/docs/api/utils/navigate-to"} -::alert{icon=๐Ÿ‘‰} -Currently, on server, `preloadRouteComponents` will have no effect. +::callout +On server, `preloadRouteComponents` will have no effect. :: diff --git a/docs/3.api/3.utils/prerender-routes.md b/docs/3.api/3.utils/prerender-routes.md index 1e4bd578cb73..e3ee8a1b229f 100644 --- a/docs/3.api/3.utils/prerender-routes.md +++ b/docs/3.api/3.utils/prerender-routes.md @@ -1,4 +1,5 @@ --- +title: 'prerenderRoutes' description: prerenderRoutes hints to Nitro to prerender an additional route. links: - label: Source Code @@ -7,12 +8,8 @@ links: size: xs --- -# `prerenderRoutes` - When prerendering, you can hint to Nitro to prerender additional paths, even if their URLs do not show up in the HTML of the generated page. -`prerenderRoutes` can only be called within component setup functions, plugins, and route middleware. - ```js const route = useRoute() @@ -20,6 +17,6 @@ prerenderRoutes('/') prerenderRoutes(['/', '/about']) ``` -::alert{icon=๐Ÿ‘‰} +::callout In the browser, or if called outside prerendering, `prerenderRoutes` will have no effect. :: diff --git a/docs/3.api/3.utils/refresh-nuxt-data.md b/docs/3.api/3.utils/refresh-nuxt-data.md index 540ffced1cf4..87f266bdc02f 100644 --- a/docs/3.api/3.utils/refresh-nuxt-data.md +++ b/docs/3.api/3.utils/refresh-nuxt-data.md @@ -1,5 +1,5 @@ --- -title: "refreshNuxtData" +title: 'refreshNuxtData' description: refreshNuxtData refetches all data from the server and updates the page. links: - label: Source Code @@ -8,9 +8,9 @@ links: size: xs --- -# `refreshNuxtData` - +::callout `refreshNuxtData` re-fetches all data from the server and updates the page as well as invalidates the cache of [`useAsyncData`](/docs/api/composables/use-async-data) , `useLazyAsyncData`, [`useFetch`](/docs/api/composables/use-fetch) and `useLazyFetch`. +:: ## Type @@ -26,9 +26,7 @@ refreshNuxtData(keys?: string | string[]) `refreshNuxtData` accepts a single or an array of strings as `keys` that are used to fetch the data. This parameter is **optional**. All [`useAsyncData`](/docs/api/composables/use-async-data) and [`useFetch`](/docs/api/composables/use-fetch) are re-fetched when no `keys` are specified. -## Examples - -### Refresh All data +## Refresh All Data This example below refreshes all data being fetched using [`useAsyncData`](/docs/api/composables/use-async-data) and [`useFetch`](/docs/api/composables/use-fetch) on the current page. @@ -54,7 +52,7 @@ const refreshAll = async () => { </template> ``` -### Refresh Specific Data +## Refresh Specific Data This example below refreshes only data where the key matches to `count`. @@ -72,5 +70,4 @@ const refresh = () => refreshNuxtData('count') </template> ``` -::ReadMore{link="/docs/getting-started/data-fetching"} -:: +:read-more{to="/docs/getting-started/data-fetching"} diff --git a/docs/3.api/3.utils/reload-nuxt-app.md b/docs/3.api/3.utils/reload-nuxt-app.md index 79502aa56ab3..d8fbb8674292 100644 --- a/docs/3.api/3.utils/reload-nuxt-app.md +++ b/docs/3.api/3.utils/reload-nuxt-app.md @@ -1,13 +1,22 @@ --- -title: "reloadNuxtApp" +title: 'reloadNuxtApp' description: reloadNuxtApp will perform a hard reload of the page. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/chunk.ts + size: xs --- -# `reloadNuxtApp` - +::callout `reloadNuxtApp` will perform a hard reload of your app, re-requesting a page and its dependencies from the server. +:: + +By default, it will also save the current `state` of your app (that is, any state you could access with `useState`). -By default, it will also save the current `state` of your app (that is, any state you could access with `useState`). You can enable experimental restoration of this state by enabling the `experimental.restoreState` option in your `nuxt.config` file. +::read-more{to="/docs/guide/going-further/experimental-features#restorestate"} +You can enable experimental restoration of this state by enabling the `experimental.restoreState` option in your `nuxt.config` file. +:: ## Type diff --git a/docs/3.api/3.utils/set-page-layout.md b/docs/3.api/3.utils/set-page-layout.md index 64c167f0e871..47eeacd9f9eb 100644 --- a/docs/3.api/3.utils/set-page-layout.md +++ b/docs/3.api/3.utils/set-page-layout.md @@ -1,4 +1,5 @@ --- +title: 'setPageLayout' description: setPageLayout allows you to dynamically change the layout of a page. links: - label: Source Code @@ -6,17 +7,18 @@ links: to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts size: xs --- -# `setPageLayout` -`setPageLayout` allows you to dynamically change the layout of a page. It relies on access to the Nuxt context and can only be called within components' setup functions, plugins, and route middleware. +::callout +`setPageLayout` relies on access to the Nuxt context and can only be called within components' setup functions, plugins, and route middleware. +:: -```ts +```ts [middleware/custom-layout.ts] export default defineNuxtRouteMiddleware((to) => { // Set the layout on the route you are navigating _to_ setPageLayout('other') }) ``` -::alert{icon=๐Ÿ‘‰} +::callout If you choose to set the layout dynamically on the server side, you _must_ do so before the layout is rendered by Vue (that is, within a plugin or route middleware) to avoid a hydration mismatch. :: diff --git a/docs/3.api/3.utils/set-response-status.md b/docs/3.api/3.utils/set-response-status.md index 4841c55012a2..f6b8bdea1bc3 100644 --- a/docs/3.api/3.utils/set-response-status.md +++ b/docs/3.api/3.utils/set-response-status.md @@ -1,4 +1,5 @@ --- +title: 'setResponseStatus' description: setResponseStatus sets the statusCode (and optionally the statusMessage) of the response. links: - label: Source Code @@ -7,14 +8,10 @@ links: size: xs --- -# `setResponseStatus` - Nuxt provides composables and utilities for first-class server-side-rendering support. `setResponseStatus` sets the statusCode (and optionally the statusMessage) of the response. -`setResponseStatus` can only be called within component setup functions, plugins, and route middleware. - ```js const event = useRequestEvent() @@ -25,6 +22,8 @@ setResponseStatus(event, 404) setResponseStatus(event, 404, 'Page Not Found') ``` -::alert{icon=๐Ÿ‘‰} +::callout In the browser, `setResponseStatus` will have no effect. :: + +:read-more{to="/docs/getting-started/error-handling"} diff --git a/docs/3.api/3.utils/show-error.md b/docs/3.api/3.utils/show-error.md index 1a9b04473439..2925318bbc99 100644 --- a/docs/3.api/3.utils/show-error.md +++ b/docs/3.api/3.utils/show-error.md @@ -1,4 +1,6 @@ --- +title: 'showError' +description: Nuxt provides a quick and simple way to show a full screen error page if needed. links: - label: Source Code icon: i-simple-icons-github @@ -6,24 +8,24 @@ links: size: xs --- -# `showError` - -Nuxt provides a quick and simple way to show a full screen error page if needed. - Within your pages, components and plugins you can use `showError` to show an error. **Parameters:** - `error`: `string | Error | Partial<{ cause, data, message, name, stack, statusCode, statusMessage }>` -```js +```ts showError("๐Ÿ˜ฑ Oh no, an error has been thrown.") -showError({ statusCode: 404, statusMessage: "Page Not Found" }) +showError({ + statusCode: 404, + statusMessage: "Page Not Found" +}) ``` The error is set in the state using [`useError()`](/docs/api/composables/use-error) to create a reactive and SSR-friendly shared error state across components. +::callout `showError` calls the `app:error` hook. - -::ReadMore{link="/docs/getting-started/error-handling"} :: + +:ReadMore{to="/docs/getting-started/error-handling"} diff --git a/docs/3.api/3.utils/update-app-config.md b/docs/3.api/3.utils/update-app-config.md index a51dfcacdfc6..622e231b56df 100644 --- a/docs/3.api/3.utils/update-app-config.md +++ b/docs/3.api/3.utils/update-app-config.md @@ -1,8 +1,18 @@ -# `updateAppConfig` +--- +title: 'updateAppConfig' +description: 'Update the App Config at runtime.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/config.ts + size: xs +--- -Updates [app config](/docs/guide/directory-structure/app-config) using deep assignment. Existing (nested) properties will be preserved. +::callout +Updates the [`app.config`](/docs/guide/directory-structure/app-config) using deep assignment. Existing (nested) properties will be preserved. +:: -**Usage:** +## Usage ```js const appConfig = useAppConfig() // { foo: 'bar' } @@ -14,4 +24,4 @@ updateAppConfig(newAppConfig) console.log(appConfig) // { foo: 'baz' } ``` -::ReadMore{link="/docs/guide/directory-structure/app-config"} +:read-more{to="/docs/guide/directory-structure/app-config"} From d90116e5086ba408363b8e2abb44ea9f37c9490b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 18:57:57 +0200 Subject: [PATCH 34/62] commands: ready --- docs/3.api/4.commands/add.md | 28 ++++++++++----------------- docs/3.api/4.commands/analyze.md | 11 ++++++++--- docs/3.api/4.commands/build-module.md | 16 +++++++++++---- docs/3.api/4.commands/build.md | 11 ++++++++--- docs/3.api/4.commands/cleanup.md | 10 +++++++--- docs/3.api/4.commands/dev.md | 13 ++++++++----- docs/3.api/4.commands/devtools.md | 12 ++++++++---- docs/3.api/4.commands/generate.md | 13 ++++++++----- docs/3.api/4.commands/info.md | 9 ++++++--- docs/3.api/4.commands/init.md | 9 ++++++--- docs/3.api/4.commands/prepare.md | 11 ++++++++--- docs/3.api/4.commands/preview.md | 13 ++++++++----- docs/3.api/4.commands/typecheck.md | 17 ++++++++++------ docs/3.api/4.commands/upgrade.md | 9 ++++++--- 14 files changed, 114 insertions(+), 68 deletions(-) diff --git a/docs/3.api/4.commands/add.md b/docs/3.api/4.commands/add.md index 25e8b4b669f5..4e9c958ff14a 100644 --- a/docs/3.api/4.commands/add.md +++ b/docs/3.api/4.commands/add.md @@ -1,11 +1,14 @@ --- title: "nuxi add" description: "Scaffold an entity into your Nuxt application." +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/add.ts + size: xs --- -# `nuxi add` - -```{bash} +```bash [Terminal] npx nuxi add [--cwd] [--force] <TEMPLATE> <NAME> ``` @@ -20,14 +23,15 @@ Option | Default | Description Some templates support additional modifier flags to add a suffix (like `.client` or `.get`) to their name. -**Example:** `npx nuxi add plugin sockets --client` generates `/plugins/sockets.client.ts`. +```bash [Terminal] +# Generates `/plugins/sockets.client.ts` +npx nuxi add plugin sockets --client +``` ## `nuxi add component` * Modifier flags: `--mode client|server` or `--client` or `--server` -Example: - ```bash [Terminal] # Generates `components/TheHeader.vue` npx nuxi add component TheHeader @@ -35,8 +39,6 @@ npx nuxi add component TheHeader ## `nuxi add composable` -Example: - ```bash [Terminal] # Generates `composables/foo.ts` npx nuxi add composable foo @@ -44,8 +46,6 @@ npx nuxi add composable foo ## `nuxi add layout` -Example: - ```bash [Terminal] # Generates `layouts/custom.vue` npx nuxi add layout custom @@ -55,8 +55,6 @@ npx nuxi add layout custom * Modifier flags: `--mode client|server` or `--client`or `--server` -Example: - ```bash [Terminal] # Generates `plugins/analytics.ts` npx nuxi add plugin analytics @@ -64,8 +62,6 @@ npx nuxi add plugin analytics ## `nuxi add page` -Example: - ```bash [Terminal] # Generates `pages/about.vue` npx nuxi add page about @@ -80,8 +76,6 @@ npx nuxi add page "category/[id]" * Modifier flags: `--global` -Example: - ```bash [Terminal] # Generates `middleware/auth.ts` npx nuxi add middleware auth @@ -91,8 +85,6 @@ npx nuxi add middleware auth * Modifier flags: `--method` (can accept `connect`, `delete`, `get`, `head`, `options`, `patch`, `post`, `put` or `trace`) or alternatively you can directly use `--get`, `--post`, etc. -Example: - ```bash [Terminal] # Generates `server/api/hello.ts` npx nuxi add api hello diff --git a/docs/3.api/4.commands/analyze.md b/docs/3.api/4.commands/analyze.md index b7a59f25f8d7..d60c54736dc6 100644 --- a/docs/3.api/4.commands/analyze.md +++ b/docs/3.api/4.commands/analyze.md @@ -1,11 +1,14 @@ --- title: "nuxi analyze" description: "Analyze the production bundle or your Nuxt application." +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/analyze.ts + size: xs --- -# `nuxi analyze` - -```{bash} +```bash [Terminal] npx nuxi analyze [--log-level] [rootDir] ``` @@ -15,4 +18,6 @@ Option | Default | Description -------------------------|-----------------|------------------ `rootDir` | `.` | The directory of the target application. +::callout This command sets `process.env.NODE_ENV` to `production`. +:: diff --git a/docs/3.api/4.commands/build-module.md b/docs/3.api/4.commands/build-module.md index 1445a52c49cd..1699f4baf792 100644 --- a/docs/3.api/4.commands/build-module.md +++ b/docs/3.api/4.commands/build-module.md @@ -1,6 +1,14 @@ -# `nuxi build-module` +--- +title: 'nuxi build-module' +description: 'Nuxt command to build your Nuxt module before publishing.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/build-module.ts + size: xs +--- -```{bash} +```bash [Terminal] npx nuxi build-module [--stub] [rootDir] ``` @@ -11,6 +19,6 @@ Option | Default | Description `rootDir` | `.` | The root directory of the module to bundle. `--stub` | `false` | Stub out your module for development using [jiti](https://github.com/unjs/jiti#jiti). (**note:** This is mainly for development purposes.) -::alert -This command is only available when you are using `@nuxt/module-builder` to build your module. Please see [this readme](https://github.com/nuxt/module-builder#-nuxt-module-builder) for more information. +::read-more{to="https://github.com/nuxt/module-builder" icon="i-simple-icons-github" color="gray" target="_blank"} +Read more about `@nuxt/module-builder`. :: diff --git a/docs/3.api/4.commands/build.md b/docs/3.api/4.commands/build.md index 05d11cd15c07..785db16cac7d 100644 --- a/docs/3.api/4.commands/build.md +++ b/docs/3.api/4.commands/build.md @@ -1,11 +1,14 @@ --- title: "nuxi build" description: "Build your Nuxt application." +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/build.ts + size: xs --- -# `nuxi build` - -```{bash} +```bash [Terminal] npx nuxi build [--prerender] [--dotenv] [--log-level] [rootDir] ``` @@ -17,4 +20,6 @@ Option | Default | Description `--prerender` | `false` | Pre-render every route of your application. (**note:** This is an experimental flag. The behavior might be changed.) `--dotenv` | `.` | Point to another `.env` file to load, **relative** to the root directory. +::callout This command sets `process.env.NODE_ENV` to `production`. +:: diff --git a/docs/3.api/4.commands/cleanup.md b/docs/3.api/4.commands/cleanup.md index 2e37dcd197d5..156baaf4c4e1 100644 --- a/docs/3.api/4.commands/cleanup.md +++ b/docs/3.api/4.commands/cleanup.md @@ -1,14 +1,18 @@ --- +title: 'nuxi cleanup' description: "Remove common generated Nuxt files and caches." +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/cleanup.ts + size: xs --- -# `nuxi cleanup` -```{bash} +```bash [Terminal] npx nuxi clean|cleanup [rootDir] ``` The `cleanup` command removes common generated Nuxt files and caches, including: - - `.nuxt` - `.output` - `node_modules/.vite` diff --git a/docs/3.api/4.commands/dev.md b/docs/3.api/4.commands/dev.md index e7eda852d823..8cd5bd2cec58 100644 --- a/docs/3.api/4.commands/dev.md +++ b/docs/3.api/4.commands/dev.md @@ -1,11 +1,14 @@ --- -title: "nuxi dev" +title: 'nuxi dev' description: The dev command starts a development server with hot module replacement at http://localhost:3000 +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/dev.ts + size: xs --- -# `nuxi dev` - -```{bash} +```bash [Terminal] npx nuxi dev [rootDir] [--dotenv] [--log-level] [--clipboard] [--open, -o] [--no-clear] [--port, -p] [--host, -h] [--https] [--ssl-cert] [--ssl-key] ``` @@ -30,6 +33,6 @@ Additionally to the above options, `nuxi` can pass options through to `listhen`, This command sets `process.env.NODE_ENV` to `development`. -::alert{type="info"} +::callout If you are using a self-signed certificate in development, you will need to set `NODE_TLS_REJECT_UNAUTHORIZED=0` in your environment. :: diff --git a/docs/3.api/4.commands/devtools.md b/docs/3.api/4.commands/devtools.md index 714b300e903b..1f7c476e75d6 100644 --- a/docs/3.api/4.commands/devtools.md +++ b/docs/3.api/4.commands/devtools.md @@ -1,11 +1,14 @@ --- title: "nuxi devtools" description: The devtools command allows you to enable or disable Nuxt DevTools on a per-project basis. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/devtools.ts + size: xs --- -# `nuxi devtools` - -```{bash} +```bash [Terminal] npx nuxi devtools enable|disable [rootDir] ``` @@ -15,5 +18,6 @@ Option | Default | Description -------------------------|-----------------|------------------ `rootDir` | `.` | The root directory of the app you want to enable devtools for. -::ReadMore{link="https://github.com/nuxt/devtools"} +::read-more{icon="i-simple-icons-nuxtdotjs" to="https://devtools.nuxt.com" target="_blank"} +Read more about the **Nuxt Devtools**. :: diff --git a/docs/3.api/4.commands/generate.md b/docs/3.api/4.commands/generate.md index 5aae757cff49..b5b71ec564b3 100644 --- a/docs/3.api/4.commands/generate.md +++ b/docs/3.api/4.commands/generate.md @@ -1,11 +1,14 @@ --- title: "nuxi generate" description: Pre-renders every route of the application and stores the result in plain HTML files. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/generate.ts + size: xs --- -# `nuxi generate` - -```{bash} +```bash [Terminal] npx nuxi generate [rootDir] [--dotenv] ``` @@ -16,6 +19,6 @@ Option | Default | Description `rootDir` | `.` | The root directory of the application to generate `--dotenv` | `.` | Point to another `.env` file to load, **relative** to the root directory. -::alert{type=info} -Read more about [pre-rendering and static hosting](/docs/getting-started/deployment#static-hosting). +::read-more{to="/docs/getting-started/deployment#static-hosting"} +Read more about pre-rendering and static hosting. :: diff --git a/docs/3.api/4.commands/info.md b/docs/3.api/4.commands/info.md index 12519e7b0074..7d4d757913ce 100644 --- a/docs/3.api/4.commands/info.md +++ b/docs/3.api/4.commands/info.md @@ -1,11 +1,14 @@ --- title: "nuxi info" description: The info command logs information about the current or specified Nuxt project. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/info.ts + size: xs --- -# `nuxi info` - -```{bash} +```bash [Terminal] npx nuxi info [rootDir] ``` diff --git a/docs/3.api/4.commands/init.md b/docs/3.api/4.commands/init.md index 345373f49680..89b7abc76745 100644 --- a/docs/3.api/4.commands/init.md +++ b/docs/3.api/4.commands/init.md @@ -1,11 +1,14 @@ --- title: "nuxi init" description: The init command initializes a fresh Nuxt project. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/init.ts + size: xs --- -# `nuxi init` - -```{bash} +```bash [Terminal] npx nuxi init|create [--verbose|-v] [--template,-t] [dir] ``` diff --git a/docs/3.api/4.commands/prepare.md b/docs/3.api/4.commands/prepare.md index 411966cfef3f..0d838507468e 100644 --- a/docs/3.api/4.commands/prepare.md +++ b/docs/3.api/4.commands/prepare.md @@ -1,13 +1,18 @@ --- +title: 'nuxi prepare' description: The prepare command creates a .nuxt directory in your application and generates types. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/prepare.ts + size: xs --- -# `nuxi prepare` -```{bash} +```bash [Terminal] npx nuxi prepare [--log-level] [rootDir] ``` -The `prepare` command creates a `.nuxt` directory in your application and generates types. This can be useful in a CI environment or as a `postinstall` command in your `package.json`. +The `prepare` command creates a [`.nuxt`](/docs/guide/directory-structure/nuxt) directory in your application and generates types. This can be useful in a CI environment or as a `postinstall` command in your [`package.json`](/docs/guide/directory-structure/package). Option | Default | Description -------------------------|-----------------|------------------ diff --git a/docs/3.api/4.commands/preview.md b/docs/3.api/4.commands/preview.md index 363cb66d83fc..a59cf61aff6d 100644 --- a/docs/3.api/4.commands/preview.md +++ b/docs/3.api/4.commands/preview.md @@ -1,11 +1,14 @@ --- title: "nuxi preview" description: The preview command starts a server to preview your application after the build command. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/preview.ts + size: xs --- -# `nuxi preview` - -```{bash} +```bash [Terminal] npx nuxi preview [rootDir] [--dotenv] ``` @@ -18,6 +21,6 @@ Option | Default | Description This command sets `process.env.NODE_ENV` to `production`. To override, define `NODE_ENV` in a `.env` file or as command-line argument. -::alert{type=info} -For convenience, in preview mode, your `.env` file will be loaded into `process.env`. (However, in production you will need to ensure your environment variables are set yourself.) +::callout +For convenience, in preview mode, your [`.env`](/docs/guide/directory-structure/env) file will be loaded into `process.env`. (However, in production you will need to ensure your environment variables are set yourself.) :: diff --git a/docs/3.api/4.commands/typecheck.md b/docs/3.api/4.commands/typecheck.md index bc23166a7b3d..c5a4454195fa 100644 --- a/docs/3.api/4.commands/typecheck.md +++ b/docs/3.api/4.commands/typecheck.md @@ -1,11 +1,14 @@ --- title: "nuxi typecheck" description: The typecheck command runs vue-tsc to check types throughout your app. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/typecheck.ts + size: xs --- -# `nuxi typecheck` - -```{bash} +```bash [Terminal] npx nuxi typecheck [--log-level] [rootDir] ``` @@ -15,8 +18,10 @@ Option | Default | Description -------------------------|-----------------|------------------ `rootDir` | `.` | The directory of the target application. -This command sets `process.env.NODE_ENV` to `production`. To override, define `NODE_ENV` in a `.env` file or as a command-line argument. +::callout +This command sets `process.env.NODE_ENV` to `production`. To override, define `NODE_ENV` in a [`.env`](/docs/guide/directory-structure/env) file or as a command-line argument. +:: -::alert -You can also enable type-checking at build or development time by installing `typescript` and `vue-tsc` as devDependencies and enabling [the `typescript.typeCheck` option in your `nuxt.config` file](/docs/api/nuxt-config#typescript). +::read-more{to="/docs/guide/concepts/typescript#type-checking"} +Read more on how to enable type-checking at build or development time. :: diff --git a/docs/3.api/4.commands/upgrade.md b/docs/3.api/4.commands/upgrade.md index eb86321bd5f2..1091ef36497b 100644 --- a/docs/3.api/4.commands/upgrade.md +++ b/docs/3.api/4.commands/upgrade.md @@ -1,11 +1,14 @@ --- title: "nuxi upgrade" description: The upgrade command upgrades Nuxt 3 to the latest version. +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/cli/blob/main/src/commands/upgrade.ts + size: xs --- -# `nuxi upgrade` - -```{bash} +```bash [Terminal] npx nuxi upgrade [--force|-f] ``` From fdba37d31e656e72b25b199cac58671863b987fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 19:04:20 +0200 Subject: [PATCH 35/62] docs: api done --- docs/3.api/3.utils/show-error.md | 2 +- docs/3.api/5.kit/11.nitro.md | 6 +++--- docs/3.api/5.kit/14.builder.md | 12 ++++++------ docs/3.api/5.kit/4.autoimports.md | 2 +- docs/3.api/5.kit/6.context.md | 2 +- docs/3.api/5.kit/7.pages.md | 4 ++-- docs/3.api/5.kit/9.plugins.md | 4 ++-- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/3.api/3.utils/show-error.md b/docs/3.api/3.utils/show-error.md index 2925318bbc99..eef4242c088d 100644 --- a/docs/3.api/3.utils/show-error.md +++ b/docs/3.api/3.utils/show-error.md @@ -28,4 +28,4 @@ The error is set in the state using [`useError()`](/docs/api/composables/use-err `showError` calls the `app:error` hook. :: -:ReadMore{to="/docs/getting-started/error-handling"} +:read-more{to="/docs/getting-started/error-handling"} diff --git a/docs/3.api/5.kit/11.nitro.md b/docs/3.api/5.kit/11.nitro.md index 9ea274ef00a7..bbd7690f99f0 100644 --- a/docs/3.api/5.kit/11.nitro.md +++ b/docs/3.api/5.kit/11.nitro.md @@ -207,11 +207,11 @@ export default defineNuxtModule({ Returns the Nitro instance. -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} You can call `useNitro()` only after `ready` hook. :: -::alert{type=info} +::callout Changes to the Nitro instance configuration are not applied. :: @@ -264,7 +264,7 @@ export default defineNuxtModule({ Add plugin to extend Nitro's runtime behavior. -::alert{type=info} +::callout You can read more about Nitro plugins in the [Nitro documentation](https://nitro.unjs.io/guide/plugins). :: diff --git a/docs/3.api/5.kit/14.builder.md b/docs/3.api/5.kit/14.builder.md index fe0f4da56b0c..2617165b1a5d 100644 --- a/docs/3.api/5.kit/14.builder.md +++ b/docs/3.api/5.kit/14.builder.md @@ -28,8 +28,8 @@ export interface ExtendWebpackConfigOptions { } ``` -::alert{type=info} -See [webpack website](https://webpack.js.org/configuration/) for more information about webpack configuration. +::read-more{to="https://webpack.js.org/configuration/" target="_blank" color="gray" icon="i-simple-icons-webpack"} +Checkout webpack website for more information about its configuration. :: ### Parameters @@ -123,8 +123,8 @@ export interface ExtendViteConfigOptions { } ``` -::alert{type=info} -See [Vite website](https://vitejs.dev/config/) for more information about Vite configuration. +::read-more{to="https://vitejs.dev/config/" target="_blank" color="gray" icon="i-simple-icons-vite"} +Checkout Vite website for more information about its configuration. :: ### Parameters @@ -220,7 +220,7 @@ interface ExtendWebpackConfigOptions { } ``` -::alert{type=info} +::callout See [webpack website](https://webpack.js.org/concepts/plugins/) for more information about webpack plugins. You can also use [this collection](https://webpack.js.org/awesome-webpack/#webpack-plugins) to find a plugin that suits your needs. :: @@ -328,7 +328,7 @@ interface ExtendViteConfigOptions { } ``` -::alert{type=info} +::callout See [Vite website](https://vitejs.dev/guide/api-plugin.html) for more information about Vite plugins. You can also use [this repository](https://github.com/vitejs/awesome-vite#plugins) to find a plugin that suits your needs. :: diff --git a/docs/3.api/5.kit/4.autoimports.md b/docs/3.api/5.kit/4.autoimports.md index cb8c6822a842..43fb8a77b03b 100644 --- a/docs/3.api/5.kit/4.autoimports.md +++ b/docs/3.api/5.kit/4.autoimports.md @@ -12,7 +12,7 @@ links: Nuxt auto-imports helper functions, composables and Vue APIs to use across your application without explicitly importing them. Based on the directory structure, every Nuxt application can also use auto-imports for its own composables and plugins. With Nuxt Kit you can also add your own auto-imports. `addImports` and `addImportsDir` allow you to add imports to the Nuxt application. `addImportsSources` allows you to add listed imports from 3rd party packages to the Nuxt application. -::alert{type=info} +::callout These functions are designed for registering your own utils, composables and Vue APIs. For pages, components and plugins, please refer to the specific sections: [Pages](/docs/api/kit/pages), [Components](/docs/api/kit/components), [Plugins](/docs/api/kit/plugins). :: diff --git a/docs/3.api/5.kit/6.context.md b/docs/3.api/5.kit/6.context.md index ae302d23e8d3..8c432fa96439 100644 --- a/docs/3.api/5.kit/6.context.md +++ b/docs/3.api/5.kit/6.context.md @@ -10,7 +10,7 @@ links: Nuxt modules allow you to enhance Nuxt's capabilities. They offer a structured way to keep your code organized and modular. If you're looking to break down your module into smaller components, Nuxt offers the `useNuxt` and `tryUseNuxt` functions. These functions enable you to conveniently access the Nuxt instance from the context without having to pass it as argument. -::alert{type=info} +::callout When you're working with the `setup` function in Nuxt modules, Nuxt is already provided as the second argument. This means you can directly utilize it without needing to call `useNuxt()`. You can look at [Nuxt Site Config](https://github.com/harlan-zw/nuxt-site-config) as an example of usage. :: diff --git a/docs/3.api/5.kit/7.pages.md b/docs/3.api/5.kit/7.pages.md index 3fdcc1e83a14..9a21bd2fa7e8 100644 --- a/docs/3.api/5.kit/7.pages.md +++ b/docs/3.api/5.kit/7.pages.md @@ -63,7 +63,7 @@ export default defineNuxtModule({ Nuxt is powered by the [Nitro](https://nitro.unjs.io) server engine. With Nitro, you can incorporate high-level logic directly into your configuration, which is useful for actions like redirects, proxying, caching, and appending headers to routes. This configuration works by associating route patterns with specific route settings. -::alert{type=info icon=๐Ÿ‘‰} +::callout You can read more about Nitro route rules in the [Nitro documentation](https://nitro.unjs.io/guide/routing#route-rules). :: @@ -180,7 +180,7 @@ Registers route middlewares to be available for all routes or for specific route Route middlewares can be also defined in plugins via [`addRouteMiddleware`](/docs/api/utils/add-route-middleware) composable. -::alert{type=info icon=๐Ÿ‘‰} +::callout Read more about route middlewares in the [Route middleware documentation](/docs/getting-started/routing#route-middleware). :: diff --git a/docs/3.api/5.kit/9.plugins.md b/docs/3.api/5.kit/9.plugins.md index 320bc59cbd2f..f25b2c38e4a4 100644 --- a/docs/3.api/5.kit/9.plugins.md +++ b/docs/3.api/5.kit/9.plugins.md @@ -60,7 +60,7 @@ A plugin object or a string with the path to the plugin. If a string is provided Order of the plugin. This allows more granular control over plugin order and should only be used by advanced users. Lower numbers run first, and user plugins default to `0`. It's recommended to set `order` to a number between `-20` for `pre`-plugins (plugins that run before Nuxt plugins) and `20` for `post`-plugins (plugins that run after Nuxt plugins). -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} Don't use `order` unless you know what you're doing. For most plugins, the default `order` of `0` is sufficient. To append a plugin to the end of the plugins array, use the `append` option instead. :: @@ -197,7 +197,7 @@ A plugin template object with the following properties: Order of the plugin. This allows more granular control over plugin order and should only be used by advanced users. Lower numbers run first, and user plugins default to `0`. It's recommended to set `order` to a number between `-20` for `pre`-plugins (plugins that run before Nuxt plugins) and `20` for `post`-plugins (plugins that run after Nuxt plugins). -::alert{type=warning} +::callout{color="amber" icon="i-ph-warning-duotone"} Don't use `order` unless you know what you're doing. For most plugins, the default `order` of `0` is sufficient. To append a plugin to the end of the plugins array, use the `append` option instead. :: From 4893ab91895a6dfbfdd5c077edabd1ad84685034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 19:18:59 +0200 Subject: [PATCH 36/62] docs: 404 links --- docs/2.guide/3.going-further/1.internals.md | 2 +- docs/2.guide/3.going-further/3.modules.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/2.guide/3.going-further/1.internals.md b/docs/2.guide/3.going-further/1.internals.md index b406272a4230..e0e60f733d4d 100644 --- a/docs/2.guide/3.going-further/1.internals.md +++ b/docs/2.guide/3.going-further/1.internals.md @@ -12,7 +12,7 @@ a common context will be created, referred to as `nuxt` internally. It holds nor some internal state, and a powerful [hooking system](/docs/api/advanced/hooks) powered by [unjs/hookable](https://github.com/unjs/hookable) allowing different components to communicate with each other. You can think of it as **Builder Core**. -This context is globally available to be used with [nuxt/kit](/docs/api/advanced/kit) composables. +This context is globally available to be used with [Nuxt Kit](/docs/guide/going-further/kit) composables. Therefore only one instance of Nuxt is allowed to run per process. To extend the Nuxt interface and hook into different stages of the build process, we can use [Nuxt Modules](/docs/guide/going-further/modules). diff --git a/docs/2.guide/3.going-further/3.modules.md b/docs/2.guide/3.going-further/3.modules.md index f300e6489725..9b23d09590eb 100644 --- a/docs/2.guide/3.going-further/3.modules.md +++ b/docs/2.guide/3.going-further/3.modules.md @@ -123,7 +123,7 @@ export default function (inlineOptions, nuxt) { } ``` -You can get type-hint support for this function using the higher-level `defineNuxtModule` helper provided by [Nuxt Kit](/docs/api/advanced/kit). +You can get type-hint support for this function using the higher-level `defineNuxtModule` helper provided by [Nuxt Kit](/docs/guide/going-further/kit). ```ts import { defineNuxtModule } from '@nuxt/kit' @@ -227,7 +227,7 @@ Modules come with a set of first-party tools to help you with their development. [Nuxt Kit](/docs/guide/going-further/kit) provides composable utilities to help your module interact with Nuxt applications. It's recommended to use Nuxt Kit utilities over manual alternatives whenever possible to ensure better compatibility and code readability of your module. -:read-more{to="/docs/api/advanced/kit"} +:read-more{to="/docs/guide/going-further/kit"} #### `@nuxt/test-utils` @@ -305,7 +305,7 @@ export default defineNuxtModule({ }) ``` -:read-more{to="/docs/api/advanced/kit"} +:read-more{to="/docs/guide/going-further/kit"} #### Injecting Vue Components With `addComponent` From 04c8a4417b169f9fc34f3a6fbedd5a6c22fbe74d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 20:29:55 +0200 Subject: [PATCH 37/62] docs: lint --- docs/3.api/2.composables/use-lazy-async-data.md | 1 - docs/3.api/2.composables/use-runtime-config.md | 1 - docs/3.api/2.composables/use-state.md | 1 - docs/3.api/3.utils/navigate-to.md | 2 -- docs/3.api/3.utils/reload-nuxt-app.md | 2 +- 5 files changed, 1 insertion(+), 6 deletions(-) diff --git a/docs/3.api/2.composables/use-lazy-async-data.md b/docs/3.api/2.composables/use-lazy-async-data.md index a32f52d685cc..2d9d0f8bc579 100644 --- a/docs/3.api/2.composables/use-lazy-async-data.md +++ b/docs/3.api/2.composables/use-lazy-async-data.md @@ -12,7 +12,6 @@ links: By default, [`useAsyncData`](/docs/api/composables/use-async-data) blocks navigation until its async handler is resolved. `useLazyAsyncData` provides a wrapper around [`useAsyncData`](/docs/api/composables/use-async-data) that triggers navigation before the handler is resolved by setting the `lazy` option to `true`. - ::callout `useLazyAsyncData` has the same signature as [`useAsyncData`](/docs/api/composables/use-async-data). :: diff --git a/docs/3.api/2.composables/use-runtime-config.md b/docs/3.api/2.composables/use-runtime-config.md index a1dbb7f3e147..c83c35b1fe48 100644 --- a/docs/3.api/2.composables/use-runtime-config.md +++ b/docs/3.api/2.composables/use-runtime-config.md @@ -140,4 +140,3 @@ export default defineEventHandler((event) => { ``` :read-more{to="/docs/guide/going-further/runtime-config"} - diff --git a/docs/3.api/2.composables/use-state.md b/docs/3.api/2.composables/use-state.md index 40b8bf9c7775..18788a6fe0bb 100644 --- a/docs/3.api/2.composables/use-state.md +++ b/docs/3.api/2.composables/use-state.md @@ -26,7 +26,6 @@ Because the data inside `useState` will be serialized to JSON, it is important t `useState` is a reserved function name transformed by the compiler, so you should not name your own function `useState`. :: - ## Type ```ts diff --git a/docs/3.api/3.utils/navigate-to.md b/docs/3.api/3.utils/navigate-to.md index ac96417c24f8..366b386b3f42 100644 --- a/docs/3.api/3.utils/navigate-to.md +++ b/docs/3.api/3.utils/navigate-to.md @@ -12,7 +12,6 @@ links: `navigateTo` is available on both server side and client side. :: - ## Usage ### Within a Vue Component @@ -81,7 +80,6 @@ await navigateTo('https://nuxt.com', { </script> ``` - ## Type ```ts diff --git a/docs/3.api/3.utils/reload-nuxt-app.md b/docs/3.api/3.utils/reload-nuxt-app.md index d8fbb8674292..e590773777d4 100644 --- a/docs/3.api/3.utils/reload-nuxt-app.md +++ b/docs/3.api/3.utils/reload-nuxt-app.md @@ -12,7 +12,7 @@ links: `reloadNuxtApp` will perform a hard reload of your app, re-requesting a page and its dependencies from the server. :: -By default, it will also save the current `state` of your app (that is, any state you could access with `useState`). +By default, it will also save the current `state` of your app (that is, any state you could access with `useState`). ::read-more{to="/docs/guide/going-further/experimental-features#restorestate"} You can enable experimental restoration of this state by enabling the `experimental.restoreState` option in your `nuxt.config` file. From 667fefcbcf7a3f19f8721b5b004425cb0c860d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 21:18:42 +0200 Subject: [PATCH 38/62] schema: improve links --- packages/schema/src/config/experimental.ts | 36 +++++++++++++++------- packages/schema/src/types/config.ts | 6 ++-- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/packages/schema/src/config/experimental.ts b/packages/schema/src/config/experimental.ts index fb65f1c513b5..ca376a07c9b7 100644 --- a/packages/schema/src/config/experimental.ts +++ b/packages/schema/src/config/experimental.ts @@ -11,11 +11,12 @@ export default defineUntypedSchema({ /** * Enable Vue's reactivity transform - * @see https://vuejs.org/guide/extras/reactivity-transform.html + * + * @see [Vue Reactivity Transform Docs](https://vuejs.org/guide/extras/reactivity-transform.html) * * Warning: Reactivity transform feature has been marked as deprecated in Vue 3.3 and is planned to be * removed from core in Vue 3.4. - * @see https://github.com/vuejs/rfcs/discussions/369#discussioncomment-5059028 + * @see [Vue RFC#369](https://github.com/vuejs/rfcs/discussions/369#discussioncomment-5059028) */ reactivityTransform: false, @@ -23,13 +24,15 @@ export default defineUntypedSchema({ // https://github.com/unjs/nitro/issues/1118 /** * Externalize `vue`, `@vue/*` and `vue-router` when building. - * @see https://github.com/nuxt/nuxt/issues/13632 + * + * @see [Nuxt Issue #13632](https://github.com/nuxt/nuxt/issues/13632) */ externalVue: true, /** * Tree shakes contents of client-only components from server bundle. - * @see https://github.com/nuxt/framework/pull/5750 + * + * @see [Nuxt PR #5750](https://github.com/nuxt/framework/pull/5750) */ treeshakeClientOnly: true, @@ -42,7 +45,8 @@ export default defineUntypedSchema({ * * You can disable automatic handling by setting this to `false`, or handle * chunk errors manually by setting it to `manual`. - * @see https://github.com/nuxt/nuxt/pull/19038 + * + * @see [Nuxt PR #19038](https://github.com/nuxt/nuxt/pull/19038) * @type {false | 'manual' | 'automatic'} */ emitRouteChunkError: { @@ -78,6 +82,7 @@ export default defineUntypedSchema({ * Consider carefully before enabling this as it can cause unexpected behavior, and * consider providing explicit keys to `useState` as auto-generated keys may not match * across builds. + * * @type {boolean} */ restoreState: false, @@ -87,6 +92,7 @@ export default defineUntypedSchema({ * * You can also pass a function that receives the path of a Vue component * and returns a boolean indicating whether to inline the styles for that component. + * * @type {boolean | ((id?: string) => boolean)} */ inlineSSRStyles: { @@ -115,6 +121,7 @@ export default defineUntypedSchema({ /** * When this option is enabled (by default) payload of pages that are prerendered are extracted + * * @type {boolean | undefined} */ payloadExtraction: true, @@ -130,18 +137,21 @@ export default defineUntypedSchema({ /** * Enable View Transition API integration with client-side router. - * @see https://developer.chrome.com/docs/web-platform/view-transitions + * + * @see [View Transitions API](https://developer.chrome.com/docs/web-platform/view-transitions) */ viewTransition: false, /** * Write early hints when using node server. + * * @note nginx does not support 103 Early hints in the current version. */ writeEarlyHints: false, /** * Experimental component islands support with <NuxtIsland> and .island.vue files. + * * @type {true | 'local' | 'local+remote' | false} */ componentIslands: { @@ -154,7 +164,8 @@ export default defineUntypedSchema({ /** * Config schema support - * @see https://github.com/nuxt/nuxt/issues/15592 + * + * @see [Nuxt Issue #15592](https://github.com/nuxt/nuxt/issues/15592) */ configSchema: true, @@ -216,15 +227,17 @@ export default defineUntypedSchema({ * performance in large projects or on Windows platforms. * * You can also set this to `chokidar` to watch all files in your source directory. - * @see https://github.com/paulmillr/chokidar - * @see https://github.com/parcel-bundler/watcher + * + * @see [chokidar](https://github.com/paulmillr/chokidar) + * @see [Parcel watcher](https://github.com/parcel-bundler/watcher) * @type {'chokidar' | 'parcel' | 'chokidar-granular'} */ watcher: 'chokidar-granular', /** * Enable native async context to be accessible for nested composables - * @see https://github.com/nuxt/nuxt/pull/20918 + * + * @see [Nuxt PR #20918](https://github.com/nuxt/nuxt/pull/20918) */ asyncContext: false, @@ -232,7 +245,8 @@ export default defineUntypedSchema({ * Use new experimental head optimisations: * - Add the capo.js head plugin in order to render tags in of the head in a more performant way. * - Uses the hash hydration plugin to reduce initial hydration - * @see https://github.com/nuxt/nuxt/discussions/22632 + * + * @see [Nuxt Discussion #22632](https://github.com/nuxt/nuxt/discussions/22632] */ headNext: false, diff --git a/packages/schema/src/types/config.ts b/packages/schema/src/types/config.ts index 3226585d468a..eab2313ace82 100644 --- a/packages/schema/src/types/config.ts +++ b/packages/schema/src/types/config.ts @@ -89,7 +89,7 @@ export interface NuxtConfig extends DeepPartial<Omit<ConfigSchema, 'vite' | 'run /** * Experimental custom config schema * - * @see https://github.com/nuxt/nuxt/issues/15592 + * @see [Nuxt Issue #15592](https://github.com/nuxt/nuxt/issues/15592) */ $schema?: SchemaDefinition } @@ -127,14 +127,14 @@ export interface ViteConfig extends Omit<ViteUserConfig, 'publicDir'> { /** * Options passed to @vitejs/plugin-vue. * - * @see https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue + * @see [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue) */ vue?: VuePluginOptions /** * Options passed to @vitejs/plugin-vue-jsx. * - * @see https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue-jsx + * @see [@vitejs/plugin-vue-jsx.](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue-jsx) */ vueJsx?: VueJsxPluginOptions From 7c63787ef7a2013dc0b51acb249f5dc854d6d547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Mon, 16 Oct 2023 21:22:40 +0200 Subject: [PATCH 39/62] Update 5.components.md --- docs/3.api/5.kit/5.components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/3.api/5.kit/5.components.md b/docs/3.api/5.kit/5.components.md index 293d0015d8e6..f973fa815645 100644 --- a/docs/3.api/5.kit/5.components.md +++ b/docs/3.api/5.kit/5.components.md @@ -266,7 +266,7 @@ An object with the following properties: **Type**: `boolean` - If enabled, registers component as island. You can read more about islands in [<NuxtIsland/>](/docs/api/components/nuxt-island#nuxtisland) component description. + If enabled, registers component as island. You can read more about islands in [`<NuxtIsland/>`](/docs/api/components/nuxt-island#nuxtisland) component description. - `mode` (optional) From 097b43dd05dab7a069eb8fc1f2933d145d01cc42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Tue, 17 Oct 2023 10:28:42 +0200 Subject: [PATCH 40/62] Update use-state.md --- docs/3.api/2.composables/use-state.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/3.api/2.composables/use-state.md b/docs/3.api/2.composables/use-state.md index 18788a6fe0bb..e7d8d107ad03 100644 --- a/docs/3.api/2.composables/use-state.md +++ b/docs/3.api/2.composables/use-state.md @@ -26,6 +26,15 @@ Because the data inside `useState` will be serialized to JSON, it is important t `useState` is a reserved function name transformed by the compiler, so you should not name your own function `useState`. :: +## Using `shallowRef` + +If you don't need your state to be deeply reactive, you can combine `useState` with [`shallowRef`](https://vuejs.org/api/reactivity-advanced.html#shallowref). This can improve performance when your state contains large objects and arrays. + +```ts +const state = useState('my-shallow-state', () => shallowRef({ deep: 'not reactive' })) +// isShallow(state) === true +``` + ## Type ```ts From 93c932b05888606e3c81e8c1b9951f629759e2a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Tue, 17 Oct 2023 10:37:11 +0200 Subject: [PATCH 41/62] docs: improve layout naming --- .../2.directory-structure/1.layouts.md | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/docs/2.guide/2.directory-structure/1.layouts.md b/docs/2.guide/2.directory-structure/1.layouts.md index 1b762b9cde6e..5b7ac1810f7a 100644 --- a/docs/2.guide/2.directory-structure/1.layouts.md +++ b/docs/2.guide/2.directory-structure/1.layouts.md @@ -93,6 +93,22 @@ const layout = "custom"; </template> ``` +If you have a layout in nested directories, the layout's name will be based on its own path directory and filename, with duplicate segments being removed. + +File | Layout Name +-- | -- +`~/layouts/desktop/default.vue` | `desktop-default` +`~/layouts/desktop-base/base.vue` | `desktop-base` +`~/layouts/desktop/index.vue` | `desktop` + +For clarity, we recommend that the layout's filename matches its name: + +File | Layout Name +-- | -- +`~/layouts/desktop/DesktopDefault.vue` | `desktop-default` +`~/layouts/desktop-base/DesktopBase.vue` | `desktop-base` +`~/layouts/desktop/Desktop.vue` | `desktop` + :link-example{to="/docs/examples/features/layouts"} ## Changing the Layout Dynamically @@ -162,24 +178,3 @@ definePageMeta({ ::callout If you use `<NuxtLayout>` within your pages, make sure it is not the root element (or [disable layout/page transitions](/docs/getting-started/transitions#disable-transitions)). :: - -## Layout Names - -If you have a layout in nested directories such as: - -```bash -| layouts/ ---| base/ -----| foo/ -------| Layout.vue -``` - -... then the layout's name will be based on its own path directory and filename, with duplicate segments being removed. Therefore, the layout's name will be: - -```html -<BaseFooLayout /> -``` - -::alert -For clarity, we recommend that the layout's filename matches its name. (So, in the example above, you could rename `Layout.vue` to be `BaseFooLayout.vue`.) -:: From c2f13dbdfb238ca64bd2e5d52c6cfc44ce01410a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Tue, 17 Oct 2023 11:11:54 +0200 Subject: [PATCH 42/62] chore: remove .website --- .website/.gitignore | 12 - .website/README.md | 35 - .website/app.config.ts | 14 - .website/nuxt.config.ts | 20 - .website/package.json | 14 - .website/tsconfig.json | 3 - package.json | 1 - pnpm-lock.yaml | 2632 ++------------------------------------- pnpm-workspace.yaml | 1 - 9 files changed, 80 insertions(+), 2652 deletions(-) delete mode 100755 .website/.gitignore delete mode 100755 .website/README.md delete mode 100644 .website/app.config.ts delete mode 100755 .website/nuxt.config.ts delete mode 100755 .website/package.json delete mode 100755 .website/tsconfig.json diff --git a/.website/.gitignore b/.website/.gitignore deleted file mode 100755 index 69f6b69d0721..000000000000 --- a/.website/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -node_modules -*.iml -.idea -*.log* -.nuxt -.vscode -.DS_Store -coverage -dist -sw.* -.env -.output diff --git a/.website/README.md b/.website/README.md deleted file mode 100755 index 197a0d921a61..000000000000 --- a/.website/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Nuxt Docs Website - -This is a temporary directory until we open source the repository for nuxt.com. - -The goal is to simplify the contribution in the meantime to the documentation by having the possibility to preview the changes locally. - -## Setup - -Install dependencies in the root of the `nuxt` folder: - -```bash -pnpm i -``` - -Then stub the dependencies: - -```bash -pnpm build:stub -``` - -## Development - -In the root of the `nuxt` folder, run: - -```bash -pnpm docs:dev -``` - -Then open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -Update the documentation within the `docs` folder. - ---- - -For a detailed explanation of how things work, check out [Docus](https://docus.dev). diff --git a/.website/app.config.ts b/.website/app.config.ts deleted file mode 100644 index 9692072acbc6..000000000000 --- a/.website/app.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -export default defineAppConfig({ - docus: { - title: 'Nuxt Docs [dev]', - description: 'The best place to start your documentation.', - socials: { - twitter: 'nuxt_js', - github: 'nuxt/nuxt' - }, - aside: { - level: 1, - collapsed: false, - }, - } -}) diff --git a/.website/nuxt.config.ts b/.website/nuxt.config.ts deleted file mode 100755 index 8de14298ae0e..000000000000 --- a/.website/nuxt.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createResolver } from 'nuxt/kit' - -const { resolve } = createResolver(import.meta.url) - -export default defineNuxtConfig({ - // https://github.com/nuxt-themes/docus - extends: '@nuxt-themes/docus', - content: { - sources: { - docs: { - driver: 'fs', - prefix: '/', - base: resolve('../docs') - } - } - }, - experimental: { - renderJsonPayloads: false - } -}) diff --git a/.website/package.json b/.website/package.json deleted file mode 100755 index 3cb01d7ff891..000000000000 --- a/.website/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "docus-starter", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "nuxt dev", - "build": "nuxt build", - "generate": "nuxt generate", - "preview": "nuxt preview" - }, - "devDependencies": { - "@nuxt-themes/docus": "1.15.0" - } -} diff --git a/.website/tsconfig.json b/.website/tsconfig.json deleted file mode 100755 index 4b34df1571f7..000000000000 --- a/.website/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./.nuxt/tsconfig.json" -} diff --git a/package.json b/package.json index b3d525c507c2..9d92661338f6 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ "lint:docs": "markdownlint ./docs && case-police 'docs/**/*.md' *.md", "lint:docs:fix": "markdownlint ./docs --fix && case-police 'docs/**/*.md' *.md --fix", "lint:knip": "pnpx knip", - "docs:dev": "nuxi dev .website", "play": "nuxi dev playground", "play:build": "nuxi build playground", "play:preview": "nuxi preview playground", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2fb6e87e81b5..614b613237d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -140,12 +140,6 @@ importers: specifier: 1.8.19 version: 1.8.19(typescript@5.2.2) - .website: - devDependencies: - '@nuxt-themes/docus': - specifier: 1.15.0 - version: 1.15.0(nuxt@packages+nuxt)(postcss@8.4.31)(vue@3.3.4) - packages/kit: dependencies: '@nuxt/schema': @@ -1583,31 +1577,6 @@ packages: dependencies: mime: 3.0.0 - /@csstools/cascade-layer-name-parser@1.0.4(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0): - resolution: {integrity: sha512-zXMGsJetbLoXe+gjEES07MEGjL0Uy3hMxmnGtVBrRpVKr5KV9OgCB09zr/vLrsEtoVQTgJFewxaU8IYSAE4tjg==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - '@csstools/css-parser-algorithms': ^2.3.1 - '@csstools/css-tokenizer': ^2.2.0 - dependencies: - '@csstools/css-parser-algorithms': 2.3.1(@csstools/css-tokenizer@2.2.0) - '@csstools/css-tokenizer': 2.2.0 - dev: true - - /@csstools/css-parser-algorithms@2.3.1(@csstools/css-tokenizer@2.2.0): - resolution: {integrity: sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - '@csstools/css-tokenizer': ^2.2.0 - dependencies: - '@csstools/css-tokenizer': 2.2.0 - dev: true - - /@csstools/css-tokenizer@2.2.0: - resolution: {integrity: sha512-wErmsWCbsmig8sQKkM6pFhr/oPha1bHfvxsUY5CYSQxwyhA9Ulrs8EqCgClhg4Tgg2XapVstGqSVcz0xOYizZA==} - engines: {node: ^14 || ^16 || >=18} - dev: true - /@discoveryjs/json-ext@0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} @@ -1622,15 +1591,6 @@ packages: jsdoc-type-pratt-parser: 4.0.0 dev: true - /@esbuild/android-arm64@0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -1647,15 +1607,6 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm@0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.18.20: resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -1672,15 +1623,6 @@ packages: requiresBuild: true optional: true - /@esbuild/android-x64@0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.18.20: resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -1697,15 +1639,6 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-arm64@0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.18.20: resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -1722,15 +1655,6 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-x64@0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.18.20: resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -1747,15 +1671,6 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-arm64@0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.18.20: resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -1772,15 +1687,6 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-x64@0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.18.20: resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -1797,15 +1703,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm64@0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.18.20: resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -1822,15 +1719,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm@0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.18.20: resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -1847,15 +1735,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ia32@0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.18.20: resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -1872,15 +1751,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-loong64@0.17.19: - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.18.20: resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -1897,15 +1767,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-mips64el@0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.18.20: resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -1922,15 +1783,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ppc64@0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.18.20: resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -1947,15 +1799,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-riscv64@0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.18.20: resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -1972,15 +1815,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-s390x@0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.18.20: resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -1997,15 +1831,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-x64@0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.18.20: resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -2022,15 +1847,6 @@ packages: requiresBuild: true optional: true - /@esbuild/netbsd-x64@0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.18.20: resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -2047,15 +1863,6 @@ packages: requiresBuild: true optional: true - /@esbuild/openbsd-x64@0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.18.20: resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -2072,15 +1879,6 @@ packages: requiresBuild: true optional: true - /@esbuild/sunos-x64@0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.18.20: resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -2097,15 +1895,6 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-arm64@0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.18.20: resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -2122,15 +1911,6 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-ia32@0.17.19: - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.18.20: resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -2147,15 +1927,6 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-x64@0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.18.20: resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -2222,19 +1993,6 @@ packages: /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - /@iconify/types@2.0.0: - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - dev: true - - /@iconify/vue@4.1.1(vue@3.3.4): - resolution: {integrity: sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==} - peerDependencies: - vue: 3.3.4 - dependencies: - '@iconify/types': 2.0.0 - vue: 3.3.4 - dev: true - /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -2524,136 +2282,6 @@ packages: - supports-color dev: false - /@nuxt-themes/docus@1.15.0(nuxt@packages+nuxt)(postcss@8.4.31)(vue@3.3.4): - resolution: {integrity: sha512-V2kJ5ecGUxXcEovXeQkJBPYfQwjmjaxB5fnl2XaQV+S2Epcn+vhPWShSlL6/WXzLPiAkQFdwbBj9xedTvXgjkw==} - dependencies: - '@nuxt-themes/elements': 0.9.5(postcss@8.4.31)(vue@3.3.4) - '@nuxt-themes/tokens': 1.9.1(postcss@8.4.31)(vue@3.3.4) - '@nuxt-themes/typography': 0.11.0(postcss@8.4.31)(vue@3.3.4) - '@nuxt/content': 2.8.5(vue@3.3.4) - '@nuxthq/studio': 1.0.0 - '@vueuse/integrations': 10.4.1(focus-trap@7.5.3)(fuse.js@6.6.2)(vue@3.3.4) - '@vueuse/nuxt': 10.4.1(nuxt@packages+nuxt)(vue@3.3.4) - focus-trap: 7.5.3 - fuse.js: 6.6.2 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/kv' - - '@vue/composition-api' - - async-validator - - axios - - bufferutil - - change-case - - drauu - - idb-keyval - - jwt-decode - - nprogress - - nuxt - - postcss - - qrcode - - sass - - sortablejs - - supports-color - - universal-cookie - - utf-8-validate - - vue - dev: true - - /@nuxt-themes/elements@0.9.5(postcss@8.4.31)(vue@3.3.4): - resolution: {integrity: sha512-uAA5AiIaT1SxCBjNIURJyCDPNR27+8J+t3AWuzWyhbNPr3L1inEcETZ3RVNzFdQE6mx7MGAMwFBqxPkOUhZQuA==} - dependencies: - '@nuxt-themes/tokens': 1.9.1(postcss@8.4.31)(vue@3.3.4) - '@vueuse/core': 9.13.0(vue@3.3.4) - transitivePeerDependencies: - - '@vue/composition-api' - - postcss - - sass - - supports-color - - vue - dev: true - - /@nuxt-themes/tokens@1.9.1(postcss@8.4.31)(vue@3.3.4): - resolution: {integrity: sha512-5C28kfRvKnTX8Tux+xwyaf+2pxKgQ53dC9l6C33sZwRRyfUJulGDZCFjKbuNq4iqVwdGvkFSQBYBYjFAv6t75g==} - dependencies: - '@nuxtjs/color-mode': 3.3.0 - '@vueuse/core': 9.13.0(vue@3.3.4) - pinceau: 0.18.9(postcss@8.4.31) - transitivePeerDependencies: - - '@vue/composition-api' - - postcss - - sass - - supports-color - - vue - dev: true - - /@nuxt-themes/typography@0.11.0(postcss@8.4.31)(vue@3.3.4): - resolution: {integrity: sha512-TqyvD7sDWnqGmL00VtuI7JdmNTPL5/g957HCAWNzcNp+S20uJjW/FXSdkM76d4JSVDHvBqw7Wer3RsqVhqvA4w==} - dependencies: - '@nuxtjs/color-mode': 3.3.0 - nuxt-config-schema: 0.4.6 - nuxt-icon: 0.3.3(vue@3.3.4) - pinceau: 0.18.9(postcss@8.4.31) - ufo: 1.3.1 - transitivePeerDependencies: - - postcss - - sass - - supports-color - - vue - dev: true - - /@nuxt/content@2.8.5(vue@3.3.4): - resolution: {integrity: sha512-sWVGoZJOjwEd8v6XYTrHYtQ7c11HR6yK9dcqruf+7WM2WJmwTSeY8B1ir6+9mE1FPQAFnqg26qSkxwafpS9o+g==} - dependencies: - '@nuxt/kit': link:packages/kit - '@nuxtjs/mdc': 0.2.1 - '@vueuse/head': 2.0.0(vue@3.3.4) - consola: 3.2.3 - defu: 6.1.2 - destr: 2.0.1 - json5: 2.2.3 - knitwork: 1.0.0 - listhen: 1.5.5 - mdast-util-to-string: 4.0.0 - mdurl: 1.0.1 - micromark: 4.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-types: 2.0.0 - ohash: 1.1.3 - pathe: 1.1.1 - scule: 1.0.0 - shiki-es: 0.14.0 - slugify: 1.6.6 - socket.io-client: 4.7.2 - ufo: 1.3.1 - unist-util-stringify-position: 4.0.0 - unstorage: 1.9.0 - ws: 8.14.2 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - idb-keyval - - supports-color - - utf-8-validate - - vue - dev: true - /@nuxt/devalue@2.0.2: resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} dev: false @@ -2794,33 +2422,10 @@ packages: resolution: {integrity: sha512-5gc02Pu1HycOVUWJ8aYsWeeXcSTPe8iX8+KIrhyEtEoOSkY0eMBuo0ssljB8wALuEmepv31DlYe5gpiRwkjESA==} dev: false - /@nuxthq/studio@1.0.0: - resolution: {integrity: sha512-W4dUsj4ypJc2jG6cE8ECmnAx99SKX0qqzoAYqj1KJ9QmknLON/DIHdyhUtIoPMHlzcBgErTeUzy4prxsO5cHBg==} - dependencies: - '@nuxt/kit': link:packages/kit - defu: 6.1.2 - nuxt-component-meta: 0.5.3 - nuxt-config-schema: 0.4.6 - socket.io-client: 4.7.2 - ufo: 1.3.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /@nuxtjs/color-mode@3.3.0: - resolution: {integrity: sha512-YVFNmTISke1eL7uk5p9I1suOsM222FxrqKoF13HS4x94OKCWwPLLeTCEzHZ8orzKnaFUbCXpuL4pRv8gvW+0Kw==} - dependencies: - '@nuxt/kit': link:packages/kit - lodash.template: 4.5.0 - pathe: 1.1.1 - dev: true - - /@nuxtjs/eslint-config-typescript@12.1.0(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-l2fLouDYwdAvCZEEw7wGxOBj+i8TQcHFu3zMPTLqKuv1qu6WcZIr0uztkbaa8ND1uKZ9YPqKx6UlSOjM4Le69Q==} - peerDependencies: - eslint: ^8.48.0 + /@nuxtjs/eslint-config-typescript@12.1.0(eslint@8.51.0)(typescript@5.2.2): + resolution: {integrity: sha512-l2fLouDYwdAvCZEEw7wGxOBj+i8TQcHFu3zMPTLqKuv1qu6WcZIr0uztkbaa8ND1uKZ9YPqKx6UlSOjM4Le69Q==} + peerDependencies: + eslint: ^8.48.0 dependencies: '@nuxtjs/eslint-config': 12.0.0(@typescript-eslint/parser@6.6.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.51.0) '@typescript-eslint/eslint-plugin': 6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.51.0)(typescript@5.2.2) @@ -2857,43 +2462,6 @@ packages: - supports-color dev: true - /@nuxtjs/mdc@0.2.1: - resolution: {integrity: sha512-14TPZ4p2UcG3IWqdPArx03hsUmWYQBlEYXkfm2Eq5sXu7hAg8UI9wEqZNNadMdnEi/WZvcMNf0xsbBhcRnxqew==} - dependencies: - '@nuxt/kit': link:packages/kit - '@types/hast': 3.0.1 - '@types/mdast': 4.0.1 - '@vue/compiler-core': 3.3.4 - consola: 3.2.3 - defu: 6.1.2 - destr: 2.0.1 - detab: 3.0.2 - github-slugger: 2.0.0 - hast-util-to-string: 3.0.0 - mdast-util-to-hast: 13.0.2 - micromark-util-sanitize-uri: 2.0.0 - ohash: 1.1.3 - property-information: 6.3.0 - rehype-external-links: 3.0.0 - rehype-raw: 6.1.1 - rehype-slug: 6.0.0 - rehype-sort-attribute-values: 5.0.0 - rehype-sort-attributes: 5.0.0 - remark-emoji: 4.0.0 - remark-gfm: 3.0.1 - remark-mdc: 2.0.0 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - scule: 1.0.0 - shikiji: 0.6.8 - ufo: 1.3.1 - unified: 11.0.3 - unist-builder: 4.0.0 - unist-util-visit: 5.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /@one-ini/wasm@0.1.1: resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} dev: true @@ -3047,24 +2615,6 @@ packages: rollup: 3.29.1 slash: 4.0.0 - /@rollup/plugin-commonjs@24.1.0(rollup@3.29.1): - resolution: {integrity: sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@rollup/pluginutils': 5.0.4(rollup@3.29.1) - commondir: 1.0.1 - estree-walker: 2.0.2 - glob: 8.1.0 - is-reference: 1.2.1 - magic-string: 0.30.4 - rollup: 3.29.1 - dev: true - /@rollup/plugin-commonjs@25.0.4(rollup@3.29.1): resolution: {integrity: sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ==} engines: {node: '>=14.0.0'} @@ -3220,11 +2770,6 @@ packages: /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - /@sindresorhus/is@3.1.2: - resolution: {integrity: sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==} - engines: {node: '>=10'} - dev: true - /@sinonjs/commons@3.0.0: resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} dependencies: @@ -3237,10 +2782,6 @@ packages: '@sinonjs/commons': 3.0.0 dev: true - /@socket.io/component-emitter@3.1.0: - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - dev: true - /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -3284,12 +2825,6 @@ packages: '@types/node': 18.18.4 dev: true - /@types/debug@4.1.8: - resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} - dependencies: - '@types/ms': 0.7.31 - dev: true - /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: @@ -3328,18 +2863,6 @@ packages: resolution: {integrity: sha512-FdLBT93h3kcZ586Aee66HPCVJ6qvxVjBlDWNmxSGSbCZe9hTsjRKdSsl4y1T+3zfujxo9auykQMnFsfyHWD7wg==} dev: true - /@types/hast@2.3.5: - resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} - dependencies: - '@types/unist': 2.0.7 - dev: true - - /@types/hast@3.0.1: - resolution: {integrity: sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ==} - dependencies: - '@types/unist': 3.0.0 - dev: true - /@types/http-proxy@1.17.11: resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} dependencies: @@ -3381,22 +2904,6 @@ packages: resolution: {integrity: sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==} dev: true - /@types/mdast@3.0.12: - resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} - dependencies: - '@types/unist': 2.0.7 - dev: true - - /@types/mdast@4.0.1: - resolution: {integrity: sha512-IlKct1rUTJ1T81d8OHzyop15kGv9A/ff7Gz7IJgrk6jDb4Udw77pCJ+vq8oxZf4Ghpm+616+i1s/LNg/Vh7d+g==} - dependencies: - '@types/unist': 3.0.0 - dev: true - - /@types/ms@0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: true - /@types/node-sass@4.11.3: resolution: {integrity: sha512-wXPCn3t9uu5rR4zXNSLasZHQMuRzUKBsdi4MsgT8uq4Lp1gQQo+T2G23tGj4SSgDHeNBle6vGseZtM2XV/X9bw==} dependencies: @@ -3414,10 +2921,6 @@ packages: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: false - /@types/parse5@6.0.3: - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - dev: true - /@types/pify@5.0.2: resolution: {integrity: sha512-+d6bogL6/YV6e/T+JYgVIkLA8rA7mjqiHRCFB/x2RcQBM2GWE1vtYBdWzkPY6NiEEB09pxwyBUi7mH7HJ0G+zQ==} dev: true @@ -3460,22 +2963,6 @@ packages: source-map: 0.6.1 dev: true - /@types/unist@2.0.7: - resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} - dev: true - - /@types/unist@3.0.0: - resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} - dev: true - - /@types/web-bluetooth@0.0.16: - resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} - dev: true - - /@types/web-bluetooth@0.0.17: - resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} - dev: true - /@types/webpack-bundle-analyzer@4.6.1: resolution: {integrity: sha512-MQ9GBzu8N7bsjmE9xtWe9JUrRUsPljKxS8fd5EdSIU/x+/U0Ga8f0OsVJZTX1yWF87xZSt0Ai1Iaiwi+Gq+ugA==} dependencies: @@ -3666,21 +3153,19 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - /@unhead/dom@1.7.4: resolution: {integrity: sha512-xanQMtGmgikqTvDtuyJy6GXgqvUXOdrdnIyqAabpeS8goD8udxo0stzjtbT8ERbMQibzPGSGcN+Ux+MKoWzrjQ==} dependencies: '@unhead/schema': 1.7.4 '@unhead/shared': 1.7.4 + dev: false /@unhead/schema@1.7.4: resolution: {integrity: sha512-wUL4CK0NSEm3KH4kYsiqVYQw5xBk1hpBi5tiNj0BTZgpQVrRufICdK5EHA9Fh7OIAR6tOTWwTvsf5+nK0BgQDA==} dependencies: hookable: 5.5.3 zhead: 2.1.3 + dev: false /@unhead/schema@1.7.5: resolution: {integrity: sha512-qmXRX8HoRS6OlIJGM1HMsP67+QFNKD7segptggHR7vrV+MaumVoIrzL1Tq5TPkk9hxeP38o1wnX+KCZiDKifXg==} @@ -3693,12 +3178,14 @@ packages: resolution: {integrity: sha512-YUNA2UxAuDPnDps41BQ8aEIY5hdyvruSB1Vs3AALhRo07MxMivSq5DjNKfYr/JvRN6593RtfI1NHnP9x5M57xA==} dependencies: '@unhead/schema': 1.7.4 + dev: false /@unhead/ssr@1.7.4: resolution: {integrity: sha512-2QqaHdC48XJGP9Pd0F2fblPv9/6G4IU04iZ5qLRAs6MFFmFEzrdvoooFlcwdcoH/WDGRnpYBmo+Us2nzQz1MMQ==} dependencies: '@unhead/schema': 1.7.4 '@unhead/shared': 1.7.4 + dev: false /@unhead/vue@1.7.4(vue@3.3.4): resolution: {integrity: sha512-ZfgzOhg1Bxo9xwp3upawqerw4134hc9Lhz6t005ixcBwPX+39Wpgc9dC3lf+owFQEVuWkf8F+eAwK2sghVBK4A==} @@ -3710,10 +3197,7 @@ packages: hookable: 5.5.3 unhead: 1.7.4 vue: 3.3.4 - - /@unocss/reset@0.50.8: - resolution: {integrity: sha512-2WoM6O9VyuHDPAnvCXr7LBJQ8ZRHDnuQAFsL1dWXp561Iq2l9whdNtPuMcozLGJGUUrFfVBXIrHY4sfxxScgWg==} - dev: true + dev: false /@vercel/nft@0.23.1: resolution: {integrity: sha512-NE0xSmGWVhgHF1OIoir71XAd0W0C1UE3nzFyhpFiMr3rVhetww7NvM1kc41trBsPG37Bh+dE5FYCTMzM/gBu0w==} @@ -3818,42 +3302,16 @@ packages: dependencies: '@volar/source-map': 1.10.4 - /@volar/language-core@1.4.1: - resolution: {integrity: sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==} - dependencies: - '@volar/source-map': 1.4.1 - dev: true - /@volar/source-map@1.10.4: resolution: {integrity: sha512-RxZdUEL+pV8p+SMqnhVjzy5zpb1QRZTlcwSk4bdcBO7yOu4rtEWqDGahVCEj4CcXour+0yJUMrMczfSCpP9Uxg==} dependencies: muggle-string: 0.3.1 - /@volar/source-map@1.4.1: - resolution: {integrity: sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==} - dependencies: - muggle-string: 0.2.2 - dev: true - /@volar/typescript@1.10.4: resolution: {integrity: sha512-BCCUEBASBEMCrz7qmNSi2hBEWYsXD0doaktRKpmmhvb6XntM2sAWYu6gbyK/MluLDgluGLFiFRpWgobgzUqolg==} dependencies: '@volar/language-core': 1.10.4 - /@volar/vue-language-core@1.6.5: - resolution: {integrity: sha512-IF2b6hW4QAxfsLd5mePmLgtkXzNi+YnH6ltCd80gb7+cbdpFMjM1I+w+nSg2kfBTyfu+W8useCZvW89kPTBpzg==} - dependencies: - '@volar/language-core': 1.4.1 - '@volar/source-map': 1.4.1 - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-sfc': 3.3.4 - '@vue/reactivity': 3.3.4 - '@vue/shared': 3.3.4 - minimatch: 9.0.3 - muggle-string: 0.2.2 - vue-template-compiler: 2.7.14 - dev: true - /@vue-macros/common@1.8.0(rollup@3.29.1)(vue@3.3.4): resolution: {integrity: sha512-auDJJzE0z3uRe3867e0DsqcseKImktNf5ojCZgUKqiVxb2yTlwlgOVAYCgoep9oITqxkXQymSvFeKhedi8PhaA==} engines: {node: '>=16.14.0'} @@ -3969,25 +3427,6 @@ packages: typescript: 5.2.2 vue-template-compiler: 2.7.14 - /@vue/language-core@1.8.8(typescript@5.2.2): - resolution: {integrity: sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@volar/language-core': 1.10.4 - '@volar/source-map': 1.10.4 - '@vue/compiler-dom': 3.3.4 - '@vue/reactivity': 3.3.4 - '@vue/shared': 3.3.4 - minimatch: 9.0.3 - muggle-string: 0.3.1 - typescript: 5.2.2 - vue-template-compiler: 2.7.14 - dev: true - /@vue/reactivity-transform@3.3.4: resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} dependencies: @@ -4049,135 +3488,6 @@ packages: transitivePeerDependencies: - typescript - /@vueuse/core@10.4.1(vue@3.3.4): - resolution: {integrity: sha512-DkHIfMIoSIBjMgRRvdIvxsyboRZQmImofLyOHADqiVbQVilP8VVHDhBX2ZqoItOgu7dWa8oXiNnScOdPLhdEXg==} - dependencies: - '@types/web-bluetooth': 0.0.17 - '@vueuse/metadata': 10.4.1 - '@vueuse/shared': 10.4.1(vue@3.3.4) - vue-demi: 0.14.5(vue@3.3.4) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: true - - /@vueuse/core@9.13.0(vue@3.3.4): - resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} - dependencies: - '@types/web-bluetooth': 0.0.16 - '@vueuse/metadata': 9.13.0 - '@vueuse/shared': 9.13.0(vue@3.3.4) - vue-demi: 0.14.5(vue@3.3.4) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: true - - /@vueuse/head@2.0.0(vue@3.3.4): - resolution: {integrity: sha512-ykdOxTGs95xjD4WXE4na/umxZea2Itl0GWBILas+O4oqS7eXIods38INvk3XkJKjqMdWPcpCyLX/DioLQxU1KA==} - peerDependencies: - vue: 3.3.4 - dependencies: - '@unhead/dom': 1.7.4 - '@unhead/schema': 1.7.5 - '@unhead/ssr': 1.7.4 - '@unhead/vue': 1.7.4(vue@3.3.4) - vue: 3.3.4 - dev: true - - /@vueuse/integrations@10.4.1(focus-trap@7.5.3)(fuse.js@6.6.2)(vue@3.3.4): - resolution: {integrity: sha512-uRBPyG5Lxoh1A/J+boiioPT3ELEAPEo4t8W6Mr4yTKIQBeW/FcbsotZNPr4k9uz+3QEksMmflWloS9wCnypM7g==} - peerDependencies: - async-validator: '*' - axios: '*' - change-case: '*' - drauu: '*' - focus-trap: '*' - fuse.js: '*' - idb-keyval: '*' - jwt-decode: '*' - nprogress: '*' - qrcode: '*' - sortablejs: '*' - universal-cookie: '*' - peerDependenciesMeta: - async-validator: - optional: true - axios: - optional: true - change-case: - optional: true - drauu: - optional: true - focus-trap: - optional: true - fuse.js: - optional: true - idb-keyval: - optional: true - jwt-decode: - optional: true - nprogress: - optional: true - qrcode: - optional: true - sortablejs: - optional: true - universal-cookie: - optional: true - dependencies: - '@vueuse/core': 10.4.1(vue@3.3.4) - '@vueuse/shared': 10.4.1(vue@3.3.4) - focus-trap: 7.5.3 - fuse.js: 6.6.2 - vue-demi: 0.14.5(vue@3.3.4) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: true - - /@vueuse/metadata@10.4.1: - resolution: {integrity: sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg==} - dev: true - - /@vueuse/metadata@9.13.0: - resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} - dev: true - - /@vueuse/nuxt@10.4.1(nuxt@packages+nuxt)(vue@3.3.4): - resolution: {integrity: sha512-tJ25KCkozZaQEy0qli4Ta8WXlbMIjSD7gPnVfLScZ2DpSSgImMB5R66PQEkrbSg4GfFj0OuoYc4+vCHQ/FqTsw==} - peerDependencies: - nuxt: workspace:* - dependencies: - '@nuxt/kit': link:packages/kit - '@vueuse/core': 10.4.1(vue@3.3.4) - '@vueuse/metadata': 10.4.1 - local-pkg: 0.4.3 - nuxt: link:packages/nuxt - vue-demi: 0.14.5(vue@3.3.4) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: true - - /@vueuse/shared@10.4.1(vue@3.3.4): - resolution: {integrity: sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg==} - dependencies: - vue-demi: 0.14.5(vue@3.3.4) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: true - - /@vueuse/shared@9.13.0(vue@3.3.4): - resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} - dependencies: - vue-demi: 0.14.5(vue@3.3.4) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: true - /@webassemblyjs/ast@1.11.6: resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} dependencies: @@ -4569,15 +3879,6 @@ packages: resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==} dev: false - /assert@2.0.0: - resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} - dependencies: - es6-object-assign: 1.1.0 - is-nan: 1.3.2 - object-is: 1.1.5 - util: 0.12.5 - dev: true - /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true @@ -4604,13 +3905,6 @@ packages: - rollup dev: false - /ast-types@0.15.2: - resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} - engines: {node: '>=4'} - dependencies: - tslib: 2.6.1 - dev: true - /ast-walker-scope@0.5.0(rollup@3.29.1): resolution: {integrity: sha512-NsyHMxBh4dmdEHjBo1/TBZvCKxffmZxRYhmclfu0PP6Aftre47jOHYaYaNqJcV0bxihxFXhDkzLHUwHc0ocd0Q==} engines: {node: '>=16.14.0'} @@ -4691,10 +3985,6 @@ packages: '@babel/types': 7.23.0 dev: false - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: true - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -4854,13 +4144,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - dependencies: - pascal-case: 3.1.2 - tslib: 2.6.1 - dev: true - /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -4882,23 +4165,11 @@ packages: /caniuse-lite@1.0.30001538: resolution: {integrity: sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==} - /capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.1 - upper-case-first: 2.0.2 - dev: true - /case-police@0.6.1: resolution: {integrity: sha512-tOgkG3HhtzNVHU+HVHqbpVJ3CICPDihtlgoM2C4dx0RLeo6qcNVeBgiYJN5Bln+stxKrnKrw89CFgqYQDqwZQg==} hasBin: true dev: true - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: true - /chai@4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} engines: {node: '>=4'} @@ -4931,23 +4202,6 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - /change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.6.1 - dev: true - /changelogen@0.5.5: resolution: {integrity: sha512-IzgToIJ/R9NhVKmL+PW33ozYkv53bXvufDNUSH3GTKXq1iCHGgkbgbtqEWbo8tnWNnt7nPDpjL8PwSG2iS8RVw==} hasBin: true @@ -4971,33 +4225,12 @@ packages: - supports-color dev: true - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true - - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: true - - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: true - - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: true - /character-parser@2.2.0: resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} dependencies: is-regex: 1.1.4 dev: false - /character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: true - /check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true @@ -5020,10 +4253,6 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - /chroma-js@2.4.2: - resolution: {integrity: sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==} - dev: true - /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -5101,10 +4330,6 @@ packages: /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: true - /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -5157,6 +4382,7 @@ packages: /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + dev: false /consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} @@ -5165,14 +4391,6 @@ packages: /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - /constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.1 - upper-case: 2.0.2 - dev: true - /constantinople@4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} dependencies: @@ -5447,12 +4665,6 @@ packages: dependencies: ms: 2.1.2 - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - dependencies: - character-entities: 2.0.2 - dev: true - /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} @@ -5518,11 +4730,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true - /destr@2.0.1: resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} @@ -5530,10 +4737,6 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - /detab@3.0.2: - resolution: {integrity: sha512-7Bp16Bk8sk0Y6gdXiCtnpGbghn8atnTJdd/82aWvS5ESnlcNvgUc10U2NYS0PAiDSGjWiI8qs/Cv1b2uSGdQ8w==} - dev: true - /detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -5546,12 +4749,6 @@ packages: /devalue@4.3.2: resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dependencies: - dequal: 2.0.3 - dev: true - /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5560,6 +4757,7 @@ packages: /diff@5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} + dev: false /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -5611,13 +4809,6 @@ packages: domhandler: 5.0.3 dev: false - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.1 - dev: true - /dot-prop@8.0.2: resolution: {integrity: sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==} engines: {node: '>=16'} @@ -5657,18 +4848,10 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - /emojilib@2.4.0: - resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} - dev: true - /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - /emoticon@4.0.1: - resolution: {integrity: sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==} - dev: true - /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -5681,25 +4864,6 @@ packages: dev: false optional: true - /engine.io-client@6.5.2: - resolution: {integrity: sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==} - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 - engine.io-parser: 5.2.1 - ws: 8.11.0 - xmlhttprequest-ssl: 2.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /engine.io-parser@5.2.1: - resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} - engines: {node: '>=10.0.0'} - dev: true - /enhanced-resolve@4.5.0: resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} engines: {node: '>=6.9.0'} @@ -5828,10 +4992,6 @@ packages: is-symbol: 1.0.4 dev: true - /es6-object-assign@1.1.0: - resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} - dev: true - /esbuild-loader@4.0.2(webpack@5.88.2): resolution: {integrity: sha512-kj88m0yrtTEJDeUEF+3TZsq7t9VPzQQj7UmXAzUbIaipoYSrd0UxKAcg4l9CBgP8uVoploiw+nKr8DIv6Y9gXw==} peerDependencies: @@ -5843,36 +5003,6 @@ packages: webpack: 5.88.2 webpack-sources: 1.4.3 - /esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 - dev: true - /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -6398,10 +5528,6 @@ packages: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} dev: false - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true - /externality@1.0.2: resolution: {integrity: sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==} dependencies: @@ -6511,12 +5637,6 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: false - /focus-trap@7.5.3: - resolution: {integrity: sha512-7UsT/eSJcTPF0aZp73u7hBRTABz26knRRTJfoTGFCQD5mUImLIIOwWWCrtoQdmWa7dykBi6H+Cp5i3S/kvsMeA==} - dependencies: - tabbable: 6.2.0 - dev: true - /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -6621,11 +5741,6 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /fuse.js@6.6.2: - resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==} - engines: {node: '>=10'} - dev: true - /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} @@ -6737,10 +5852,6 @@ packages: dependencies: git-up: 7.0.0 - /github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - dev: true - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -6936,172 +6047,10 @@ packages: /hash-sum@2.0.0: resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} - /hast-util-from-parse5@7.1.2: - resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} - dependencies: - '@types/hast': 2.3.5 - '@types/unist': 2.0.7 - hastscript: 7.2.0 - property-information: 6.3.0 - vfile: 5.3.7 - vfile-location: 4.1.0 - web-namespaces: 2.0.1 - dev: true - - /hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} - dependencies: - '@types/hast': 3.0.1 - '@types/unist': 3.0.0 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.3.0 - vfile: 6.0.1 - vfile-location: 5.0.2 - web-namespaces: 2.0.1 - dev: true - - /hast-util-heading-rank@3.0.0: - resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} - dependencies: - '@types/hast': 3.0.1 - dev: true - - /hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - dependencies: - '@types/hast': 3.0.1 - dev: true - - /hast-util-parse-selector@3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} - dependencies: - '@types/hast': 2.3.5 - dev: true - - /hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - dependencies: - '@types/hast': 3.0.1 - dev: true - - /hast-util-raw@7.2.3: - resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} - dependencies: - '@types/hast': 2.3.5 - '@types/parse5': 6.0.3 - hast-util-from-parse5: 7.1.2 - hast-util-to-parse5: 7.1.0 - html-void-elements: 2.0.1 - parse5: 6.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - vfile: 5.3.7 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: true - - /hast-util-raw@9.0.1: - resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} - dependencies: - '@types/hast': 3.0.1 - '@types/unist': 3.0.0 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.0.2 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: true - - /hast-util-to-html@9.0.0: - resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} - dependencies: - '@types/hast': 3.0.1 - '@types/unist': 3.0.0 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.1 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.0.2 - property-information: 6.3.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.3 - zwitch: 2.0.4 - dev: true - - /hast-util-to-parse5@7.1.0: - resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} - dependencies: - '@types/hast': 2.3.5 - comma-separated-tokens: 2.0.3 - property-information: 6.3.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: true - - /hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} - dependencies: - '@types/hast': 3.0.1 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.3.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: true - - /hast-util-to-string@3.0.0: - resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} - dependencies: - '@types/hast': 3.0.1 - dev: true - - /hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - dependencies: - '@types/hast': 3.0.1 - dev: true - - /hastscript@7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} - dependencies: - '@types/hast': 2.3.5 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 3.1.1 - property-information: 6.3.0 - space-separated-tokens: 2.0.2 - dev: true - - /hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - dependencies: - '@types/hast': 3.0.1 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.3.0 - space-separated-tokens: 2.0.2 - dev: true - /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - /header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - dependencies: - capital-case: 1.0.4 - tslib: 2.6.1 - dev: true - /hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -7124,14 +6073,6 @@ packages: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} - /html-void-elements@2.0.1: - resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} - dev: true - - /html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - dev: true - /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false @@ -7320,30 +6261,6 @@ packages: /iron-webcrypto@0.10.1: resolution: {integrity: sha512-QGOS8MRMnj/UiOa+aMIgfyHcvkhqNUsUxb1XzskENvbo+rEfp6TOwqd1KPuDzXC4OnGHcMSVxDGRoilqB8ViqA==} - /is-absolute-url@4.0.1: - resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: true - - /is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - dev: true - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -7375,11 +6292,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: true - /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} @@ -7403,10 +6315,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: true - /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -7432,23 +6340,12 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - /is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - dev: true - /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -7471,14 +6368,6 @@ packages: /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - /is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - dev: true - /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -7499,11 +6388,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: true - /is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -7872,11 +6756,6 @@ packages: engines: {node: '>=6'} dev: false - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true - /klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} @@ -7994,10 +6873,6 @@ packages: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} dev: true - /lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - dev: true - /lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} dev: false @@ -8043,19 +6918,6 @@ packages: resolution: {integrity: sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==} dev: false - /lodash.template@4.5.0: - resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.templatesettings: 4.2.0 - dev: true - - /lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - dependencies: - lodash._reinterpolate: 3.0.0 - dev: true - /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: false @@ -8067,22 +6929,12 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: true - /loupe@2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: get-func-name: 2.0.0 dev: true - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - dependencies: - tslib: 2.6.1 - dev: true - /lru-cache@10.0.1: resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} engines: {node: 14 || >=16.14} @@ -8189,10 +7041,6 @@ packages: uc.micro: 1.0.6 dev: true - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: true - /markdownlint-cli@0.33.0: resolution: {integrity: sha512-zMK1oHpjYkhjO+94+ngARiBBrRDEUMzooDHBAHtmEIJ9oYddd9l3chCReY2mPlecwH7gflQp1ApilTo+o0zopQ==} engines: {node: '>=14'} @@ -8216,204 +7064,6 @@ packages: markdown-it: 13.0.1 dev: true - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 - unist-util-visit: 4.1.2 - dev: true - - /mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} - dependencies: - '@types/mdast': 3.0.12 - escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: true - - /mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - dependencies: - '@types/mdast': 4.0.1 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: true - - /mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 - decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} - dependencies: - '@types/mdast': 4.0.1 - '@types/unist': 3.0.0 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.0 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} - dependencies: - '@types/mdast': 3.0.12 - ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 - dev: true - - /mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} - dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 - dev: true - - /mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} - dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 - dev: true - - /mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} - dependencies: - '@types/mdast': 3.0.12 - markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} - dependencies: - '@types/mdast': 3.0.12 - mdast-util-to-markdown: 1.5.0 - dev: true - - /mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} - dependencies: - '@types/mdast': 3.0.12 - unist-util-is: 5.2.1 - dev: true - - /mdast-util-phrasing@4.0.0: - resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} - dependencies: - '@types/mdast': 4.0.1 - unist-util-is: 6.0.0 - dev: true - - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} - dependencies: - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.2.0 - trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - dev: true - - /mdast-util-to-hast@13.0.2: - resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} - dependencies: - '@types/hast': 3.0.1 - '@types/mdast': 4.0.1 - '@ungap/structured-clone': 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - dev: true - - /mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} - dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 - longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 - unist-util-visit: 4.1.2 - zwitch: 2.0.4 - dev: true - - /mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} - dependencies: - '@types/mdast': 4.0.1 - '@types/unist': 3.0.0 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.0.0 - mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - dev: true - - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - dependencies: - '@types/mdast': 3.0.12 - dev: true - - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - dependencies: - '@types/mdast': 4.0.1 - dev: true - /mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} dev: false @@ -8461,494 +7111,72 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true - - /micromark-core-commonmark@2.0.0: - resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} dependencies: - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + braces: 3.0.2 + picomatch: 2.3.1 - /micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} - /micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true + mime-db: 1.52.0 - /micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true - /micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true + /mime@2.5.2: + resolution: {integrity: sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: false - /micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} - dependencies: - micromark-util-types: 1.1.0 - dev: true + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true - /micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} - /micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} - dependencies: - micromark-extension-gfm-autolink-literal: 1.0.5 - micromark-extension-gfm-footnote: 1.1.2 - micromark-extension-gfm-strikethrough: 1.0.7 - micromark-extension-gfm-table: 1.0.7 - micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 - dev: true + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} - /micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} dev: true - /micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + /mini-css-extract-plugin@2.7.6(webpack@5.88.2): + resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true + schema-utils: 4.2.0 + webpack: 5.88.2 + dev: false - /micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + /minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true + brace-expansion: 1.1.11 + dev: false - /micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: - devlop: 1.1.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true - - /micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-types: 2.0.0 - dev: true - - /micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true - - /micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true - - /micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-util-character@2.0.1: - resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true - - /micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: true - - /micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} - dependencies: - micromark-util-symbol: 2.0.0 - dev: true - - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true - - /micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 - dev: true - - /micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} - dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 - dev: true - - /micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: true - - /micromark-util-decode-numeric-character-reference@2.0.0: - resolution: {integrity: sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==} - dependencies: - micromark-util-symbol: 2.0.0 - dev: true - - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 - dev: true - - /micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.0 - micromark-util-symbol: 2.0.0 - dev: true - - /micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - dev: true - - /micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - dev: true - - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - dev: true - - /micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - dev: true - - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: true - - /micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} - dependencies: - micromark-util-symbol: 2.0.0 - dev: true - - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - dependencies: - micromark-util-types: 1.1.0 - dev: true - - /micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} - dependencies: - micromark-util-types: 2.0.0 - dev: true - - /micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 - dev: true - - /micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 - dev: true - - /micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: true - - /micromark-util-subtokenize@2.0.0: - resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: true - - /micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - dev: true - - /micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - dev: true - - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - dev: true - - /micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - dev: true - - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - dependencies: - '@types/debug': 4.1.8 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - /micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - dependencies: - '@types/debug': 4.1.8 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.0 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - /mime@2.5.2: - resolution: {integrity: sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: false - - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - - /mini-css-extract-plugin@2.7.6(webpack@5.88.2): - resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - schema-utils: 4.2.0 - webpack: 5.88.2 - dev: false - - /minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} - dependencies: - brace-expansion: 1.1.11 - dev: false - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.11 /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} @@ -9098,10 +7326,6 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /muggle-string@0.2.2: - resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==} - dev: true - /muggle-string@0.3.1: resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} @@ -9217,13 +7441,6 @@ packages: - idb-keyval - supports-color - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - dependencies: - lower-case: 2.0.2 - tslib: 2.6.1 - dev: true - /node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} dev: false @@ -9231,15 +7448,6 @@ packages: /node-addon-api@7.0.0: resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} - /node-emoji@2.1.0: - resolution: {integrity: sha512-tcsBm9C6FmPN5Wo7OjFi9lgMyJjvkAeirmjR/ax8Ttfqy4N8PoFic26uqFTIgayHPNI5FH4ltUvfh9kHzwcK9A==} - dependencies: - '@sindresorhus/is': 3.1.2 - char-regex: 1.0.2 - emojilib: 2.4.0 - skin-tone: 2.0.0 - dev: true - /node-fetch-native@1.4.0: resolution: {integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==} @@ -9434,38 +7642,6 @@ packages: optionalDependencies: fsevents: 2.3.3 - /nuxt-component-meta@0.5.3: - resolution: {integrity: sha512-+MHUrESdr+Si9PdbkxQrzQv+X6RdRd/ffmFWVVsZAHA7X9vGoNAYxwvoB1Pbs15TaPtFBWA1P5a4VGqtp+bhAg==} - dependencies: - '@nuxt/kit': link:packages/kit - scule: 1.0.0 - typescript: 5.2.2 - vue-component-meta: 1.8.8(typescript@5.2.2) - dev: true - - /nuxt-config-schema@0.4.6: - resolution: {integrity: sha512-kHLWJFynj5QrxVZ1MjY2xmDaTSN1BCMLGExA+hMMLoCb3wn9TJlDVqnE/nSdUJPMRkNn/NQ5WP9NLA9vlAXRUw==} - dependencies: - '@nuxt/kit': link:packages/kit - defu: 6.1.2 - jiti: 1.20.0 - pathe: 1.1.1 - untyped: 1.4.0 - transitivePeerDependencies: - - supports-color - dev: true - - /nuxt-icon@0.3.3(vue@3.3.4): - resolution: {integrity: sha512-KdhJAigBGTP8/YIFZ3orwetk40AgLq6VQ5HRYuDLmv5hiDptor9Ro+WIdZggHw7nciRxZvDdQkEwi9B5G/jrkQ==} - dependencies: - '@iconify/vue': 4.1.1(vue@3.3.4) - '@nuxt/kit': link:packages/kit - nuxt-config-schema: 0.4.6 - transitivePeerDependencies: - - supports-color - - vue - dev: true - /nuxt-vitest@0.11.0(@vitejs/plugin-vue-jsx@3.0.2)(@vitejs/plugin-vue@4.4.0)(happy-dom@12.9.1)(vite@4.4.11)(vitest@0.33.0)(vue-router@4.2.5)(vue@3.3.4): resolution: {integrity: sha512-3gXY/c6bfIQnrwUp1tVLdc5jNEk9m2czmebCSWn9fmMz7wVO3BX1k1qJaWvwU0Q4q7WEzHNn6toUXwI8BuhV1Q==} peerDependencies: @@ -9513,14 +7689,6 @@ packages: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - dev: true - /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -9713,41 +7881,12 @@ packages: - supports-color dev: false - /paneer@0.1.0: - resolution: {integrity: sha512-SZfJe/y9fbpeXZU+Kf7cSG2G7rnGP50hUYzCvcWyhp7hYzA3YXGthpkGfv6NSt0oo6QbcRyKwycg/6dpG5p8aw==} - deprecated: Please migrate to https://github.com/unjs/magicast - dependencies: - '@babel/parser': 7.22.16 - '@types/estree': 1.0.2 - recast: 0.22.0 - dev: true - - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - dependencies: - dot-case: 3.0.4 - tslib: 2.6.1 - dev: true - /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} - dependencies: - '@types/unist': 2.0.7 - character-entities: 2.0.2 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - dev: true - /parse-git-config@3.0.0: resolution: {integrity: sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==} engines: {node: '>=8'} @@ -9774,34 +7913,10 @@ packages: dependencies: parse-path: 7.0.0 - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: true - - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: true - /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.1 - dev: true - - /path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.6.1 - dev: true - /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -9859,35 +7974,6 @@ packages: engines: {node: '>=14.16'} dev: false - /pinceau@0.18.9(postcss@8.4.31): - resolution: {integrity: sha512-GJ+l8a5Y+7PP/diwuajJhd2QONTIFkk2YXjrVTh7QKC3sMQEphpLH6ZJfXSeeSonQ0/BnhrrMi9a5e14mmqXug==} - dependencies: - '@unocss/reset': 0.50.8 - '@volar/vue-language-core': 1.6.5 - acorn: 8.10.0 - chroma-js: 2.4.2 - consola: 3.2.3 - csstype: 3.1.2 - defu: 6.1.2 - magic-string: 0.30.4 - nanoid: 4.0.2 - ohash: 1.1.3 - paneer: 0.1.0 - pathe: 1.1.1 - postcss-custom-properties: 13.1.4(postcss@8.4.31) - postcss-dark-theme-class: 0.7.3(postcss@8.4.31) - postcss-nested: 6.0.1(postcss@8.4.31) - recast: 0.22.0 - scule: 1.0.0 - style-dictionary-esm: 1.3.7 - unbuild: 1.2.1 - unplugin: 1.5.0 - transitivePeerDependencies: - - postcss - - sass - - supports-color - dev: true - /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -9946,28 +8032,6 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-custom-properties@13.1.4(postcss@8.4.31): - resolution: {integrity: sha512-iSAdaZrM3KMec8cOSzeTUNXPYDlhqsMJHpt62yrjwG6nAnMtRHPk5JdMzGosBJtqEahDolvD5LNbcq+EZ78o5g==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - dependencies: - '@csstools/cascade-layer-name-parser': 1.0.4(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) - '@csstools/css-parser-algorithms': 2.3.1(@csstools/css-tokenizer@2.2.0) - '@csstools/css-tokenizer': 2.2.0 - postcss: 8.4.31 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-dark-theme-class@0.7.3(postcss@8.4.31): - resolution: {integrity: sha512-M9vtfh8ORzQsVdT9BWb+xpEDAzC7nHBn7wVc988/JkEVLPupKcUnV0jw7RZ8sSj0ovpqN1POf6PLdt19JCHfhQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.31 - dev: true - /postcss-discard-comments@6.0.0(postcss@8.4.31): resolution: {integrity: sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==} engines: {node: ^14 || ^16 || >=18.0} @@ -10145,16 +8209,6 @@ packages: postcss: 8.4.31 dev: false - /postcss-nested@6.0.1(postcss@8.4.31): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 - dev: true - /postcss-normalize-charset@6.0.0(postcss@8.4.31): resolution: {integrity: sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==} engines: {node: ^14 || ^16 || >=18.0} @@ -10320,6 +8374,7 @@ packages: /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} @@ -10390,10 +8445,6 @@ packages: sisteransi: 1.0.5 dev: false - /property-information@6.3.0: - resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==} - dev: true - /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: true @@ -10620,152 +8671,33 @@ packages: dependencies: picomatch: 2.3.1 - /recast@0.22.0: - resolution: {integrity: sha512-5AAx+mujtXijsEavc5lWXBPQqrM4+Dl5qNH96N2aNeuJFUzpiiToKPsxQD/zAIJHspz7zz0maX0PCtCTFVlixQ==} - engines: {node: '>= 4'} - dependencies: - assert: 2.0.0 - ast-types: 0.15.2 - esprima: 4.0.1 - source-map: 0.6.1 - tslib: 2.6.1 - dev: true - /redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} /redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} - dependencies: - redis-errors: 1.2.0 - - /regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: true - - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 - dev: true - - /regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - - /rehype-external-links@3.0.0: - resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} - dependencies: - '@types/hast': 3.0.1 - '@ungap/structured-clone': 1.2.0 - hast-util-is-element: 3.0.0 - is-absolute-url: 4.0.1 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 - dev: true - - /rehype-raw@6.1.1: - resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} - dependencies: - '@types/hast': 2.3.5 - hast-util-raw: 7.2.3 - unified: 10.1.2 - dev: true - - /rehype-slug@6.0.0: - resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} - dependencies: - '@types/hast': 3.0.1 - github-slugger: 2.0.0 - hast-util-heading-rank: 3.0.0 - hast-util-to-string: 3.0.0 - unist-util-visit: 5.0.0 - dev: true - - /rehype-sort-attribute-values@5.0.0: - resolution: {integrity: sha512-dQdHdCIRnpiU+BkrLSqH+aM4lWJyLqGzv49KvH4gHj+JxYwNqvGhoTXckS3AJu4V9ZutwsTcawP0pC7PhwX0tQ==} - dependencies: - '@types/hast': 3.0.1 - hast-util-is-element: 3.0.0 - unist-util-visit: 5.0.0 - dev: true - - /rehype-sort-attributes@5.0.0: - resolution: {integrity: sha512-6tJUH4xHFcdO85CZRwAcEtHNCzjZ9V9S0VZLgo1pzbN04qy8jiVCZ3oAxDmBVG3Rth5b1xFTDet5WG/UYZeJLQ==} - dependencies: - '@types/hast': 3.0.1 - unist-util-visit: 5.0.0 - dev: true - - /remark-emoji@4.0.0: - resolution: {integrity: sha512-lQP1lFaYOz6zyJTBfOwYChM1YkgJEVcxSnUBkjo9qujqWwpY36MRFzDjYDk9YNdHqkw5yExB8MnVVHb6wX9QNA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - emoticon: 4.0.1 - mdast-util-find-and-replace: 3.0.1 - node-emoji: 2.1.0 - dev: true - - /remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} - dependencies: - '@types/mdast': 3.0.12 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /remark-mdc@2.0.0: - resolution: {integrity: sha512-zBonqJya1254h84GRLjJc1fU4aXng2cKaie5qk0T1edUIkP4lVY1kJD4TP+uoFaUziTeyR6LSvkmRcHDZiWtoA==} + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} dependencies: - '@types/mdast': 4.0.1 - '@types/unist': 3.0.0 - flat: 5.0.2 - js-yaml: 4.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - micromark: 4.0.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-types: 2.0.0 - parse-entities: 4.0.1 - scule: 1.0.0 - stringify-entities: 4.0.3 - unified: 11.0.3 - unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 - transitivePeerDependencies: - - supports-color + redis-errors: 1.2.0 + + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true dev: true - /remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} dependencies: - '@types/mdast': 3.0.12 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 dev: true - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} - dependencies: - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} dev: true /require-directory@2.1.1: @@ -10818,20 +8750,6 @@ packages: glob: 10.3.7 dev: true - /rollup-plugin-dts@5.3.1(rollup@3.29.1)(typescript@5.2.2): - resolution: {integrity: sha512-gusMi+Z4gY/JaEQeXnB0RUdU82h1kF0WYzCWgVmV4p3hWXqelaKuCvcJawfeg+EKn2T1Ie+YWF2OiN1/L8bTVg==} - engines: {node: '>=v14.21.3'} - peerDependencies: - rollup: ^3.0 - typescript: ^4.1 || ^5.0 - dependencies: - magic-string: 0.30.4 - rollup: 3.29.1 - typescript: 5.2.2 - optionalDependencies: - '@babel/code-frame': 7.22.13 - dev: true - /rollup-plugin-dts@6.0.0(rollup@3.29.1)(typescript@5.2.2): resolution: {integrity: sha512-A996xSZDAqnx/KfFttzC8mDEuyMjsRpiLCrlGc8effhK8KhE3AG0g1woQiITgFc5HSE8HWU7ccR9CiQ3vXgUlQ==} engines: {node: '>=v18.17.1'} @@ -10896,13 +8814,6 @@ packages: tslib: 2.6.1 dev: false - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - dependencies: - mri: 1.2.0 - dev: true - /safe-array-concat@1.0.0: resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} engines: {node: '>=0.4'} @@ -11002,14 +8913,6 @@ packages: transitivePeerDependencies: - supports-color - /sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.1 - upper-case-first: 2.0.2 - dev: true - /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: @@ -11051,16 +8954,6 @@ packages: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} dev: false - /shiki-es@0.14.0: - resolution: {integrity: sha512-e+/aueHx0YeIEut6RXC6K8gSf0PykwZiHD7q7AHtpTW8Kd8TpFUIWqTwhAnrGjOyOMyrwv+syr5WPagMpDpVYQ==} - dev: true - - /shikiji@0.6.8: - resolution: {integrity: sha512-K0axxNAdB9KvLUflU7QoLC7p6i2p1R2MFG0eP+iclbjtuEZqng99jHcg3VJL0GWRO67yozTICnykjo1HjOzdkg==} - dependencies: - hast-util-to-html: 9.0.0 - dev: true - /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -11114,13 +9007,6 @@ packages: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: false - /skin-tone@2.0.0: - resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} - engines: {node: '>=8'} - dependencies: - unicode-emoji-modifier-base: 1.0.0 - dev: true - /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -11130,11 +9016,6 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} - /slugify@1.6.6: - resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} - engines: {node: '>=8.0.0'} - dev: true - /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -11143,37 +9024,6 @@ packages: /smob@1.4.0: resolution: {integrity: sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==} - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.6.1 - dev: true - - /socket.io-client@4.7.2: - resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 - engine.io-client: 6.5.2 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /socks-proxy-agent@7.0.0: resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} engines: {node: '>= 10'} @@ -11225,10 +9075,6 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: true - /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: @@ -11344,13 +9190,6 @@ packages: dependencies: safe-buffer: 5.2.1 - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: true - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -11392,23 +9231,6 @@ packages: dependencies: acorn: 8.10.0 - /style-dictionary-esm@1.3.7: - resolution: {integrity: sha512-xO2o8sKGera0SMLCLtix1dPvgD2ZyX2VohZ09cGRRuXBb8HQObqhgDQw4dLW+qJy4gj7r4Mdhz9J1rS2p50xDw==} - engines: {node: '>=12.0.0'} - hasBin: true - dependencies: - chalk: 4.1.2 - change-case: 4.1.2 - commander: 10.0.1 - consola: 2.15.3 - glob: 8.1.0 - jiti: 1.20.0 - json5: 2.2.3 - jsonc-parser: 3.2.0 - lodash.template: 4.5.0 - tinycolor2: 1.6.0 - dev: true - /stylehacks@6.0.0(postcss@8.4.31): resolution: {integrity: sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==} engines: {node: ^14 || ^16 || >=18.0} @@ -11462,10 +9284,6 @@ packages: picocolors: 1.0.0 dev: false - /tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: true - /tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} @@ -11563,10 +9381,6 @@ packages: resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} dev: true - /tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - dev: true - /tinypool@0.6.0: resolution: {integrity: sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==} engines: {node: '>=14.0.0'} @@ -11610,14 +9424,6 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: true - - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: true - /ts-api-utils@1.0.2(typescript@5.2.2): resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} engines: {node: '>=16.13.0'} @@ -11638,6 +9444,7 @@ packages: /tslib@2.6.1: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + dev: false /tuf-js@2.1.0: resolution: {integrity: sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==} @@ -11722,10 +9529,6 @@ packages: is-typed-array: 1.1.12 dev: true - /typesafe-path@0.2.2: - resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} - dev: true - /typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} @@ -11751,40 +9554,6 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /unbuild@1.2.1: - resolution: {integrity: sha512-J4efk69Aye43tWcBPCsLK7TIRppGrEN4pAlDzRKo3HSE6MgTSTBxSEuE3ccx7ixc62JvGQ/CoFXYqqF2AHozow==} - hasBin: true - dependencies: - '@rollup/plugin-alias': 5.0.0(rollup@3.29.1) - '@rollup/plugin-commonjs': 24.1.0(rollup@3.29.1) - '@rollup/plugin-json': 6.0.0(rollup@3.29.1) - '@rollup/plugin-node-resolve': 15.2.1(rollup@3.29.1) - '@rollup/plugin-replace': 5.0.3(rollup@3.29.1) - '@rollup/pluginutils': 5.0.4(rollup@3.29.1) - chalk: 5.3.0 - consola: 3.2.3 - defu: 6.1.2 - esbuild: 0.17.19 - globby: 13.2.2 - hookable: 5.5.3 - jiti: 1.20.0 - magic-string: 0.30.4 - mkdist: 1.3.0(typescript@5.2.2) - mlly: 1.4.2 - mri: 1.2.0 - pathe: 1.1.1 - pkg-types: 1.0.3 - pretty-bytes: 6.1.1 - rollup: 3.29.1 - rollup-plugin-dts: 5.3.1(rollup@3.29.1)(typescript@5.2.2) - scule: 1.0.0 - typescript: 5.2.2 - untyped: 1.4.0 - transitivePeerDependencies: - - sass - - supports-color - dev: true - /unbuild@2.0.0(typescript@5.2.2): resolution: {integrity: sha512-JWCUYx3Oxdzvw2J9kTAp+DKE8df/BnH/JTSj6JyA4SH40ECdFu7FoJJcrm8G92B7TjofQ6GZGjJs50TRxoH6Wg==} hasBin: true @@ -11857,35 +9626,7 @@ packages: '@unhead/schema': 1.7.4 '@unhead/shared': 1.7.4 hookable: 5.5.3 - - /unicode-emoji-modifier-base@1.0.0: - resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} - engines: {node: '>=4'} - dev: true - - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - dependencies: - '@types/unist': 2.0.7 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 5.3.7 - dev: true - - /unified@11.0.3: - resolution: {integrity: sha512-jlCV402P+YDcFcB2VcN/n8JasOddqIiaxv118wNBoZXEhOn+lYG7BR4Bfg2BwxvlK58dwbuH2w7GX2esAjL6Mg==} - dependencies: - '@types/unist': 3.0.0 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 6.0.1 - dev: true + dev: false /unimport@3.4.0(rollup@3.29.1): resolution: {integrity: sha512-M/lfFEgufIT156QAr/jWHLUn55kEmxBBiQsMxvRSIbquwmeJEyQYgshHDEvQDWlSJrVOOTAgnJ3FvlsrpGkanA==} @@ -11918,82 +9659,6 @@ packages: imurmurhash: 0.1.4 dev: false - /unist-builder@4.0.0: - resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} - dependencies: - '@types/unist': 3.0.0 - dev: true - - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - dev: true - - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - dependencies: - '@types/unist': 2.0.7 - dev: true - - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - dependencies: - '@types/unist': 3.0.0 - dev: true - - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - dependencies: - '@types/unist': 2.0.7 - dev: true - - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - dependencies: - '@types/unist': 3.0.0 - dev: true - - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - dependencies: - '@types/unist': 2.0.7 - dev: true - - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - dependencies: - '@types/unist': 3.0.0 - dev: true - - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 - dev: true - - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - dependencies: - '@types/unist': 3.0.0 - unist-util-is: 6.0.0 - dev: true - - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: true - - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - dependencies: - '@types/unist': 3.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: true - /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} @@ -12121,18 +9786,6 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 - /upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - dependencies: - tslib: 2.6.1 - dev: true - - /upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - dependencies: - tslib: 2.6.1 - dev: true - /uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} @@ -12164,27 +9817,6 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.12 - which-typed-array: 1.1.11 - dev: true - - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - dev: true - /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -12198,51 +9830,6 @@ packages: builtins: 5.0.1 dev: false - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} - dependencies: - '@types/unist': 2.0.7 - vfile: 5.3.7 - dev: true - - /vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} - dependencies: - '@types/unist': 3.0.0 - vfile: 6.0.1 - dev: true - - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - dependencies: - '@types/unist': 2.0.7 - unist-util-stringify-position: 3.0.3 - dev: true - - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - dependencies: - '@types/unist': 3.0.0 - unist-util-stringify-position: 4.0.0 - dev: true - - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - dependencies: - '@types/unist': 2.0.7 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: true - - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - dependencies: - '@types/unist': 3.0.0 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - dev: true - /vite-node@0.33.0(@types/node@18.18.4): resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} engines: {node: '>=v14.18.0'} @@ -12549,44 +10136,10 @@ packages: dependencies: ufo: 1.3.1 - /vue-component-meta@1.8.8(typescript@5.2.2): - resolution: {integrity: sha512-iVwH7wGm6VpOAvQoMjFmv8Coe9oV61JqbRkUVx95Xegwb3hEYmltvv4hYvLwUjaev07JRkskPQctyzPBU3YFyQ==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@volar/typescript': 1.10.4 - '@vue/language-core': 1.8.8(typescript@5.2.2) - typesafe-path: 0.2.2 - typescript: 5.2.2 - vue-component-type-helpers: 1.8.8 - dev: true - /vue-component-type-helpers@1.8.4: resolution: {integrity: sha512-6bnLkn8O0JJyiFSIF0EfCogzeqNXpnjJ0vW/SZzNHfe6sPx30lTtTXlE5TFs2qhJlAtDFybStVNpL73cPe3OMQ==} dev: true - /vue-component-type-helpers@1.8.8: - resolution: {integrity: sha512-Ohv9HQY92nSbpReC6WhY0X4YkOszHzwUHaaN/lev5tHQLM1AEw+LrLeB2bIGIyKGDU7ZVrncXcv/oBny4rjbYg==} - dev: true - - /vue-demi@0.14.5(vue@3.3.4): - resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: 3.3.4 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - dependencies: - vue: 3.3.4 - dev: true - /vue-devtools-stub@0.1.0: resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} dev: false @@ -12674,10 +10227,6 @@ packages: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: true - /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -12932,19 +10481,6 @@ packages: optional: true dev: false - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - /ws@8.14.2: resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} engines: {node: '>=10.0.0'} @@ -12956,17 +10492,13 @@ packages: optional: true utf-8-validate: optional: true + dev: false /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} dev: true - /xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} - engines: {node: '>=0.4.0'} - dev: true - /xxhashjs@0.2.2: resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} dependencies: @@ -13027,7 +10559,3 @@ packages: archiver-utils: 4.0.1 compress-commons: 5.0.1 readable-stream: 3.6.2 - - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 92caab7c9dee..0b568a37d507 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,4 +2,3 @@ packages: - "packages/**" - "playground" - "test/fixtures/*" - - ".website" From 9204d8413a631e62ccb6ab6cbbbd52d5d33442fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Tue, 17 Oct 2023 11:13:04 +0200 Subject: [PATCH 43/62] chore: update banner --- .github/assets/banner.png | Bin 135841 -> 0 bytes .github/assets/banner.svg | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 .github/assets/banner.png diff --git a/.github/assets/banner.png b/.github/assets/banner.png deleted file mode 100644 index a6d77b947e783e96b4bec84e8ae8c3556a2097d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135841 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�Ipdir8UO3SJ8ASW;|Ct4 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 Xg1|!AnFC4(00000NkvXXu0mjf1QQL= diff --git a/.github/assets/banner.svg b/.github/assets/banner.svg index 9a7abed71bae..25c5a7e375c3 100644 --- a/.github/assets/banner.svg +++ b/.github/assets/banner.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="896" height="230" fill="none" viewBox="0 0 896 230"><g clip-path="url(#a)"><path fill="#020420" d="M0 0h896v230H0z"/><g filter="url(#b)"><ellipse cx="450" cy="-98" fill="url(#c)" rx="578" ry="272"/></g><path fill="#fff" d="M220.908 159v-22.716h-7.524V133.8h18.072v2.484h-7.524V159h-3.024Zm14.06 0v-25.92h3.024v11.124c.6-1.104 1.452-1.956 2.556-2.556 1.104-.624 2.304-.936 3.6-.936 2.064 0 3.72.648 4.968 1.944 1.248 1.272 1.872 3.24 1.872 5.904V159H248v-10.116c0-3.72-1.5-5.58-4.5-5.58-1.56 0-2.868.564-3.924 1.692-1.056 1.104-1.584 2.688-1.584 4.752V159h-3.024Zm28.63.432c-1.704 0-3.216-.384-4.536-1.152-1.32-.792-2.364-1.884-3.132-3.276-.744-1.392-1.116-3.036-1.116-4.932 0-1.872.372-3.504 1.116-4.896.744-1.416 1.776-2.508 3.096-3.276 1.344-.792 2.892-1.188 4.644-1.188 1.728 0 3.216.396 4.464 1.188 1.272.768 2.244 1.788 2.916 3.06.672 1.272 1.008 2.64 1.008 4.104 0 .264-.012.528-.036.792v.9h-14.22c.072 1.368.384 2.508.936 3.42.576.888 1.284 1.56 2.124 2.016.864.456 1.776.684 2.736.684 1.248 0 2.292-.288 3.132-.864.84-.576 1.452-1.356 1.836-2.34h2.988c-.48 1.656-1.404 3.036-2.772 4.14-1.344 1.08-3.072 1.62-5.184 1.62Zm0-16.164c-1.44 0-2.724.444-3.852 1.332-1.104.864-1.74 2.136-1.908 3.816h11.232c-.072-1.608-.624-2.868-1.656-3.78-1.032-.912-2.304-1.368-3.816-1.368ZM285.773 159v-25.2h3.024V159h-3.024Zm8.188 0v-17.856h2.736l.18 3.204c.576-1.128 1.404-2.016 2.484-2.664 1.08-.648 2.304-.972 3.672-.972 2.112 0 3.792.648 5.04 1.944 1.272 1.272 1.908 3.24 1.908 5.904V159h-3.024v-10.116c0-3.72-1.536-5.58-4.608-5.58-1.536 0-2.82.564-3.852 1.692-1.008 1.104-1.512 2.688-1.512 4.752V159h-3.024Zm27.657 0c-1.632 0-2.916-.396-3.852-1.188-.936-.792-1.404-2.22-1.404-4.284V143.7h-3.096v-2.556h3.096l.396-4.284h2.628v4.284h5.256v2.556h-5.256v9.828c0 1.128.228 1.896.684 2.304.456.384 1.26.576 2.412.576h1.872V159h-2.736Zm13.382.432c-2.112 0-3.792-.636-5.04-1.908-1.248-1.296-1.872-3.276-1.872-5.94v-10.44h3.024v10.116c0 3.72 1.524 5.58 4.572 5.58 1.56 0 2.844-.552 3.852-1.656 1.032-1.128 1.548-2.724 1.548-4.788v-9.252h3.024V159h-2.736l-.216-3.204c-.552 1.128-1.38 2.016-2.484 2.664-1.08.648-2.304.972-3.672.972Zm15.922-22.248c-.6 0-1.104-.192-1.512-.576-.384-.408-.576-.912-.576-1.512 0-.576.192-1.056.576-1.44.408-.384.912-.576 1.512-.576.576 0 1.068.192 1.476.576.408.384.612.864.612 1.44 0 .6-.204 1.104-.612 1.512-.408.384-.9.576-1.476.576ZM349.41 159v-17.856h3.024V159h-3.024Zm15.345 0c-1.632 0-2.916-.396-3.852-1.188-.936-.792-1.404-2.22-1.404-4.284V143.7h-3.096v-2.556h3.096l.396-4.284h2.628v4.284h5.256v2.556h-5.256v9.828c0 1.128.228 1.896.684 2.304.456.384 1.26.576 2.412.576h1.872V159h-2.736Zm8.702-21.816c-.6 0-1.104-.192-1.512-.576-.384-.408-.576-.912-.576-1.512 0-.576.192-1.056.576-1.44.408-.384.912-.576 1.512-.576.576 0 1.068.192 1.476.576.408.384.612.864.612 1.44 0 .6-.204 1.104-.612 1.512-.408.384-.9.576-1.476.576ZM371.945 159v-17.856h3.024V159h-3.024Zm13.437 0-6.768-17.856h3.168l5.364 14.94 5.4-14.94h3.096L388.874 159h-3.492Zm20.739.432c-1.704 0-3.216-.384-4.536-1.152-1.32-.792-2.364-1.884-3.132-3.276-.744-1.392-1.116-3.036-1.116-4.932 0-1.872.372-3.504 1.116-4.896.744-1.416 1.776-2.508 3.096-3.276 1.344-.792 2.892-1.188 4.644-1.188 1.728 0 3.216.396 4.464 1.188 1.272.768 2.244 1.788 2.916 3.06.672 1.272 1.008 2.64 1.008 4.104 0 .264-.012.528-.036.792v.9h-14.22c.072 1.368.384 2.508.936 3.42.576.888 1.284 1.56 2.124 2.016.864.456 1.776.684 2.736.684 1.248 0 2.292-.288 3.132-.864.84-.576 1.452-1.356 1.836-2.34h2.988c-.48 1.656-1.404 3.036-2.772 4.14-1.344 1.08-3.072 1.62-5.184 1.62Zm0-16.164c-1.44 0-2.724.444-3.852 1.332-1.104.864-1.74 2.136-1.908 3.816h11.232c-.072-1.608-.624-2.868-1.656-3.78-1.032-.912-2.304-1.368-3.816-1.368ZM435.893 159l-9.468-25.2h3.276l7.956 21.996 8.028-21.996h3.204l-9.468 25.2h-3.528Zm22.365.432c-2.112 0-3.792-.636-5.04-1.908-1.248-1.296-1.872-3.276-1.872-5.94v-10.44h3.024v10.116c0 3.72 1.524 5.58 4.572 5.58 1.56 0 2.844-.552 3.852-1.656 1.032-1.128 1.548-2.724 1.548-4.788v-9.252h3.024V159h-2.736l-.216-3.204c-.552 1.128-1.38 2.016-2.484 2.664-1.08.648-2.304.972-3.672.972Zm22.113 0c-1.704 0-3.216-.384-4.536-1.152-1.32-.792-2.364-1.884-3.132-3.276-.744-1.392-1.116-3.036-1.116-4.932 0-1.872.372-3.504 1.116-4.896.744-1.416 1.776-2.508 3.096-3.276 1.344-.792 2.892-1.188 4.644-1.188 1.728 0 3.216.396 4.464 1.188 1.272.768 2.244 1.788 2.916 3.06.672 1.272 1.008 2.64 1.008 4.104 0 .264-.012.528-.036.792v.9h-14.22c.072 1.368.384 2.508.936 3.42.576.888 1.284 1.56 2.124 2.016.864.456 1.776.684 2.736.684 1.248 0 2.292-.288 3.132-.864.84-.576 1.452-1.356 1.836-2.34h2.988c-.48 1.656-1.404 3.036-2.772 4.14-1.344 1.08-3.072 1.62-5.184 1.62Zm0-16.164c-1.44 0-2.724.444-3.852 1.332-1.104.864-1.74 2.136-1.908 3.816h11.232c-.072-1.608-.624-2.868-1.656-3.78-1.032-.912-2.304-1.368-3.816-1.368ZM502.547 159v-25.2h15.336v2.484h-12.312v8.856h10.476v2.448h-10.476V159h-3.024Zm19.05 0v-17.856h2.736l.252 3.42c.552-1.176 1.392-2.112 2.52-2.808 1.128-.696 2.52-1.044 4.176-1.044v3.168h-.828c-1.056 0-2.028.192-2.916.576-.888.36-1.596.984-2.124 1.872-.528.888-.792 2.112-.792 3.672v9h-3.024Zm19.018.432c-1.488 0-2.724-.252-3.708-.756s-1.716-1.176-2.196-2.016c-.48-.84-.72-1.752-.72-2.736 0-1.824.696-3.228 2.088-4.212 1.392-.984 3.288-1.476 5.688-1.476h4.824v-.216c0-1.56-.408-2.736-1.224-3.528-.816-.816-1.908-1.224-3.276-1.224-1.176 0-2.196.3-3.06.9-.84.576-1.368 1.428-1.584 2.556h-3.096c.12-1.296.552-2.388 1.296-3.276.768-.888 1.716-1.56 2.844-2.016 1.128-.48 2.328-.72 3.6-.72 2.496 0 4.368.672 5.616 2.016 1.272 1.32 1.908 3.084 1.908 5.292V159h-2.7l-.18-3.204c-.504 1.008-1.248 1.872-2.232 2.592-.96.696-2.256 1.044-3.888 1.044Zm.468-2.556c1.152 0 2.136-.3 2.952-.9.84-.6 1.476-1.38 1.908-2.34.432-.96.648-1.968.648-3.024v-.036h-4.572c-1.776 0-3.036.312-3.78.936-.72.6-1.08 1.356-1.08 2.268 0 .936.336 1.692 1.008 2.268.696.552 1.668.828 2.916.828ZM554.152 159v-17.856h2.736l.216 2.592c.576-.96 1.344-1.704 2.304-2.232.96-.528 2.04-.792 3.24-.792 1.416 0 2.628.288 3.636.864 1.032.576 1.824 1.452 2.376 2.628.624-1.08 1.476-1.932 2.556-2.556 1.104-.624 2.292-.936 3.564-.936 2.136 0 3.84.648 5.112 1.944 1.272 1.272 1.908 3.24 1.908 5.904V159h-2.988v-10.116c0-1.848-.372-3.24-1.116-4.176-.744-.936-1.812-1.404-3.204-1.404-1.44 0-2.64.564-3.6 1.692-.936 1.104-1.404 2.688-1.404 4.752V159h-3.024v-10.116c0-1.848-.372-3.24-1.116-4.176-.744-.936-1.812-1.404-3.204-1.404-1.416 0-2.604.564-3.564 1.692-.936 1.104-1.404 2.688-1.404 4.752V159h-3.024Zm40.231.432c-1.704 0-3.216-.384-4.536-1.152-1.32-.792-2.364-1.884-3.132-3.276-.744-1.392-1.116-3.036-1.116-4.932 0-1.872.372-3.504 1.116-4.896.744-1.416 1.776-2.508 3.096-3.276 1.344-.792 2.892-1.188 4.644-1.188 1.728 0 3.216.396 4.464 1.188 1.272.768 2.244 1.788 2.916 3.06.672 1.272 1.008 2.64 1.008 4.104 0 .264-.012.528-.036.792v.9h-14.22c.072 1.368.384 2.508.936 3.42.576.888 1.284 1.56 2.124 2.016.864.456 1.776.684 2.736.684 1.248 0 2.292-.288 3.132-.864.84-.576 1.452-1.356 1.836-2.34h2.988c-.48 1.656-1.404 3.036-2.772 4.14-1.344 1.08-3.072 1.62-5.184 1.62Zm0-16.164c-1.44 0-2.724.444-3.852 1.332-1.104.864-1.74 2.136-1.908 3.816h11.232c-.072-1.608-.624-2.868-1.656-3.78-1.032-.912-2.304-1.368-3.816-1.368ZM609.748 159l-5.22-17.856h3.024l3.78 14.004 4.176-14.004h3.42l4.212 14.004 3.744-14.004h3.06L624.724 159h-3.096l-4.392-14.724L612.844 159h-3.096Zm31.009.432c-1.68 0-3.192-.384-4.536-1.152-1.344-.768-2.412-1.848-3.204-3.24-.768-1.416-1.152-3.072-1.152-4.968s.396-3.54 1.188-4.932c.792-1.416 1.86-2.508 3.204-3.276 1.368-.768 2.892-1.152 4.572-1.152 1.68 0 3.192.384 4.536 1.152 1.344.768 2.4 1.86 3.168 3.276.792 1.392 1.188 3.036 1.188 4.932 0 1.896-.396 3.552-1.188 4.968-.792 1.392-1.872 2.472-3.24 3.24-1.344.768-2.856 1.152-4.536 1.152Zm0-2.592c1.032 0 1.992-.252 2.88-.756.888-.504 1.608-1.26 2.16-2.268.552-1.008.828-2.256.828-3.744 0-1.488-.276-2.736-.828-3.744-.528-1.008-1.236-1.764-2.124-2.268-.888-.504-1.836-.756-2.844-.756-1.032 0-1.992.252-2.88.756-.888.504-1.608 1.26-2.16 2.268-.552 1.008-.828 2.256-.828 3.744 0 1.488.276 2.736.828 3.744.552 1.008 1.26 1.764 2.124 2.268.888.504 1.836.756 2.844.756Zm13.168 2.16v-17.856h2.736l.252 3.42c.552-1.176 1.392-2.112 2.52-2.808 1.128-.696 2.52-1.044 4.176-1.044v3.168h-.828c-1.056 0-2.028.192-2.916.576-.888.36-1.596.984-2.124 1.872-.528.888-.792 2.112-.792 3.672v9h-3.024Zm13.079 0v-25.92h3.024v15.588l7.308-7.524h3.708l-7.92 8.064 8.928 9.792H678.2l-8.172-9.252V159h-3.024ZM442.48 108c.518 0 .96-.43.96-.96V84.72s1.2 2.16 3.36 5.76l9.36 16.08c.428.898 1.378 1.44 2.16 1.44h6.48V72h-6.48c-.432 0-.96.3586-.96.96v22.56l-4.32-7.68-8.64-14.64c-.42-.7461-1.325-1.2-2.16-1.2H436v36h6.48ZM526.24 82.08h3.12c.795 0 1.44-.6447 1.44-1.44V74.4h6.72v7.68H544v5.76h-6.48v10.32c0 2.52 1.214 3.6 3.36 3.6H544V108h-4.08c-5.532 0-9.12-3.583-9.12-9.6V87.84h-4.56v-5.76ZM493.84 82.08v14.88c0 3.361-1.262 6.194-3.12 8.16-1.858 1.966-4.424 2.88-7.92 2.88-3.496 0-6.302-.914-8.16-2.88-1.827-1.966-3.12-4.799-3.12-8.16V82.08h3.84c.819 0 1.625.1493 2.16.72.535.539.72.8556.72 1.68v12.48c0 1.9341.11 3.129.96 4.08.85.919 1.899 1.2 3.6 1.2 1.732 0 2.51-.281 3.36-1.2.85-.951.96-2.1459.96-4.08V84.48c0-.8244.185-1.3493.72-1.92.47-.5014.967-.4896 1.68-.48.099.0013.381 0 .48 0h3.84ZM514.24 94.56l8.16-12.48h-6.24c-.786 0-1.485.2822-1.92.96l-3.84 5.76-3.6-5.52c-.435-.6778-1.374-1.2-2.16-1.2h-6l8.16 12.24-8.88 13.68h6.24c.78 0 1.484-.771 1.92-1.44l4.32-6.48 4.56 6.72c.436.669 1.14 1.2 1.92 1.2h6.24l-8.88-13.44Z"/><path fill="#00DC82" d="M392.32 108h26.64c.85 0 1.664-.299 2.4-.72s1.495-.95 1.92-1.68c.425-.73.72-1.558.72-2.4 0-.843-.294-1.67-.72-2.4l-18-30.96c-.425-.7296-.944-1.2587-1.68-1.68s-1.79-.72-2.64-.72c-.85 0-1.664.2987-2.4.72-.736.4213-1.255.9504-1.68 1.68l-4.56 7.92-9.12-15.3606c-.425-.7295-.944-1.4982-1.68-1.9194s-1.55-.48-2.4-.48c-.85 0-1.664.0588-2.4.48-.736.4212-1.495 1.1899-1.92 1.9194L352.48 100.8c-.426.73-.48 1.557-.48 2.4 0 .842.055 1.67.48 2.4s1.184 1.259 1.92 1.68c.736.421 1.55.72 2.4.72h16.8c6.657 0 11.502-2.986 14.88-8.64l8.16-14.16 4.32-7.44 13.2 22.56h-17.52l-4.32 7.68Zm-18.96-7.68H361.6l17.52-30.24L388 85.2l-5.882 10.254c-2.243 3.6684-4.801 4.866-8.758 4.866Z"/></g><defs><radialGradient id="c" cx="0" cy="0" r="1" gradientTransform="matrix(0 272 -578 0 450 -98)" gradientUnits="userSpaceOnUse"><stop stop-color="#00DC82"/><stop offset="1" stop-color="#00DC82" stop-opacity="0"/></radialGradient><clipPath id="a"><path fill="#fff" d="M0 0h896v230H0z"/></clipPath><filter id="b" width="1878" height="1266" x="-489" y="-731" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_3477_75" stdDeviation="180.5"/></filter></defs></svg> +<svg xmlns="http://www.w3.org/2000/svg" width="896" height="230" fill="none" viewBox="0 0 896 230"><g clip-path="url(#a)"><path fill="#020420" d="M0 0h896v230H0z"/><g clip-path="url(#b)"><path stroke="url(#c)" d="m909.245 16.5386-6.803-.5581c-2.026-.1661-4.062.145-5.946.9084l-2.952 1.1963c-2.283.9252-4.781 1.1828-7.205.7428l-2.894-.5255c-.857-.1554-1.695-.3965-2.503-.7195l-11.033-4.4098c-3.008-1.2024-6.408-.9078-9.164.7941l-4.476 2.7636c-1.458.9001-3.345.6678-4.542-.5589-1.383-1.4187-3.644-1.4782-5.1-.1344l-4.172 3.8502c-3.012 2.7803-7.469 3.3129-11.051 1.3205l-1.447-.8042c-3.633-2.0207-8.063-1.9762-11.655.1169l-6.218 3.6234-9.189 4.128c-2.259 1.0146-4.181 2.653-5.54 4.7226l-2.865 4.3626c-1.213 1.8484-2.879 3.3566-4.838 4.382l-7.92 4.1455c-1.599.8368-3.006 1.9972-4.132 3.4073l-8.465 10.6045c-.431.54-.905 1.0448-1.416 1.5096l-11.88 10.7973c-.519.4724-1.079.8995-1.671 1.2766l-6.085 3.8719c-1.742 1.1087-4.036.7521-5.36-.8331-.96-1.1506-2.471-1.6868-3.942-1.3991l-3.237.6329c-2.351.4597-4.789.0318-6.843-1.2011l-.725-.4347c-2.52-1.5128-5.511-2.0378-8.396-1.4737l-.206.0402c-2.953.5774-6.015.04-8.594-1.5083-2.468-1.4816-5.382-2.0397-8.224-1.5748l-.908.1486c-1.308.214-2.641.2268-3.953.0378l-10.356-1.4918c-4.934-.7107-9.84 1.4622-12.628 5.5934l-5.246 7.7704c-1.469 2.1763-4.086 3.2786-6.67 2.8096-2.262-.4107-4.576.3819-6.111 2.0938l-.284.3169c-2.772 3.0905-7.67 2.8987-10.192-.3988l-.27-.3531c-1.218-1.5933-3.171-2.4471-5.168-2.2595-1.735.163-3.452-.4599-4.678-1.6976l-.338-.3402c-1.473-1.4862-3.545-2.2156-5.625-1.9793l-5.885.6689c-3.781.4297-7.183 2.4941-9.311 5.6488l-.842 1.2489c-.202.2999-.381.615-.535.9424-1.434 3.0518-4.829 4.6606-8.099 3.8388l-43.376-10.8997c-4.849-1.2185-9.967.4519-13.164 4.2964l-14.169 17.0407c-1.061 1.276-1.868 2.744-2.378 4.323l-1.585 4.92c-1.194 3.705-3.986 6.68-7.607 8.107l-20.359 8.022c-.806.318-1.579.716-2.307 1.188l-16.42 10.647-17.97 11.763c-1.906 1.247-3.45 2.973-4.479 5.005l-4.503 8.893c-.667 1.318-1.554 2.513-2.623 3.532l-1.953 1.865c-1.968 1.877-4.474 3.091-7.166 3.469l-3.171.446c-1.323.185-2.583.685-3.675 1.456-3.87 2.734-9.234 1.724-11.846-2.229l-1.195-1.809c-2.53-3.83-7.256-5.571-11.666-4.299l-15.97 4.607c-.962.278-1.954.443-2.955.493l-19.182.958c-1.017.051-2.024.221-3.002.507l-17.105 5.004c-1.251.366-2.55.542-3.853.521l-10.129-.158c-2.66-.041-5.243-.897-7.401-2.453l-13.438-9.69c-2.158-1.556-4.741-2.412-7.401-2.454l-5.16-.08-6.217-.097c-1.993-.031-3.967.396-5.768 1.25l-8.126 3.85c-1.457.69-3.029 1.103-4.636 1.218l-7.569.543c-4.186.301-8.152 2.714-12.022 4.339-3.014 1.266-7.348 2.248-13.263 2.156-6.961-.109-14.765 3.574-21.161 7.727-4.143 2.689-17.9 8.157-22.838 8.08-.587-.009-2.392.064-2.954.23-22.349 6.607-28.67-5.871-35.036-9.226-1.949-1.027-4.194-.169-6.053 1.012l-15.034 9.551c-3.744 2.379-8.442 2.684-12.463.81l-7.755-3.613-16.199-6.842c-3.931-1.661-8.427-1.286-12.0288 1.003l-26.4404 16.797c-1.0077.64-2.0987 1.138-3.2424 1.481l-32.6339 9.77c-1.2748.382-2.6007.566-3.9313.545l-16.2859-.254c-5.4059-.084-10.19523-3.506-12.02776-8.592l-2.68772-7.46c-1.8325297-5.087-6.33769-7.091-11.25588-4.846-8.00184 3.654-19.83014 8.756-26.24784 8.656-9.9859-.156-40.6727-9.167-54.7678-13.654"/><path stroke="url(#d)" stroke-opacity=".5" d="m921.529 11.6746-9.536-5.68761c-1.682-1.00343-3.569-1.61372-5.521-1.78525l-3.974-.3494c-1.954-.17169-3.92.10063-5.753.79657l-3.55 1.34771c-2.053.77945-4.27 1.02617-6.444.71714l-3.05-.43357c-1.09-.15496-2.156-.44779-3.172-.87146L869.525.821792c-2.965-1.235971-6.343-.9696-9.078.715728l-4.455 2.74576c-1.448.89209-3.323.64174-4.486-.59879-1.354-1.44438-3.624-1.51412-5.064-.15559l-4.194 3.9571c-3.057 2.8837-7.665 3.3665-11.253 1.17898l-1.118-.68185c-3.466-2.11317-7.812-2.15382-11.318-.10585l-6.422 3.75292-9.667 4.5377c-2.118.9944-3.929 2.542-5.24 4.4796l-3.13 4.6228c-1.148 1.6949-2.679 3.0948-4.47 4.086l-8.212 4.545c-1.377.7618-2.604 1.7671-3.621 2.9671l-9.626 11.3535-12.112 11.7169c-.592.5725-1.239 1.0845-1.933 1.5284l-5.809 3.719c-1.762 1.1282-4.082.8124-5.479-.7457-.949-1.059-2.364-1.5756-3.772-1.3777l-3.54.4975c-2.462.346-4.968-.1544-7.109-1.4192l-.368-.2176c-2.379-1.4057-5.165-1.9618-7.901-1.5772l-1.365.1918c-2.776.3901-5.603-.1274-8.061-1.4753l-.23-.1264c-2.458-1.348-5.285-1.8655-8.061-1.4754l-.786.1105c-1.206.1695-2.43.1687-3.636-.0025l-10.621-1.5072c-4.947-.7022-9.86 1.494-12.636 5.6494l-5.164 7.7306c-1.523 2.2798-4.228 3.4723-6.939 3.059l-.219-.0334c-2.213-.3374-4.447.4608-5.945 2.1243-2.728 3.0279-7.512 2.9143-10.092-.2396l-.712-.8702c-1.217-1.4868-3.121-2.2313-5.024-1.9639-1.666.2342-3.348-.3074-4.565-1.47l-.526-.5021c-1.549-1.4798-3.69-2.1691-5.811-1.871l-6.299.8852c-3.274.4603-6.251 2.1512-8.322 4.7286l-1.141 1.4191c-.336.4176-.621.8738-.848 1.3588-1.368 2.9177-4.613 4.4559-7.738 3.6685l-43.612-10.9892c-4.856-1.2234-9.982.4505-13.18 4.3036l-14.161 17.0626c-1.06 1.2765-1.865 2.744-2.373 4.3233l-1.587 4.9383c-1.192 3.7073-3.983 6.6843-7.605 8.1133l-20.352 8.03c-.807.319-1.581.717-2.309 1.19l-16.415 10.662-17.967 11.778c-1.905 1.248-3.448 2.976-4.476 5.009l-4.503 8.913c-.666 1.319-1.552 2.514-2.619 3.535l-1.951 1.865c-1.969 1.882-4.478 3.098-7.175 3.477l-3.162.444c-1.324.186-2.584.686-3.676 1.459-3.867 2.736-9.232 1.727-11.84-2.228l-1.202-1.823c-2.53-3.835-7.261-5.579-11.675-4.305l-15.955 4.608c-.965.278-1.958.444-2.961.494l-19.175.954c-1.019.051-2.028.221-3.007.508l-17.097 5.007c-1.253.367-2.554.543-3.86.522l-10.12-.16c-2.663-.043-5.248-.902-7.406-2.461l-13.439-9.709c-2.159-1.559-4.744-2.418-7.407-2.46l-5.155-.082-6.21-.099c-1.997-.032-3.974.397-5.779 1.253l-8.116 3.851c-1.458.692-3.033 1.106-4.643 1.221l-7.555.541c-4.191.3-8.16 2.719-12.034 4.346-3.015 1.266-7.346 2.248-13.257 2.154-6.964-.111-14.769 3.579-21.165 7.739-4.144 2.695-17.879 8.163-22.821 8.084-.588-.009-2.399.064-2.963.231-22.339 6.609-28.664-5.883-35.029-9.249-1.951-1.032-4.2-.173-6.062 1.012l-15.017 9.555c-3.748 2.385-8.454 2.69-12.479.81l-7.747-3.618-16.191-6.853c-3.936-1.667-8.44-1.292-12.0464 1.003l-26.4233 16.813c-1.0088.641-2.1013 1.141-3.2467 1.484l-32.6232 9.777c-1.2771.383-2.6054.567-3.9384.546l-16.28-.259c-5.4063-.085-10.195-3.509-12.02577-8.596l-2.69916-7.501c-1.830779-5.088-6.33458-7.091-11.25203-4.843-8.00054 3.658-19.82654 8.765-26.24384 8.664"/><path stroke="url(#e)" stroke-opacity=".25" d="m922.529-3.32539-9.532-5.6874c-1.683-1.00391-3.57-1.61451-5.522-1.78621l-3.97-.3493c-1.954-.1719-3.921.1005-5.754.7968l-3.545 1.34616c-2.054.77983-4.271 1.02661-6.446.7173l-3.046-.43329c-1.091-.15509-2.157-.4481-3.174-.87201l-10.999-4.58716c-2.964-1.236-6.342-.9697-9.075.7155l-4.454 2.7452c-1.447.89209-3.322.6417-4.484-.5987-1.354-1.4444-3.623-1.5141-5.063-.1556l-4.192 3.95656c-3.056 2.88338-7.663 3.36604-11.249 1.17857l-1.119-.68196c-3.464-2.11321-7.81-2.15394-11.314-.10607l-6.42 3.75231-9.662 4.53667c-2.118.99467-3.929 2.54273-5.24 4.48083l-3.128 4.62109c-1.147 1.6952-2.679 3.0956-4.47 4.087l-8.207 4.5435c-1.377.7621-2.604 1.7677-3.621 2.968l-9.622 11.3524-12.108 11.7165c-.591.5724-1.238 1.0843-1.932 1.5281l-5.806 3.7184c-1.762 1.1283-4.082.8125-5.478-.7456-.949-1.059-2.364-1.5756-3.772-1.3778l-3.538.4973c-2.461.3459-4.967-.1545-7.106-1.4193l-.369-.2178c-2.378-1.4058-5.163-1.962-7.899-1.5775l-1.361.1914c-2.777.3902-5.605-.1277-8.063-1.4763l-.227-.1245c-2.458-1.3487-5.286-1.8665-8.063-1.4763l-.782.1099c-1.206.1695-2.43.1687-3.637-.0026l-10.611-1.5069c-4.949-.7028-9.863 1.4942-12.639 5.651l-5.161 7.7281c-1.522 2.2792-4.226 3.4714-6.935 3.0581l-.219-.0334c-2.212-.3376-4.446.4606-5.944 2.1239-2.726 3.0275-7.509 2.9139-10.088-.2394l-.713-.8714c-1.216-1.4865-3.12-2.2308-5.021-1.9636-1.666.2342-3.348-.3074-4.564-1.4698l-.526-.5025c-1.549-1.4797-3.689-2.1691-5.81-1.8711l-6.293.8845c-3.276.4603-6.252 2.1519-8.324 4.7302l-1.139 1.4175c-.336.4175-.62.8735-.848 1.3585-1.368 2.9175-4.612 4.4556-7.736 3.6679l-43.594-10.9895c-4.856-1.2243-9.984.4502-13.182 4.3048L535.58 75.0943c-1.06 1.2765-1.865 2.744-2.372 4.3232l-1.587 4.9376c-1.191 3.7074-3.982 6.6854-7.604 8.1149l-20.342 8.027c-.808.319-1.582.718-2.31 1.191l-16.409 10.661-17.959 11.776c-1.905 1.249-3.449 2.977-4.476 5.011l-4.501 8.912c-.666 1.318-1.551 2.513-2.619 3.534l-1.948 1.864c-1.969 1.882-4.479 3.099-7.176 3.478l-3.159.444c-1.324.186-2.583.686-3.674 1.458-3.866 2.736-9.229 1.727-11.836-2.226l-1.203-1.825c-2.53-3.835-7.259-5.579-11.673-4.305l-15.947 4.606c-.965.279-1.959.445-2.962.495l-19.167.953c-1.019.051-2.029.221-3.008.508l-17.089 5.005c-1.254.368-2.555.544-3.861.523l-10.114-.161c-2.663-.043-5.249-.902-7.408-2.462l-13.432-9.707c-2.158-1.561-4.744-2.42-7.407-2.462l-5.152-.082-6.206-.099c-1.998-.032-3.976.397-5.781 1.253l-8.11 3.849c-1.459.692-3.034 1.107-4.645 1.222l-7.547.54c-4.192.301-8.162 2.72-12.037 4.347-3.013 1.265-7.342 2.246-13.249 2.152-6.962-.111-14.765 3.579-21.16 7.739-4.142 2.695-17.87 8.161-22.811 8.083-.588-.01-2.399.063-2.964.23-22.328 6.607-28.653-5.882-35.016-9.25-1.951-1.032-4.2-.173-6.063 1.012l-15.006 9.551c-3.749 2.386-8.457 2.692-12.483.811l-7.741-3.617-16.183-6.853c-3.937-1.667-8.442-1.292-12.049 1.004l-26.4101 16.808c-1.009.642-2.1017 1.142-3.2474 1.486l-32.6102 9.774c-1.2775.383-2.6062.567-3.9397.546l-16.2706-.259c-5.4063-.086-10.19492-3.51-12.0254-8.597l-2.69846-7.501c-1.83047-5.087-6.33401-7.09-11.25134-4.842-7.9978 3.657-19.818 8.763-26.2326 8.661-9.9822-.159-40.6604-9.195-54.7516-13.693"/><path stroke="url(#f)" stroke-opacity=".1" d="m920.529-18.3254-9.532-5.6874c-1.683-1.0039-3.57-1.6145-5.522-1.7862l-3.97-.3493c-1.954-.1719-3.921.1005-5.754.7968l-3.545 1.3462c-2.054.7798-4.271 1.0266-6.446.7173l-3.046-.4333c-1.091-.1551-2.157-.4481-3.174-.872l-10.999-4.5872c-2.964-1.236-6.342-.9697-9.075.7155l-4.454 2.7452c-1.447.8921-3.322.6417-4.484-.5987-1.354-1.4444-3.623-1.5141-5.063-.1556l-4.192 3.9566c-3.056 2.8833-7.663 3.366-11.249 1.1785l-1.119-.6819c-3.464-2.1132-7.81-2.154-11.314-.1061l-6.42 3.7523-9.662 4.5367c-2.118.9946-3.929 2.5427-5.24 4.48081l-3.128 4.62105c-1.147 1.69527-2.679 3.09562-4.47 4.087053l-8.207 4.543497c-1.377.76206-2.604 1.7677-3.621 2.96802l-9.622 11.35237-12.108 11.7165c-.591.5724-1.238 1.0843-1.932 1.5281l-5.806 3.7184c-1.762 1.1283-4.082.8125-5.478-.7456-.949-1.059-2.364-1.5756-3.772-1.3778l-3.538.4973c-2.461.3459-4.967-.1545-7.106-1.4193l-.369-.2178c-2.378-1.4058-5.163-1.962-7.899-1.5775l-1.361.1914c-2.777.3902-5.605-.1277-8.063-1.4763l-.227-.1245c-2.458-1.3487-5.286-1.8665-8.063-1.4763l-.782.1099c-1.206.1695-2.43.1687-3.637-.0026l-10.611-1.5069c-4.949-.7028-9.863 1.4942-12.639 5.651l-5.161 7.7281c-1.522 2.2792-4.226 3.4714-6.935 3.0581l-.219-.0334c-2.212-.3376-4.446.4606-5.944 2.1239-2.726 3.0275-7.509 2.9139-10.088-.2394l-.713-.8714c-1.216-1.4865-3.12-2.2308-5.021-1.9636-1.666.2342-3.348-.3074-4.564-1.4698l-.526-.5025c-1.549-1.4797-3.689-2.1691-5.81-1.8711l-6.293.8845c-3.276.4603-6.252 2.1519-8.324 4.7302l-1.139 1.4175c-.336.4175-.62.8735-.848 1.3585-1.368 2.9175-4.612 4.4556-7.736 3.6679l-43.594-10.9895c-4.856-1.2243-9.984.4502-13.182 4.3048L533.58 60.0943c-1.06 1.2765-1.865 2.744-2.372 4.3232l-1.587 4.9376c-1.191 3.7074-3.982 6.6854-7.604 8.1149l-20.342 8.0274c-.808.3189-1.582.7179-2.31 1.1911l-16.409 10.66-17.959 11.7765c-1.905 1.249-3.449 2.977-4.476 5.011l-4.501 8.912c-.666 1.318-1.551 2.513-2.619 3.534l-1.948 1.864c-1.969 1.882-4.479 3.099-7.176 3.478l-3.159.444c-1.324.186-2.583.686-3.674 1.458-3.866 2.736-9.229 1.727-11.836-2.226l-1.203-1.825c-2.53-3.835-7.259-5.579-11.673-4.305l-15.947 4.606c-.965.279-1.959.445-2.962.495l-19.167.953c-1.019.051-2.029.221-3.008.508l-17.089 5.005c-1.254.368-2.555.544-3.861.523l-10.114-.161c-2.663-.043-5.249-.902-7.408-2.462l-13.432-9.707c-2.158-1.561-4.744-2.42-7.407-2.462l-5.152-.082-6.206-.099c-1.998-.032-3.976.397-5.781 1.253l-8.11 3.849c-1.459.692-3.034 1.107-4.645 1.222l-7.547.54c-4.192.301-8.162 2.72-12.037 4.347-3.013 1.265-7.342 2.246-13.249 2.152-6.962-.111-14.765 3.579-21.16 7.739-4.142 2.695-17.87 8.161-22.811 8.083-.588-.01-2.399.063-2.964.23-22.328 6.607-28.653-5.882-35.016-9.25-1.951-1.032-4.2-.173-6.063 1.012l-15.006 9.551c-3.749 2.386-8.457 2.692-12.483.811l-7.741-3.617-16.183-6.853c-3.937-1.667-8.442-1.292-12.049 1.004l-26.4101 16.808c-1.009.642-2.1017 1.142-3.2474 1.486l-32.6102 9.774c-1.2775.383-2.6062.567-3.9397.546l-16.2706-.259c-5.4063-.086-10.19492-3.51-12.0254-8.597l-2.698456-7.501c-1.830474-5.087-6.334014-7.09-11.251344-4.842-7.9978 3.657-19.818 8.763-26.2326 8.661-9.9822-.159-40.6604-9.195-54.7516-13.693"/><g filter="url(#g)" opacity=".5"><path fill="url(#h)" d="M-81-1H964l-18 34.5L333.5 119-81 199V-1Z"/></g></g><path fill="#fff" d="M348.67 126v-21.708h-7.416V100.8h19.116v3.492h-7.416V126h-4.284Zm15.117 0v-25.92h4.32v10.584c.6-.984 1.416-1.764 2.448-2.34 1.032-.6 2.196-.9 3.492-.9 1.488 0 2.748.312 3.78.936 1.032.6 1.812 1.5 2.34 2.7.552 1.176.828 2.652.828 4.428V126h-4.284v-10.116c0-1.56-.336-2.748-1.008-3.564-.648-.816-1.644-1.224-2.988-1.224-.864 0-1.644.216-2.34.648-.696.408-1.248 1.008-1.656 1.8-.408.768-.612 1.716-.612 2.844V126h-4.32Zm30.293.432c-1.8 0-3.384-.384-4.752-1.152-1.368-.792-2.436-1.896-3.204-3.312-.768-1.416-1.152-3.048-1.152-4.896 0-1.92.372-3.6 1.116-5.04.768-1.44 1.836-2.568 3.204-3.384 1.392-.816 3-1.224 4.824-1.224 1.776 0 3.324.396 4.644 1.188 1.32.792 2.34 1.86 3.06 3.204.72 1.32 1.08 2.808 1.08 4.464v.792c0 .288-.024.588-.072.9h-14.76V115.2h10.476c-.048-1.32-.492-2.352-1.332-3.096-.84-.768-1.884-1.152-3.132-1.152-.888 0-1.704.204-2.448.612-.744.408-1.332 1.02-1.764 1.836-.432.792-.648 1.8-.648 3.024v1.044c0 1.128.204 2.1.612 2.916.432.816 1.008 1.44 1.728 1.872.744.408 1.572.612 2.484.612 1.008 0 1.836-.216 2.484-.648.672-.432 1.164-1.008 1.476-1.728h4.392c-.336 1.128-.888 2.148-1.656 3.06-.768.888-1.716 1.596-2.844 2.124-1.128.504-2.4.756-3.816.756Zm21.742-.432v-25.2h4.32V126h-4.32Zm9.242 0v-18.144h3.816l.324 3.024c.552-1.056 1.344-1.896 2.376-2.52 1.032-.624 2.256-.936 3.672-.936 1.464 0 2.712.312 3.744.936 1.032.6 1.824 1.488 2.376 2.664.576 1.176.864 2.64.864 4.392V126h-4.32v-10.188c0-1.512-.336-2.676-1.008-3.492-.672-.816-1.668-1.224-2.988-1.224-.864 0-1.644.204-2.34.612-.672.408-1.212 1.008-1.62 1.8-.384.768-.576 1.704-.576 2.808V126h-4.32Zm29.611 0c-1.224 0-2.292-.192-3.204-.576-.888-.384-1.584-1.02-2.088-1.908-.504-.888-.756-2.088-.756-3.6v-8.424h-3.096v-3.636h3.096l.504-4.788h3.816v4.788h4.932v3.636h-4.932v8.424c0 .912.192 1.548.576 1.908.408.336 1.08.504 2.016.504h2.232V126h-3.096Zm14 .432c-1.464 0-2.724-.288-3.78-.864-1.032-.6-1.824-1.488-2.376-2.664-.552-1.2-.828-2.676-.828-4.428v-10.62h4.32v10.188c0 1.56.324 2.748.972 3.564.672.792 1.68 1.188 3.024 1.188.864 0 1.632-.204 2.304-.612.696-.408 1.236-.996 1.62-1.764.408-.792.612-1.752.612-2.88v-9.684h4.32V126h-3.816l-.324-3.024c-.552 1.056-1.356 1.896-2.412 2.52-1.032.624-2.244.936-3.636.936ZM483.85 126v-18.144h4.32V126h-4.32Zm2.16-21.024c-.792 0-1.452-.24-1.98-.72-.504-.504-.756-1.116-.756-1.836 0-.744.252-1.344.756-1.8.528-.48 1.188-.72 1.98-.72s1.44.24 1.944.72c.528.456.792 1.056.792 1.8 0 .72-.264 1.332-.792 1.836-.504.48-1.152.72-1.944.72ZM501.046 126c-1.224 0-2.292-.192-3.204-.576-.888-.384-1.584-1.02-2.088-1.908-.504-.888-.756-2.088-.756-3.6v-8.424h-3.096v-3.636h3.096l.504-4.788h3.816v4.788h4.932v3.636h-4.932v8.424c0 .912.192 1.548.576 1.908.408.336 1.08.504 2.016.504h2.232V126h-3.096Zm7.448 0v-18.144h4.32V126h-4.32Zm2.16-21.024c-.792 0-1.452-.24-1.98-.72-.504-.504-.756-1.116-.756-1.836 0-.744.252-1.344.756-1.8.528-.48 1.188-.72 1.98-.72s1.44.24 1.944.72c.528.456.792 1.056.792 1.8 0 .72-.264 1.332-.792 1.836-.504.48-1.152.72-1.944.72ZM522.775 126l-6.696-18.144h4.536l4.788 14.04 4.788-14.04h4.464L527.959 126h-5.184Zm22.582.432c-1.8 0-3.384-.384-4.752-1.152-1.368-.792-2.436-1.896-3.204-3.312-.768-1.416-1.152-3.048-1.152-4.896 0-1.92.372-3.6 1.116-5.04.768-1.44 1.836-2.568 3.204-3.384 1.392-.816 3-1.224 4.824-1.224 1.776 0 3.324.396 4.644 1.188 1.32.792 2.34 1.86 3.06 3.204.72 1.32 1.08 2.808 1.08 4.464v.792c0 .288-.024.588-.072.9h-14.76V115.2h10.476c-.048-1.32-.492-2.352-1.332-3.096-.84-.768-1.884-1.152-3.132-1.152-.888 0-1.704.204-2.448.612-.744.408-1.332 1.02-1.764 1.836-.432.792-.648 1.8-.648 3.024v1.044c0 1.128.204 2.1.612 2.916.432.816 1.008 1.44 1.728 1.872.744.408 1.572.612 2.484.612 1.008 0 1.836-.216 2.484-.648.672-.432 1.164-1.008 1.476-1.728h4.392c-.336 1.128-.888 2.148-1.656 3.06-.768.888-1.716 1.596-2.844 2.124-1.128.504-2.4.756-3.816.756Z"/><path fill="#00DC82" d="m323.022 166-9.252-25.2h4.644l7.236 20.772 7.344-20.772h4.572l-9.288 25.2h-5.256Zm24.065.432c-1.464 0-2.724-.288-3.78-.864-1.032-.6-1.824-1.488-2.376-2.664-.552-1.2-.828-2.676-.828-4.428v-10.62h4.32v10.188c0 1.56.324 2.748.972 3.564.672.792 1.68 1.188 3.024 1.188.864 0 1.632-.204 2.304-.612.696-.408 1.236-.996 1.62-1.764.408-.792.612-1.752.612-2.88v-9.684h4.32V166h-3.816l-.324-3.024c-.552 1.056-1.356 1.896-2.412 2.52-1.032.624-2.244.936-3.636.936Zm23.491 0c-1.8 0-3.384-.384-4.752-1.152-1.368-.792-2.436-1.896-3.204-3.312-.768-1.416-1.152-3.048-1.152-4.896 0-1.92.372-3.6 1.116-5.04.768-1.44 1.836-2.568 3.204-3.384 1.392-.816 3-1.224 4.824-1.224 1.776 0 3.324.396 4.644 1.188 1.32.792 2.34 1.86 3.06 3.204.72 1.32 1.08 2.808 1.08 4.464v.792c0 .288-.024.588-.072.9h-14.76V155.2h10.476c-.048-1.32-.492-2.352-1.332-3.096-.84-.768-1.884-1.152-3.132-1.152-.888 0-1.704.204-2.448.612-.744.408-1.332 1.02-1.764 1.836-.432.792-.648 1.8-.648 3.024v1.044c0 1.128.204 2.1.612 2.916.432.816 1.008 1.44 1.728 1.872.744.408 1.572.612 2.484.612 1.008 0 1.836-.216 2.484-.648.672-.432 1.164-1.008 1.476-1.728h4.392c-.336 1.128-.888 2.148-1.656 3.06-.768.888-1.716 1.596-2.844 2.124-1.128.504-2.4.756-3.816.756ZM392.32 166v-25.2h16.092v3.492H396.64v7.38h9.612v3.42h-9.612V166h-4.32Zm19.649 0v-18.144h3.852l.396 3.384c.432-.792.972-1.464 1.62-2.016.648-.576 1.404-1.02 2.268-1.332.888-.312 1.86-.468 2.916-.468v4.572h-1.512c-.72 0-1.404.096-2.052.288-.648.168-1.212.456-1.692.864-.456.384-.816.924-1.08 1.62-.264.672-.396 1.524-.396 2.556V166h-4.32Zm20.356.432c-1.488 0-2.724-.252-3.708-.756s-1.716-1.176-2.196-2.016c-.48-.84-.72-1.752-.72-2.736 0-1.152.288-2.148.864-2.988.6-.84 1.476-1.488 2.628-1.944 1.152-.48 2.568-.72 4.248-.72h4.572c0-.96-.132-1.752-.396-2.376-.264-.648-.672-1.128-1.224-1.44-.552-.312-1.26-.468-2.124-.468-.984 0-1.824.228-2.52.684-.696.432-1.128 1.104-1.296 2.016h-4.248c.144-1.296.576-2.4 1.296-3.312.72-.936 1.668-1.656 2.844-2.16 1.2-.528 2.508-.792 3.924-.792 1.704 0 3.156.3 4.356.9 1.2.576 2.112 1.416 2.736 2.52.648 1.08.972 2.388.972 3.924V166h-3.672l-.432-2.916c-.24.48-.552.924-.936 1.332-.36.408-.78.768-1.26 1.08-.48.288-1.032.516-1.656.684-.6.168-1.284.252-2.052.252Zm.972-3.42c.696 0 1.308-.12 1.836-.36.552-.264 1.02-.624 1.404-1.08.408-.48.72-1.008.936-1.584.216-.576.36-1.188.432-1.836v-.072h-3.996c-.84 0-1.536.108-2.088.324-.552.192-.948.48-1.188.864s-.36.828-.36 1.332c0 .504.12.936.36 1.296s.588.636 1.044.828c.456.192.996.288 1.62.288ZM446.949 166v-18.144h3.816l.36 2.484c.576-.912 1.332-1.62 2.268-2.124.96-.528 2.052-.792 3.276-.792.912 0 1.728.12 2.448.36.744.24 1.392.6 1.944 1.08.576.48 1.044 1.08 1.404 1.8.672-1.008 1.548-1.8 2.628-2.376 1.08-.576 2.256-.864 3.528-.864 1.512 0 2.796.312 3.852.936 1.056.6 1.86 1.5 2.412 2.7.552 1.176.828 2.628.828 4.356V166h-4.284v-10.152c0-1.536-.312-2.712-.936-3.528-.624-.816-1.548-1.224-2.772-1.224-.84 0-1.584.204-2.232.612-.624.408-1.116 1.008-1.476 1.8-.36.768-.54 1.716-.54 2.844V166h-4.284v-10.152c0-1.536-.312-2.712-.936-3.528-.624-.816-1.56-1.224-2.808-1.224-.792 0-1.512.204-2.16.612-.624.408-1.116 1.008-1.476 1.8-.36.768-.54 1.716-.54 2.844V166h-4.32Zm41.824.432c-1.8 0-3.384-.384-4.752-1.152-1.368-.792-2.436-1.896-3.204-3.312-.768-1.416-1.152-3.048-1.152-4.896 0-1.92.372-3.6 1.116-5.04.768-1.44 1.836-2.568 3.204-3.384 1.392-.816 3-1.224 4.824-1.224 1.776 0 3.324.396 4.644 1.188 1.32.792 2.34 1.86 3.06 3.204.72 1.32 1.08 2.808 1.08 4.464v.792c0 .288-.024.588-.072.9h-14.76V155.2h10.476c-.048-1.32-.492-2.352-1.332-3.096-.84-.768-1.884-1.152-3.132-1.152-.888 0-1.704.204-2.448.612-.744.408-1.332 1.02-1.764 1.836-.432.792-.648 1.8-.648 3.024v1.044c0 1.128.204 2.1.612 2.916.432.816 1.008 1.44 1.728 1.872.744.408 1.572.612 2.484.612 1.008 0 1.836-.216 2.484-.648.672-.432 1.164-1.008 1.476-1.728h4.392c-.336 1.128-.888 2.148-1.656 3.06-.768.888-1.716 1.596-2.844 2.124-1.128.504-2.4.756-3.816.756Zm15.706-.432-5.328-18.144h4.284l3.708 14.904-.792-.036 4.14-14.868h4.824l4.176 14.868h-.792l3.708-14.868h4.284L521.363 166h-4.464l-4.428-15.372h.9L508.943 166h-4.464Zm33.125.432c-1.728 0-3.288-.396-4.68-1.188-1.368-.816-2.448-1.932-3.24-3.348-.768-1.44-1.152-3.084-1.152-4.932 0-1.896.396-3.552 1.188-4.968.792-1.44 1.872-2.556 3.24-3.348 1.392-.816 2.952-1.224 4.68-1.224 1.728 0 3.276.408 4.644 1.224 1.392.792 2.472 1.896 3.24 3.312.792 1.416 1.188 3.072 1.188 4.968s-.396 3.552-1.188 4.968c-.792 1.416-1.884 2.532-3.276 3.348-1.368.792-2.916 1.188-4.644 1.188Zm0-3.708c.864 0 1.644-.216 2.34-.648.72-.432 1.296-1.08 1.728-1.944.432-.864.648-1.932.648-3.204 0-1.272-.216-2.328-.648-3.168-.408-.864-.972-1.512-1.692-1.944-.696-.432-1.476-.648-2.34-.648-.84 0-1.62.216-2.34.648-.72.432-1.296 1.08-1.728 1.944-.432.84-.648 1.896-.648 3.168 0 1.272.216 2.34.648 3.204.432.864.996 1.512 1.692 1.944.72.432 1.5.648 2.34.648ZM550.941 166v-18.144h3.852l.396 3.384c.432-.792.972-1.464 1.62-2.016.648-.576 1.404-1.02 2.268-1.332.888-.312 1.86-.468 2.916-.468v4.572h-1.512c-.72 0-1.404.096-2.052.288-.648.168-1.212.456-1.692.864-.456.384-.816.924-1.08 1.62-.264.672-.396 1.524-.396 2.556V166h-4.32Zm26.009 0-8.028-9.936 7.2-8.208h5.148l-8.964 9.972v-3.348L582.35 166h-5.4Zm-11.7 0v-25.92h4.32V166h-4.32Z"/><path fill="#fff" d="M445.24 78c.259 0 .48-.2149.48-.48V66.36s.6 1.08 1.68 2.88l4.68 8.04c.214.4488.689.72 1.08.72h3.24V60h-3.24c-.216 0-.48.1793-.48.48v11.28l-2.16-3.84-4.32-7.32c-.21-.3731-.663-.6-1.08-.6H442v18h3.24ZM487.12 65.04h1.56c.398 0 .72-.3224.72-.72V61.2h3.36v3.84H496v2.88h-3.24v5.16c0 1.26.607 1.8 1.68 1.8H496V78h-2.04c-2.766 0-4.56-1.7914-4.56-4.8v-5.28h-2.28v-2.88ZM470.92 65.04v7.44c0 1.6804-.631 3.0971-1.56 4.08-.929.9829-2.212 1.44-3.96 1.44-1.748 0-3.151-.4571-4.08-1.44-.913-.9829-1.56-2.3996-1.56-4.08v-7.44h1.92c.409 0 .812.0746 1.08.36.268.2695.36.4278.36.84v6.24c0 .967.055 1.5644.48 2.04.425.4597.95.6 1.8.6.866 0 1.255-.1403 1.68-.6.425-.4756.48-1.073.48-2.04v-6.24c0-.4122.092-.6746.36-.96.235-.2507.483-.2448.84-.24.049.0007.19 0 .24 0h1.92ZM481.12 71.28l4.08-6.24h-3.12c-.393 0-.743.1411-.96.48l-1.92 2.88-1.8-2.76c-.217-.3389-.687-.6-1.08-.6h-3l4.08 6.12-4.44 6.84h3.12c.39 0 .742-.3855.96-.72l2.16-3.24 2.28 3.36c.218.3345.57.6.96.6h3.12l-4.44-6.72Z"/><path fill="#00DC82" d="M420.16 78h13.32c.425.0001.832-.1493 1.2-.36s.748-.4751.96-.84c.212-.3649.36-.7788.36-1.2001 0-.4213-.147-.8351-.36-1.1998l-9-15.4801c-.212-.3648-.472-.6294-.84-.84s-.895-.36-1.32-.36c-.425 0-.832.1494-1.2.36-.368.2106-.628.4752-.84.84l-2.28 3.96-4.56-7.6803c-.213-.3648-.472-.7491-.84-.9597s-.775-.24-1.2-.24c-.425 0-.832.0294-1.2.24-.368.2106-.747.5949-.96.9597l-11.16 19.2004c-.213.3647-.24.7785-.24 1.1998s.028.8352.24 1.2c.212.3649.592.6294.96.8401s.775.3601 1.2.36h8.4c3.328 0 5.751-1.4931 7.44-4.32l4.08-7.08 2.16-3.72 6.6 11.28h-8.76L420.16 78Zm-9.48-3.84h-5.88l8.76-15.12L418 66.6l-2.941 5.127c-1.122 1.8342-2.4 2.433-4.379 2.433Z"/></g><defs><linearGradient id="c" x1="891.588" x2="-45.7984" y1="20.9199" y2="181.711" gradientUnits="userSpaceOnUse"><stop offset=".0414531" stop-color="#00DC82" stop-opacity="0"/><stop offset=".203125" stop-color="#00DC82"/><stop offset=".333238" stop-color="#00DC82" stop-opacity="0"/><stop offset=".66715" stop-color="#00DC82" stop-opacity="0"/><stop offset=".757084" stop-color="#00DC82"/><stop offset=".930802" stop-color="#00DC82" stop-opacity="0"/></linearGradient><linearGradient id="d" x1="901.173" x2="-50.4208" y1="6.94982" y2="173.748" gradientUnits="userSpaceOnUse"><stop offset=".0830603" stop-color="#00DC82" stop-opacity="0"/><stop offset=".203125" stop-color="#00DC82"/><stop offset=".333238" stop-color="#00DC82" stop-opacity="0"/><stop offset=".66715" stop-color="#00DC82" stop-opacity="0"/><stop offset=".757084" stop-color="#00DC82"/><stop offset=".918562" stop-color="#00DC82" stop-opacity="0"/></linearGradient><linearGradient id="e" x1="902.927" x2="-44.1572" y1="-8.156" y2="154.552" gradientUnits="userSpaceOnUse"><stop offset=".102813" stop-color="#00DC82" stop-opacity="0"/><stop offset=".203125" stop-color="#00DC82"/><stop offset=".333238" stop-color="#00DC82" stop-opacity="0"/><stop offset=".66715" stop-color="#00DC82" stop-opacity="0"/><stop offset=".757084" stop-color="#00DC82"/><stop offset=".926908" stop-color="#00DC82" stop-opacity="0"/></linearGradient><linearGradient id="f" x1="900.927" x2="-46.1572" y1="-23.156" y2="139.552" gradientUnits="userSpaceOnUse"><stop stop-color="#00DC82" stop-opacity="0"/><stop offset=".203125" stop-color="#00DC82"/><stop offset=".333238" stop-color="#00DC82" stop-opacity="0"/><stop offset=".66715" stop-color="#00DC82" stop-opacity="0"/><stop offset=".757084" stop-color="#00DC82"/><stop offset=".994792" stop-color="#00DC82" stop-opacity="0"/></linearGradient><linearGradient id="h" x1="442" x2="442" y1="-95.5" y2="99" gradientUnits="userSpaceOnUse"><stop stop-color="#020420"/><stop offset=".4375" stop-color="#00DC82"/><stop offset="1" stop-color="#00DC82" stop-opacity="0"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h896v230H0z"/></clipPath><clipPath id="b"><path fill="#fff" d="M-81.0598-210.34h1045.06V445h-1045.06z"/></clipPath><filter id="g" width="1316.82" height="471.82" x="-216.91" y="-136.91" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_3501_689" stdDeviation="67.955"/></filter></defs></svg> From f86d9d0143c82644a8020e10184197ed5293841a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Tue, 17 Oct 2023 11:14:48 +0200 Subject: [PATCH 44/62] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 488fc275cf9b..9b6f31453476 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Here are a few ways you can get involved: ## Local Development -Follow the docs to [Set Up Your Local Development Environment](https://nuxt.com/docs/community/framework-contribution#set-up-your-local-development-environment) to contribute to the framework and documentation. +Follow the docs to [Set Up Your Local Development Environment](https://nuxt.com/docs/community/framework-contribution#setup) to contribute to the framework and documentation. ## Nuxt 2 From 4ada6248172162bfbb52fed97eb191195f3b6f48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Tue, 17 Oct 2023 15:23:08 +0200 Subject: [PATCH 45/62] Update 5.routing.md --- docs/1.getting-started/5.routing.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/1.getting-started/5.routing.md b/docs/1.getting-started/5.routing.md index 18acd5ca7f38..4476a4736646 100644 --- a/docs/1.getting-started/5.routing.md +++ b/docs/1.getting-started/5.routing.md @@ -14,15 +14,15 @@ This file system routing uses naming conventions to create dynamic and nested ro ::code-group -```text [pages/] -pages/ ---| about.vue ---| index.vue ---| posts/ -----| [id].vue +```bash [Directory Structure] +| pages/ +---| about.vue +---| index.vue +---| posts/ +-----| [id].vue ``` -```js [Generated Router File] +```json [Generated Router File] { "routes": [ { From 2529b9f07b2e262a0b60230ab85789f3e7f676ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Tue, 17 Oct 2023 15:23:54 +0200 Subject: [PATCH 46/62] lint fix --- docs/2.guide/2.directory-structure/0.nuxt.md | 2 +- docs/3.api/4.commands/devtools.md | 2 +- docs/5.community/7.changelog.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/2.guide/2.directory-structure/0.nuxt.md b/docs/2.guide/2.directory-structure/0.nuxt.md index 1b959435291d..9ad6d24aeb06 100644 --- a/docs/2.guide/2.directory-structure/0.nuxt.md +++ b/docs/2.guide/2.directory-structure/0.nuxt.md @@ -13,7 +13,7 @@ This directory is interesting if you want to learn more about the files Nuxt gen Nuxt also provides a Virtual File System (VFS) for modules to add templates to this directory without writing them to disk. -You can explore the generated files by opening the [Nuxt Devtools](https://devtools.nuxt.com) in development mode and navigating to the **Virtual Files** tab. +You can explore the generated files by opening the [Nuxt DevTools](https://devtools.nuxt.com) in development mode and navigating to the **Virtual Files** tab. ::callout{icon="i-ph-warning-duotone" color="amber"} You should not touch any files inside since the whole directory will be re-created when running [`nuxt dev`](/docs/api/commands/dev). diff --git a/docs/3.api/4.commands/devtools.md b/docs/3.api/4.commands/devtools.md index 1f7c476e75d6..0d53dcb792d7 100644 --- a/docs/3.api/4.commands/devtools.md +++ b/docs/3.api/4.commands/devtools.md @@ -19,5 +19,5 @@ Option | Default | Description `rootDir` | `.` | The root directory of the app you want to enable devtools for. ::read-more{icon="i-simple-icons-nuxtdotjs" to="https://devtools.nuxt.com" target="_blank"} -Read more about the **Nuxt Devtools**. +Read more about the **Nuxt DevTools**. :: diff --git a/docs/5.community/7.changelog.md b/docs/5.community/7.changelog.md index ec5eda02ed33..593d5daa852f 100644 --- a/docs/5.community/7.changelog.md +++ b/docs/5.community/7.changelog.md @@ -43,7 +43,7 @@ navigation.icon: i-ph-notification-duotone target: _blank ui.icon.base: text-black dark:text-white --- - Nuxt Devtools releases. + Nuxt DevTools releases. :: ::card --- From 272c95af6f2e6cb82d19ea21020c9def9340811a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Tue, 17 Oct 2023 22:50:25 +0200 Subject: [PATCH 47/62] docs: add defineRouteRules --- docs/2.guide/1.concepts/1.auto-imports.md | 2 +- docs/2.guide/1.concepts/3.rendering.md | 2 + .../1.experimental-features.md | 20 ++++++++ docs/3.api/1.components/8.nuxt-island.md | 2 +- docs/3.api/3.utils/define-route-rules.md | 51 +++++++++++++++++++ docs/3.api/3.utils/reload-nuxt-app.md | 2 +- 6 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 docs/3.api/3.utils/define-route-rules.md diff --git a/docs/2.guide/1.concepts/1.auto-imports.md b/docs/2.guide/1.concepts/1.auto-imports.md index 8f0990894d68..8f9c2e96430d 100644 --- a/docs/2.guide/1.concepts/1.auto-imports.md +++ b/docs/2.guide/1.concepts/1.auto-imports.md @@ -60,7 +60,7 @@ That means that (with very few exceptions) you cannot use them outside a Nuxt pl If you get an error message like `Nuxt instance is unavailable` then it probably means you are calling a Nuxt composable in the wrong place in the Vue or Nuxt lifecycle. -::read-more{to="/docs/guide/going-further/experimental-features#asynccontext"} +::read-more{to="/docs/guide/going-further/experimental-features#asynccontext" icon="i-ph-star-duotone"} Checkout the `asyncContext` experimental feature to use Nuxt composables in async functions. :: diff --git a/docs/2.guide/1.concepts/3.rendering.md b/docs/2.guide/1.concepts/3.rendering.md index 7cf9e3b9209c..78225ec866d0 100644 --- a/docs/2.guide/1.concepts/3.rendering.md +++ b/docs/2.guide/1.concepts/3.rendering.md @@ -98,6 +98,8 @@ export default defineNuxtConfig({ }) ``` +### Route Rules + The different properties you can use are the following: - `redirect: string`{lang=ts} - Define server-side redirects. - `ssr: boolean`{lang=ts} - Disables server-side rendering for sections of your app and make them SPA-only with `ssr: false` diff --git a/docs/2.guide/3.going-further/1.experimental-features.md b/docs/2.guide/3.going-further/1.experimental-features.md index d61ce4fca945..bb827b2ec692 100644 --- a/docs/2.guide/3.going-further/1.experimental-features.md +++ b/docs/2.guide/3.going-further/1.experimental-features.md @@ -118,6 +118,26 @@ export defineNuxtConfig({ }) ``` +## inlineRouteRules + +Define route rules at the page level using [`defineRouteRules`](/docs/api/utils/define-route-rules). + +```ts [nuxt.config.ts] +export defineNuxtConfig({ + experimental: { + inlineRouteRules: true + } +}) +``` + +Matching route rules will be created, based on the page's _path_. + +::read-more{to="/docs/api/utils/define-route-rules" icon="i-ph-function-duotone"} +Read more in `defineRouteRules` utility. +:: + +:read-more{to="/docs/guide/concepts/rendering#hybrid-rendering" icon="i-ph-medal-duotone"} + ## inlineSSRStyles Inlines styles when rendering HTML. This is currently available only when using Vite. diff --git a/docs/3.api/1.components/8.nuxt-island.md b/docs/3.api/1.components/8.nuxt-island.md index 9549d803ddd9..dc2119f86485 100644 --- a/docs/3.api/1.components/8.nuxt-island.md +++ b/docs/3.api/1.components/8.nuxt-island.md @@ -12,7 +12,7 @@ When rendering an island component, the content of the island component is stati Changing the island component props triggers a refetch of the island component to re-render it again. -::read-more{to="/docs/guide/going-further/experimental-features#componentislands"} +::read-more{to="/docs/guide/going-further/experimental-features#componentislands" icon="i-ph-star-duotone"} This component is experimental and in order to use it you must enable the `experimental.componentIslands` option in your `nuxt.config`. :: diff --git a/docs/3.api/3.utils/define-route-rules.md b/docs/3.api/3.utils/define-route-rules.md new file mode 100644 index 000000000000..fab2f67749f7 --- /dev/null +++ b/docs/3.api/3.utils/define-route-rules.md @@ -0,0 +1,51 @@ +--- +title: 'defineRouteRules' +description: 'Define route rules for hybrid rendering at the page level.' +links: + - label: Source Code + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/pages/runtime/composables.ts +--- + +::read-more{to="/docs/guide/going-further/experimental-features#inlinerouterules" icon="i-ph-star-duotone"} +This feature is experimental and in order to use it you must enable the `experimental.inlineRouteRules` option in your `nuxt.config`. +:: + +## Usage + +```vue [pages/index.vue] +<script> +defineRouteRules({ + prerender: true +}) +</script> + +<template> + <h1>Hello world!</h1> +</template> +``` + +Will be translated to: + +```ts [nuxt.config.ts] +export default defineNuxtConfig({ + routeRules: { + '/': { prerender: true } + } +}) +``` + +::callout +When running [`nuxt build`](/docs/api/commands/build), the home page will be pre-rendered in `.output/public/index.html` and statically served. +:: + +## Notes + +- A rule defined in `~/pages/foo/bar.vue` will be applied to `/foo/bar` requests. +- A rule in `~/pages/foo/[id].vue` will be applied to `/foo/**` requests. + +For more control, such as if you are using a custom `path` or `alias` set in the page's [`definePageMeta`](/docs/api/utils/define-page-meta), you should set `routeRules` directly within your `nuxt.config`. + +::read-more{to="/docs/guide/concepts/rendering#hybrid-rendering" icon="i-ph-medal-duotone"} +Read more about the `routeRules`. +:: diff --git a/docs/3.api/3.utils/reload-nuxt-app.md b/docs/3.api/3.utils/reload-nuxt-app.md index e590773777d4..f30dea101c12 100644 --- a/docs/3.api/3.utils/reload-nuxt-app.md +++ b/docs/3.api/3.utils/reload-nuxt-app.md @@ -14,7 +14,7 @@ links: By default, it will also save the current `state` of your app (that is, any state you could access with `useState`). -::read-more{to="/docs/guide/going-further/experimental-features#restorestate"} +::read-more{to="/docs/guide/going-further/experimental-features#restorestate" icon="i-ph-star-duotone"} You can enable experimental restoration of this state by enabling the `experimental.restoreState` option in your `nuxt.config` file. :: From 3791865d78a23a496613b9e28df42ac75b4a2e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Tue, 17 Oct 2023 22:57:42 +0200 Subject: [PATCH 48/62] script setup is better --- docs/3.api/3.utils/define-route-rules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/3.api/3.utils/define-route-rules.md b/docs/3.api/3.utils/define-route-rules.md index fab2f67749f7..ec63aa0bd855 100644 --- a/docs/3.api/3.utils/define-route-rules.md +++ b/docs/3.api/3.utils/define-route-rules.md @@ -14,7 +14,7 @@ This feature is experimental and in order to use it you must enable the `experim ## Usage ```vue [pages/index.vue] -<script> +<script setup> defineRouteRules({ prerender: true }) From 1b42ab3bd69ec1a8c303792cb02ceabe5e9e239d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Wed, 18 Oct 2023 09:18:18 +0200 Subject: [PATCH 49/62] chore: update button size --- docs/3.api/3.utils/define-route-rules.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/3.api/3.utils/define-route-rules.md b/docs/3.api/3.utils/define-route-rules.md index ec63aa0bd855..4d08e392ef07 100644 --- a/docs/3.api/3.utils/define-route-rules.md +++ b/docs/3.api/3.utils/define-route-rules.md @@ -5,6 +5,7 @@ links: - label: Source Code icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/pages/runtime/composables.ts + size: xs --- ::read-more{to="/docs/guide/going-further/experimental-features#inlinerouterules" icon="i-ph-star-duotone"} From 5ee523a428696ecd2942d3a9a1e522703dcce35a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Wed, 18 Oct 2023 12:29:11 +0200 Subject: [PATCH 50/62] docs: rename to Source --- docs/2.guide/3.going-further/6.nuxt-app.md | 2 +- docs/3.api/1.components/1.client-only.md | 2 +- docs/3.api/1.components/1.nuxt-client-fallback.md | 4 ++-- docs/3.api/1.components/2.nuxt-page.md | 2 +- docs/3.api/1.components/3.nuxt-layout.md | 2 +- docs/3.api/1.components/4.nuxt-link.md | 2 +- docs/3.api/1.components/5.nuxt-loading-indicator.md | 2 +- docs/3.api/1.components/6.nuxt-error-boundary.md | 2 +- docs/3.api/1.components/7.nuxt-welcome.md | 2 +- docs/3.api/1.components/8.nuxt-island.md | 2 +- docs/3.api/2.composables/use-app-config.md | 2 +- docs/3.api/2.composables/use-async-data.md | 2 +- docs/3.api/2.composables/use-cookie.md | 2 +- docs/3.api/2.composables/use-error.md | 2 +- docs/3.api/2.composables/use-fetch.md | 2 +- docs/3.api/2.composables/use-head-safe.md | 2 +- docs/3.api/2.composables/use-head.md | 2 +- docs/3.api/2.composables/use-hydration.md | 2 +- docs/3.api/2.composables/use-lazy-async-data.md | 2 +- docs/3.api/2.composables/use-lazy-fetch.md | 2 +- docs/3.api/2.composables/use-nuxt-app.md | 2 +- docs/3.api/2.composables/use-nuxt-data.md | 2 +- docs/3.api/2.composables/use-request-event.md | 2 +- docs/3.api/2.composables/use-request-headers.md | 2 +- docs/3.api/2.composables/use-request-url.md | 2 +- docs/3.api/2.composables/use-route.md | 2 +- docs/3.api/2.composables/use-router.md | 2 +- docs/3.api/2.composables/use-runtime-config.md | 2 +- docs/3.api/2.composables/use-seo-meta.md | 2 +- docs/3.api/2.composables/use-server-seo-meta.md | 2 +- docs/3.api/2.composables/use-state.md | 2 +- docs/3.api/3.utils/$fetch.md | 2 +- docs/3.api/3.utils/abort-navigation.md | 2 +- docs/3.api/3.utils/add-route-middleware.md | 2 +- docs/3.api/3.utils/clear-error.md | 2 +- docs/3.api/3.utils/clear-nuxt-data.md | 2 +- docs/3.api/3.utils/clear-nuxt-state.md | 2 +- docs/3.api/3.utils/create-error.md | 2 +- docs/3.api/3.utils/define-nuxt-component.md | 2 +- docs/3.api/3.utils/define-nuxt-route-middleware.md | 2 +- docs/3.api/3.utils/define-page-meta.md | 2 +- docs/3.api/3.utils/define-route-rules.md | 2 +- docs/3.api/3.utils/navigate-to.md | 2 +- docs/3.api/3.utils/on-before-route-leave.md | 2 +- docs/3.api/3.utils/on-before-route-update.md | 2 +- docs/3.api/3.utils/on-nuxt-ready.md | 2 +- docs/3.api/3.utils/prefetch-components.md | 2 +- docs/3.api/3.utils/preload-components.md | 2 +- docs/3.api/3.utils/preload-route-components.md | 2 +- docs/3.api/3.utils/prerender-routes.md | 2 +- docs/3.api/3.utils/refresh-nuxt-data.md | 2 +- docs/3.api/3.utils/reload-nuxt-app.md | 2 +- docs/3.api/3.utils/set-page-layout.md | 2 +- docs/3.api/3.utils/set-response-status.md | 2 +- docs/3.api/3.utils/show-error.md | 2 +- docs/3.api/3.utils/update-app-config.md | 2 +- docs/3.api/4.commands/add.md | 2 +- docs/3.api/4.commands/analyze.md | 2 +- docs/3.api/4.commands/build-module.md | 2 +- docs/3.api/4.commands/build.md | 2 +- docs/3.api/4.commands/cleanup.md | 2 +- docs/3.api/4.commands/dev.md | 2 +- docs/3.api/4.commands/devtools.md | 2 +- docs/3.api/4.commands/generate.md | 2 +- docs/3.api/4.commands/info.md | 2 +- docs/3.api/4.commands/init.md | 2 +- docs/3.api/4.commands/prepare.md | 2 +- docs/3.api/4.commands/preview.md | 2 +- docs/3.api/4.commands/typecheck.md | 2 +- docs/3.api/4.commands/upgrade.md | 2 +- docs/3.api/5.kit/1.modules.md | 2 +- docs/3.api/5.kit/10.templates.md | 2 +- docs/3.api/5.kit/11.nitro.md | 2 +- docs/3.api/5.kit/12.resolving.md | 2 +- docs/3.api/5.kit/13.logging.md | 2 +- docs/3.api/5.kit/14.builder.md | 2 +- docs/3.api/5.kit/2.programmatic.md | 2 +- docs/3.api/5.kit/3.compatibility.md | 2 +- docs/3.api/5.kit/4.autoimports.md | 2 +- docs/3.api/5.kit/5.components.md | 2 +- docs/3.api/5.kit/6.context.md | 2 +- docs/3.api/5.kit/7.pages.md | 2 +- docs/3.api/5.kit/8.layout.md | 2 +- docs/3.api/5.kit/9.plugins.md | 2 +- 84 files changed, 85 insertions(+), 85 deletions(-) diff --git a/docs/2.guide/3.going-further/6.nuxt-app.md b/docs/2.guide/3.going-further/6.nuxt-app.md index ab2f0e47f59c..6fe503cd5ad6 100644 --- a/docs/2.guide/3.going-further/6.nuxt-app.md +++ b/docs/2.guide/3.going-further/6.nuxt-app.md @@ -2,7 +2,7 @@ title: "NuxtApp" description: "In Nuxt 3, you can access runtime app context within composables, components and plugins." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/nuxt.ts --- diff --git a/docs/3.api/1.components/1.client-only.md b/docs/3.api/1.components/1.client-only.md index 682a3a924688..481ab8ab9c60 100644 --- a/docs/3.api/1.components/1.client-only.md +++ b/docs/3.api/1.components/1.client-only.md @@ -2,7 +2,7 @@ title: '<ClientOnly>' description: Render components only in client-side with the <ClientOnly> component. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/client-only.ts size: xs diff --git a/docs/3.api/1.components/1.nuxt-client-fallback.md b/docs/3.api/1.components/1.nuxt-client-fallback.md index b25ed785030a..d5d1bd450f85 100644 --- a/docs/3.api/1.components/1.nuxt-client-fallback.md +++ b/docs/3.api/1.components/1.nuxt-client-fallback.md @@ -2,11 +2,11 @@ title: "<NuxtClientFallback>" description: "Nuxt provides `<NuxtClientFallback>` component to render its content on the client if any of its children trigger an error in SSR" links: - - label: Source Code (client) + - label: Source (client) icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/client-fallback.client.ts size: xs - - label: Source Code (server) + - label: Source (server) icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/client-fallback.server.ts size: xs diff --git a/docs/3.api/1.components/2.nuxt-page.md b/docs/3.api/1.components/2.nuxt-page.md index f6d9ca93eaab..4556db0cd118 100644 --- a/docs/3.api/1.components/2.nuxt-page.md +++ b/docs/3.api/1.components/2.nuxt-page.md @@ -2,7 +2,7 @@ title: "<NuxtPage>" description: The <NuxtPage> component is required to display pages located in the pages/ directory. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/pages/runtime/page.ts size: xs diff --git a/docs/3.api/1.components/3.nuxt-layout.md b/docs/3.api/1.components/3.nuxt-layout.md index 495026c3b23d..94cf0ddcf5a7 100644 --- a/docs/3.api/1.components/3.nuxt-layout.md +++ b/docs/3.api/1.components/3.nuxt-layout.md @@ -2,7 +2,7 @@ title: "<NuxtLayout>" description: "Nuxt provides the <NuxtLayout> component to show layouts on pages and error pages." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-layout.ts size: xs diff --git a/docs/3.api/1.components/4.nuxt-link.md b/docs/3.api/1.components/4.nuxt-link.md index 01619fdf1103..7c2c0f6e296a 100644 --- a/docs/3.api/1.components/4.nuxt-link.md +++ b/docs/3.api/1.components/4.nuxt-link.md @@ -2,7 +2,7 @@ title: "<NuxtLink>" description: "Nuxt provides <NuxtLink> component to handle any kind of links within your application." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-link.ts size: xs diff --git a/docs/3.api/1.components/5.nuxt-loading-indicator.md b/docs/3.api/1.components/5.nuxt-loading-indicator.md index 693b6405b398..6d0d8d569389 100644 --- a/docs/3.api/1.components/5.nuxt-loading-indicator.md +++ b/docs/3.api/1.components/5.nuxt-loading-indicator.md @@ -2,7 +2,7 @@ title: '<NuxtLoadingIndicator>' description: 'Display a progress bar between page navigations.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-loading-indicator.ts size: xs diff --git a/docs/3.api/1.components/6.nuxt-error-boundary.md b/docs/3.api/1.components/6.nuxt-error-boundary.md index 11d7dc22b688..2e9efe3c8226 100644 --- a/docs/3.api/1.components/6.nuxt-error-boundary.md +++ b/docs/3.api/1.components/6.nuxt-error-boundary.md @@ -2,7 +2,7 @@ title: "<NuxtErrorBoundary>" description: The <NuxtErrorBoundary> component handles client-side errors happening in its default slot. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-error-boundary.ts size: xs diff --git a/docs/3.api/1.components/7.nuxt-welcome.md b/docs/3.api/1.components/7.nuxt-welcome.md index 161be3601a91..974102b0abc2 100644 --- a/docs/3.api/1.components/7.nuxt-welcome.md +++ b/docs/3.api/1.components/7.nuxt-welcome.md @@ -2,7 +2,7 @@ title: '<NuxtWelcome>' description: The `<NuxtWelcome>` component greets users in new projects made from the starter template. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/assets/blob/main/packages/templates/templates/welcome/index.html size: xs diff --git a/docs/3.api/1.components/8.nuxt-island.md b/docs/3.api/1.components/8.nuxt-island.md index dc2119f86485..47a945e92b5d 100644 --- a/docs/3.api/1.components/8.nuxt-island.md +++ b/docs/3.api/1.components/8.nuxt-island.md @@ -2,7 +2,7 @@ title: "<NuxtIsland>" description: "Nuxt provides `<NuxtIsland>` component to render a non-interactive component without any client JS" links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/components/nuxt-island.ts size: xs diff --git a/docs/3.api/2.composables/use-app-config.md b/docs/3.api/2.composables/use-app-config.md index b585a3aeb7b2..0d676429b1b3 100644 --- a/docs/3.api/2.composables/use-app-config.md +++ b/docs/3.api/2.composables/use-app-config.md @@ -2,7 +2,7 @@ title: 'useAppConfig' description: 'Access the reactive app config defined in the project.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/config.ts size: xs diff --git a/docs/3.api/2.composables/use-async-data.md b/docs/3.api/2.composables/use-async-data.md index 6cbe0d5a21db..6195001cda15 100644 --- a/docs/3.api/2.composables/use-async-data.md +++ b/docs/3.api/2.composables/use-async-data.md @@ -2,7 +2,7 @@ title: 'useAsyncData' description: useAsyncData provides access to data that resolves asynchronously in a SSR-friendly composable. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts size: xs diff --git a/docs/3.api/2.composables/use-cookie.md b/docs/3.api/2.composables/use-cookie.md index 58689e20c781..a218fd7761a3 100644 --- a/docs/3.api/2.composables/use-cookie.md +++ b/docs/3.api/2.composables/use-cookie.md @@ -2,7 +2,7 @@ title: 'useCookie' description: useCookie is an SSR-friendly composable to read and write cookies. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/cookie.ts size: xs diff --git a/docs/3.api/2.composables/use-error.md b/docs/3.api/2.composables/use-error.md index 19fb75a37869..1368128d14a8 100644 --- a/docs/3.api/2.composables/use-error.md +++ b/docs/3.api/2.composables/use-error.md @@ -2,7 +2,7 @@ title: "useError" description: useError composable returns the global Nuxt error that is being handled. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/error.ts size: xs diff --git a/docs/3.api/2.composables/use-fetch.md b/docs/3.api/2.composables/use-fetch.md index ce71dd408257..e26231098cf7 100644 --- a/docs/3.api/2.composables/use-fetch.md +++ b/docs/3.api/2.composables/use-fetch.md @@ -2,7 +2,7 @@ title: 'useFetch' description: 'Fetch data from an API endpoint with a SSR-friendly composable.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/fetch.ts size: xs diff --git a/docs/3.api/2.composables/use-head-safe.md b/docs/3.api/2.composables/use-head-safe.md index 962dd15ebbcb..70b8b3d1396e 100644 --- a/docs/3.api/2.composables/use-head-safe.md +++ b/docs/3.api/2.composables/use-head-safe.md @@ -2,7 +2,7 @@ title: useHeadSafe description: The recommended way to provide head data with user input. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/unjs/unhead/blob/main/packages/unhead/src/composables/useHeadSafe.ts size: xs diff --git a/docs/3.api/2.composables/use-head.md b/docs/3.api/2.composables/use-head.md index 02b48cada89f..20903006ac05 100644 --- a/docs/3.api/2.composables/use-head.md +++ b/docs/3.api/2.composables/use-head.md @@ -2,7 +2,7 @@ title: useHead description: useHead customizes the head properties of individual pages of your Nuxt app. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/unjs/unhead/blob/main/packages/unhead/src/composables/useHead.ts size: xs diff --git a/docs/3.api/2.composables/use-hydration.md b/docs/3.api/2.composables/use-hydration.md index b06f1a6b1242..e8728ea7ce0c 100644 --- a/docs/3.api/2.composables/use-hydration.md +++ b/docs/3.api/2.composables/use-hydration.md @@ -2,7 +2,7 @@ title: 'useHydration' description: 'Allows full control of the hydration cycle to set and receive data from the server.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/hydrate.ts size: xs diff --git a/docs/3.api/2.composables/use-lazy-async-data.md b/docs/3.api/2.composables/use-lazy-async-data.md index 2d9d0f8bc579..eab5bac63621 100644 --- a/docs/3.api/2.composables/use-lazy-async-data.md +++ b/docs/3.api/2.composables/use-lazy-async-data.md @@ -2,7 +2,7 @@ title: useLazyAsyncData description: This wrapper around useAsyncData triggers navigation immediately. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts size: xs diff --git a/docs/3.api/2.composables/use-lazy-fetch.md b/docs/3.api/2.composables/use-lazy-fetch.md index 7883af9c5539..3e5bd0a6e1ea 100644 --- a/docs/3.api/2.composables/use-lazy-fetch.md +++ b/docs/3.api/2.composables/use-lazy-fetch.md @@ -2,7 +2,7 @@ title: 'useLazyFetch' description: This wrapper around useFetch triggers navigation immediately. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/fetch.ts size: xs diff --git a/docs/3.api/2.composables/use-nuxt-app.md b/docs/3.api/2.composables/use-nuxt-app.md index 428dfb9b56ec..788ba1f009b7 100644 --- a/docs/3.api/2.composables/use-nuxt-app.md +++ b/docs/3.api/2.composables/use-nuxt-app.md @@ -2,7 +2,7 @@ title: 'useNuxtApp' description: 'Access the shared runtime context of the Nuxt Application.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/nuxt.ts size: xs diff --git a/docs/3.api/2.composables/use-nuxt-data.md b/docs/3.api/2.composables/use-nuxt-data.md index e73300a65edf..a552f298242f 100644 --- a/docs/3.api/2.composables/use-nuxt-data.md +++ b/docs/3.api/2.composables/use-nuxt-data.md @@ -2,7 +2,7 @@ title: 'useNuxtData' description: 'Access the current cached value of data fetching composables.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts size: xs diff --git a/docs/3.api/2.composables/use-request-event.md b/docs/3.api/2.composables/use-request-event.md index 597c42bcffd5..5cb1b318bb9c 100644 --- a/docs/3.api/2.composables/use-request-event.md +++ b/docs/3.api/2.composables/use-request-event.md @@ -2,7 +2,7 @@ title: 'useRequestEvent' description: 'Access the incoming request event with the useRequestEvent composable.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ssr.ts size: xs diff --git a/docs/3.api/2.composables/use-request-headers.md b/docs/3.api/2.composables/use-request-headers.md index 2b286f0d5057..76434bddb058 100644 --- a/docs/3.api/2.composables/use-request-headers.md +++ b/docs/3.api/2.composables/use-request-headers.md @@ -2,7 +2,7 @@ title: "useRequestHeaders" description: "Use useRequestHeaders to access the incoming request headers." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ssr.ts size: xs diff --git a/docs/3.api/2.composables/use-request-url.md b/docs/3.api/2.composables/use-request-url.md index 2faabcb7646f..29a0486bd1dc 100644 --- a/docs/3.api/2.composables/use-request-url.md +++ b/docs/3.api/2.composables/use-request-url.md @@ -2,7 +2,7 @@ title: 'useRequestURL' description: 'Access the incoming request URL with the useRequestURL composable.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/url.ts size: xs diff --git a/docs/3.api/2.composables/use-route.md b/docs/3.api/2.composables/use-route.md index 10bcdb4de99b..2b315a4c7039 100644 --- a/docs/3.api/2.composables/use-route.md +++ b/docs/3.api/2.composables/use-route.md @@ -2,7 +2,7 @@ title: "useRoute" description: The useRoute composable returns the current route. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts size: xs diff --git a/docs/3.api/2.composables/use-router.md b/docs/3.api/2.composables/use-router.md index a034f91a1039..db5708911189 100644 --- a/docs/3.api/2.composables/use-router.md +++ b/docs/3.api/2.composables/use-router.md @@ -2,7 +2,7 @@ title: "useRouter" description: "The useRouter composable returns the router instance." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts size: xs diff --git a/docs/3.api/2.composables/use-runtime-config.md b/docs/3.api/2.composables/use-runtime-config.md index c83c35b1fe48..cafac034b374 100644 --- a/docs/3.api/2.composables/use-runtime-config.md +++ b/docs/3.api/2.composables/use-runtime-config.md @@ -2,7 +2,7 @@ title: 'useRuntimeConfig' description: 'Access runtime config variables with the useRuntimeConfig composable.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts size: xs diff --git a/docs/3.api/2.composables/use-seo-meta.md b/docs/3.api/2.composables/use-seo-meta.md index 4426b08081bc..8bec86dbeb63 100644 --- a/docs/3.api/2.composables/use-seo-meta.md +++ b/docs/3.api/2.composables/use-seo-meta.md @@ -2,7 +2,7 @@ title: 'useSeoMeta' description: The useSeoMeta composable lets you define your site's SEO meta tags as a flat object with full TypeScript support. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/unjs/unhead/blob/main/packages/unhead/src/composables/useSeoMeta.ts size: xs diff --git a/docs/3.api/2.composables/use-server-seo-meta.md b/docs/3.api/2.composables/use-server-seo-meta.md index 4a98275206e0..6b1b2db9fb6a 100644 --- a/docs/3.api/2.composables/use-server-seo-meta.md +++ b/docs/3.api/2.composables/use-server-seo-meta.md @@ -2,7 +2,7 @@ title: 'useServerSeoMeta' description: The useServerSeoMeta composable lets you define your site's SEO meta tags as a flat object with full TypeScript support. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/unjs/unhead/blob/main/packages/unhead/src/composables/useServerSeoMeta.ts size: xs diff --git a/docs/3.api/2.composables/use-state.md b/docs/3.api/2.composables/use-state.md index e7d8d107ad03..6d5a8d429435 100644 --- a/docs/3.api/2.composables/use-state.md +++ b/docs/3.api/2.composables/use-state.md @@ -2,7 +2,7 @@ title: "useState" description: The useState composable creates a reactive and SSR-friendly shared state. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/state.ts size: xs diff --git a/docs/3.api/3.utils/$fetch.md b/docs/3.api/3.utils/$fetch.md index 0c0c507d2099..166ad9e7b8a5 100644 --- a/docs/3.api/3.utils/$fetch.md +++ b/docs/3.api/3.utils/$fetch.md @@ -2,7 +2,7 @@ title: "$fetch" description: Nuxt uses ofetch to expose globally the $fetch helper for making HTTP requests. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/entry.ts size: xs diff --git a/docs/3.api/3.utils/abort-navigation.md b/docs/3.api/3.utils/abort-navigation.md index 5eba6c7d611a..669bc00b4bca 100644 --- a/docs/3.api/3.utils/abort-navigation.md +++ b/docs/3.api/3.utils/abort-navigation.md @@ -2,7 +2,7 @@ title: 'abortNavigation' description: 'abortNavigation is a helper function that prevents navigation from taking place and throws an error if one is set as a parameter.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts size: xs diff --git a/docs/3.api/3.utils/add-route-middleware.md b/docs/3.api/3.utils/add-route-middleware.md index 3bc2a7b5b94d..5ba1cc51ae9f 100644 --- a/docs/3.api/3.utils/add-route-middleware.md +++ b/docs/3.api/3.utils/add-route-middleware.md @@ -2,7 +2,7 @@ title: 'addRouteMiddleware' description: 'addRouteMiddleware() is a helper function to dynamically add middleware in your application.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts size: xs diff --git a/docs/3.api/3.utils/clear-error.md b/docs/3.api/3.utils/clear-error.md index 5b4e97c3dad2..f2f8897a91d8 100644 --- a/docs/3.api/3.utils/clear-error.md +++ b/docs/3.api/3.utils/clear-error.md @@ -2,7 +2,7 @@ title: "clearError" description: "The clearError composable clears all handled errors." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/error.ts size: xs diff --git a/docs/3.api/3.utils/clear-nuxt-data.md b/docs/3.api/3.utils/clear-nuxt-data.md index e191137e0b51..b1b7f7cb9bf1 100644 --- a/docs/3.api/3.utils/clear-nuxt-data.md +++ b/docs/3.api/3.utils/clear-nuxt-data.md @@ -2,7 +2,7 @@ title: 'clearNuxtData' description: Delete cached data, error status and pending promises of useAsyncData and useFetch. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts size: xs diff --git a/docs/3.api/3.utils/clear-nuxt-state.md b/docs/3.api/3.utils/clear-nuxt-state.md index e53c66468fac..70ed999bf28e 100644 --- a/docs/3.api/3.utils/clear-nuxt-state.md +++ b/docs/3.api/3.utils/clear-nuxt-state.md @@ -2,7 +2,7 @@ title: 'clearNuxtState' description: Delete the cached state of useState. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/state.ts size: xs diff --git a/docs/3.api/3.utils/create-error.md b/docs/3.api/3.utils/create-error.md index 2178980a27ea..ecdc7e738606 100644 --- a/docs/3.api/3.utils/create-error.md +++ b/docs/3.api/3.utils/create-error.md @@ -2,7 +2,7 @@ title: 'createError' description: Create an error object with additional metadata. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/error.ts size: xs diff --git a/docs/3.api/3.utils/define-nuxt-component.md b/docs/3.api/3.utils/define-nuxt-component.md index 7d7577b8e641..26e1d183205a 100644 --- a/docs/3.api/3.utils/define-nuxt-component.md +++ b/docs/3.api/3.utils/define-nuxt-component.md @@ -2,7 +2,7 @@ title: "defineNuxtComponent" description: defineNuxtComponent() is a helper function for defining type safe components with Options API. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/component.ts size: xs diff --git a/docs/3.api/3.utils/define-nuxt-route-middleware.md b/docs/3.api/3.utils/define-nuxt-route-middleware.md index d197eab9e6f2..590436f9ed8e 100644 --- a/docs/3.api/3.utils/define-nuxt-route-middleware.md +++ b/docs/3.api/3.utils/define-nuxt-route-middleware.md @@ -2,7 +2,7 @@ title: "defineNuxtRouteMiddleware" description: "Create named route middleware using defineNuxtRouteMiddleware helper function." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts size: xs diff --git a/docs/3.api/3.utils/define-page-meta.md b/docs/3.api/3.utils/define-page-meta.md index d4b6a1be7307..12ff64f4facd 100644 --- a/docs/3.api/3.utils/define-page-meta.md +++ b/docs/3.api/3.utils/define-page-meta.md @@ -2,7 +2,7 @@ title: 'definePageMeta' description: 'Define metadata for your page components.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/pages/runtime/composables.ts size: xs diff --git a/docs/3.api/3.utils/define-route-rules.md b/docs/3.api/3.utils/define-route-rules.md index 4d08e392ef07..cbe87b4c4af8 100644 --- a/docs/3.api/3.utils/define-route-rules.md +++ b/docs/3.api/3.utils/define-route-rules.md @@ -2,7 +2,7 @@ title: 'defineRouteRules' description: 'Define route rules for hybrid rendering at the page level.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/pages/runtime/composables.ts size: xs diff --git a/docs/3.api/3.utils/navigate-to.md b/docs/3.api/3.utils/navigate-to.md index 366b386b3f42..8fd4eeb6963a 100644 --- a/docs/3.api/3.utils/navigate-to.md +++ b/docs/3.api/3.utils/navigate-to.md @@ -2,7 +2,7 @@ title: "navigateTo" description: navigateTo is a helper function that programmatically navigates users. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts size: xs diff --git a/docs/3.api/3.utils/on-before-route-leave.md b/docs/3.api/3.utils/on-before-route-leave.md index 90209d9b8e29..9353f8df7983 100644 --- a/docs/3.api/3.utils/on-before-route-leave.md +++ b/docs/3.api/3.utils/on-before-route-leave.md @@ -2,7 +2,7 @@ title: "onBeforeRouteLeave" description: The onBeforeRouteLeave composable allows registering a route guard within a component. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts size: xs diff --git a/docs/3.api/3.utils/on-before-route-update.md b/docs/3.api/3.utils/on-before-route-update.md index 2e9ba922ec46..fb603447cd7b 100644 --- a/docs/3.api/3.utils/on-before-route-update.md +++ b/docs/3.api/3.utils/on-before-route-update.md @@ -2,7 +2,7 @@ title: "onBeforeRouteUpdate" description: The onBeforeRouteUpdate composable allows registering a route guard within a component. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts size: xs diff --git a/docs/3.api/3.utils/on-nuxt-ready.md b/docs/3.api/3.utils/on-nuxt-ready.md index 1b1932b775b7..e259e3d0e771 100644 --- a/docs/3.api/3.utils/on-nuxt-ready.md +++ b/docs/3.api/3.utils/on-nuxt-ready.md @@ -2,7 +2,7 @@ title: "onNuxtReady" description: The onNuxtReady composable allows running a callback after your app has finished initializing. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ready.ts size: xs diff --git a/docs/3.api/3.utils/prefetch-components.md b/docs/3.api/3.utils/prefetch-components.md index a06d16ad04cd..d14bcf268019 100644 --- a/docs/3.api/3.utils/prefetch-components.md +++ b/docs/3.api/3.utils/prefetch-components.md @@ -2,7 +2,7 @@ title: 'prefetchComponents' description: Nuxt provides utilities to give you control over prefetching components. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/preload.ts size: xs diff --git a/docs/3.api/3.utils/preload-components.md b/docs/3.api/3.utils/preload-components.md index eb0d0f8c3a0b..59a557aa6745 100644 --- a/docs/3.api/3.utils/preload-components.md +++ b/docs/3.api/3.utils/preload-components.md @@ -2,7 +2,7 @@ title: 'preloadComponents' description: Nuxt provides utilities to give you control over preloading components. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/preload.ts size: xs diff --git a/docs/3.api/3.utils/preload-route-components.md b/docs/3.api/3.utils/preload-route-components.md index 1e092ac3fbfd..fcf4aac98b2c 100644 --- a/docs/3.api/3.utils/preload-route-components.md +++ b/docs/3.api/3.utils/preload-route-components.md @@ -2,7 +2,7 @@ title: 'preloadRouteComponents' description: preloadRouteComponents allows you to manually preload individual pages in your Nuxt app. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/preload.ts size: xs diff --git a/docs/3.api/3.utils/prerender-routes.md b/docs/3.api/3.utils/prerender-routes.md index e3ee8a1b229f..763ffc88b267 100644 --- a/docs/3.api/3.utils/prerender-routes.md +++ b/docs/3.api/3.utils/prerender-routes.md @@ -2,7 +2,7 @@ title: 'prerenderRoutes' description: prerenderRoutes hints to Nitro to prerender an additional route. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ssr.ts size: xs diff --git a/docs/3.api/3.utils/refresh-nuxt-data.md b/docs/3.api/3.utils/refresh-nuxt-data.md index 87f266bdc02f..c871ff57b7ff 100644 --- a/docs/3.api/3.utils/refresh-nuxt-data.md +++ b/docs/3.api/3.utils/refresh-nuxt-data.md @@ -2,7 +2,7 @@ title: 'refreshNuxtData' description: refreshNuxtData refetches all data from the server and updates the page. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts size: xs diff --git a/docs/3.api/3.utils/reload-nuxt-app.md b/docs/3.api/3.utils/reload-nuxt-app.md index f30dea101c12..0868e1319c50 100644 --- a/docs/3.api/3.utils/reload-nuxt-app.md +++ b/docs/3.api/3.utils/reload-nuxt-app.md @@ -2,7 +2,7 @@ title: 'reloadNuxtApp' description: reloadNuxtApp will perform a hard reload of the page. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/chunk.ts size: xs diff --git a/docs/3.api/3.utils/set-page-layout.md b/docs/3.api/3.utils/set-page-layout.md index 47eeacd9f9eb..1a0a6f19688d 100644 --- a/docs/3.api/3.utils/set-page-layout.md +++ b/docs/3.api/3.utils/set-page-layout.md @@ -2,7 +2,7 @@ title: 'setPageLayout' description: setPageLayout allows you to dynamically change the layout of a page. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts size: xs diff --git a/docs/3.api/3.utils/set-response-status.md b/docs/3.api/3.utils/set-response-status.md index f6b8bdea1bc3..200d644f9123 100644 --- a/docs/3.api/3.utils/set-response-status.md +++ b/docs/3.api/3.utils/set-response-status.md @@ -2,7 +2,7 @@ title: 'setResponseStatus' description: setResponseStatus sets the statusCode (and optionally the statusMessage) of the response. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ssr.ts size: xs diff --git a/docs/3.api/3.utils/show-error.md b/docs/3.api/3.utils/show-error.md index eef4242c088d..c0a32fdd876e 100644 --- a/docs/3.api/3.utils/show-error.md +++ b/docs/3.api/3.utils/show-error.md @@ -2,7 +2,7 @@ title: 'showError' description: Nuxt provides a quick and simple way to show a full screen error page if needed. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/error.ts size: xs diff --git a/docs/3.api/3.utils/update-app-config.md b/docs/3.api/3.utils/update-app-config.md index 622e231b56df..15f32044be75 100644 --- a/docs/3.api/3.utils/update-app-config.md +++ b/docs/3.api/3.utils/update-app-config.md @@ -2,7 +2,7 @@ title: 'updateAppConfig' description: 'Update the App Config at runtime.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/config.ts size: xs diff --git a/docs/3.api/4.commands/add.md b/docs/3.api/4.commands/add.md index 4e9c958ff14a..6b88b119fd20 100644 --- a/docs/3.api/4.commands/add.md +++ b/docs/3.api/4.commands/add.md @@ -2,7 +2,7 @@ title: "nuxi add" description: "Scaffold an entity into your Nuxt application." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/add.ts size: xs diff --git a/docs/3.api/4.commands/analyze.md b/docs/3.api/4.commands/analyze.md index d60c54736dc6..2d5dbe2c75d5 100644 --- a/docs/3.api/4.commands/analyze.md +++ b/docs/3.api/4.commands/analyze.md @@ -2,7 +2,7 @@ title: "nuxi analyze" description: "Analyze the production bundle or your Nuxt application." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/analyze.ts size: xs diff --git a/docs/3.api/4.commands/build-module.md b/docs/3.api/4.commands/build-module.md index 1699f4baf792..6d0c277339b9 100644 --- a/docs/3.api/4.commands/build-module.md +++ b/docs/3.api/4.commands/build-module.md @@ -2,7 +2,7 @@ title: 'nuxi build-module' description: 'Nuxt command to build your Nuxt module before publishing.' links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/build-module.ts size: xs diff --git a/docs/3.api/4.commands/build.md b/docs/3.api/4.commands/build.md index 785db16cac7d..2ff30e32d83a 100644 --- a/docs/3.api/4.commands/build.md +++ b/docs/3.api/4.commands/build.md @@ -2,7 +2,7 @@ title: "nuxi build" description: "Build your Nuxt application." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/build.ts size: xs diff --git a/docs/3.api/4.commands/cleanup.md b/docs/3.api/4.commands/cleanup.md index 156baaf4c4e1..656675055cf3 100644 --- a/docs/3.api/4.commands/cleanup.md +++ b/docs/3.api/4.commands/cleanup.md @@ -2,7 +2,7 @@ title: 'nuxi cleanup' description: "Remove common generated Nuxt files and caches." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/cleanup.ts size: xs diff --git a/docs/3.api/4.commands/dev.md b/docs/3.api/4.commands/dev.md index 8cd5bd2cec58..4d1e79a4b692 100644 --- a/docs/3.api/4.commands/dev.md +++ b/docs/3.api/4.commands/dev.md @@ -2,7 +2,7 @@ title: 'nuxi dev' description: The dev command starts a development server with hot module replacement at http://localhost:3000 links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/dev.ts size: xs diff --git a/docs/3.api/4.commands/devtools.md b/docs/3.api/4.commands/devtools.md index 0d53dcb792d7..6f8947592e14 100644 --- a/docs/3.api/4.commands/devtools.md +++ b/docs/3.api/4.commands/devtools.md @@ -2,7 +2,7 @@ title: "nuxi devtools" description: The devtools command allows you to enable or disable Nuxt DevTools on a per-project basis. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/devtools.ts size: xs diff --git a/docs/3.api/4.commands/generate.md b/docs/3.api/4.commands/generate.md index b5b71ec564b3..1077ea4b1f7c 100644 --- a/docs/3.api/4.commands/generate.md +++ b/docs/3.api/4.commands/generate.md @@ -2,7 +2,7 @@ title: "nuxi generate" description: Pre-renders every route of the application and stores the result in plain HTML files. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/generate.ts size: xs diff --git a/docs/3.api/4.commands/info.md b/docs/3.api/4.commands/info.md index 7d4d757913ce..98fce3725145 100644 --- a/docs/3.api/4.commands/info.md +++ b/docs/3.api/4.commands/info.md @@ -2,7 +2,7 @@ title: "nuxi info" description: The info command logs information about the current or specified Nuxt project. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/info.ts size: xs diff --git a/docs/3.api/4.commands/init.md b/docs/3.api/4.commands/init.md index 89b7abc76745..f7ed12408407 100644 --- a/docs/3.api/4.commands/init.md +++ b/docs/3.api/4.commands/init.md @@ -2,7 +2,7 @@ title: "nuxi init" description: The init command initializes a fresh Nuxt project. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/init.ts size: xs diff --git a/docs/3.api/4.commands/prepare.md b/docs/3.api/4.commands/prepare.md index 0d838507468e..395719ca57f3 100644 --- a/docs/3.api/4.commands/prepare.md +++ b/docs/3.api/4.commands/prepare.md @@ -2,7 +2,7 @@ title: 'nuxi prepare' description: The prepare command creates a .nuxt directory in your application and generates types. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/prepare.ts size: xs diff --git a/docs/3.api/4.commands/preview.md b/docs/3.api/4.commands/preview.md index a59cf61aff6d..ed2736faeecb 100644 --- a/docs/3.api/4.commands/preview.md +++ b/docs/3.api/4.commands/preview.md @@ -2,7 +2,7 @@ title: "nuxi preview" description: The preview command starts a server to preview your application after the build command. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/preview.ts size: xs diff --git a/docs/3.api/4.commands/typecheck.md b/docs/3.api/4.commands/typecheck.md index c5a4454195fa..1666997a5c6f 100644 --- a/docs/3.api/4.commands/typecheck.md +++ b/docs/3.api/4.commands/typecheck.md @@ -2,7 +2,7 @@ title: "nuxi typecheck" description: The typecheck command runs vue-tsc to check types throughout your app. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/typecheck.ts size: xs diff --git a/docs/3.api/4.commands/upgrade.md b/docs/3.api/4.commands/upgrade.md index 1091ef36497b..187e915635d7 100644 --- a/docs/3.api/4.commands/upgrade.md +++ b/docs/3.api/4.commands/upgrade.md @@ -2,7 +2,7 @@ title: "nuxi upgrade" description: The upgrade command upgrades Nuxt 3 to the latest version. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/cli/blob/main/src/commands/upgrade.ts size: xs diff --git a/docs/3.api/5.kit/1.modules.md b/docs/3.api/5.kit/1.modules.md index 91c5e7525332..8845c92fa8a2 100644 --- a/docs/3.api/5.kit/1.modules.md +++ b/docs/3.api/5.kit/1.modules.md @@ -2,7 +2,7 @@ title: "Modules" description: Nuxt Kit provides a set of utilities to help you create and use modules. You can use these utilities to create your own modules or to reuse existing modules. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/module size: xs diff --git a/docs/3.api/5.kit/10.templates.md b/docs/3.api/5.kit/10.templates.md index aecee202596a..e02b76ff71b1 100644 --- a/docs/3.api/5.kit/10.templates.md +++ b/docs/3.api/5.kit/10.templates.md @@ -2,7 +2,7 @@ title: "Templates" description: Nuxt Kit provides a set of utilities to help you work with templates. These functions allow you to generate extra files during development and build time. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/template.ts size: xs diff --git a/docs/3.api/5.kit/11.nitro.md b/docs/3.api/5.kit/11.nitro.md index bbd7690f99f0..535ad0347318 100644 --- a/docs/3.api/5.kit/11.nitro.md +++ b/docs/3.api/5.kit/11.nitro.md @@ -2,7 +2,7 @@ title: "Nitro" description: Nuxt Kit provides a set of utilities to help you work with Nitro. These functions allow you to add server handlers, plugins, and prerender routes. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/nitro.ts size: xs diff --git a/docs/3.api/5.kit/12.resolving.md b/docs/3.api/5.kit/12.resolving.md index 4c7bfe84ba98..d8df4589ba87 100644 --- a/docs/3.api/5.kit/12.resolving.md +++ b/docs/3.api/5.kit/12.resolving.md @@ -2,7 +2,7 @@ title: Resolving description: Nuxt Kit provides a set of utilities to help you resolve paths. These functions allow you to resolve paths relative to the current module, with unknown name or extension. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/resolve.ts size: xs diff --git a/docs/3.api/5.kit/13.logging.md b/docs/3.api/5.kit/13.logging.md index f63d507388cd..721d6fcd4478 100644 --- a/docs/3.api/5.kit/13.logging.md +++ b/docs/3.api/5.kit/13.logging.md @@ -2,7 +2,7 @@ title: "Logging" description: Nuxt Kit provides a set of utilities to help you work with logging. These functions allow you to log messages with extra features. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/logger.ts size: xs diff --git a/docs/3.api/5.kit/14.builder.md b/docs/3.api/5.kit/14.builder.md index 2617165b1a5d..166a1eb3fc99 100644 --- a/docs/3.api/5.kit/14.builder.md +++ b/docs/3.api/5.kit/14.builder.md @@ -2,7 +2,7 @@ title: Builder description: Nuxt Kit provides a set of utilities to help you work with the builder. These functions allow you to extend the webpack and vite configurations. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/build.ts size: xs diff --git a/docs/3.api/5.kit/2.programmatic.md b/docs/3.api/5.kit/2.programmatic.md index 78390b5546e4..2c2544bc02f4 100644 --- a/docs/3.api/5.kit/2.programmatic.md +++ b/docs/3.api/5.kit/2.programmatic.md @@ -2,7 +2,7 @@ title: "Programmatic Usage" description: Nuxt Kit provides a set of utilities to help you work with Nuxt programmatically. These functions allow you to load Nuxt, build Nuxt, and load Nuxt configuration. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/loader size: xs diff --git a/docs/3.api/5.kit/3.compatibility.md b/docs/3.api/5.kit/3.compatibility.md index 13a0086270ca..d958f367a3c9 100644 --- a/docs/3.api/5.kit/3.compatibility.md +++ b/docs/3.api/5.kit/3.compatibility.md @@ -2,7 +2,7 @@ title: "Compatibility" description: Nuxt Kit provides a set of utilities to help you check the compatibility of your modules with different Nuxt versions. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/compatibility.ts size: xs diff --git a/docs/3.api/5.kit/4.autoimports.md b/docs/3.api/5.kit/4.autoimports.md index 43fb8a77b03b..66e781afbff6 100644 --- a/docs/3.api/5.kit/4.autoimports.md +++ b/docs/3.api/5.kit/4.autoimports.md @@ -2,7 +2,7 @@ title: "Auto-imports" description: Nuxt Kit provides a set of utilities to help you work with auto-imports. These functions allow you to register your own utils, composables and Vue APIs. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/imports.ts size: xs diff --git a/docs/3.api/5.kit/5.components.md b/docs/3.api/5.kit/5.components.md index f973fa815645..64c7adcab381 100644 --- a/docs/3.api/5.kit/5.components.md +++ b/docs/3.api/5.kit/5.components.md @@ -2,7 +2,7 @@ title: "Components" description: Nuxt Kit provides a set of utilities to help you work with components. You can register components globally or locally, and also add directories to be scanned for components. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/components.ts size: xs diff --git a/docs/3.api/5.kit/6.context.md b/docs/3.api/5.kit/6.context.md index 8c432fa96439..91232cbafe32 100644 --- a/docs/3.api/5.kit/6.context.md +++ b/docs/3.api/5.kit/6.context.md @@ -2,7 +2,7 @@ title: "Context" description: Nuxt Kit provides a set of utilities to help you work with context. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/context.ts size: xs diff --git a/docs/3.api/5.kit/7.pages.md b/docs/3.api/5.kit/7.pages.md index 9a21bd2fa7e8..27b7a0d4101f 100644 --- a/docs/3.api/5.kit/7.pages.md +++ b/docs/3.api/5.kit/7.pages.md @@ -2,7 +2,7 @@ title: Pages description: Nuxt Kit provides a set of utilities to help you create and use pages. You can use these utilities to manipulate the pages configuration or to define route rules. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/pages.ts size: xs diff --git a/docs/3.api/5.kit/8.layout.md b/docs/3.api/5.kit/8.layout.md index cf2f5fc7c256..da80a70c901c 100644 --- a/docs/3.api/5.kit/8.layout.md +++ b/docs/3.api/5.kit/8.layout.md @@ -2,7 +2,7 @@ title: "Layout" description: "Nuxt Kit provides a set of utilities to help you work with layouts." links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/layout.ts size: xs diff --git a/docs/3.api/5.kit/9.plugins.md b/docs/3.api/5.kit/9.plugins.md index f25b2c38e4a4..da4940419d73 100644 --- a/docs/3.api/5.kit/9.plugins.md +++ b/docs/3.api/5.kit/9.plugins.md @@ -2,7 +2,7 @@ title: Plugins description: Nuxt Kit provides a set of utilities to help you create and use plugins. You can add plugins or plugin templates to your module using these functions. links: - - label: Source Code + - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/kit/src/plugin.ts size: xs From 7a18711d654aeb0b512d232dac7e0a67084a139a Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 10:35:07 +0000 Subject: [PATCH 51/62] [autofix.ci] apply automated fixes --- packages/kit/src/plugin.ts | 1 - packages/nuxt/src/core/external-config-files.ts | 1 - packages/schema/src/config/common.ts | 14 -------------- packages/schema/src/config/experimental.ts | 14 -------------- packages/schema/src/config/vite.ts | 1 - packages/schema/src/types/config.ts | 5 ----- test/bundle.test.ts | 2 +- 7 files changed, 1 insertion(+), 37 deletions(-) diff --git a/packages/kit/src/plugin.ts b/packages/kit/src/plugin.ts index 5980cf810d76..5421c3027fed 100644 --- a/packages/kit/src/plugin.ts +++ b/packages/kit/src/plugin.ts @@ -48,7 +48,6 @@ export function normalizePlugin (plugin: NuxtPlugin | string): NuxtPlugin { * to use plugin only in client or server side. * * Note: By default plugin is prepended to the plugins array. You can use second argument to append (push) instead. - * * @example * ```js * addPlugin({ diff --git a/packages/nuxt/src/core/external-config-files.ts b/packages/nuxt/src/core/external-config-files.ts index 34fd7ca12b88..517c88ecbaac 100644 --- a/packages/nuxt/src/core/external-config-files.ts +++ b/packages/nuxt/src/core/external-config-files.ts @@ -5,7 +5,6 @@ import { generateApp as _generateApp } from './app' /** * Check for those external configuration files that are not compatible with Nuxt, * and warns the user about them. - * * @see {@link https://nuxt.com/docs/getting-started/configuration#external-configuration-files} */ export async function checkForExternalConfigurationFiles () { diff --git a/packages/schema/src/config/common.ts b/packages/schema/src/config/common.ts index 9141133c6aba..66762b69b69e 100644 --- a/packages/schema/src/config/common.ts +++ b/packages/schema/src/config/common.ts @@ -12,7 +12,6 @@ export default defineUntypedSchema({ * Value should be either a string or array of strings pointing to source directories or config path relative to current config. * * You can use `github:`, `gitlab:`, `bitbucket:` or `https://` to extend from a remote git repository. - * * @type {string|string[]} */ extends: null, @@ -23,7 +22,6 @@ export default defineUntypedSchema({ * Value should be a string pointing to source directory or config path relative to current config. * * You can use `github:`, `gitlab:`, `bitbucket:` or `https://` to extend from a remote git repository. - * * @type {string} */ theme: null, @@ -57,7 +55,6 @@ export default defineUntypedSchema({ * Define the source directory of your Nuxt application. * * If a relative path is specified, it will be relative to the `rootDir`. - * * @example * ```js * export default { @@ -105,7 +102,6 @@ export default defineUntypedSchema({ * * Many tools assume that `.nuxt` is a hidden directory (because it starts * with a `.`). If that is a problem, you can use this option to prevent that. - * * @example * ```js * export default { @@ -124,7 +120,6 @@ export default defineUntypedSchema({ * The configuration path is relative to `options.rootDir` (default is current working directory). * * Setting this field may be necessary if your project is organized as a yarn workspace-styled mono-repository. - * * @example * ```js * export default { @@ -190,7 +185,6 @@ export default defineUntypedSchema({ * * Nuxt tries to resolve each item in the modules array using node require path * (in `node_modules`) and then will be resolved from project `srcDir` if `~` alias is used. - * * @note Modules are executed sequentially so the order is important. * @example * ```js @@ -271,7 +265,6 @@ export default defineUntypedSchema({ /** * You can improve your DX by defining additional aliases to access custom directories * within your JavaScript and CSS. - * * @note Within a webpack context (image sources, CSS - but not JavaScript) you _must_ access * your alias by prefixing it with `~`. * @note These aliases will be automatically added to the generated `.nuxt/tsconfig.json` so you can get full @@ -323,7 +316,6 @@ export default defineUntypedSchema({ /** * Pass options directly to `node-ignore` (which is used by Nuxt to ignore files). - * * @see [node-ignore](https://github.com/kaelzhang/node-ignore) * @example * ```js @@ -364,7 +356,6 @@ export default defineUntypedSchema({ * It is an array of strings or regular expressions. Strings should be either absolute paths or * relative to the `srcDir` (and the `srcDir` of any layers). Regular expressions will be matched * against the path relative to the project `srcDir` (and the `srcDir` of any layers). - * * @type {Array<string | RegExp>} */ watch: { @@ -379,7 +370,6 @@ export default defineUntypedSchema({ rewatchOnRawEvents: undefined, /** * `watchOptions` to pass directly to webpack. - * * @see [webpack@4 watch options](https://v4.webpack.js.org/configuration/watch/#watchoptions). */ webpack: { @@ -387,7 +377,6 @@ export default defineUntypedSchema({ }, /** * Options to pass directly to `chokidar`. - * * @see [chokidar](https://github.com/paulmillr/chokidar#api) */ chokidar: { @@ -403,7 +392,6 @@ export default defineUntypedSchema({ * * For ease of configuration, you can also structure them as an hierarchical * object in `nuxt.config` (as below). - * * @example * ```js * import fs from 'node:fs' @@ -438,7 +426,6 @@ export default defineUntypedSchema({ * * Values are automatically replaced by matching env variables at runtime, e.g. setting an environment * variable `NUXT_API_KEY=my-api-key NUXT_PUBLIC_BASE_URL=/foo/` would overwrite the two values in the example below. - * * @example * ```js * export default { @@ -471,7 +458,6 @@ export default defineUntypedSchema({ * * For programmatic usage and type support, you can directly provide app config with this option. * It will be merged with `app.config` file as default value. - * * @type {typeof import('../src/types/config').AppConfig} */ appConfig: { diff --git a/packages/schema/src/config/experimental.ts b/packages/schema/src/config/experimental.ts index ca376a07c9b7..68410ce4aa2b 100644 --- a/packages/schema/src/config/experimental.ts +++ b/packages/schema/src/config/experimental.ts @@ -11,7 +11,6 @@ export default defineUntypedSchema({ /** * Enable Vue's reactivity transform - * * @see [Vue Reactivity Transform Docs](https://vuejs.org/guide/extras/reactivity-transform.html) * * Warning: Reactivity transform feature has been marked as deprecated in Vue 3.3 and is planned to be @@ -24,14 +23,12 @@ export default defineUntypedSchema({ // https://github.com/unjs/nitro/issues/1118 /** * Externalize `vue`, `@vue/*` and `vue-router` when building. - * * @see [Nuxt Issue #13632](https://github.com/nuxt/nuxt/issues/13632) */ externalVue: true, /** * Tree shakes contents of client-only components from server bundle. - * * @see [Nuxt PR #5750](https://github.com/nuxt/framework/pull/5750) */ treeshakeClientOnly: true, @@ -45,7 +42,6 @@ export default defineUntypedSchema({ * * You can disable automatic handling by setting this to `false`, or handle * chunk errors manually by setting it to `manual`. - * * @see [Nuxt PR #19038](https://github.com/nuxt/nuxt/pull/19038) * @type {false | 'manual' | 'automatic'} */ @@ -82,7 +78,6 @@ export default defineUntypedSchema({ * Consider carefully before enabling this as it can cause unexpected behavior, and * consider providing explicit keys to `useState` as auto-generated keys may not match * across builds. - * * @type {boolean} */ restoreState: false, @@ -92,7 +87,6 @@ export default defineUntypedSchema({ * * You can also pass a function that receives the path of a Vue component * and returns a boolean indicating whether to inline the styles for that component. - * * @type {boolean | ((id?: string) => boolean)} */ inlineSSRStyles: { @@ -121,7 +115,6 @@ export default defineUntypedSchema({ /** * When this option is enabled (by default) payload of pages that are prerendered are extracted - * * @type {boolean | undefined} */ payloadExtraction: true, @@ -137,21 +130,18 @@ export default defineUntypedSchema({ /** * Enable View Transition API integration with client-side router. - * * @see [View Transitions API](https://developer.chrome.com/docs/web-platform/view-transitions) */ viewTransition: false, /** * Write early hints when using node server. - * * @note nginx does not support 103 Early hints in the current version. */ writeEarlyHints: false, /** * Experimental component islands support with <NuxtIsland> and .island.vue files. - * * @type {true | 'local' | 'local+remote' | false} */ componentIslands: { @@ -164,7 +154,6 @@ export default defineUntypedSchema({ /** * Config schema support - * * @see [Nuxt Issue #15592](https://github.com/nuxt/nuxt/issues/15592) */ configSchema: true, @@ -227,7 +216,6 @@ export default defineUntypedSchema({ * performance in large projects or on Windows platforms. * * You can also set this to `chokidar` to watch all files in your source directory. - * * @see [chokidar](https://github.com/paulmillr/chokidar) * @see [Parcel watcher](https://github.com/parcel-bundler/watcher) * @type {'chokidar' | 'parcel' | 'chokidar-granular'} @@ -236,7 +224,6 @@ export default defineUntypedSchema({ /** * Enable native async context to be accessible for nested composables - * * @see [Nuxt PR #20918](https://github.com/nuxt/nuxt/pull/20918) */ asyncContext: false, @@ -245,7 +232,6 @@ export default defineUntypedSchema({ * Use new experimental head optimisations: * - Add the capo.js head plugin in order to render tags in of the head in a more performant way. * - Uses the hash hydration plugin to reduce initial hydration - * * @see [Nuxt Discussion #22632](https://github.com/nuxt/nuxt/discussions/22632] */ headNext: false, diff --git a/packages/schema/src/config/vite.ts b/packages/schema/src/config/vite.ts index b0ded5472f97..2a4beb35aa1c 100644 --- a/packages/schema/src/config/vite.ts +++ b/packages/schema/src/config/vite.ts @@ -10,7 +10,6 @@ export default defineUntypedSchema({ * * See https://vitejs.dev/config for more information. * Please note that not all vite options are supported in Nuxt. - * * @type {typeof import('../src/types/config').ViteConfig & { $client?: typeof import('../src/types/config').ViteConfig, $server?: typeof import('../src/types/config').ViteConfig }} */ vite: { diff --git a/packages/schema/src/types/config.ts b/packages/schema/src/types/config.ts index eab2313ace82..f8351a378a11 100644 --- a/packages/schema/src/types/config.ts +++ b/packages/schema/src/types/config.ts @@ -88,7 +88,6 @@ export interface NuxtConfig extends DeepPartial<Omit<ConfigSchema, 'vite' | 'run /** * Experimental custom config schema - * * @see [Nuxt Issue #15592](https://github.com/nuxt/nuxt/issues/15592) */ $schema?: SchemaDefinition @@ -126,21 +125,18 @@ export interface ViteConfig extends Omit<ViteUserConfig, 'publicDir'> { entry?: string /** * Options passed to @vitejs/plugin-vue. - * * @see [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue) */ vue?: VuePluginOptions /** * Options passed to @vitejs/plugin-vue-jsx. - * * @see [@vitejs/plugin-vue-jsx.](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue-jsx) */ vueJsx?: VueJsxPluginOptions /** * Bundler for dev time server-side rendering. - * * @default 'vite-node' */ devBundler?: 'vite-node' | 'legacy' @@ -158,7 +154,6 @@ export interface ViteConfig extends Omit<ViteUserConfig, 'publicDir'> { * Directly configuring the `vite.publicDir` option is not supported. Instead, set `dir.public`. * * You can read more in <https://nuxt.com/docs/api/nuxt-config#public>. - * * @deprecated */ publicDir?: never diff --git a/test/bundle.test.ts b/test/bundle.test.ts index 57e97a6bf78d..a8d6acbec490 100644 --- a/test/bundle.test.ts +++ b/test/bundle.test.ts @@ -35,7 +35,7 @@ describe.skipIf(process.env.SKIP_BUNDLE_SIZE === 'true' || process.env.ECOSYSTEM expect.soft(roundToKilobytes(serverStats.totalBytes)).toMatchInlineSnapshot('"304k"') const modules = await analyzeSizes('node_modules/**/*', serverDir) - expect.soft(roundToKilobytes(modules.totalBytes)).toMatchInlineSnapshot('"1826k"') + expect.soft(roundToKilobytes(modules.totalBytes)).toMatchInlineSnapshot('"1823k"') const packages = modules.files .filter(m => m.endsWith('package.json')) From 10f482a038b5a7ca20234473a2088fc026ed1472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Wed, 18 Oct 2023 12:43:20 +0200 Subject: [PATCH 52/62] docs: ready --- docs/3.api/1.components/10.nuxt-picture.md | 7 ++++++- docs/3.api/1.components/9.nuxt-img.md | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/3.api/1.components/10.nuxt-picture.md b/docs/3.api/1.components/10.nuxt-picture.md index 964519d101e6..d34173e0b4b3 100644 --- a/docs/3.api/1.components/10.nuxt-picture.md +++ b/docs/3.api/1.components/10.nuxt-picture.md @@ -1,6 +1,11 @@ --- title: "<NuxtPicture>" description: "Nuxt provides a <NuxtPicture> component to handle automatic image optimization." +links: + - label: Source + icon: i-simple-icons-github + to: https://github.com/nuxt/image/blob/main/src/runtime/components/nuxt-picture.ts + size: xs --- `<NuxtPicture>` is a drop-in replacement for the native `<picture>` tag. @@ -17,6 +22,6 @@ In order to use `<NuxtPicture>` you should install and enable the Nuxt Image mod npx nuxi@latest module add image ``` -::read-more{to="https://image.nuxt.com/usage/nuxt-picture"} +::read-more{to="https://image.nuxt.com/usage/nuxt-picture" target="_blank"} Read more about the `<NuxtPicture>` component. :: diff --git a/docs/3.api/1.components/9.nuxt-img.md b/docs/3.api/1.components/9.nuxt-img.md index a1789b9e6127..8585db81f358 100644 --- a/docs/3.api/1.components/9.nuxt-img.md +++ b/docs/3.api/1.components/9.nuxt-img.md @@ -1,6 +1,11 @@ --- title: "<NuxtImg>" description: "Nuxt provides a <NuxtImg> component to handle automatic image optimization." +links: + - label: Source + icon: i-simple-icons-github + to: https://github.com/nuxt/image/blob/main/src/runtime/components/nuxt-img.ts + size: xs --- `<NuxtImg>` is a drop-in replacement for the native `<img>` tag. @@ -33,6 +38,6 @@ Will result in: <img src="/nuxt-icon.png" /> ``` -::read-more{to="https://image.nuxt.com/usage/nuxt-img"} +::read-more{to="https://image.nuxt.com/usage/nuxt-img" target="_blank"} Read more about the `<NuxtImg>` component. :: From 746ea31253929703ee8aec864ac134c1059b4604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Wed, 18 Oct 2023 12:43:49 +0200 Subject: [PATCH 53/62] docs: lint --- docs/2.guide/3.going-further/1.experimental-features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/2.guide/3.going-further/1.experimental-features.md b/docs/2.guide/3.going-further/1.experimental-features.md index bb827b2ec692..9c1baef2f1d3 100644 --- a/docs/2.guide/3.going-further/1.experimental-features.md +++ b/docs/2.guide/3.going-further/1.experimental-features.md @@ -130,7 +130,7 @@ export defineNuxtConfig({ }) ``` -Matching route rules will be created, based on the page's _path_. +Matching route rules will be created, based on the page's `path`. ::read-more{to="/docs/api/utils/define-route-rules" icon="i-ph-function-duotone"} Read more in `defineRouteRules` utility. From fba7aaff5850f39a1961718cce7e3f07aa1b5789 Mon Sep 17 00:00:00 2001 From: Daniel Roe <daniel@roe.dev> Date: Wed, 18 Oct 2023 11:44:16 +0100 Subject: [PATCH 54/62] chore: update lockfile --- pnpm-lock.yaml | 710 ++++++------------------------------------------- 1 file changed, 85 insertions(+), 625 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d798e10a7fff..0abd8d11da1a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -250,7 +250,7 @@ importers: version: link:../vite '@types/node': specifier: ^14.18.0 || >=16.10.0 - version: 18.18.4 + version: 18.18.5 '@unhead/dom': specifier: ^1.7.4 version: 1.7.4 @@ -413,7 +413,7 @@ importers: version: 2.0.0(typescript@5.2.2) vite: specifier: 4.4.11 - version: 4.4.11(@types/node@18.18.4) + version: 4.4.11(@types/node@18.18.5) vitest: specifier: 0.33.0 version: 0.33.0(happy-dom@12.9.1) @@ -933,14 +933,6 @@ packages: resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==} dev: false - /@babel/code-frame@7.22.10: - resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} - engines: {node: '>=6.9.0'} - requiresBuild: true - dependencies: - '@babel/highlight': 7.22.10 - chalk: 2.4.2 - /@babel/code-frame@7.22.13: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} @@ -953,28 +945,6 @@ packages: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.22.10: - resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.22.10 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) - '@babel/helpers': 7.22.10 - '@babel/parser': 7.22.16 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.19 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - /@babel/core@7.23.0: resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} engines: {node: '>=6.9.0'} @@ -996,16 +966,6 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: false - - /@babel/generator@7.22.10: - resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.19 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 - jsesc: 2.5.2 /@babel/generator@7.23.0: resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} @@ -1015,23 +975,12 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 - dev: false /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 - - /@babel/helper-compilation-targets@7.22.10: - resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.10 - lru-cache: 5.1.1 - semver: 6.3.1 + '@babel/types': 7.23.0 /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} @@ -1042,24 +991,6 @@ packages: browserslist: 4.21.10 lru-cache: 5.1.1 semver: 6.3.1 - dev: false - - /@babel/helper-create-class-features-plugin@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.10) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} @@ -1077,23 +1008,10 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - dev: false /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} - engines: {node: '>=6.9.0'} - - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.19 /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} @@ -1101,17 +1019,10 @@ packages: dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.0 - dev: false /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.19 - - /@babel/helper-member-expression-to-functions@7.22.5: - resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} - engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 @@ -1120,33 +1031,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 - dev: false /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 - dev: false - - /@babel/helper-module-imports@7.22.5: - resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.19 - - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} @@ -1160,7 +1050,6 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - dev: false /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} @@ -1182,24 +1071,12 @@ packages: '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - dev: false - - /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.10): - resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} @@ -1211,7 +1088,7 @@ packages: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} @@ -1224,21 +1101,6 @@ packages: /@babel/helper-validator-option@7.22.15: resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-validator-option@7.22.5: - resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} - engines: {node: '>=6.9.0'} - - /@babel/helpers@7.22.10: - resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.19 - transitivePeerDependencies: - - supports-color /@babel/helpers@7.23.1: resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} @@ -1249,16 +1111,6 @@ packages: '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color - dev: false - - /@babel/highlight@7.22.10: - resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} - engines: {node: '>=6.9.0'} - requiresBuild: true - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 /@babel/highlight@7.22.20: resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} @@ -1269,13 +1121,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.22.16: - resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.22.19 - /@babel/parser@7.23.0: resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} @@ -1297,30 +1142,30 @@ packages: '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.23.0) dev: false - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.10): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.10): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.10): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -1344,15 +1189,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.10): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -1360,26 +1196,16 @@ packages: dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.10): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} @@ -1388,81 +1214,71 @@ packages: dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.10): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.10): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.10): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.10): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.10): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.10): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.10): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.10): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} @@ -1471,19 +1287,6 @@ packages: dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-transform-typescript@7.22.10(@babel/core@7.22.10): - resolution: {integrity: sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.10) /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.0): resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} @@ -1496,7 +1299,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) - dev: false /@babel/standalone@7.22.9: resolution: {integrity: sha512-RRUFpN2WiHaczMqIhmy7VoruvSw+c3NSq6BczondQ6elJXtKzr9cAWWsWWZvtZ/rYFQpoQlch5VxQe4aWTt8LA==} @@ -1509,32 +1311,6 @@ packages: '@babel/code-frame': 7.22.13 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - dev: false - - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.19 - - /@babel/traverse@7.22.10: - resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.16 - '@babel/types': 7.22.19 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color /@babel/traverse@7.23.0: resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} @@ -1552,15 +1328,6 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: false - - /@babel/types@7.22.19: - resolution: {integrity: sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 /@babel/types@7.23.0: resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} @@ -1597,14 +1364,6 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm64@0.19.4: - resolution: {integrity: sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - optional: true - /@esbuild/android-arm64@0.19.5: resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==} engines: {node: '>=12'} @@ -1621,14 +1380,6 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm@0.19.4: - resolution: {integrity: sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - optional: true - /@esbuild/android-arm@0.19.5: resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==} engines: {node: '>=12'} @@ -1645,14 +1396,6 @@ packages: requiresBuild: true optional: true - /@esbuild/android-x64@0.19.4: - resolution: {integrity: sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - optional: true - /@esbuild/android-x64@0.19.5: resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==} engines: {node: '>=12'} @@ -1669,14 +1412,6 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-arm64@0.19.4: - resolution: {integrity: sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optional: true - /@esbuild/darwin-arm64@0.19.5: resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==} engines: {node: '>=12'} @@ -1693,14 +1428,6 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-x64@0.19.4: - resolution: {integrity: sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - /@esbuild/darwin-x64@0.19.5: resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==} engines: {node: '>=12'} @@ -1717,14 +1444,6 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-arm64@0.19.4: - resolution: {integrity: sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - optional: true - /@esbuild/freebsd-arm64@0.19.5: resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==} engines: {node: '>=12'} @@ -1741,14 +1460,6 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-x64@0.19.4: - resolution: {integrity: sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - optional: true - /@esbuild/freebsd-x64@0.19.5: resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==} engines: {node: '>=12'} @@ -1765,14 +1476,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm64@0.19.4: - resolution: {integrity: sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-arm64@0.19.5: resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==} engines: {node: '>=12'} @@ -1789,14 +1492,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm@0.19.4: - resolution: {integrity: sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-arm@0.19.5: resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==} engines: {node: '>=12'} @@ -1813,14 +1508,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ia32@0.19.4: - resolution: {integrity: sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-ia32@0.19.5: resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==} engines: {node: '>=12'} @@ -1837,14 +1524,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-loong64@0.19.4: - resolution: {integrity: sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-loong64@0.19.5: resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==} engines: {node: '>=12'} @@ -1861,14 +1540,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-mips64el@0.19.4: - resolution: {integrity: sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-mips64el@0.19.5: resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==} engines: {node: '>=12'} @@ -1885,14 +1556,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ppc64@0.19.4: - resolution: {integrity: sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-ppc64@0.19.5: resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==} engines: {node: '>=12'} @@ -1909,14 +1572,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-riscv64@0.19.4: - resolution: {integrity: sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-riscv64@0.19.5: resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==} engines: {node: '>=12'} @@ -1933,14 +1588,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-s390x@0.19.4: - resolution: {integrity: sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-s390x@0.19.5: resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==} engines: {node: '>=12'} @@ -1957,14 +1604,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-x64@0.19.4: - resolution: {integrity: sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-x64@0.19.5: resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==} engines: {node: '>=12'} @@ -1981,14 +1620,6 @@ packages: requiresBuild: true optional: true - /@esbuild/netbsd-x64@0.19.4: - resolution: {integrity: sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - optional: true - /@esbuild/netbsd-x64@0.19.5: resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==} engines: {node: '>=12'} @@ -2005,14 +1636,6 @@ packages: requiresBuild: true optional: true - /@esbuild/openbsd-x64@0.19.4: - resolution: {integrity: sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - optional: true - /@esbuild/openbsd-x64@0.19.5: resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==} engines: {node: '>=12'} @@ -2029,14 +1652,6 @@ packages: requiresBuild: true optional: true - /@esbuild/sunos-x64@0.19.4: - resolution: {integrity: sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - optional: true - /@esbuild/sunos-x64@0.19.5: resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==} engines: {node: '>=12'} @@ -2053,14 +1668,6 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-arm64@0.19.4: - resolution: {integrity: sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - optional: true - /@esbuild/win32-arm64@0.19.5: resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==} engines: {node: '>=12'} @@ -2077,14 +1684,6 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-ia32@0.19.4: - resolution: {integrity: sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - optional: true - /@esbuild/win32-ia32@0.19.5: resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==} engines: {node: '>=12'} @@ -2101,14 +1700,6 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-x64@0.19.4: - resolution: {integrity: sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - optional: true - /@esbuild/win32-x64@0.19.5: resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==} engines: {node: '>=12'} @@ -2258,7 +1849,7 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.18 babel-plugin-istanbul: 6.1.1 @@ -2470,7 +2061,7 @@ packages: '@nuxt/schema': link:packages/schema execa: 7.2.0 nuxt: link:packages/nuxt - vite: 4.4.11(@types/node@18.18.4) + vite: 4.4.11(@types/node@18.18.5) dev: false /@nuxt/devtools-wizard@1.0.0-beta.3: @@ -2531,7 +2122,7 @@ packages: simple-git: 3.20.0 sirv: 2.0.3 unimport: 3.4.0(rollup@3.29.1) - vite: 4.4.11(@types/node@18.18.4) + vite: 4.4.11(@types/node@18.18.5) vite-plugin-inspect: 0.7.40(@nuxt/kit@packages+kit)(rollup@3.29.1)(vite@4.4.11) vite-plugin-vue-inspector: 4.0.0(vite@4.4.11) which: 3.0.1 @@ -2849,19 +2440,6 @@ packages: resolve: 1.22.4 rollup: 3.29.1 - /@rollup/plugin-replace@5.0.3(rollup@3.29.1): - resolution: {integrity: sha512-je7fu05B800IrMlWjb2wzJcdXzHYW46iTipfChnBDbIbDXhASZs27W1B58T2Yf45jZtJUONegpbce+9Ut2Ti/Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@rollup/pluginutils': 5.0.4(rollup@3.29.1) - magic-string: 0.30.5 - rollup: 3.29.1 - /@rollup/plugin-replace@5.0.4(rollup@3.29.1): resolution: {integrity: sha512-E2hmRnlh09K8HGT0rOnnri9OTh+BILGr7NVJGB30S4E3cLRn3J0xjdiyOZ74adPs4NiAMgrjUMGAZNJDBgsdmQ==} engines: {node: '>=14.0.0'} @@ -2874,7 +2452,6 @@ packages: '@rollup/pluginutils': 5.0.4(rollup@3.29.1) magic-string: 0.30.5 rollup: 3.29.1 - dev: false /@rollup/plugin-terser@0.4.3(rollup@3.29.1): resolution: {integrity: sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA==} @@ -3041,7 +2618,7 @@ packages: resolution: {integrity: sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==} dependencies: '@types/jsonfile': 6.1.1 - '@types/node': 18.18.4 + '@types/node': 18.18.5 dev: true /@types/graceful-fs@4.1.6: @@ -3101,9 +2678,6 @@ packages: '@types/node': 18.18.5 dev: true - /@types/node@18.18.4: - resolution: {integrity: sha512-t3rNFBgJRugIhackit2mVcLfF6IRc0JE4oeizPQL8Zrm8n2WY/0wOdpOPhdtG0V9Q2TlW/axbF1MJ6z+Yj/kKQ==} - /@types/node@18.18.5: resolution: {integrity: sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A==} @@ -3129,7 +2703,7 @@ packages: /@types/sass-loader@8.0.6: resolution: {integrity: sha512-IhUYL6DhlWDKvWrChKsQJFId7qnD4AT9Q+Dy95LyYHqz0pyVkq7VenZjdY8L5tCID80lOahrvmCG24WACgHrsw==} dependencies: - '@types/node': 18.18.4 + '@types/node': 18.18.5 '@types/node-sass': 4.11.3 '@types/webpack': 4.41.33 sass: 1.64.2 @@ -3160,7 +2734,7 @@ packages: /@types/webpack-bundle-analyzer@4.6.1: resolution: {integrity: sha512-MQ9GBzu8N7bsjmE9xtWe9JUrRUsPljKxS8fd5EdSIU/x+/U0Ga8f0OsVJZTX1yWF87xZSt0Ai1Iaiwi+Gq+ugA==} dependencies: - '@types/node': 18.18.4 + '@types/node': 18.18.5 tapable: 2.2.1 webpack: 5.89.0 transitivePeerDependencies: @@ -3420,9 +2994,9 @@ packages: vite: 4.4.11 vue: 3.3.4 dependencies: - '@babel/core': 7.22.10 - '@babel/plugin-transform-typescript': 7.22.10(@babel/core@7.22.10) - '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.22.10) + '@babel/core': 7.23.0 + '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.0) + '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.23.0) vite: 4.4.11(@types/node@18.18.5) vue: 3.3.4 transitivePeerDependencies: @@ -3435,7 +3009,7 @@ packages: vite: 4.4.11 vue: 3.3.4 dependencies: - vite: 4.4.11(@types/node@18.18.4) + vite: 4.4.11(@types/node@18.18.5) vue: 3.3.4 /@vitest/expect@0.33.0: @@ -3515,7 +3089,7 @@ packages: vue: optional: true dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 '@rollup/pluginutils': 5.0.4(rollup@3.29.1) '@vue/compiler-sfc': 3.3.4 ast-kit: 0.11.2(rollup@3.29.1) @@ -3529,47 +3103,28 @@ packages: /@vue/babel-helper-vue-transform-on@1.1.5: resolution: {integrity: sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==} - /@vue/babel-plugin-jsx@1.1.5(@babel/core@7.22.10): - resolution: {integrity: sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.22.10 - '@babel/helper-module-imports': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.19 - '@vue/babel-helper-vue-transform-on': 1.1.5 - camelcase: 6.3.0 - html-tags: 3.3.1 - svg-tags: 1.0.0 - transitivePeerDependencies: - - supports-color - /@vue/babel-plugin-jsx@1.1.5(@babel/core@7.23.0): resolution: {integrity: sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.10 - '@babel/types': 7.22.19 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 '@vue/babel-helper-vue-transform-on': 1.1.5 camelcase: 6.3.0 html-tags: 3.3.1 svg-tags: 1.0.0 transitivePeerDependencies: - supports-color - dev: false /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@vue/shared': 3.3.4 estree-walker: 2.0.2 source-map-js: 1.0.2 @@ -3583,7 +3138,7 @@ packages: /@vue/compiler-sfc@3.3.4: resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@vue/compiler-core': 3.3.4 '@vue/compiler-dom': 3.3.4 '@vue/compiler-ssr': 3.3.4 @@ -3624,7 +3179,7 @@ packages: /@vue/reactivity-transform@3.3.4: resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 @@ -4081,7 +3636,7 @@ packages: resolution: {integrity: sha512-Q0DjXK4ApbVoIf9GLyCo252tUH44iTnD/hiJ2TQaJeydYWSpKk0sI34+WMel8S9Wt5pbLgG02oJ+gkgX5DV3sQ==} engines: {node: '>=16.14.0'} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@rollup/pluginutils': 5.0.4(rollup@3.29.1) pathe: 1.1.1 transitivePeerDependencies: @@ -4092,7 +3647,7 @@ packages: resolution: {integrity: sha512-UrZHsdj87OS6NM+IXRii+asdAUA/P0SMa4r1NrZvsUy72hDvCYwk8c9PsbKf1MvJ0BvP+rF1B8tFP54eT370Tg==} engines: {node: '>=16.14.0'} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 '@rollup/pluginutils': 5.0.4(rollup@3.29.1) pathe: 1.1.1 transitivePeerDependencies: @@ -4103,7 +3658,7 @@ packages: resolution: {integrity: sha512-NsyHMxBh4dmdEHjBo1/TBZvCKxffmZxRYhmclfu0PP6Aftre47jOHYaYaNqJcV0bxihxFXhDkzLHUwHc0ocd0Q==} engines: {node: '>=16.14.0'} dependencies: - '@babel/parser': 7.22.16 + '@babel/parser': 7.23.0 ast-kit: 0.9.4(rollup@3.29.1) transitivePeerDependencies: - rollup @@ -4152,24 +3707,24 @@ packages: - supports-color dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.10): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.0): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.10 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.10) + '@babel/core': 7.23.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) dev: true /babel-walk@3.0.0-canary-5: @@ -4596,9 +4151,6 @@ packages: resolution: {integrity: sha512-t5yxPyI8h8KPvRwrS/sRrfIpT2gJbmBAY0TFokyUBy3PM44RuFRpZwHdACz+GTSPLRLo3s4qsscOMLjHiXBwzw==} dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -5226,35 +4778,6 @@ packages: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - /esbuild@0.19.4: - resolution: {integrity: sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.4 - '@esbuild/android-arm64': 0.19.4 - '@esbuild/android-x64': 0.19.4 - '@esbuild/darwin-arm64': 0.19.4 - '@esbuild/darwin-x64': 0.19.4 - '@esbuild/freebsd-arm64': 0.19.4 - '@esbuild/freebsd-x64': 0.19.4 - '@esbuild/linux-arm': 0.19.4 - '@esbuild/linux-arm64': 0.19.4 - '@esbuild/linux-ia32': 0.19.4 - '@esbuild/linux-loong64': 0.19.4 - '@esbuild/linux-mips64el': 0.19.4 - '@esbuild/linux-ppc64': 0.19.4 - '@esbuild/linux-riscv64': 0.19.4 - '@esbuild/linux-s390x': 0.19.4 - '@esbuild/linux-x64': 0.19.4 - '@esbuild/netbsd-x64': 0.19.4 - '@esbuild/openbsd-x64': 0.19.4 - '@esbuild/sunos-x64': 0.19.4 - '@esbuild/win32-arm64': 0.19.4 - '@esbuild/win32-ia32': 0.19.4 - '@esbuild/win32-x64': 0.19.4 - /esbuild@0.19.5: resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} engines: {node: '>=12'} @@ -5876,7 +5399,7 @@ packages: typescript: '>3.6.0' webpack: ^5.11.0 dependencies: - '@babel/code-frame': 7.22.10 + '@babel/code-frame': 7.22.13 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 7.1.0 @@ -6094,7 +5617,7 @@ packages: foreground-child: 3.1.1 jackspeak: 2.2.2 minimatch: 9.0.3 - minipass: 7.0.2 + minipass: 7.0.4 path-scurry: 1.10.1 /glob@7.2.3: @@ -6711,7 +6234,7 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/parser': 7.23.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -6805,15 +6328,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.22.10 - '@babel/generator': 7.22.10 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.10) - '@babel/types': 7.22.19 + '@babel/core': 7.23.0 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + '@babel/types': 7.23.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -7475,14 +6998,9 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - /minipass@7.0.2: - resolution: {integrity: sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==} - engines: {node: '>=16 || 14 >=14.17'} - /minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} - dev: false /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -7589,7 +7107,7 @@ packages: '@rollup/plugin-inject': 5.0.3(rollup@3.29.1) '@rollup/plugin-json': 6.0.0(rollup@3.29.1) '@rollup/plugin-node-resolve': 15.2.1(rollup@3.29.1) - '@rollup/plugin-replace': 5.0.3(rollup@3.29.1) + '@rollup/plugin-replace': 5.0.4(rollup@3.29.1) '@rollup/plugin-terser': 0.4.3(rollup@3.29.1) '@rollup/plugin-wasm': 6.1.3(rollup@3.29.1) '@rollup/pluginutils': 5.0.4(rollup@3.29.1) @@ -7605,7 +7123,7 @@ packages: defu: 6.1.2 destr: 2.0.1 dot-prop: 8.0.2 - esbuild: 0.19.4 + esbuild: 0.19.5 escape-string-regexp: 5.0.0 etag: 1.8.1 fs-extra: 11.1.1 @@ -8160,7 +7678,7 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.0.1 - minipass: 7.0.2 + minipass: 7.0.4 /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -9786,13 +9304,13 @@ packages: '@rollup/plugin-commonjs': 25.0.4(rollup@3.29.1) '@rollup/plugin-json': 6.0.0(rollup@3.29.1) '@rollup/plugin-node-resolve': 15.2.1(rollup@3.29.1) - '@rollup/plugin-replace': 5.0.3(rollup@3.29.1) + '@rollup/plugin-replace': 5.0.4(rollup@3.29.1) '@rollup/pluginutils': 5.0.4(rollup@3.29.1) chalk: 5.3.0 citty: 0.1.4 consola: 3.2.3 defu: 6.1.2 - esbuild: 0.19.4 + esbuild: 0.19.5 globby: 13.2.2 hookable: 5.5.3 jiti: 1.20.0 @@ -9890,7 +9408,7 @@ packages: vue-router: optional: true dependencies: - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 '@rollup/pluginutils': 5.0.4(rollup@3.29.1) '@vue-macros/common': 1.8.0(rollup@3.29.1)(vue@3.3.4) ast-walker-scope: 0.5.0(rollup@3.29.1) @@ -9985,9 +9503,9 @@ packages: resolution: {integrity: sha512-Egkr/s4zcMTEuulcIb7dgURS6QpN7DyqQYdf+jBtiaJvQ+eRsrtWUoX84SbvQWuLkXsOjM+8sJC9u6KoMK/U7Q==} hasBin: true dependencies: - '@babel/core': 7.22.10 + '@babel/core': 7.23.0 '@babel/standalone': 7.22.9 - '@babel/types': 7.22.19 + '@babel/types': 7.23.0 defu: 6.1.2 jiti: 1.20.0 mri: 1.2.0 @@ -10049,28 +9567,6 @@ packages: builtins: 5.0.1 dev: false - /vite-node@0.33.0(@types/node@18.18.4): - resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} - engines: {node: '>=v14.18.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.4.2 - pathe: 1.1.1 - picocolors: 1.0.0 - vite: 4.4.11(@types/node@18.18.4) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vite-node@0.33.0(@types/node@18.18.5): resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} engines: {node: '>=v14.18.0'} @@ -10091,7 +9587,6 @@ packages: - sugarss - supports-color - terser - dev: false /vite-plugin-checker@0.6.2(eslint@8.51.0)(typescript@5.2.2)(vite@4.4.11)(vue-tsc@1.8.19): resolution: {integrity: sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==} @@ -10124,7 +9619,7 @@ packages: vue-tsc: optional: true dependencies: - '@babel/code-frame': 7.22.10 + '@babel/code-frame': 7.22.13 ansi-escapes: 4.3.2 chalk: 4.1.2 chokidar: 3.5.3 @@ -10166,7 +9661,7 @@ packages: open: 9.1.0 picocolors: 1.0.0 sirv: 2.0.3 - vite: 4.4.11(@types/node@18.18.4) + vite: 4.4.11(@types/node@18.18.5) transitivePeerDependencies: - rollup - supports-color @@ -10186,46 +9681,11 @@ packages: '@vue/compiler-dom': 3.3.4 kolorist: 1.8.0 magic-string: 0.30.5 - vite: 4.4.11(@types/node@18.18.4) + vite: 4.4.11(@types/node@18.18.5) transitivePeerDependencies: - supports-color dev: false - /vite@4.4.11(@types/node@18.18.4): - resolution: {integrity: sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.18.4 - esbuild: 0.18.20 - postcss: 8.4.31 - rollup: 3.29.1 - optionalDependencies: - fsevents: 2.3.3 - /vite@4.4.11(@types/node@18.18.5): resolution: {integrity: sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==} engines: {node: ^14.18.0 || >=16.0.0} @@ -10330,7 +9790,7 @@ packages: dependencies: '@types/chai': 4.3.5 '@types/chai-subset': 1.3.3 - '@types/node': 18.18.4 + '@types/node': 18.18.5 '@vitest/expect': 0.33.0 '@vitest/runner': 0.33.0 '@vitest/snapshot': 0.33.0 @@ -10350,8 +9810,8 @@ packages: strip-literal: 1.3.0 tinybench: 2.5.0 tinypool: 0.6.0 - vite: 4.4.11(@types/node@18.18.4) - vite-node: 0.33.0(@types/node@18.18.4) + vite: 4.4.11(@types/node@18.18.5) + vite-node: 0.33.0(@types/node@18.18.5) why-is-node-running: 2.2.2 transitivePeerDependencies: - less From cb1face330ceb019179c23a519a4b2f8faaffc9f Mon Sep 17 00:00:00 2001 From: Daniel Roe <daniel@roe.dev> Date: Wed, 18 Oct 2023 11:49:55 +0100 Subject: [PATCH 55/62] fix: update modules link --- docs/5.community/3.reporting-bugs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/5.community/3.reporting-bugs.md b/docs/5.community/3.reporting-bugs.md index b895671f5486..9671af08633c 100644 --- a/docs/5.community/3.reporting-bugs.md +++ b/docs/5.community/3.reporting-bugs.md @@ -53,4 +53,4 @@ Once you've reproduced the issue, remove as much code from your reproduction as ## Figure Out What the Cause Might Be -With a Nuxt project, there are lots of moving pieces - from [Nuxt modules](https://nuxtjs.org/modules) to [other JavaScript libraries](https://www.npmjs.com/). Try to report the bug at the most relevant and specific place. That will likely be the Nuxt module causing an issue, or the upstream library that Nuxt is depending on. +With a Nuxt project, there are lots of moving pieces - from [Nuxt modules](https://nuxt.com/modules) to [other JavaScript libraries](https://www.npmjs.com/). Try to report the bug at the most relevant and specific place. That will likely be the Nuxt module causing an issue, or the upstream library that Nuxt is depending on. From 44bf8ed8ae6c6d2fe9fedbea11536ab0e200e25a Mon Sep 17 00:00:00 2001 From: Daniel Roe <daniel@roe.dev> Date: Wed, 18 Oct 2023 11:50:23 +0100 Subject: [PATCH 56/62] fix: add missing x --- docs/5.community/3.reporting-bugs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/5.community/3.reporting-bugs.md b/docs/5.community/3.reporting-bugs.md index 9671af08633c..47cbca02bd35 100644 --- a/docs/5.community/3.reporting-bugs.md +++ b/docs/5.community/3.reporting-bugs.md @@ -38,7 +38,7 @@ If your issue concerns Vue 3 or Vite, please try to reproduce it first with the **Nuxt Bridge**: ::card-group - :card{title="Nuxt Bridge on CodeSandbox" icon="i-simple-icons-codesandbox" to="https://codesandbox.io/s/github/nuxt/starter/v2-bridge-codesandbo" target="_blank"} + :card{title="Nuxt Bridge on CodeSandbox" icon="i-simple-icons-codesandbox" to="https://codesandbox.io/s/github/nuxt/starter/v2-bridge-codesandbox" target="_blank"} :: **Vue 3**: From 0326ad2b4317e4699dddadde2e7e62fd4ec2059e Mon Sep 17 00:00:00 2001 From: Daniel Roe <daniel@roe.dev> Date: Wed, 18 Oct 2023 11:51:04 +0100 Subject: [PATCH 57/62] chore: remove link to tween --- docs/1.getting-started/5.transitions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/1.getting-started/5.transitions.md b/docs/1.getting-started/5.transitions.md index 734fc015dd57..6634457d8a5b 100644 --- a/docs/1.getting-started/5.transitions.md +++ b/docs/1.getting-started/5.transitions.md @@ -291,7 +291,7 @@ defineNuxtConfig({ For advanced use-cases, you can use JavaScript hooks to create highly dynamic and custom transitions for your Nuxt pages. -This way presents perfect use-cases for JavaScript animation libraries such as [GSAP](https://greensock.com/gsap/) or [Tween.js](https://createjs.com/tweenjs). +This way presents perfect use-cases for JavaScript animation libraries such as [GSAP](https://greensock.com/gsap/). ```vue [pages/some-page.vue] <script setup lang="ts"> From e51cdb7387bb147ac39d1583ffb87c11244b7c7f Mon Sep 17 00:00:00 2001 From: Daniel Roe <daniel@roe.dev> Date: Wed, 18 Oct 2023 11:51:53 +0100 Subject: [PATCH 58/62] chore: reset bundle size --- test/bundle.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/bundle.test.ts b/test/bundle.test.ts index a8d6acbec490..57e97a6bf78d 100644 --- a/test/bundle.test.ts +++ b/test/bundle.test.ts @@ -35,7 +35,7 @@ describe.skipIf(process.env.SKIP_BUNDLE_SIZE === 'true' || process.env.ECOSYSTEM expect.soft(roundToKilobytes(serverStats.totalBytes)).toMatchInlineSnapshot('"304k"') const modules = await analyzeSizes('node_modules/**/*', serverDir) - expect.soft(roundToKilobytes(modules.totalBytes)).toMatchInlineSnapshot('"1823k"') + expect.soft(roundToKilobytes(modules.totalBytes)).toMatchInlineSnapshot('"1826k"') const packages = modules.files .filter(m => m.endsWith('package.json')) From 3dd1dc1a72711e71294662fa5c7bfd7973eb8d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Wed, 18 Oct 2023 12:53:09 +0200 Subject: [PATCH 59/62] docs: relative links for modules --- docs/1.getting-started/4.styling.md | 8 ++++---- docs/7.migration/2.configuration.md | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/1.getting-started/4.styling.md b/docs/1.getting-started/4.styling.md index f535a4620c09..d1fd090ebf84 100644 --- a/docs/1.getting-started/4.styling.md +++ b/docs/1.getting-started/4.styling.md @@ -459,16 +459,16 @@ Use different styles for different layouts. Nuxt isn't opinionated when it comes to styling and provides you with a wide variety of options. You can use any styling tool that you want, such as popular libraries like [UnoCSS](https://unocss.dev/) or [Tailwind CSS](https://tailwindcss.com/). The community and the Nuxt team have developed plenty of Nuxt modules to makes the integration easier. -You can discover them on the [modules section](https://nuxt.com/modules) of the website. +You can discover them on the [modules section](/modules) of the website. Here are a few modules to help you get started: -- [UnoCSS](https://nuxt.com/modules/unocss): Instant on-demand atomic CSS engine -- [Tailwind CSS](https://nuxt.com/modules/tailwindcss): Utility-first CSS framework +- [UnoCSS](/modules/unocss): Instant on-demand atomic CSS engine +- [Tailwind CSS](/modules/tailwindcss): Utility-first CSS framework - [Fontaine](https://github.com/nuxt-modules/fontaine): Font metric fallback - [Pinceau](https://pinceau.dev/): Adaptable styling framework - [Nuxt UI](https://ui.nuxt.com): A UI Library for Modern Web Apps -Nuxt modules provide you with a good developer experience out of the box, but remember that if your favorite tool doesn't have a module, it doesn't mean that you can't use it with Nuxt! You can configure it yourself for your own project. Depending on the tool, you might need to use a [Nuxt plugin](/docs/guide/directory-structure/plugins) and/or [make your own module](/docs/guide/going-further/modules). Share them with the [community](https://nuxt.com/modules) if you do! +Nuxt modules provide you with a good developer experience out of the box, but remember that if your favorite tool doesn't have a module, it doesn't mean that you can't use it with Nuxt! You can configure it yourself for your own project. Depending on the tool, you might need to use a [Nuxt plugin](/docs/guide/directory-structure/plugins) and/or [make your own module](/docs/guide/going-further/modules). Share them with the [community](/modules) if you do! ### Easily Load Webfonts diff --git a/docs/7.migration/2.configuration.md b/docs/7.migration/2.configuration.md index 3e2704102a9b..992ffc92bdb9 100644 --- a/docs/7.migration/2.configuration.md +++ b/docs/7.migration/2.configuration.md @@ -138,7 +138,7 @@ Nuxt no longer provides a Vuex integration. Instead, the official Vue recommenda A simple way to provide global state management with pinia would be: -Install the [`@pinia/nuxt`](https://nuxt.com/modules/pinia) module: +Install the [`@pinia/nuxt`](/modules/pinia) module: ```bash [Terminal] yarn add pinia @pinia/nuxt From 1a51318bd79573fe1ab871204b08bb71ecf421ad Mon Sep 17 00:00:00 2001 From: Daniel Roe <daniel@roe.dev> Date: Wed, 18 Oct 2023 11:54:08 +0100 Subject: [PATCH 60/62] docs: use link relative to root --- docs/3.api/1.components/10.nuxt-picture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/3.api/1.components/10.nuxt-picture.md b/docs/3.api/1.components/10.nuxt-picture.md index d34173e0b4b3..85bdbb97a97b 100644 --- a/docs/3.api/1.components/10.nuxt-picture.md +++ b/docs/3.api/1.components/10.nuxt-picture.md @@ -10,7 +10,7 @@ links: `<NuxtPicture>` is a drop-in replacement for the native `<picture>` tag. -Usage of `<NuxtPicture>` is almost identical to [`<NuxtImg>`](./nuxt-img) but it also allows serving modern formats like `webp` when possible. +Usage of `<NuxtPicture>` is almost identical to [`<NuxtImg>`](/docs/api/components/nuxt-img) but it also allows serving modern formats like `webp` when possible. Learn more about the [`<picture>` tag on MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture). From 0584d558acefab49bbd7ac34081013c55b9e6378 Mon Sep 17 00:00:00 2001 From: Daniel Roe <daniel@roe.dev> Date: Wed, 18 Oct 2023 11:54:37 +0100 Subject: [PATCH 61/62] chore: use gsap.com --- docs/1.getting-started/5.transitions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/1.getting-started/5.transitions.md b/docs/1.getting-started/5.transitions.md index 6634457d8a5b..d93cf5960c4a 100644 --- a/docs/1.getting-started/5.transitions.md +++ b/docs/1.getting-started/5.transitions.md @@ -291,7 +291,7 @@ defineNuxtConfig({ For advanced use-cases, you can use JavaScript hooks to create highly dynamic and custom transitions for your Nuxt pages. -This way presents perfect use-cases for JavaScript animation libraries such as [GSAP](https://greensock.com/gsap/). +This way presents perfect use-cases for JavaScript animation libraries such as [GSAP](https://gsap.com/). ```vue [pages/some-page.vue] <script setup lang="ts"> From eea69558e9cd859a90a6a5971d44ae1537c35764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Chopin?= <seb@nuxt.com> Date: Wed, 18 Oct 2023 12:55:23 +0200 Subject: [PATCH 62/62] docs: more relative links --- docs/2.guide/2.directory-structure/1.pages.md | 2 +- docs/2.guide/2.directory-structure/2.env.md | 2 +- docs/2.guide/3.going-further/1.experimental-features.md | 2 +- docs/3.api/3.utils/$fetch.md | 2 +- docs/3.api/6.advanced/1.hooks.md | 2 +- docs/5.community/3.reporting-bugs.md | 2 +- docs/5.community/6.roadmap.md | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/2.guide/2.directory-structure/1.pages.md b/docs/2.guide/2.directory-structure/1.pages.md index 2830793cdccf..c7ca9364508b 100644 --- a/docs/2.guide/2.directory-structure/1.pages.md +++ b/docs/2.guide/2.directory-structure/1.pages.md @@ -11,7 +11,7 @@ To reduce your application's bundle size, this directory is **optional**, meanin ## Usage -Pages are Vue components and can have any [valid extension](https://nuxt.com/docs/api/configuration/nuxt-config#extensions) that Nuxt supports (by default `.vue`, `.js`, `.jsx`, `.mjs`, `.ts` or `.tsx`). +Pages are Vue components and can have any [valid extension](/docs/api/configuration/nuxt-config#extensions) that Nuxt supports (by default `.vue`, `.js`, `.jsx`, `.mjs`, `.ts` or `.tsx`). Nuxt will automatically create a route for every page in your `~/pages/` directory. diff --git a/docs/2.guide/2.directory-structure/2.env.md b/docs/2.guide/2.directory-structure/2.env.md index 03adf2ffa42f..3932c4e2ad20 100644 --- a/docs/2.guide/2.directory-structure/2.env.md +++ b/docs/2.guide/2.directory-structure/2.env.md @@ -39,7 +39,7 @@ When updating `.env` in development mode, the Nuxt instance is automatically res Your `.env` file will not be read at this point. How you do this is different for every environment. -For local production preview purpose, we recommend using [`nuxi preview`](https://nuxt.com/docs/api/commands/preview) since using this command, the `.env` file will be loaded into `process.env` for convenience. Note that this command requires dependencies to be installed in the package directory. +For local production preview purpose, we recommend using [`nuxi preview`](/docs/api/commands/preview) since using this command, the `.env` file will be loaded into `process.env` for convenience. Note that this command requires dependencies to be installed in the package directory. Or you could pass the environment variables as arguments using the terminal. For example, on Linux or macOS: diff --git a/docs/2.guide/3.going-further/1.experimental-features.md b/docs/2.guide/3.going-further/1.experimental-features.md index 9c1baef2f1d3..e80d1218f71d 100644 --- a/docs/2.guide/3.going-further/1.experimental-features.md +++ b/docs/2.guide/3.going-further/1.experimental-features.md @@ -5,7 +5,7 @@ description: "Enable Nuxt experimental features to unlock new possibilities." The Nuxt experimental features can be enabled in the Nuxt configuration file. -Internally, Nuxt uses `@nuxt/schema` to define these experimental features. You can refer to the [API documentation](https://nuxt.com/docs/api/configuration/nuxt-config#experimental) or the [source code](https://github.com/nuxt/nuxt/blob/main/packages/schema/src/config/experimental.ts) for more information. +Internally, Nuxt uses `@nuxt/schema` to define these experimental features. You can refer to the [API documentation](/docs/api/configuration/nuxt-config#experimental) or the [source code](https://github.com/nuxt/nuxt/blob/main/packages/schema/src/config/experimental.ts) for more information. ::callout Note that these features are experimental and could be removed or modified in the future. diff --git a/docs/3.api/3.utils/$fetch.md b/docs/3.api/3.utils/$fetch.md index 166ad9e7b8a5..8e5ff25f0880 100644 --- a/docs/3.api/3.utils/$fetch.md +++ b/docs/3.api/3.utils/$fetch.md @@ -18,7 +18,7 @@ During server-side rendering, calling `$fetch` to fetch your internal [API route Using `$fetch` in components without wrapping it with [`useAsyncData`](/docs/api/composables/use-async-data) causes fetching the data twice: initially on the server, then again on the client-side during hydration, because `$fetch` does not transfer state from the server to the client. Thus, the fetch will be executed on both sides because the client has to get the data again. :: -We recommend to use [`useFetch`](https://nuxt.com/docs/api/composables/use-fetch) or [`useAsyncData`](https://nuxt.com/docs/api/composables/use-async-data) + `$fetch` to prevent double data fetching when fetching the component data. +We recommend to use [`useFetch`](/docs/api/composables/use-fetch) or [`useAsyncData`](/docs/api/composables/use-async-data) + `$fetch` to prevent double data fetching when fetching the component data. ```vue [app.vue] <script setup lang="ts"> diff --git a/docs/3.api/6.advanced/1.hooks.md b/docs/3.api/6.advanced/1.hooks.md index 667c9646d300..99530c5933d0 100644 --- a/docs/3.api/6.advanced/1.hooks.md +++ b/docs/3.api/6.advanced/1.hooks.md @@ -41,7 +41,7 @@ Hook | Arguments | Description `modules:done` | - | Called during Nuxt initialization, after installing user modules. `app:resolve` | `app` | Called after resolving the `app` instance. `app:templates` | `app` | Called during `NuxtApp` generation, to allow customizing, modifying or adding new files to the build directory (either virtually or to written to `.nuxt`). -`app:templatesGenerated` | `app` | Called after templates are compiled into the [virtual file system](https://nuxt.com/docs/guide/directory-structure/nuxt#virtual-file-system) (vfs). +`app:templatesGenerated` | `app` | Called after templates are compiled into the [virtual file system](/docs/guide/directory-structure/nuxt#virtual-file-system) (vfs). `build:before` | - | Called before Nuxt bundle builder. `build:done` | - | Called after Nuxt bundle builder is complete. `build:manifest` | `manifest` | Called during the manifest build by Vite and webpack. This allows customizing the manifest that Nitro will use to render `<script>` and `<link>` tags in the final HTML. diff --git a/docs/5.community/3.reporting-bugs.md b/docs/5.community/3.reporting-bugs.md index 47cbca02bd35..e2d5884c95f6 100644 --- a/docs/5.community/3.reporting-bugs.md +++ b/docs/5.community/3.reporting-bugs.md @@ -53,4 +53,4 @@ Once you've reproduced the issue, remove as much code from your reproduction as ## Figure Out What the Cause Might Be -With a Nuxt project, there are lots of moving pieces - from [Nuxt modules](https://nuxt.com/modules) to [other JavaScript libraries](https://www.npmjs.com/). Try to report the bug at the most relevant and specific place. That will likely be the Nuxt module causing an issue, or the upstream library that Nuxt is depending on. +With a Nuxt project, there are lots of moving pieces - from [Nuxt modules](/modules) to [other JavaScript libraries](https://www.npmjs.com/). Try to report the bug at the most relevant and specific place. That will likely be the Nuxt module causing an issue, or the upstream library that Nuxt is depending on. diff --git a/docs/5.community/6.roadmap.md b/docs/5.community/6.roadmap.md index a50f50ee11fa..94b2ba429789 100644 --- a/docs/5.community/6.roadmap.md +++ b/docs/5.community/6.roadmap.md @@ -67,7 +67,7 @@ Each active version has its own nightly releases which are generated automatical Release | | Initial release | End Of Life | Docs ----------------------------------------|---------------------------------------------------------------------------------------------------|-----------------|--------------|------- **4.x** (scheduled) | | 2024 Q1 | | -**3.x** (stable) | <a href="https://npmjs.com/package/nuxt"><img src="https://flat.badgen.net/npm/v/nuxt?label="></a> | 2022-11-16 | TBA | [nuxt.com](https://nuxt.com/docs) +**3.x** (stable) | <a href="https://npmjs.com/package/nuxt"><img src="https://flat.badgen.net/npm/v/nuxt?label="></a> | 2022-11-16 | TBA | [nuxt.com](/docs) **2.x** (maintenance) | <a href="https://www.npmjs.com/package/nuxt?activeTab=versions"><img src="https://flat.badgen.net/npm/v/nuxt/2x?label="></a> | 2018-09-21 | 2023-12-31 | [v2.nuxt.com](https://v2.nuxt.com/docs) **1.x** (unsupported) | <a href="https://www.npmjs.com/package/nuxt?activeTab=versions"><img src="https://flat.badgen.net/npm/v/nuxt/1x?label="></a> | 2018-01-08 | 2019-09-21 |