-
Notifications
You must be signed in to change notification settings - Fork 8
/
optionalTest_6_2_13.js
40 lines (36 loc) · 1.05 KB
/
optionalTest_6_2_13.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
/**
* @param {any} doc
*/
export default function optionalTest_6_2_13(doc) {
const ctx = {
warnings:
/** @type {Array<{ instancePath: string; message: string }>} */ ([]),
}
/**
* @param {Intl.Collator} collator
* @param {string} prefix
* @param {unknown} obj
* @returns {unknown}
*/
const checkObjectKeysSorting = (collator, prefix, obj) => {
if (typeof obj !== 'object' || obj == null) return
if (Array.isArray(obj)) {
obj.forEach((e, i) => {
checkObjectKeysSorting(collator, prefix + '/' + i, e)
})
}
const keys = /** @type {Array<keyof obj>} */ (Object.keys(obj))
const expectedKeys = keys.slice().sort((a, z) => collator.compare(a, z))
if (JSON.stringify(keys) !== JSON.stringify(expectedKeys)) {
ctx.warnings.push({
instancePath: prefix,
message: 'not sorted alphabetically',
})
}
for (const key of keys) {
checkObjectKeysSorting(collator, prefix + '/' + key, obj[key])
}
}
checkObjectKeysSorting(new Intl.Collator(), '', doc)
return ctx
}