From fc01f7d03310dcd6ef5bc509bdbbc3fd1c9ed151 Mon Sep 17 00:00:00 2001 From: calixteman Date: Tue, 4 Aug 2026 18:27:23 +0200 Subject: [PATCH] Enable the `regexp/no-super-linear-move` ESLint rule It flags the regexes whose search is quadratic in the input length, like the autolinker and XFA-path ones fixed recently. The three existing offenders: `\s*` matched the CSS indentation but also the line terminators that make `^` match with the `m` flag (the preprocessed CSS is unchanged), `(\d+)` made every digit of a number a candidate start position, and `/T.*$/` could fail on the `$` and backtrack since `.` doesn't match a line terminator. --- eslint.config.mjs | 1 + external/builder/builder.mjs | 2 +- external/cmapscompress/parse.mjs | 2 +- test/unit/scripting_spec.js | 4 ++-- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index d3a09666f..9d887d7e4 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -62,6 +62,7 @@ export default [ rules: { ...regexpPlugin.configs["flat/recommended"].rules, "regexp/no-legacy-features": "off", + "regexp/no-super-linear-move": "error", }, }, { diff --git a/external/builder/builder.mjs b/external/builder/builder.mjs index ae88dde2d..64a0082a2 100644 --- a/external/builder/builder.mjs +++ b/external/builder/builder.mjs @@ -53,7 +53,7 @@ function preprocess(inFilename, outFilename, defines) { } return content.replaceAll( - /^\s*@import\s+url\(([^)]+)\);\s*$/gm, + /^[ \t]*@import\s+url\(([^)]+)\);[ \t]*$/gm, function (all, url) { const file = path.join(path.dirname(baseUrl), url); const imported = fs.readFileSync(file, "utf8").toString(); diff --git a/external/cmapscompress/parse.mjs b/external/cmapscompress/parse.mjs index 3fe93bff8..0b7a9ec30 100644 --- a/external/cmapscompress/parse.mjs +++ b/external/cmapscompress/parse.mjs @@ -37,7 +37,7 @@ function parseAdobeCMap(content) { result.usecmap = m[1]; } const re = - /(\d+)\s+(begincodespacerange|beginnotdefrange|begincidchar|begincidrange|beginbfchar|beginbfrange)\n([\s\S]*?)\n(?:endcodespacerange|endnotdefrange|endcidchar|endcidrange|endbfchar|endbfrange)/g; + /\b(\d+)\s+(begincodespacerange|beginnotdefrange|begincidchar|begincidrange|beginbfchar|beginbfrange)\n([\s\S]*?)\n(?:endcodespacerange|endnotdefrange|endcidchar|endcidrange|endbfchar|endbfrange)/g; while ((m = re.exec(body))) { const lines = m[3].toLowerCase().split("\n"); diff --git a/test/unit/scripting_spec.js b/test/unit/scripting_spec.js index 22eacaa9d..05d756237 100644 --- a/test/unit/scripting_spec.js +++ b/test/unit/scripting_spec.js @@ -753,10 +753,10 @@ describe("Scripting", function () { it("should parse a date with a format", async () => { const check = async (date, format, expected) => { const value = await myeval( - `AFParseDateEx("${date}", "${format}").toISOString().replace(/T.*$/, "")` + `AFParseDateEx("${date}", "${format}").toISOString().replace(/T.*/, "")` ); expect(value).toEqual( - new Date(expected).toISOString().replace(/T.*$/, "") + new Date(expected).toISOString().replace(/T.*/, "") ); };