forked from mdn/browser-compat-data
/
traverse.js
88 lines (83 loc) · 2.47 KB
/
traverse.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
'use strict';
const bcd = require('..');
const { argv } = require('yargs').command(
'$0 <browser> [folder] [value]',
'Test for specified values in any specified browser',
yargs => {
yargs
.positional('browser', {
describe: 'The browser to test for',
type: 'string',
})
.positional('folder', {
describe: 'The folder(s) to test (set to "all" for all folders)',
type: 'string',
default: 'all',
})
.positional('value', {
describe: 'The value(s) to test against',
type: 'string',
default: 'null,true',
})
.option('depth', {
alias: 'd',
describe:
'Depth of features to traverse (ex. "2" will capture "api.CSSStyleSheet.insertRule" but not "api.CSSStyleSheet.insertRule.optional_index")',
type: 'number',
default: 100,
});
},
);
function traverseFeatures(obj, depth, identifier) {
depth--;
if (depth >= 0) {
for (const i in obj) {
if (!!obj[i] && typeof obj[i] == 'object' && i !== '__compat') {
if (obj[i].__compat) {
const comp = obj[i].__compat.support;
let browser = comp[argv.browser];
if (!Array.isArray(browser)) {
browser = [browser];
}
for (const range in browser) {
if (browser[range] === undefined) {
if (values.includes('null')) features.push(`${identifier}${i}`);
} else if (
values.includes(String(browser[range].version_added)) ||
values.includes(String(browser[range].version_removed))
) {
let f = `${identifier}${i}`;
if (browser[range].prefix)
f += ` (${browser[range].prefix} prefix)`;
if (browser[range].alternative_name)
f += ` (as ${browser[range].alternative_name})`;
features.push(f);
}
}
}
traverseFeatures(obj[i], depth, identifier + i + '.');
}
}
}
}
let features = [];
const folders =
argv.folder == 'all'
? [
'api',
'css',
'html',
'http',
'svg',
'javascript',
'mathml',
'webdriver',
'xpath',
'xslt',
]
: argv.folder.split(',');
const values = argv.value.split(',');
for (const folder in folders)
traverseFeatures(bcd[folders[folder]], argv.depth, `${folders[folder]}.`);
console.log(features.join('\n'));
console.log(features.length);