forked from RobotWebTools/rclnodejs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilter.js
104 lines (90 loc) · 2.13 KB
/
filter.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
const fs = require('fs');
const path = require('path');
const os = require('os');
// blocklist.json format
// [
// {
// pkgName: RegExString,
// interfaceName: RegExString,
// os: RegExString
// },
// ...
// ]
//
// examples
// [
// {
// "pkgName": "action*"
// },
// {
// "pkgName": "std_msgs",
// },
// {
// "pkgName": "std_msgs",
// "interfaceName": "String"
// },
// {
// "os": "Linux"
// },
// ]
const RosPackageFilters = {
filters: [],
_loaded: false,
addFilter: function (pkgName, interfaceName, os) {
this.filters.push({
pkgName: pkgName,
interfaceName: interfaceName,
os: os,
});
},
_matches: function (filter, pkgInfo) {
if (filter.os && filter.os.test(os.type())) {
return true;
}
if (filter.pkgName) {
if (filter.pkgName.test(pkgInfo.pkgName)) {
if (!filter.interfaceName) {
return true;
}
} else {
return false;
}
}
if (
filter.interfaceName &&
filter.interfaceName.test(pkgInfo.interfaceName)
) {
return true;
}
return false;
},
load: function (
blocklistPath = path.join(__dirname, '../rosidl_gen/blocklist.json')
) {
this._loaded = true;
if (!fs.existsSync(blocklistPath)) return;
// eslint-disable-next-line
let blocklistData = JSON.parse(fs.readFileSync(blocklistPath, 'utf8'));
let filters = blocklistData.map((pkgFilterData) => {
let filter = {};
if (pkgFilterData['pkgName']) {
filter.pkgName = new RegExp(pkgFilterData.pkgName);
}
if (pkgFilterData['interfaceName']) {
filter.interfaceName = new RegExp(pkgFilterData.interfaceName);
}
if (pkgFilterData['os']) {
filter.os = new RegExp(pkgFilterData.os);
}
return filter;
});
this.filters = filters.filter(
(filter) => !filter.os || filter.os.test(os.type())
);
},
matchesAny: function (pkgInfo) {
if (!this._loaded) this.load();
return this.filters.some((filter) => this._matches(filter, pkgInfo));
},
};
module.exports = RosPackageFilters;