Skip to content

Commit 333244d

Browse files
committed
chore: add features module
1 parent 8a3dc15 commit 333244d

File tree

4 files changed

+42
-84
lines changed

4 files changed

+42
-84
lines changed

src/runtime/plugins/critical.server.ts

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
} from '../shared-types/types'
77
import { useHttpClientHintsState } from './state'
88
import { lookupHeader, writeClientHintHeaders, writeHeaders } from './headers'
9+
import { browserFeatureAvailable } from './features'
910
import {
1011
defineNuxtPlugin,
1112
useCookie,
@@ -100,31 +101,6 @@ const allowedBrowsers: [browser: Browser, features: BrowserFeatures][] = [
100101

101102
const ClientHeaders = ['Accept-CH', 'Vary', 'Critical-CH']
102103

103-
function browserFeatureAvailable(userAgent: ReturnType<typeof parseUserAgent>, feature: AcceptClientHintsHeadersKey) {
104-
if (userAgent == null || userAgent.type !== 'browser')
105-
return false
106-
107-
try {
108-
const browserName = userAgent.name
109-
const android = userAgent.os?.toLowerCase().startsWith('android') ?? false
110-
const versions = userAgent.version.split('.').map(v => Number.parseInt(v))
111-
return allowedBrowsers.some(([name, check]) => {
112-
if (browserName !== name)
113-
return false
114-
115-
try {
116-
return check[feature](android, versions)
117-
}
118-
catch {
119-
return false
120-
}
121-
})
122-
}
123-
catch {
124-
return false
125-
}
126-
}
127-
128104
function lookupClientHints(
129105
userAgent: ReturnType<typeof parseUserAgent>,
130106
criticalClientHintsConfiguration: CriticalClientHintsConfiguration,
@@ -145,21 +121,21 @@ function lookupClientHints(
145121
return features
146122

147123
if (criticalClientHintsConfiguration.prefersColorScheme)
148-
features.prefersColorSchemeAvailable = browserFeatureAvailable(userAgent, 'prefersColorScheme')
124+
features.prefersColorSchemeAvailable = browserFeatureAvailable(allowedBrowsers, userAgent, 'prefersColorScheme')
149125

150126
if (criticalClientHintsConfiguration.prefersReducedMotion)
151-
features.prefersReducedMotionAvailable = browserFeatureAvailable(userAgent, 'prefersReducedMotion')
127+
features.prefersReducedMotionAvailable = browserFeatureAvailable(allowedBrowsers, userAgent, 'prefersReducedMotion')
152128

153129
if (criticalClientHintsConfiguration.prefersReducedTransparency)
154-
features.prefersReducedMotionAvailable = browserFeatureAvailable(userAgent, 'prefersReducedTransparency')
130+
features.prefersReducedMotionAvailable = browserFeatureAvailable(allowedBrowsers, userAgent, 'prefersReducedTransparency')
155131

156132
if (criticalClientHintsConfiguration.viewportSize) {
157-
features.viewportHeightAvailable = browserFeatureAvailable(userAgent, 'viewportHeight')
158-
features.viewportWidthAvailable = browserFeatureAvailable(userAgent, 'viewportWidth')
133+
features.viewportHeightAvailable = browserFeatureAvailable(allowedBrowsers, userAgent, 'viewportHeight')
134+
features.viewportWidthAvailable = browserFeatureAvailable(allowedBrowsers, userAgent, 'viewportWidth')
159135
}
160136

161137
if (criticalClientHintsConfiguration.width) {
162-
features.widthAvailable = browserFeatureAvailable(userAgent, 'width')
138+
features.widthAvailable = browserFeatureAvailable(allowedBrowsers, userAgent, 'width')
163139
}
164140

165141
if (features.viewportWidthAvailable || features.viewportHeightAvailable) {
@@ -173,7 +149,7 @@ function lookupClientHints(
173149
headers,
174150
)
175151
if (mobileHeader)
176-
features.devicePixelRatioAvailable = browserFeatureAvailable(userAgent, 'devicePixelRatio')
152+
features.devicePixelRatioAvailable = browserFeatureAvailable(allowedBrowsers, userAgent, 'devicePixelRatio')
177153
}
178154

179155
return features

src/runtime/plugins/device.server.ts

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
} from '../shared-types/types'
77
import { useHttpClientHintsState } from './state'
88
import { type GetHeaderType, lookupHeader, writeClientHintHeaders, writeHeaders } from './headers'
9+
import { browserFeatureAvailable } from './features'
910
import { defineNuxtPlugin, useRequestHeaders, useRuntimeConfig } from '#imports'
1011

1112
const DeviceClientHintsHeaders: Record<DeviceHints, string> = {
@@ -67,31 +68,6 @@ const allowedBrowsers: [browser: Browser, features: BrowserFeatures][] = [
6768

6869
const ClientHeaders = ['Accept-CH']
6970

70-
function browserFeatureAvailable(userAgent: ReturnType<typeof parseUserAgent>, feature: DeviceClientHintsHeadersKey) {
71-
if (userAgent == null || userAgent.type !== 'browser')
72-
return false
73-
74-
try {
75-
const browserName = userAgent.name
76-
const android = userAgent.os?.toLowerCase().startsWith('android') ?? false
77-
const versions = userAgent.version.split('.').map(v => Number.parseInt(v))
78-
return allowedBrowsers.some(([name, check]) => {
79-
if (browserName !== name)
80-
return false
81-
82-
try {
83-
return check[feature](android, versions)
84-
}
85-
catch {
86-
return false
87-
}
88-
})
89-
}
90-
catch {
91-
return false
92-
}
93-
}
94-
9571
function lookupClientHints(
9672
userAgent: ReturnType<typeof parseUserAgent>,
9773
deviceHints: DeviceHints[],
@@ -104,7 +80,7 @@ function lookupClientHints(
10480
return features
10581

10682
for (const hint of deviceHints) {
107-
features[`${hint}Available`] = browserFeatureAvailable(userAgent, hint)
83+
features[`${hint}Available`] = browserFeatureAvailable(allowedBrowsers, userAgent, hint)
10884
}
10985

11086
return features

src/runtime/plugins/features.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import type { Browser, parseUserAgent } from 'detect-browser-es'
2+
3+
export function browserFeatureAvailable<T extends string>(
4+
allowedBrowsers: [browser: Browser, features: Record<T, (android: boolean, versions: number[]) => boolean>][],
5+
userAgent: ReturnType<typeof parseUserAgent>,
6+
feature: T,
7+
) {
8+
if (userAgent == null || userAgent.type !== 'browser')
9+
return false
10+
11+
try {
12+
const browserName = userAgent.name
13+
const android = userAgent.os?.toLowerCase().startsWith('android') ?? false
14+
const versions = userAgent.version.split('.').map(v => Number.parseInt(v))
15+
return allowedBrowsers.some(([name, check]) => {
16+
if (browserName !== name)
17+
return false
18+
19+
try {
20+
return check[feature](android, versions)
21+
}
22+
catch {
23+
return false
24+
}
25+
})
26+
}
27+
catch {
28+
return false
29+
}
30+
}

src/runtime/plugins/network.server.ts

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { NetworkInfo, NetworkHints, ResolvedHttpClientHintsOptions } from '
33
import { useHttpClientHintsState } from './state'
44
import type { GetHeaderType } from './headers'
55
import { lookupHeader, writeClientHintHeaders, writeHeaders } from './headers'
6+
import { browserFeatureAvailable } from './features'
67
import { defineNuxtPlugin, useRequestHeaders, useRuntimeConfig } from '#imports'
78

89
const NetworkClientHintsHeaders: Record<NetworkHints, string> = {
@@ -82,31 +83,6 @@ const allowedBrowsers: [browser: Browser, features: BrowserFeatures][] = [
8283

8384
const ClientHeaders = ['Accept-CH', 'Vary']
8485

85-
function browserFeatureAvailable(userAgent: ReturnType<typeof parseUserAgent>, feature: NetworkClientHintsHeadersKey) {
86-
if (userAgent == null || userAgent.type !== 'browser')
87-
return false
88-
89-
try {
90-
const browserName = userAgent.name
91-
const android = userAgent.os?.toLowerCase().startsWith('android') ?? false
92-
const versions = userAgent.version.split('.').map(v => Number.parseInt(v))
93-
return allowedBrowsers.some(([name, check]) => {
94-
if (browserName !== name)
95-
return false
96-
97-
try {
98-
return check[feature](android, versions)
99-
}
100-
catch {
101-
return false
102-
}
103-
})
104-
}
105-
catch {
106-
return false
107-
}
108-
}
109-
11086
function lookupClientHints(
11187
userAgent: ReturnType<typeof parseUserAgent>,
11288
networkHints: NetworkHints[],
@@ -122,7 +98,7 @@ function lookupClientHints(
12298
return features
12399

124100
for (const hint of networkHints) {
125-
features[`${hint}Available`] = browserFeatureAvailable(userAgent, hint)
101+
features[`${hint}Available`] = browserFeatureAvailable(allowedBrowsers, userAgent, hint)
126102
}
127103

128104
return features

0 commit comments

Comments
 (0)