forked from vercel/next.js
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrequired-scripts.tsx
More file actions
77 lines (71 loc) · 2.23 KB
/
required-scripts.tsx
File metadata and controls
77 lines (71 loc) · 2.23 KB
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
import { encodeURIPath } from '../../shared/lib/encode-uri-path'
import type { BuildManifest } from '../get-page-files'
import ReactDOM from 'react-dom'
export function getRequiredScripts(
buildManifest: BuildManifest,
assetPrefix: string,
crossOrigin: undefined | '' | 'anonymous' | 'use-credentials',
SRIManifest: undefined | Record<string, string>,
qs: string,
nonce: string | undefined,
pagePath: string
): [
() => void,
{ src: string; integrity?: string; crossOrigin?: string | undefined },
] {
let preinitScripts: () => void
let preinitScriptCommands: string[] = []
const bootstrapScript: {
src: string
integrity?: string
crossOrigin?: string | undefined
} = {
src: '',
crossOrigin,
}
const files = (
buildManifest.rootMainFilesTree?.[pagePath] || buildManifest.rootMainFiles
).map(encodeURIPath)
if (files.length === 0) {
throw new Error(
'Invariant: missing bootstrap script. This is a bug in Next.js'
)
}
if (SRIManifest) {
bootstrapScript.src = `${assetPrefix}/_next/` + files[0] + qs
bootstrapScript.integrity = SRIManifest[files[0]]
for (let i = 1; i < files.length; i++) {
const src = `${assetPrefix}/_next/` + files[i] + qs
const integrity = SRIManifest[files[i]]
preinitScriptCommands.push(src, integrity)
}
preinitScripts = () => {
// preinitScriptCommands is a double indexed array of src/integrity pairs
for (let i = 0; i < preinitScriptCommands.length; i += 2) {
ReactDOM.preinit(preinitScriptCommands[i], {
as: 'script',
integrity: preinitScriptCommands[i + 1],
crossOrigin,
nonce,
})
}
}
} else {
bootstrapScript.src = `${assetPrefix}/_next/` + files[0] + qs
for (let i = 1; i < files.length; i++) {
const src = `${assetPrefix}/_next/` + files[i] + qs
preinitScriptCommands.push(src)
}
preinitScripts = () => {
// preinitScriptCommands is a singled indexed array of src values
for (let i = 0; i < preinitScriptCommands.length; i++) {
ReactDOM.preinit(preinitScriptCommands[i], {
as: 'script',
nonce,
crossOrigin,
})
}
}
}
return [preinitScripts, bootstrapScript]
}