-
Notifications
You must be signed in to change notification settings - Fork 61
/
prerenderObjs.js
60 lines (52 loc) · 1.53 KB
/
prerenderObjs.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
/* eslint no-console: "off" */
import * as Scrivito from "scrivito";
import { chunk } from "lodash-es";
import prerenderObj from "./prerenderObj";
export default async function prerenderObjs(
objClassesBlacklist,
storeResult,
reportError
) {
console.time("[prerenderObjs]");
console.time("Loading all objs");
const objs = await Scrivito.load(() => allObjs(objClassesBlacklist));
console.timeEnd("Loading all objs");
console.log(`Loaded ${objs.length} objs`);
let failedCount = 0;
const objsGroups = chunk(objs, 10);
await asyncForEachSequential(objsGroups, async objsGroup =>
asyncForEach(objsGroup, async obj => {
try {
const prerenderedFiles = await prerenderObj(obj);
await asyncForEach(prerenderedFiles, storeResult);
} catch (e) {
failedCount += 1;
const pageId = obj.id();
const pageUrl = Scrivito.urlFor(obj);
reportError(
`Error while processing obj ${pageId} (${pageUrl}). Skipping file.`,
e.message,
e
);
}
})
);
console.timeEnd("[prerenderObjs]");
if (failedCount) {
reportError(`Skipped ${failedCount} objs due to failures.`);
}
}
function allObjs(objClassesBlacklist) {
return Scrivito.Obj.all()
.andNot("_objClass", "equals", objClassesBlacklist)
.take();
}
async function asyncForEach(items, fn) {
return Promise.all(items.map(fn));
}
async function asyncForEachSequential(items, fn) {
return items.reduce(async (promise, item) => {
await promise;
return fn(item);
}, true);
}