Skip to content

Commit

Permalink
Revert "Revert "Fix codebase""
Browse files Browse the repository at this point in the history
This reverts commit 9bc7b93.
  • Loading branch information
fisker committed May 9, 2024
1 parent f590709 commit 3fcf69d
Show file tree
Hide file tree
Showing 13 changed files with 301 additions and 301 deletions.
4 changes: 2 additions & 2 deletions rules/no-unnecessary-polyfills.js
Expand Up @@ -23,13 +23,13 @@ const additionalPolyfillPatterns = {

const prefixes = '(mdn-polyfills/|polyfill-)';
const suffixes = '(-polyfill)';
const delimiter = '(\\.|-|\\.prototype\\.|/)?';
const delimiter = String.raw`(\.|-|\.prototype\.|/)?`;

const polyfills = Object.keys(compatData).map(feature => {
let [ecmaVersion, constructorName, methodName = ''] = feature.split('.');

if (ecmaVersion === 'es') {
ecmaVersion = '(es\\d*)';
ecmaVersion = String.raw`(es\d*)`;
}

constructorName = `(${constructorName}|${camelCase(constructorName)})`;
Expand Down
2 changes: 1 addition & 1 deletion rules/utils/escape-template-element-raw.js
Expand Up @@ -2,6 +2,6 @@

const escapeTemplateElementRaw = string => string.replaceAll(
/(?<=(?:^|[^\\])(?:\\\\)*)(?<symbol>(?:`|\$(?={)))/g,
'\\$<symbol>',
String.raw`\$<symbol>`,
);
module.exports = escapeTemplateElementRaw;
210 changes: 105 additions & 105 deletions test/better-regex.mjs
Expand Up @@ -29,38 +29,38 @@ const testCase = (original, optimized) => ({
test({
valid: [
// Literal regex
'const foo = /\\d/',
'const foo = /\\W/i',
'const foo = /\\w/gi',
String.raw`const foo = /\d/`,
String.raw`const foo = /\W/i`,
String.raw`const foo = /\w/gi`,
'const foo = /[a-z]/gi',
'const foo = /\\d*?/gi',
String.raw`const foo = /\d*?/gi`,

// Should not crash ESLint (#446 and #448)
'/\\{\\{verificationUrl\\}\\}/gu',
'/^test-(?<name>[a-zA-Z-\\d]+)$/u',
String.raw`/\{\{verificationUrl\}\}/gu`,
String.raw`/^test-(?<name>[a-zA-Z-\d]+)$/u`,
String.raw`/[\p{Script_Extensions=Greek}--π]/v`,

// Should not suggest wrong regex (#447)
'/(\\s|\\.|@|_|-)/u',
'/[\\s.@_-]/u',
String.raw`/(\s|\.|@|_|-)/u`,
String.raw`/[\s.@_-]/u`,

// Should not remove repeating patterns too easily (#769)
'/http:\\/\\/[^/]+\\/pull\\/commits/gi',
String.raw`/http:\/\/[^/]+\/pull\/commits/gi`,

{
code: '/[GgHhIiå.Z:a-f"0-8%A*ä]/',
options: disableSortCharacterClassesOptions,
},

// `RegExp()` constructor
'new RegExp(\'\\d\')',
'new RegExp(\'\\d\', \'ig\')',
'new RegExp(\'\\d*?\')',
String.raw`new RegExp('\d')`,
String.raw`new RegExp('\d', 'ig')`,
String.raw`new RegExp('\d*?')`,
'new RegExp(\'[a-z]\', \'i\')',
'new RegExp(/\\d/)',
'new RegExp(/\\d/gi)',
'new RegExp(/\\d/, \'ig\')',
'new RegExp(/\\d*?/)',
String.raw`new RegExp(/\d/)`,
String.raw`new RegExp(/\d/gi)`,
String.raw`new RegExp(/\d/, 'ig')`,
String.raw`new RegExp(/\d*?/)`,
'new RegExp(/[a-z]/, \'i\')',
// Not `new`
'RegExp("[0-9]")',
Expand All @@ -79,105 +79,105 @@ test({
'/[ ;-]/g',

// #994
'/\\s?\\s?/', // https://github.com/DmitrySoshnikov/regexp-tree/issues/216#issuecomment-762073297
'/\\s{0,2}/',
String.raw`/\s?\s?/`, // https://github.com/DmitrySoshnikov/regexp-tree/issues/216#issuecomment-762073297
String.raw`/\s{0,2}/`,
],
invalid: [
// Literal regex
{
code: 'const foo = /\\w/ig',
errors: createError('/\\w/ig', '/\\w/gi'),
output: 'const foo = /\\w/gi',
code: String.raw`const foo = /\w/ig`,
errors: createError(String.raw`/\w/ig`, String.raw`/\w/gi`),
output: String.raw`const foo = /\w/gi`,
},
{
code: 'const foo = /[0-9]/',
errors: createError('/[0-9]/', '/\\d/'),
output: 'const foo = /\\d/',
errors: createError('/[0-9]/', String.raw`/\d/`),
output: String.raw`const foo = /\d/`,
},
{
code: 'const foo = /[0-9]/ig',
errors: createError('/[0-9]/ig', '/\\d/gi'),
output: 'const foo = /\\d/gi',
errors: createError('/[0-9]/ig', String.raw`/\d/gi`),
output: String.raw`const foo = /\d/gi`,
},
{
code: 'const foo = /[^0-9]/',
errors: createError('/[^0-9]/', '/\\D/'),
output: 'const foo = /\\D/',
errors: createError('/[^0-9]/', String.raw`/\D/`),
output: String.raw`const foo = /\D/`,
},
{
code: 'const foo = /[A-Za-z0-9_]/',
errors: createError('/[A-Za-z0-9_]/', '/\\w/'),
output: 'const foo = /\\w/',
errors: createError('/[A-Za-z0-9_]/', String.raw`/\w/`),
output: String.raw`const foo = /\w/`,
},
{
code: 'const foo = /[A-Za-z\\d_]/',
errors: createError('/[A-Za-z\\d_]/', '/\\w/'),
output: 'const foo = /\\w/',
code: String.raw`const foo = /[A-Za-z\d_]/`,
errors: createError(String.raw`/[A-Za-z\d_]/`, String.raw`/\w/`),
output: String.raw`const foo = /\w/`,
},
{
code: 'const foo = /[a-zA-Z0-9_]/',
errors: createError('/[a-zA-Z0-9_]/', '/\\w/'),
output: 'const foo = /\\w/',
errors: createError('/[a-zA-Z0-9_]/', String.raw`/\w/`),
output: String.raw`const foo = /\w/`,
},
{
code: 'const foo = /[a-zA-Z\\d_]/',
errors: createError('/[a-zA-Z\\d_]/', '/\\w/'),
output: 'const foo = /\\w/',
code: String.raw`const foo = /[a-zA-Z\d_]/`,
errors: createError(String.raw`/[a-zA-Z\d_]/`, String.raw`/\w/`),
output: String.raw`const foo = /\w/`,
},
{
code: 'const foo = /[A-Za-z0-9_]+[0-9]?\\.[A-Za-z0-9_]*/',
errors: createError('/[A-Za-z0-9_]+[0-9]?\\.[A-Za-z0-9_]*/', '/\\w+\\d?\\.\\w*/'),
output: 'const foo = /\\w+\\d?\\.\\w*/',
code: String.raw`const foo = /[A-Za-z0-9_]+[0-9]?\.[A-Za-z0-9_]*/`,
errors: createError(String.raw`/[A-Za-z0-9_]+[0-9]?\.[A-Za-z0-9_]*/`, String.raw`/\w+\d?\.\w*/`),
output: String.raw`const foo = /\w+\d?\.\w*/`,
},
{
code: 'const foo = /[a-z0-9_]/i',
errors: createError('/[a-z0-9_]/i', '/\\w/i'),
output: 'const foo = /\\w/i',
errors: createError('/[a-z0-9_]/i', String.raw`/\w/i`),
output: String.raw`const foo = /\w/i`,
},
{
code: 'const foo = /[a-z\\d_]/i',
errors: createError('/[a-z\\d_]/i', '/\\w/i'),
output: 'const foo = /\\w/i',
code: String.raw`const foo = /[a-z\d_]/i`,
errors: createError(String.raw`/[a-z\d_]/i`, String.raw`/\w/i`),
output: String.raw`const foo = /\w/i`,
},
{
code: 'const foo = /[^A-Za-z0-9_]/',
errors: createError('/[^A-Za-z0-9_]/', '/\\W/'),
output: 'const foo = /\\W/',
errors: createError('/[^A-Za-z0-9_]/', String.raw`/\W/`),
output: String.raw`const foo = /\W/`,
},
{
code: 'const foo = /[^A-Za-z\\d_]/',
errors: createError('/[^A-Za-z\\d_]/', '/\\W/'),
output: 'const foo = /\\W/',
code: String.raw`const foo = /[^A-Za-z\d_]/`,
errors: createError(String.raw`/[^A-Za-z\d_]/`, String.raw`/\W/`),
output: String.raw`const foo = /\W/`,
},
{
code: 'const foo = /[^a-z0-9_]/i',
errors: createError('/[^a-z0-9_]/i', '/\\W/i'),
output: 'const foo = /\\W/i',
errors: createError('/[^a-z0-9_]/i', String.raw`/\W/i`),
output: String.raw`const foo = /\W/i`,
},
{
code: 'const foo = /[^a-z\\d_]/i',
errors: createError('/[^a-z\\d_]/i', '/\\W/i'),
output: 'const foo = /\\W/i',
code: String.raw`const foo = /[^a-z\d_]/i`,
errors: createError(String.raw`/[^a-z\d_]/i`, String.raw`/\W/i`),
output: String.raw`const foo = /\W/i`,
},
{
code: 'const foo = /[^a-z\\d_]/ig',
errors: createError('/[^a-z\\d_]/ig', '/\\W/gi'),
output: 'const foo = /\\W/gi',
code: String.raw`const foo = /[^a-z\d_]/ig`,
errors: createError(String.raw`/[^a-z\d_]/ig`, String.raw`/\W/gi`),
output: String.raw`const foo = /\W/gi`,
},
{
code: 'const foo = /[^\\d_a-z]/ig',
errors: createError('/[^\\d_a-z]/ig', '/\\W/gi'),
output: 'const foo = /\\W/gi',
code: String.raw`const foo = /[^\d_a-z]/ig`,
errors: createError(String.raw`/[^\d_a-z]/ig`, String.raw`/\W/gi`),
output: String.raw`const foo = /\W/gi`,
},
{
code: 'const foo = /[a-z0-9_]/',
errors: createError('/[a-z0-9_]/', '/[\\d_a-z]/'),
output: 'const foo = /[\\d_a-z]/',
errors: createError('/[a-z0-9_]/', String.raw`/[\d_a-z]/`),
output: String.raw`const foo = /[\d_a-z]/`,
},
{
code: 'const foo = /^by @([a-zA-Z0-9-]+)/',
errors: createError('/^by @([a-zA-Z0-9-]+)/', '/^by @([\\dA-Za-z-]+)/'),
output: 'const foo = /^by @([\\dA-Za-z-]+)/',
errors: createError('/^by @([a-zA-Z0-9-]+)/', String.raw`/^by @([\dA-Za-z-]+)/`),
output: String.raw`const foo = /^by @([\dA-Za-z-]+)/`,
},
{
code: '/[GgHhIiå.Z:a-f"0-8%A*ä]/',
Expand All @@ -188,100 +188,100 @@ test({
{
code: '/[a0-9b]/',
options: disableSortCharacterClassesOptions,
errors: createError('/[a0-9b]/', '/[a\\db]/'),
output: '/[a\\db]/',
errors: createError('/[a0-9b]/', String.raw`/[a\db]/`),
output: String.raw`/[a\db]/`,
},

// `RegExp()` constructor
{
code: 'const foo = new RegExp(\'[0-9]\')',
errors: createError('[0-9]', '\\d'),
output: 'const foo = new RegExp(\'\\\\d\')',
errors: createError('[0-9]', String.raw`\d`),
output: String.raw`const foo = new RegExp('\\d')`,
},
{
code: 'const foo = new RegExp("[0-9]")',
errors: createError('[0-9]', '\\d'),
output: 'const foo = new RegExp("\\\\d")',
errors: createError('[0-9]', String.raw`\d`),
output: String.raw`const foo = new RegExp("\\d")`,
},
{
code: 'const foo = new RegExp(\'\\\'[0-9]\\\'\')',
errors: createError('\'[0-9]\'', '\'\\d\''),
output: 'const foo = new RegExp(\'\\\'\\\\d\\\'\')',
code: String.raw`const foo = new RegExp('\'[0-9]\'')`,
errors: createError('\'[0-9]\'', String.raw`'\d'`),
output: String.raw`const foo = new RegExp('\'\\d\'')`,
},
{
code: 'const foo = new RegExp("\'[0-9]\'")',
errors: createError('\'[0-9]\'', '\'\\d\''),
output: 'const foo = new RegExp("\'\\\\d\'")',
errors: createError('\'[0-9]\'', String.raw`'\d'`),
output: String.raw`const foo = new RegExp("'\\d'")`,
},
{
code: 'const foo = new RegExp(\'[0-9]\', \'ig\')',
errors: createError('[0-9]', '\\d'),
output: 'const foo = new RegExp(\'\\\\d\', \'ig\')',
errors: createError('[0-9]', String.raw`\d`),
output: String.raw`const foo = new RegExp('\\d', 'ig')`,
},
{
code: 'const foo = new RegExp(/[0-9]/, \'ig\')',
errors: createError('/[0-9]/', '/\\d/'),
output: 'const foo = new RegExp(/\\d/, \'ig\')',
errors: createError('/[0-9]/', String.raw`/\d/`),
output: String.raw`const foo = new RegExp(/\d/, 'ig')`,
},
{
code: 'const foo = new RegExp(/^[^*]*[*]?$/)',
errors: createError('/^[^*]*[*]?$/', '/^[^*]*\\*?$/'),
output: 'const foo = new RegExp(/^[^*]*\\*?$/)',
errors: createError('/^[^*]*[*]?$/', String.raw`/^[^*]*\*?$/`),
output: String.raw`const foo = new RegExp(/^[^*]*\*?$/)`,
},
// No `flags`
{
code: 'const foo = new RegExp(/[0-9]/)',
errors: createError('/[0-9]/', '/\\d/'),
output: 'const foo = new RegExp(/\\d/)',
errors: createError('/[0-9]/', String.raw`/\d/`),
output: String.raw`const foo = new RegExp(/\d/)`,
},
// `flags` not `Literal`
{
code: 'const foo = new RegExp(/[0-9]/, ig)',
errors: createError('/[0-9]/', '/\\d/'),
output: 'const foo = new RegExp(/\\d/, ig)',
errors: createError('/[0-9]/', String.raw`/\d/`),
output: String.raw`const foo = new RegExp(/\d/, ig)`,
},
// `flags` not `string`
{
code: 'const foo = new RegExp(/[0-9]/, 0)',
errors: createError('/[0-9]/', '/\\d/'),
output: 'const foo = new RegExp(/\\d/, 0)',
errors: createError('/[0-9]/', String.raw`/\d/`),
output: String.raw`const foo = new RegExp(/\d/, 0)`,
},
// `\s` rewrite
testCase(
'/[ \\f\\n\\r\\t\\v\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]+/',
'/\\s+/',
String.raw`/[ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/`,
String.raw`/\s+/`,
),
// #499
{
code: '/^[a-z][a-z0-9\\-]{5,29}$/',
errors: createError('/^[a-z][a-z0-9\\-]{5,29}$/', '/^[a-z][\\da-z\\-]{5,29}$/'),
output: '/^[a-z][\\da-z\\-]{5,29}$/',
code: String.raw`/^[a-z][a-z0-9\-]{5,29}$/`,
errors: createError(String.raw`/^[a-z][a-z0-9\-]{5,29}$/`, String.raw`/^[a-z][\da-z\-]{5,29}$/`),
output: String.raw`/^[a-z][\da-z\-]{5,29}$/`,
},
// #477
testCase(
'/[ \\n\\t\\r\\]]/g',
'/[\\t\\n\\r \\]]/g',
String.raw`/[ \n\t\r\]]/g`,
String.raw`/[\t\n\r \]]/g`,
),
testCase(
'/[ \\n\\t\\r\\f"#\'()/;[\\\\\\]{}]/g',
'/[\\t\\n\\f\\r "#\'()/;[\\\\\\]{}]/g',
String.raw`/[ \n\t\r\f"#'()/;[\\\]{}]/g`,
String.raw`/[\t\n\f\r "#'()/;[\\\]{}]/g`,
),
testCase(
'/[ \\n\\t\\r\\f(){}:;@!\'"\\\\\\][#]|\\/(?=\\*)/g',
'/[\\t\\n\\f\\r !"#\'():;@[\\\\\\]{}]|\\/(?=\\*)/g',
String.raw`/[ \n\t\r\f(){}:;@!'"\\\][#]|\/(?=\*)/g`,
String.raw`/[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g`,
),
// #994
testCase(
'/\\s?\\s?\\s?/',
'/\\s{0,3}/',
String.raw`/\s?\s?\s?/`,
String.raw`/\s{0,3}/`,
),
// Actual message
{
code: '/[0-9]/',
output: '/\\d/',
output: String.raw`/\d/`,
errors: [
{
message: '/[0-9]/ can be optimized to /\\d/.',
message: String.raw`/[0-9]/ can be optimized to /\d/.`,
},
],
},
Expand All @@ -301,11 +301,11 @@ test({
// Not fixable
{
code: 'const foo = /[0-9]/.toString',
errors: createError('/[0-9]/', '/\\d/'),
errors: createError('/[0-9]/', String.raw`/\d/`),
},
{
code: 'const foo = /[0-9]/.source',
errors: createError('/[0-9]/', '/\\d/'),
errors: createError('/[0-9]/', String.raw`/\d/`),
},
],
});
Expand Down

0 comments on commit 3fcf69d

Please sign in to comment.