/
netlify-headers.js
99 lines (71 loc) · 2.85 KB
/
netlify-headers.js
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
var AssetGraph = require('assetgraph');
var headers = [
'Content-Security-Policy'
];
var resourceHintTypeMap = {
HtmlPreloadLink: 'preload',
HtmlPrefetchLink: 'prefetch',
HtmlPreconnectLink: 'preconnect',
HtmlDnsPrefetchLink: 'dns-prefetch'
};
function getHeaderForRelation (rel) {
let header = `Link: <${rel.href}>; rel=${resourceHintTypeMap[rel.type]}; as=${rel.as}; type=${rel.to.contentType}`;
if (rel.as === 'font') {
header = `${header}; crossorigin=anonymous`;
}
return header;
}
new AssetGraph({ root: 'docs/_dist' })
.loadAssets('*.html')
.populate({
followRelations: { type: 'HtmlAnchor', crossorigin: false }
})
.queue(function (assetGraph) {
var assets = assetGraph.findAssets({ type: 'Html', isInline: false });
var headerMap = {};
assets.forEach(function (asset) {
var url = '/' + asset.url.replace(assetGraph.root, '').replace(/#.*/, '').replace('index.html', '');
if (!headerMap[url]) {
headerMap[url] = [];
}
headers.forEach(function (header) {
var node = asset.parseTree.querySelector('meta[http-equiv=' + header + ']');
if (node) {
headerMap[url].push(`${header}: ${node.getAttribute('content')}`)
node.parentNode.removeChild(node);
asset.markDirty();
}
});
var firstCssRel = asset.outgoingRelations.filter(r => {
return r.type === 'HtmlStyle'
&& r.crossorigin === false
&& r.href !== undefined;
})[0];
if (firstCssRel) {
const header = `Link: <${firstCssRel.href}>; rel=preload; as=style`;
headerMap[url].push(header);
}
var resourceHintRelations = asset.outgoingRelations.filter(r => ['HtmlPreloadLink', 'HtmlPrefetchLink'].includes(r.type));
resourceHintRelations.forEach(rel => {
headerMap[url].push(getHeaderForRelation(rel));
rel.detach();
});
var resourceHintRelations = asset.outgoingRelations.filter(r => ['HtmlPreconnectLink'].includes(r.type));
resourceHintRelations.forEach(rel => {
let header = `Link: <${rel.href}>; rel=preconnect`;
headerMap[url].push(header);
rel.detach();
});
});
console.log('\n## Autogenerated headers:\n')
Object.keys(headerMap).forEach(function (url) {
console.log(url);
var httpHeaders = headerMap[url];
httpHeaders.forEach(function (header) {
console.log(` ${header}`)
});
console.log('');
});
})
.writeAssetsToDisc({ isLoaded: true })
.run();