Skip to content

Commit 2971f85

Browse files
feat(regex): Add support for pluggable regex engines for use in evaluation (#491)
1 parent 68346a6 commit 2971f85

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

src/jsonata.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -1088,7 +1088,7 @@ var jsonata = (function() {
10881088
* @returns {Function} Higher order function representing prepared regex
10891089
*/
10901090
function evaluateRegex(expr) {
1091-
var re = new RegExp(expr.value);
1091+
var re = new jsonata.RegexEngine(expr.value);
10921092
var closure = function(str, fromIndex) {
10931093
var result;
10941094
re.lastIndex = fromIndex || 0;
@@ -2041,7 +2041,9 @@ var jsonata = (function() {
20412041
/**
20422042
* JSONata
20432043
* @param {Object} expr - JSONata expression
2044-
* @param {boolean} options - recover: attempt to recover on parse error
2044+
* @param {Object} options
2045+
* @param {boolean} options.recover: attempt to recover on parse error
2046+
* @param {Function} options.RegexEngine: RegEx class constructor to use
20452047
* @returns {{evaluate: evaluate, assign: assign}} Evaluated expression
20462048
*/
20472049
function jsonata(expr, options) {
@@ -2066,6 +2068,12 @@ var jsonata = (function() {
20662068
return timestamp.getTime();
20672069
}, '<:n>'));
20682070

2071+
if(options && options.RegexEngine) {
2072+
jsonata.RegexEngine = options.RegexEngine;
2073+
} else {
2074+
jsonata.RegexEngine = RegExp;
2075+
}
2076+
20692077
return {
20702078
evaluate: function (input, bindings, callback) {
20712079
// throw if the expression compiled with syntax errors

test/parser-pluggable-regex.js

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"use strict";
2+
3+
var jsonata = require('../src/jsonata');
4+
var assert = require('assert');
5+
var chai = require("chai");
6+
var expect = chai.expect;
7+
8+
describe('Invoke parser with custom RegexEngine param', function() {
9+
10+
var regexContentSpy = null;
11+
var regexEvalSpy = null;
12+
13+
function RegexEngineSpy(content) {
14+
regexContentSpy = content;
15+
16+
this.exec = function(input) {
17+
regexEvalSpy = input;
18+
return null;
19+
}
20+
}
21+
22+
it('should call RegexEngine param constructure during evaluation', function() {
23+
var expr = jsonata('$replace(\"foo\", /bar/, \"baaz\")', { RegexEngine: RegexEngineSpy });
24+
expr.evaluate()
25+
assert.deepEqual(regexContentSpy.toString(), "/bar/g");
26+
assert.deepEqual(regexEvalSpy, "foo");
27+
});
28+
});

0 commit comments

Comments
 (0)