Skip to content

Commit 30648ce

Browse files
committed
✨ Use AST to verify whether regexes are safe
1 parent 29d5e43 commit 30648ce

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@
160160
]
161161
},
162162
"devDependencies": {
163+
"@babel/parser": "7.15.8",
164+
"@babel/traverse": "7.15.4",
163165
"jshint": "~2.12.0",
164166
"mocha": "~8.2.0",
165167
"requirejs": "^2.3.2",

test/test.js

+15-6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ var fs = require('fs');
22
var safe = require('safe-regex');
33
var assert = require('assert');
44
var requirejs = require('requirejs');
5+
var parseJS = require('@babel/parser').parse;
6+
var traverse = require('@babel/traverse').default;
57
var UAParser = require('./../src/ua-parser');
68
var browsers = require('./browser-test.json');
79
var cpus = require('./cpu-test.json');
@@ -137,12 +139,19 @@ describe('Testing regexes', function () {
137139

138140
var regexes;
139141

140-
// todo: use AST-based instead of grep
141-
before('Read main js file', function (done) {
142-
fs.readFile('src/ua-parser.js', 'utf8', function (err, data) {
143-
regexes = data.match(/(\/.+\/[ig]+)(?=[,\s\n])/g);
144-
done();
142+
before('Read main js file', function () {
143+
var code = fs.readFileSync('src/ua-parser.js', 'utf8').toString();
144+
var ast = parseJS(code, { sourceType: "script" });
145+
regexes = [];
146+
traverse(ast, {
147+
RegExpLiteral: (path) => {
148+
regexes.push(path.node.pattern);
149+
}
145150
});
151+
152+
if (regexes.length === 0) {
153+
throw new Error("Regexes cannot be empty!");
154+
}
146155
});
147156

148157
describe('Begin testing', function () {
@@ -156,4 +165,4 @@ describe('Testing regexes', function () {
156165
});
157166
});
158167
});
159-
})
168+
});

0 commit comments

Comments
 (0)