-
Notifications
You must be signed in to change notification settings - Fork 16
/
_makeQueue.mjs
37 lines (32 loc) · 1.1 KB
/
_makeQueue.mjs
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
import { _find } from './_utils';
/**
* @param {object} preparedSchema - schema already validated
* with modified prop values to avoid clashes.
* @param {object} originalSchema - User provided schema
* => contains array stringification serializers that are lost during preparation.
*/
export default (preparedSchema, originalSchema) => {
const queue = [];
// Defining a function inside an other function is slow.
// However it's OK for this use case as the queue creation is not time critical.
(function scoped(obj, acc = []) {
if (/__sjs/.test(obj)) {
const usedAcc = Array.from(acc);
const find = _find(usedAcc);
const { serializer } = find(originalSchema);
queue.push({
serializer,
find,
name: acc[acc.length - 1],
});
return;
}
// Recursively going deeper.
// NOTE: While going deeper, the current prop is pushed into the accumulator
// to keep track of the position inside of the object.
return Object
.keys(obj)
.map(prop => scoped(obj[prop], [...acc, prop]));
})(preparedSchema);
return queue;
};