From 0de0f9c7aaab2f3876c3d33250de72e2281a70db Mon Sep 17 00:00:00 2001 From: kazuya kawaguchi Date: Wed, 22 Mar 2023 16:01:05 +0900 Subject: [PATCH] feat(message-compiler): export html tag checking (#1359) * feat(message-compiler): export html tag checking * fix: lint warnings --- packages/core-base/src/compile.ts | 21 +++++++++++++-------- packages/message-compiler/src/helpers.ts | 5 +++++ packages/message-compiler/src/options.ts | 1 - 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/core-base/src/compile.ts b/packages/core-base/src/compile.ts index 818b84227..21f838e9f 100644 --- a/packages/core-base/src/compile.ts +++ b/packages/core-base/src/compile.ts @@ -1,17 +1,17 @@ import { warn, format, isBoolean } from '@intlify/shared' -import { baseCompile, defaultOnError } from '@intlify/message-compiler' +import { + baseCompile, + defaultOnError, + detectHtmlTag +} from '@intlify/message-compiler' import type { CompileOptions, CompileError } from '@intlify/message-compiler' import type { MessageFunction, MessageFunctions } from './runtime' -const RE_HTML_TAG = /<\/?[\w\s="/.':;#-\/]+>/ const WARN_MESSAGE = `Detected HTML in '{source}' message. Recommend not using HTML messages to avoid XSS.` -function checkHtmlMessage(source: string, options: CompileOptions): void { - const warnHtmlMessage = isBoolean(options.warnHtmlMessage) - ? options.warnHtmlMessage - : true - if (warnHtmlMessage && RE_HTML_TAG.test(source)) { +function checkHtmlMessage(source: string, warnHtmlMessage?: boolean): void { + if (warnHtmlMessage && detectHtmlTag(source)) { warn(format(WARN_MESSAGE, { source })) } } @@ -37,7 +37,12 @@ export function compileToFunction( return (() => source) as MessageFunction } else { // check HTML message - __DEV__ && checkHtmlMessage(source, options) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const warnHtmlMessage = isBoolean((options as any).warnHtmlMessage) + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + (options as any).warnHtmlMessage + : true + __DEV__ && checkHtmlMessage(source, warnHtmlMessage) // check caches const onCacheKey = options.onCacheKey || defaultOnCacheKey diff --git a/packages/message-compiler/src/helpers.ts b/packages/message-compiler/src/helpers.ts index 041edfea8..1d6a9cdea 100644 --- a/packages/message-compiler/src/helpers.ts +++ b/packages/message-compiler/src/helpers.ts @@ -8,3 +8,8 @@ export const enum HelperNameMap { INTERPOLATE = 'interpolate', NORMALIZE = 'normalize' } + +const RE_HTML_TAG = /<\/?[\w\s="/.':;#-\/]+>/ + +export const detectHtmlTag = (source: string): boolean => + RE_HTML_TAG.test(source) diff --git a/packages/message-compiler/src/options.ts b/packages/message-compiler/src/options.ts index 2be3b82e0..43ee3307c 100644 --- a/packages/message-compiler/src/options.ts +++ b/packages/message-compiler/src/options.ts @@ -31,7 +31,6 @@ export interface CodeGenOptions { } export type CompileOptions = { - warnHtmlMessage?: boolean onCacheKey?: CompileCacheKeyHandler } & TransformOptions & CodeGenOptions &