forked from adamlaska/browser-compat-data
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtraverse.js
More file actions
79 lines (74 loc) · 2.42 KB
/
traverse.js
File metadata and controls
79 lines (74 loc) · 2.42 KB
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
'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: 'array',
default: 'all',
})
.positional('value', {
describe: 'The value(s) to test against',
type: 'array',
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']
: argv.folder.split(',');
const values = Array.isArray(argv.value)
? argv.value
: argv.value.toString().split(',');
for (const folder in folders)
traverseFeatures(bcd[folders[folder]], argv.depth, `${folders[folder]}.`);
console.log(features.join('\n'));
console.log(features.length);