1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- 'use strict';
- var clone = require('../utils/clone');
- var parser = require('../parser');
- var transform = require('../transform');
- var optimizationTransforms = require('./transforms');
- module.exports = {
-
- optimize: function optimize(regexp) {
- var transformsWhitelist = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
- var transformToApply = transformsWhitelist.length > 0 ? transformsWhitelist : Object.keys(optimizationTransforms);
- var ast = regexp;
- if (regexp instanceof RegExp) {
- regexp = '' + regexp;
- }
- if (typeof regexp === 'string') {
- ast = parser.parse(regexp);
- }
- var result = new transform.TransformResult(ast);
- var prevResultString = void 0;
- do {
-
-
-
- prevResultString = result.toString();
- ast = clone(result.getAST());
- transformToApply.forEach(function (transformName) {
- if (!optimizationTransforms.hasOwnProperty(transformName)) {
- throw new Error('Unknown optimization-transform: ' + transformName + '. ' + 'Available transforms are: ' + Object.keys(optimizationTransforms).join(', '));
- }
- var transformer = optimizationTransforms[transformName];
-
-
- var newResult = transform.transform(ast, transformer);
- if (newResult.toString() !== result.toString()) {
- if (newResult.toString().length <= result.toString().length) {
- result = newResult;
- } else {
-
-
- ast = clone(result.getAST());
- }
- }
- });
-
-
- } while (result.toString() !== prevResultString);
- return result;
- }
- };
|