Skip to content

Commit bf3d909

Browse files
committed
chore: replace runtime caching with app config
1 parent 84576b4 commit bf3d909

File tree

10 files changed

+55
-44
lines changed

10 files changed

+55
-44
lines changed

src/runtime/plugins/critical.server.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import type { parseUserAgent } from 'detect-browser-es'
22
import { CriticalHintsHeaders, extractCriticalHints } from '../utils/critical'
3-
import type { ResolvedHttpClientHintsOptions } from '../shared-types/types'
4-
import { useHttpClientHintsState } from './state'
53
import { writeHeaders } from './headers'
6-
import { defineNuxtPlugin, useCookie, useRequestHeaders, useRuntimeConfig } from '#imports'
4+
import { useHttpClientHintsOptions, useHttpClientHintsState } from './utils'
5+
import { defineNuxtPlugin, useCookie, useRequestHeaders } from '#imports'
76
import type { Plugin } from '#app'
87

98
const plugin: Plugin = defineNuxtPlugin({
@@ -14,7 +13,7 @@ const plugin: Plugin = defineNuxtPlugin({
1413
dependsOn: ['http-client-hints:init-server:plugin'],
1514
async setup(nuxtApp) {
1615
const state = useHttpClientHintsState()
17-
const httpClientHints = useRuntimeConfig().public.httpClientHints as ResolvedHttpClientHintsOptions
16+
const httpClientHints = useHttpClientHintsOptions()
1817
const requestHeaders = useRequestHeaders<string>(CriticalHintsHeaders)
1918
const userAgent = nuxtApp.ssrContext?._httpClientHintsUserAgent as ReturnType<typeof parseUserAgent>
2019
state.value.critical = extractCriticalHints(

src/runtime/plugins/detect.server.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ import {
66
parseUserAgent,
77
} from 'detect-browser-es'
88
import { appendHeader } from 'h3'
9-
import type { ResolvedHttpClientHintsOptions, UserAgentHints } from '../shared-types/types'
9+
import type { UserAgentHints } from '../shared-types/types'
1010
import { extractBrowser } from '../utils/detect'
11-
import { useHttpClientHintsState } from './state'
11+
import { useHttpClientHintsOptions, useHttpClientHintsState } from './utils'
1212
import {
1313
defineNuxtPlugin,
1414
useNuxtApp,
1515
useRequestEvent,
16-
useRequestHeaders, useRuntimeConfig,
16+
useRequestHeaders,
1717
} from '#imports'
1818
import type { Plugin } from '#app'
1919

@@ -25,7 +25,7 @@ const plugin: Plugin = defineNuxtPlugin({
2525
dependsOn: ['http-client-hints:init-server:plugin'],
2626
async setup() {
2727
const state = useHttpClientHintsState()
28-
const httpClientHints = useRuntimeConfig().public.httpClientHints as ResolvedHttpClientHintsOptions
28+
const httpClientHints = useHttpClientHintsOptions()
2929
const requestHeaders = useRequestHeaders()
3030

3131
const userAgentHeader = requestHeaders['user-agent']

src/runtime/plugins/device.server.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import type { parseUserAgent } from 'detect-browser-es'
22
import { extractDeviceHints, HttpRequestHeaders } from '../utils/device'
3-
import { useHttpClientHintsState } from './state'
3+
import { useHttpClientHintsOptions, useHttpClientHintsState } from './utils'
44
import { writeHeaders } from './headers'
5-
import { defineNuxtPlugin, useRequestHeaders, useRuntimeConfig } from '#imports'
5+
import { defineNuxtPlugin, useRequestHeaders } from '#imports'
66
import type { Plugin } from '#app'
7-
import type { ResolvedHttpClientHintsOptions } from '~/src/runtime/shared-types/types'
87

98
const plugin: Plugin = defineNuxtPlugin({
109
name: 'http-client-hints:device-server:plugin',
@@ -13,9 +12,9 @@ const plugin: Plugin = defineNuxtPlugin({
1312
// @ts-expect-error missing at build time
1413
dependsOn: ['http-client-hints:init-server:plugin'],
1514
setup(nuxtApp) {
16-
const state = useHttpClientHintsState()
1715
const userAgent = nuxtApp.ssrContext?._httpClientHintsUserAgent as ReturnType<typeof parseUserAgent>
18-
const httpClientHints = useRuntimeConfig().public.httpClientHints as ResolvedHttpClientHintsOptions
16+
const state = useHttpClientHintsState()
17+
const httpClientHints = useHttpClientHintsOptions()
1918
const requestHeaders = useRequestHeaders<string>(HttpRequestHeaders)
2019
state.value.device = extractDeviceHints(httpClientHints, requestHeaders, userAgent, writeHeaders)
2120
},

src/runtime/plugins/init.server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { parseUserAgent } from 'detect-browser-es'
2-
import { useHttpClientHintsState } from './state'
2+
import { useHttpClientHintsState } from './utils'
33
import { defineNuxtPlugin, useRequestHeaders } from '#imports'
44
import type { Plugin } from '#app'
55

src/runtime/plugins/network.server.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import type { parseUserAgent } from 'detect-browser-es'
22
import { extractNetworkHints, NetworkHintsHeaders } from '../utils/network'
3-
import { useHttpClientHintsState } from './state'
3+
import { useHttpClientHintsOptions, useHttpClientHintsState } from './utils'
44
import { writeHeaders } from './headers'
5-
import { defineNuxtPlugin, useRequestHeaders, useRuntimeConfig } from '#imports'
5+
import { defineNuxtPlugin, useRequestHeaders } from '#imports'
66
import type { Plugin } from '#app'
7-
import type { ResolvedHttpClientHintsOptions } from '~/src/runtime/shared-types/types'
87

98
const plugin: Plugin = defineNuxtPlugin({
109
name: 'http-client-hints:network-server:plugin',
@@ -15,7 +14,7 @@ const plugin: Plugin = defineNuxtPlugin({
1514
setup(nuxtApp) {
1615
const state = useHttpClientHintsState()
1716
const userAgent = nuxtApp.ssrContext?._httpClientHintsUserAgent as ReturnType<typeof parseUserAgent>
18-
const httpClientHints = useRuntimeConfig().public.httpClientHints as ResolvedHttpClientHintsOptions
17+
const httpClientHints = useHttpClientHintsOptions()
1918
const requestHeaders = useRequestHeaders<string>(NetworkHintsHeaders)
2019
state.value.network = extractNetworkHints(httpClientHints, requestHeaders, userAgent, writeHeaders)
2120
},

src/runtime/plugins/state.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/runtime/plugins/utils.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import type {
2+
HttpClientHintsState,
3+
ResolvedHttpClientHintsOptions,
4+
ServerHttpClientHintsOptions,
5+
} from '../shared-types/types'
6+
import { useAppConfig, useState } from '#imports'
7+
8+
export function useHttpClientHintsState() {
9+
return useState<HttpClientHintsState>('http-client-hints:state', () => ({}))
10+
}
11+
12+
export function useHttpClientHintsOptions(): ResolvedHttpClientHintsOptions {
13+
const { serverImages, ...rest } = useAppConfig().httpClientHints as ServerHttpClientHintsOptions
14+
return {
15+
...rest,
16+
serverImages: serverImages.map(r => new RegExp(r)),
17+
}
18+
}

src/runtime/server/plugin.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,23 @@
11
import { defineNitroPlugin, useAppConfig } from 'nitropack/runtime'
22
import { parseUserAgent } from 'detect-browser-es'
3-
import type { HttpClientHintsState, ResolvedHttpClientHintsOptions } from '../shared-types/types'
3+
import type {
4+
HttpClientHintsState,
5+
ResolvedHttpClientHintsOptions,
6+
ServerHttpClientHintsOptions,
7+
} from '../shared-types/types'
48
import { extractBrowser } from '../utils/detect'
59
import { extractCriticalHints } from '../utils/critical'
610
import { extractDeviceHints } from '../utils/device'
711
import { extractNetworkHints } from '../utils/network'
812

9-
interface ServerRuntimeConfig extends Omit<ResolvedHttpClientHintsOptions, 'serverImages'> {
10-
serverImages: string[]
11-
}
12-
1313
export default defineNitroPlugin((nitroApp) => {
14-
const { serverImages, ...rest } = useAppConfig().httpClientHints as ServerRuntimeConfig
14+
const { serverImages, ...rest } = useAppConfig().httpClientHints as ServerHttpClientHintsOptions
1515
const options: ResolvedHttpClientHintsOptions = {
1616
...rest,
1717
serverImages: serverImages.map(r => new RegExp(r)),
1818
}
19-
console.log(options)
20-
nitroApp.hooks.hook('afterResponse', async (event) => {
21-
// we should add the vary header to the response
19+
nitroApp.hooks.hook('afterResponse', async (_event) => {
20+
// we should add the Vary header to the response: is there a way to check if the response has been committed?
2221
})
2322
nitroApp.hooks.hook('request', async (event) => {
2423
// expose the client hints in the context
@@ -48,15 +47,15 @@ export default defineNitroPlugin((nitroApp) => {
4847
if (detect) {
4948
clientHints.browser = await extractBrowser(options, requestHeaders as Record<string, string>, userAgentHeader ?? undefined)
5049
}
51-
if (critical) {
52-
clientHints.critical = extractCriticalHints(options, requestHeaders, userAgent)
53-
}
5450
if (device) {
5551
clientHints.device = extractDeviceHints(options, requestHeaders, userAgent)
5652
}
5753
if (network) {
5854
clientHints.network = extractNetworkHints(options, requestHeaders, userAgent)
5955
}
56+
if (critical) {
57+
clientHints.critical = extractCriticalHints(options, requestHeaders, userAgent)
58+
}
6059
event.context.httpClientHints = clientHints
6160
}
6261
}

src/runtime/shared-types/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,7 @@ export interface ResolvedHttpClientHintsOptions {
180180
critical?: CriticalClientHintsConfiguration
181181
serverImages?: RegExp[]
182182
}
183+
184+
export interface ServerHttpClientHintsOptions extends Omit<ResolvedHttpClientHintsOptions, 'serverImages'> {
185+
serverImages: string[]
186+
}

src/utils/configuration.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,6 @@ export function configure(ctx: HttpClientHintsContext, nuxt: Nuxt) {
125125
resolvedOptions.detectOS = options.detectOS
126126
}
127127

128-
nuxt.options.runtimeConfig.public.httpClientHints = resolvedOptions
129-
130128
addPlugin(resolver.resolve(runtimeDir, 'plugins/init.server'))
131129

132130
if (resolvedOptions.detectBrowser || resolvedOptions.detectOS || resolvedOptions.userAgent.length) {
@@ -161,21 +159,22 @@ export function configure(ctx: HttpClientHintsContext, nuxt: Nuxt) {
161159
)
162160
}) */
163161

164-
resolvedOptions.serverImages = serverImages
162+
const useServerImages = serverImages
165163
? serverImages === true
166164
? [/\.(png|jpeg|jpg|webp|avi)$/]
167165
: Array.isArray(serverImages)
168166
? serverImages
169167
: [serverImages]
170168
: undefined
171169

170+
const { serverImages: _, ...rest } = resolvedOptions
171+
nuxt.options.appConfig.httpClientHints = {
172+
...rest,
173+
serverImages: useServerImages ? useServerImages.map(r => r.source) : undefined,
174+
}
175+
172176
if (resolvedOptions.serverImages?.length) {
173177
addServerPlugin(resolver.resolve(runtimeDir, 'server/plugin'))
174-
const { serverImages, ...rest } = resolvedOptions
175-
nuxt.options.appConfig.httpClientHints = {
176-
...rest,
177-
serverImages: serverImages.map(r => r.source),
178-
}
179178
/* nuxt.hook('nitro:init', (nitro) => {
180179
nitro.options.appConfig.public ??= {}
181180
nitro.options.appConfig.public.httpClientHints = resolvedOptions

0 commit comments

Comments
 (0)