diff --git a/package.json b/package.json index 6b8a0bcff7..f010bdea9d 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "@iconify-json/svg-spinners": "1.2.4", "@iconify-json/vscode-icons": "1.2.45", "@intlify/shared": "11.3.0", + "@li/regexp-escape-polyfill": "jsr:0.3.4", "@lunariajs/core": "https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@904b935", "@napi-rs/canvas": "0.1.97", "@nuxt/a11y": "1.0.0-alpha.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 22198914ee..f2b39e2f38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,6 +78,9 @@ importers: '@intlify/shared': specifier: 11.3.0 version: 11.3.0 + '@li/regexp-escape-polyfill': + specifier: jsr:0.3.4 + version: '@jsr/li__regexp-escape-polyfill@0.3.4' '@lunariajs/core': specifier: https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@904b935 version: https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@904b935 @@ -1999,6 +2002,9 @@ packages: '@jsr/deno__graph@0.86.9': resolution: {integrity: sha512-+qrrma5/bL+hcG20mfaEeC8SLopqoyd1RjcKFMRu++3SAXyrTKuvuIjBJCn/NyN7X+kV+QrJG67BCHX38Rzw+g==, tarball: https://npm.jsr.io/~/11/@jsr/deno__graph/0.86.9.tgz} + '@jsr/li__regexp-escape-polyfill@0.3.4': + resolution: {integrity: sha512-UGHzM9zAlRt0DUQIgsXAuXBd9jdzJ3t1v+fHsIcIj2fbUKplO9A8v2FE/w9KZo8hs79n5IamuBvqCTndGADM2Q==, tarball: https://npm.jsr.io/~/11/@jsr/li__regexp-escape-polyfill/0.3.4.tgz} + '@jsr/std__bytes@1.0.6': resolution: {integrity: sha512-St6yKggjFGhxS52IFLJWvkchRFbAKg2Xh8UxA4S1EGz7GJ2Ui+ssDDldj/w2c8vCxvl6qgR0HaYbKeFJNqujmA==, tarball: https://npm.jsr.io/~/11/@jsr/std__bytes/1.0.6.tgz} @@ -12840,6 +12846,8 @@ snapshots: '@jsr/deno__graph@0.86.9': {} + '@jsr/li__regexp-escape-polyfill@0.3.4': {} + '@jsr/std__bytes@1.0.6': {} '@jsr/std__fmt@1.0.9': {} diff --git a/shared/utils/dev-dependency.ts b/shared/utils/dev-dependency.ts index f45449ba52..ae30d8855f 100644 --- a/shared/utils/dev-dependency.ts +++ b/shared/utils/dev-dependency.ts @@ -1,3 +1,5 @@ +import { regExpEscape } from '@li/regexp-escape-polyfill' + export type DevDependencySuggestionReason = 'known-package' | 'readme-hint' export interface DevDependencySuggestion { @@ -59,15 +61,11 @@ function isKnownDevDependencyPackage(packageName: string): boolean { ) } -function escapeRegExp(text: string): string { - return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') -} - function hasReadmeDevInstallHint(packageName: string, readmeContent?: string | null): boolean { if (!readmeContent) return false - const escapedName = escapeRegExp(packageName) - const escapedNpmName = escapeRegExp(`npm:${packageName}`) + const escapedName = regExpEscape(packageName) + const escapedNpmName = regExpEscape(`npm:${packageName}`) const packageSpec = `(?:${escapedName}|${escapedNpmName})(?:@[\\w.-]+)?` const patterns = [ diff --git a/shared/utils/emoji.ts b/shared/utils/emoji.ts index b617309226..f9da977b6f 100644 --- a/shared/utils/emoji.ts +++ b/shared/utils/emoji.ts @@ -1,3 +1,5 @@ +import { regExpEscape } from '@li/regexp-escape-polyfill' + // copied from https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs const emojis = { '100': '💯', @@ -1907,7 +1909,7 @@ const emojis = { const emojisKeysRegex = new RegExp( Object.keys(emojis) - .map(key => `:${key}:`) + .map(key => `:${regExpEscape(key)}:`) .join('|'), 'g', )