Skip to content

Commit

Permalink
merged with master
Browse files Browse the repository at this point in the history
  • Loading branch information
dangreen committed May 1, 2019
2 parents 9a0dd9e + 93fd6a9 commit c1e8b72
Show file tree
Hide file tree
Showing 25 changed files with 1,891 additions and 1,074 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,7 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## [1.0.3-beta] - 2019-04-07
### Fixed
- [#11](https://github.com/browserslist/browserslist-useragent-regexp/issues/11)
14 changes: 3 additions & 11 deletions examples/buildDemo.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,6 @@ function renderUserAgentRegExp({
family,
sourceRegExpString,
regExpString,
resultVersion,
requestVersionsStrings
}, query) {
return `<li>
Expand All @@ -132,16 +131,9 @@ function renderUserAgentRegExp({
<tr>
<th>Source RegExp:</th><td><pre>${sourceRegExpString}</pre></td>
</tr>
${!resultVersion ? '' : `
<tr>
<th>Source RegExp version:</th><td>${resultVersion.join('.')}</td>
</tr>
`}
${resultVersion ? '' : `
<tr>
<th>Versioned RegExp:</th><td><pre>${regExpString}</pre></td>
</tr>
`}
<tr>
<th>Versioned RegExp:</th><td><pre>${regExpString}</pre></td>
</tr>
</table>
</li>`;
}
Expand Down
15 changes: 8 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "browserslist-useragent-regexp",
"version": "1.0.2-beta",
"version": "1.0.3-beta",
"description": "A utility to compile browserslist query to a RegExp to test browser useragent.",
"author": "dangreen",
"license": "MIT",
Expand Down Expand Up @@ -37,17 +37,17 @@
"regexp"
],
"dependencies": {
"@babel/runtime": "^7.4.2",
"@babel/runtime": "^7.4.3",
"@types/node": "^11.12.2",
"argue-cli": "^1.2.0",
"browserslist": "^4.5.3",
"browserslist": "^4.5.6",
"chalk": "^2.4.2",
"core-js": "^3.0.0",
"easy-table": "^1.1.1",
"useragent": "^2.3.0"
},
"devDependencies": {
"@babel/core": "7.4.0",
"@babel/core": "7.4.3",
"@types/jest": "^24.0.11",
"babel-jest": "^24.3.0",
"babel-preset-trigen": "^2.2.1",
Expand All @@ -58,14 +58,15 @@
"del-cli": "^1.1.0",
"eslint": "^5.12.0",
"eslint-config-trigen": "^3.2.1",
"husky": "^1.3.1",
"husky": "^2.0.0",
"jest": "^24.3.0",
"lint-staged": "^8.1.0",
"rollup": "^1.7.1",
"rollup": "^1.10.1",
"rollup-plugin-babel": "^4.2.0",
"rollup-plugin-commonjs": "^9.3.4",
"rollup-plugin-shebang": "^0.1.5",
"rollup-plugin-tslint": "^0.2.2",
"rollup-plugin-typescript2": "^0.20.1",
"rollup-plugin-typescript2": "^0.21.0",
"size-limit": "^1.0.0",
"ts-node": "^8.0.3",
"tslint": "^5.12.0",
Expand Down
6 changes: 5 additions & 1 deletion rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import commonjs from 'rollup-plugin-commonjs';
import babel from 'rollup-plugin-babel';
import typescript from 'rollup-plugin-typescript2';
import tslint from 'rollup-plugin-tslint';
import shebang from 'rollup-plugin-shebang';
import { DEFAULT_EXTENSIONS } from '@babel/core';
import pkg from './package.json';

Expand Down Expand Up @@ -43,7 +44,10 @@ export default [{
}
}, {
input: 'src/cli.ts',
plugins,
plugins: [
...plugins,
shebang()
],
external: () => true,
output: {
file: 'lib/cli.js',
Expand Down
34 changes: 29 additions & 5 deletions src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
browserVersionsToRanges,
getRegExpsForBrowsers,
applyVersionsToRegExps,
optimizeAll,
joinVersionedBrowsersRegExps,
isAllVersion,
defaultOptions
Expand Down Expand Up @@ -124,16 +125,19 @@ if (verbose) {
const rangedBrowsers = browserVersionsToRanges(mergedBrowsers);
const sourceRegExps = getRegExpsForBrowsers(mergedBrowsers, options);
const regExps = applyVersionsToRegExps(sourceRegExps, rangedBrowsers, options);
const optimizedRegExps = optimizeAll(regExps);

console.log(
chalk.blue('\n> RegExps\n')
);

regExps.forEach(({
optimizedRegExps.forEach(({
family,
requestVersionsStrings,
sourceRegExp,
resultVersion,
resultFixedVersion,
resultMinVersion,
resultMaxVersion,
regExp
}) => {

Expand All @@ -151,8 +155,28 @@ if (verbose) {
regExpsTable.cell('Value', sourceRegExp);
regExpsTable.newRow();

regExpsTable.cell('Name', chalk.yellow('Source RegExp version:'));
regExpsTable.cell('Value', resultVersion && resultVersion.join('.'));
regExpsTable.cell('Name', chalk.yellow('Source RegExp fixed version:'));
regExpsTable.cell('Value', resultFixedVersion ? resultFixedVersion.join('.') : '...');
regExpsTable.newRow();

let regExpBrowsersVersion = '';

if (resultMinVersion) {
regExpBrowsersVersion = resultMinVersion.join('.');
} else {
regExpBrowsersVersion = '...';
}

regExpBrowsersVersion += ' - ';

if (resultMaxVersion) {
regExpBrowsersVersion += resultMaxVersion.join('.');
} else {
regExpBrowsersVersion += '...';
}

regExpsTable.cell('Name', chalk.yellow('Source RegExp browsers versions:'));
regExpsTable.cell('Value', regExpBrowsersVersion);
regExpsTable.newRow();

regExpsTable.cell('Name', chalk.yellow('Versioned RegExp:'));
Expand All @@ -162,7 +186,7 @@ if (verbose) {
console.log(`${regExpsTable.print()}\n`);
});

const regExpStr = joinVersionedBrowsersRegExps(regExps);
const regExpStr = joinVersionedBrowsersRegExps(optimizedRegExps);
const regExp = new RegExp(regExpStr);

console.log(regExp);
Expand Down
1 change: 1 addition & 0 deletions src/regexp/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export * from './util';
export * from './optimize';
export * from './numberRay';
export * from './numberSegment';
export * from './numberRange';
Expand Down
112 changes: 3 additions & 109 deletions src/regexp/numbersPart.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,117 +2,11 @@ import {
BRACED_NUMBER_PATTERN,
ESCAPE_SYMBOL,
getNumberPatternsCount,
regExpToString
regExpToString,
skipSquareBraces,
capturePostfix
} from './util';

/**
* Skip every char inside square braces.
* @param skip - Current skip state.
* @param prevChar - Previous char.
* @param char - Current char to check.
* @return Should skip this char or not.
*/
function skipSquareBraces(skip: boolean, prevChar: string, char: string) {

if (char === '['
&& prevChar !== ESCAPE_SYMBOL
) {
return true;
}

if (char === ']'
&& prevChar !== ESCAPE_SYMBOL
) {
return false;
}

return skip;
}

/**
* Get possible RegExp group postfix.
* @param regExpStr - Whole RegExp string.
* @param startFrom - Index to start capture.
* @return RegExp group postfix part.
*/
function capturePostfix(regExpStr: string, startFrom: number) {

let char = regExpStr[startFrom];

switch (char) {

case '+':
case '*':
case '?':
return char;

case '(': {

const nextChar = regExpStr[startFrom + 1];
const afterNextChar = regExpStr[startFrom + 2];

if (
nextChar !== '?'
|| afterNextChar !== '=' && afterNextChar !== '!'
) {
return '';
}

break;
}

case '{':
break;

default:
return '';
}

const regExpStrLength = regExpStr.length;
let prevChar = '';
let braceBalance = 0;
let skip = false;
let postfix = '';

for (let i = startFrom; i < regExpStrLength; i++) {

char = regExpStr[i];
prevChar = regExpStr[i - 1];
skip = skipSquareBraces(skip, prevChar, char);

if (!skip
&& prevChar !== ESCAPE_SYMBOL
&& (
char === '('
|| char === '{'
)
) {
braceBalance++;
}

if (braceBalance > 0) {
postfix += char;
}

if (!skip
&& prevChar !== ESCAPE_SYMBOL
&& braceBalance > 0
&& (
char === ')'
|| char === '}'
)
) {
braceBalance--;

if (braceBalance === 0) {
break;
}
}
}

return postfix;
}

/**
* Get from RegExp part with number patterns.
* @todo Optimize.
Expand Down
30 changes: 30 additions & 0 deletions src/regexp/optimize.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import {
optimize
} from './optimize';

describe('UserAgentRegExp', () => {

describe('optimize', () => {

it('should remove braces', () => {

expect(
optimize('(Family)foo(NotFamily)(bar)')
).toBe(
'FamilyfooNotFamilybar'
);

expect(
optimize('(Family)foo(NotFamily|bar)')
).toBe(
'Familyfoo(NotFamily|bar)'
);

expect(
optimize('(Family)(foo)?(?=NotFamily)')
).toBe(
'Family(foo)?(?=NotFamily)'
);
});
});
});
Loading

0 comments on commit c1e8b72

Please sign in to comment.