/
validate-local-font-function-call.ts
113 lines (103 loc) · 2.34 KB
/
validate-local-font-function-call.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import { allowedDisplayValues } from '../constants'
import { formatAvailableValues } from '../format-available-values'
import { nextFontError } from '../next-font-error'
const extToFormat = {
woff: 'woff',
woff2: 'woff2',
ttf: 'truetype',
otf: 'opentype',
eot: 'embedded-opentype',
}
type FontOptions = {
src: Array<{
path: string
weight?: string
style?: string
ext: string
format: string
}>
display: string
weight?: string
style?: string
fallback?: string[]
preload: boolean
variable?: string
adjustFontFallback?: string | false
declarations?: Array<{ prop: string; value: string }>
}
/**
* Validate the data recieved from next-swc next-transform-font on next/font/local calls
*/
export function validateLocalFontFunctionCall(
functionName: string,
fontData: any
): FontOptions {
if (functionName) {
nextFontError(`next/font/local has no named exports`)
}
let {
src,
display = 'swap',
weight,
style,
fallback,
preload = true,
variable,
adjustFontFallback,
declarations,
} = fontData || ({} as any)
if (!allowedDisplayValues.includes(display)) {
nextFontError(
`Invalid display value \`${display}\`.\nAvailable display values: ${formatAvailableValues(
allowedDisplayValues
)}`
)
}
if (!src) {
nextFontError('Missing required `src` property')
}
if (!Array.isArray(src)) {
src = [{ path: src, weight, style }]
} else {
if (src.length === 0) {
nextFontError('Unexpected empty `src` array.')
}
}
src = src.map((fontFile: any) => {
const ext = /\.(woff|woff2|eot|ttf|otf)$/.exec(fontFile.path)?.[1]
if (!ext) {
nextFontError(`Unexpected file \`${fontFile.path}\``)
}
return {
...fontFile,
ext,
format: extToFormat[ext as 'woff' | 'woff2' | 'eot' | 'ttf' | 'otf'],
}
})
if (Array.isArray(declarations)) {
declarations.forEach((declaration) => {
if (
[
'font-family',
'src',
'font-display',
'font-weight',
'font-style',
].includes(declaration?.prop)
) {
nextFontError(`Invalid declaration prop: \`${declaration.prop}\``)
}
})
}
return {
src,
display,
weight,
style,
fallback,
preload,
variable,
adjustFontFallback,
declarations,
}
}