From cff7f5987a80c1c6af3e31b72183fd0cc9701a66 Mon Sep 17 00:00:00 2001 From: Jelmer de Maat Date: Thu, 9 May 2024 16:21:04 +0200 Subject: [PATCH 1/8] feat(composables): start new useResponseHeader and useResponseHeaders composables --- packages/nuxt/src/app/composables/index.ts | 2 +- packages/nuxt/src/app/composables/ssr.ts | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/nuxt/src/app/composables/index.ts b/packages/nuxt/src/app/composables/index.ts index dbb5e96079..847609dfc7 100644 --- a/packages/nuxt/src/app/composables/index.ts +++ b/packages/nuxt/src/app/composables/index.ts @@ -24,7 +24,7 @@ export { useFetch, useLazyFetch } from './fetch' export type { FetchResult, UseFetchOptions } from './fetch' export { useCookie, refreshCookie } from './cookie' export type { CookieOptions, CookieRef } from './cookie' -export { onPrehydrate, prerenderRoutes, useRequestHeaders, useRequestEvent, useRequestFetch, setResponseStatus } from './ssr' +export { onPrehydrate, prerenderRoutes, useRequestHeaders, useRequestEvent, useRequestFetch, setResponseStatus, useResponseHeader, useResponseHeaders } from './ssr' export { onNuxtReady } from './ready' export { abortNavigation, addRouteMiddleware, defineNuxtRouteMiddleware, onBeforeRouteLeave, onBeforeRouteUpdate, setPageLayout, navigateTo, useRoute, useRouter } from './router' export type { AddRouteMiddlewareOptions, RouteMiddleware } from './router' diff --git a/packages/nuxt/src/app/composables/ssr.ts b/packages/nuxt/src/app/composables/ssr.ts index 56f3383109..9002f03c2f 100644 --- a/packages/nuxt/src/app/composables/ssr.ts +++ b/packages/nuxt/src/app/composables/ssr.ts @@ -1,5 +1,5 @@ import type { H3Event } from 'h3' -import { setResponseStatus as _setResponseStatus, appendHeader, getRequestHeader, getRequestHeaders } from 'h3' +import { setResponseStatus as _setResponseStatus, appendHeader, getRequestHeader, getRequestHeaders, setResponseHeader, setResponseHeaders } from 'h3' import { getCurrentInstance } from 'vue' import { useServerHead } from '@unhead/vue' @@ -61,6 +61,20 @@ export function setResponseStatus (arg1: H3Event | number | undefined, arg2?: nu } } +/** @since 3.11.3 */ +export function useResponseHeader (header: string, value: string) { + if (import.meta.client) { return undefined } + const event = useRequestEvent() + return event ? setResponseHeader(event, header, value) : undefined +} + +/** @since 3.11.3 */ +export function useResponseHeaders (headers: Record) { + if (import.meta.client) { return undefined } + const event = useRequestEvent() + return event ? setResponseHeaders(event, headers) : undefined +} + /** @since 3.8.0 */ export function prerenderRoutes (path: string | string[]) { if (!import.meta.server || !import.meta.prerender) { return } From 22cb24865b71b6698c5c3e7cff90f86ecb32ed5b Mon Sep 17 00:00:00 2001 From: Jelmer de Maat Date: Thu, 9 May 2024 16:22:13 +0200 Subject: [PATCH 2/8] docs(composables): document new useResponseHeader and useResponseHeaders composables --- .../2.composables/use-response-header.md | 44 +++++++++++++++++++ .../2.composables/use-response-headers.md | 44 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 docs/3.api/2.composables/use-response-header.md create mode 100644 docs/3.api/2.composables/use-response-headers.md diff --git a/docs/3.api/2.composables/use-response-header.md b/docs/3.api/2.composables/use-response-header.md new file mode 100644 index 0000000000..c6234c17a0 --- /dev/null +++ b/docs/3.api/2.composables/use-response-header.md @@ -0,0 +1,44 @@ +--- +title: "useResponseHeader" +description: "Use useResponseHeader to set a server response header." +links: + - label: Source + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ssr.ts + size: xs +--- + +You can use the built-in [`useResponseHeader`](/docs/api/composables/use-response-header) composable to set any server response header within your pages, components, and plugins. + +```ts +// Set the a custom response header +useResponseHeader('X-My-Header', 'my-value'); +``` + +::tip +As it is not retreiving a value, `useResponseHeader` never returns anything. +:: + +## Example + +We can use `useResponseHeader` to easily set a response header on a per-page basis. + +```vue [pages/test.vue] + + + +``` + +We can use `useResponseHeader` for example in Nuxt [middleware](/docs/guide/directory-structure/middleware) to set a response header for all pages. + +```ts [middleware/my-middleware.ts] +export default defineNuxtRouteMiddleware((to, from) => { + useResponseHeader('X-My-Header', 'my-value'); +}); +``` diff --git a/docs/3.api/2.composables/use-response-headers.md b/docs/3.api/2.composables/use-response-headers.md new file mode 100644 index 0000000000..71e3fe64e8 --- /dev/null +++ b/docs/3.api/2.composables/use-response-headers.md @@ -0,0 +1,44 @@ +--- +title: "useResponseHeaders" +description: "Use useResponseHeaders to set multiple server response headers." +links: + - label: Source + icon: i-simple-icons-github + to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/ssr.ts + size: xs +--- + +You can use the built-in [`useResponseHeaders`](/docs/api/composables/use-response-headers) composable to set multiple server response headers within your pages, components, and plugins. + +```ts +// Set the a custom response header +useResponseHeaders({ 'X-My-Header': 'my-value', 'X-My-Other-Header': 'my-other-value' }); +``` + +::tip +As it is not retreiving values, `useResponseHeaders` never returns anything. +:: + +## Example + +We can use `useResponseHeaders` to easily set response headers on a per-page basis. + +```vue [pages/test.vue] + + + +``` + +We can use `useResponseHeaders` for example in Nuxt [middleware](/docs/guide/directory-structure/middleware) to set response headers for all pages. + +```ts [middleware/my-middleware.ts] +export default defineNuxtRouteMiddleware((to, from) => { + useResponseHeaders({ 'X-My-Header': 'my-value', 'X-My-Other-Header': 'my-other-value' }); +}); +``` From 867275c198a139049429fe70d4d9277dcc659670 Mon Sep 17 00:00:00 2001 From: Jelmer de Maat Date: Fri, 23 Aug 2024 22:43:37 +0200 Subject: [PATCH 3/8] feat(composables): change new useResponseHeader composable to return computed value --- packages/nuxt/src/app/composables/ssr.ts | 26 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/nuxt/src/app/composables/ssr.ts b/packages/nuxt/src/app/composables/ssr.ts index 9002f03c2f..e70768e2ce 100644 --- a/packages/nuxt/src/app/composables/ssr.ts +++ b/packages/nuxt/src/app/composables/ssr.ts @@ -1,6 +1,6 @@ import type { H3Event } from 'h3' -import { setResponseStatus as _setResponseStatus, appendHeader, getRequestHeader, getRequestHeaders, setResponseHeader, setResponseHeaders } from 'h3' -import { getCurrentInstance } from 'vue' +import { setResponseStatus as _setResponseStatus, appendHeader, getRequestHeader, getRequestHeaders, getResponseHeader, getResponseHeaders, removeResponseHeader, setResponseHeader, setResponseHeaders } from 'h3' +import { computed, getCurrentInstance } from 'vue' import { useServerHead } from '@unhead/vue' import type { NuxtApp } from '../nuxt' @@ -61,11 +61,25 @@ export function setResponseStatus (arg1: H3Event | number | undefined, arg2?: nu } } -/** @since 3.11.3 */ -export function useResponseHeader (header: string, value: string) { - if (import.meta.client) { return undefined } +/** @since 3.13.1 */ +export function useResponseHeader (header: string) { + if (import.meta.client) { return {} } + const event = useRequestEvent() - return event ? setResponseHeader(event, header, value) : undefined + if (!event) { return {} } + + return computed({ + get () { + return getResponseHeader(event, header) + }, + set (newValue) { + if (!newValue) { + return removeResponseHeader(event, header) + } + + return setResponseHeader(event, header, newValue) + }, + }) } /** @since 3.11.3 */ From a9821066318b1587899376cfed25283c040a7878 Mon Sep 17 00:00:00 2001 From: Jelmer de Maat Date: Fri, 23 Aug 2024 23:08:08 +0200 Subject: [PATCH 4/8] docs(composables): update new useResponseHeader examples --- docs/3.api/2.composables/use-response-header.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/3.api/2.composables/use-response-header.md b/docs/3.api/2.composables/use-response-header.md index c6234c17a0..ba15a9cfb1 100644 --- a/docs/3.api/2.composables/use-response-header.md +++ b/docs/3.api/2.composables/use-response-header.md @@ -12,13 +12,10 @@ You can use the built-in [`useResponseHeader`](/docs/api/composables/use-respons ```ts // Set the a custom response header -useResponseHeader('X-My-Header', 'my-value'); +const header = useResponseHeader('X-My-Header'); +header.value = 'my-value'; ``` -::tip -As it is not retreiving a value, `useResponseHeader` never returns anything. -:: - ## Example We can use `useResponseHeader` to easily set a response header on a per-page basis. @@ -26,7 +23,8 @@ We can use `useResponseHeader` to easily set a response header on a per-page bas ```vue [pages/test.vue]