@kitajs/ts-html-plugin
Advanced tools
| #!/usr/bin/env node | ||
| const { main } = require('../dist/cli.js'); | ||
| void main().catch((error) => { | ||
| console.error(error); | ||
| process.exit(1); | ||
| }); |
+229
| import chalk from 'chalk'; | ||
| import fs from 'node:fs'; | ||
| import path from 'node:path'; | ||
| import ts from 'typescript'; | ||
| import yargs from 'yargs'; | ||
| import { hideBin } from 'yargs/helpers'; | ||
| import { recursiveDiagnoseJsxElements } from './util'; | ||
| const { version } = require('../package.json'); | ||
| const help = ` | ||
| @kitajs/ts-html-plugin v${version} - A CLI tool & TypeScript LSP for finding XSS vulnerabilities in your TypeScript code. | ||
| Usage: xss-scan [options] <file> <file>... | ||
| ts-html-plugin [options] <file> <file>... | ||
| Options: | ||
| --cwd <path> The current working directory to use (defaults to process.cwd()) | ||
| -p, --project <path> The path to the tsconfig.json file to use (defaults to 'tsconfig.json') | ||
| -s, --simplified Use simplified diagnostics | ||
| -h, --help Show this help message | ||
| --version Show the version number | ||
| <file> <file>... The files to check (defaults to all files in tsconfig.json) | ||
| Examples: | ||
| $ xss-scan | ||
| $ xss-scan --cwd src | ||
| $ xss-scan --project tsconfig.build.json | ||
| $ xss-scan src/index.tsx src/App.tsx | ||
| Exit codes: | ||
| 0 - No XSS vulnerabilities were found | ||
| 1 - XSS vulnerabilities were found | ||
| 2 - Only warnings were found | ||
| `.trim(); | ||
| function readCompilerOptions(tsconfigPath: string) { | ||
| const { config, error } = ts.readConfigFile(tsconfigPath, ts.sys.readFile); | ||
| if (error) { | ||
| return { errors: [error] }; | ||
| } | ||
| const { options, errors, fileNames } = ts.parseJsonConfigFileContent( | ||
| config, | ||
| ts.sys, | ||
| path.dirname(tsconfigPath), | ||
| undefined, | ||
| tsconfigPath | ||
| ); | ||
| if (errors.length) { | ||
| return { errors }; | ||
| } | ||
| return { options, fileNames, errors: undefined }; | ||
| } | ||
| function prettyPrintErrorCount(diagnostics: ts.Diagnostic[], root: string) { | ||
| const files = new Map<string, number>(); | ||
| // Counts the amount of errors per file | ||
| for (const diagnostic of diagnostics) { | ||
| if (!diagnostic.file) { | ||
| continue; | ||
| } | ||
| const file = files.get(diagnostic.file.fileName); | ||
| if (file !== undefined) { | ||
| files.set(diagnostic.file.fileName, file + 1); | ||
| continue; | ||
| } | ||
| files.set(diagnostic.file.fileName, 1); | ||
| } | ||
| if (files.size > 1) { | ||
| console.error( | ||
| chalk.red(`Found a total of ${diagnostics.length} errors in ${files.size} files\n`) | ||
| ); | ||
| } | ||
| for (const [file, amount] of files.entries()) { | ||
| console.error( | ||
| chalk.red( | ||
| `Found ${amount} error${amount === 1 ? '' : 's'} in ${path.relative(root, file)}` | ||
| ) | ||
| ); | ||
| } | ||
| } | ||
| function fileExists(p: string) { | ||
| try { | ||
| fs.statSync(p); | ||
| return true; | ||
| } catch { | ||
| return false; | ||
| } | ||
| } | ||
| export async function main() { | ||
| const args = await yargs(hideBin(process.argv)).help(false).version(version).argv; | ||
| if (args.help || args.h) { | ||
| console.log(help); | ||
| return process.exit(0); | ||
| } | ||
| // Detects unknown arguments | ||
| for (const key in args) { | ||
| if (key === '_' || key === '$0') { | ||
| continue; | ||
| } | ||
| switch (key) { | ||
| case 'cwd': | ||
| case 'project': | ||
| case 'p': | ||
| case 's': | ||
| case 'simplified': | ||
| continue; | ||
| default: | ||
| console.error(`Unknown argument: ${key}. Run --help for more information.`); | ||
| return process.exit(1); | ||
| } | ||
| } | ||
| const root = args.cwd ? String(args.cwd) : process.cwd(); | ||
| const tsconfigPath = String(args.project || args.p || 'tsconfig.json'); | ||
| const simplified = !!(args.simplified || args.s); | ||
| const diagnosticFormatter = | ||
| !process.stdout.isTTY || simplified | ||
| ? ts.formatDiagnostics | ||
| : ts.formatDiagnosticsWithColorAndContext; | ||
| if (!fileExists(tsconfigPath)) { | ||
| console.error((!simplified ? chalk.red : String)(`Could not find ${tsconfigPath}`)); | ||
| return process.exit(1); | ||
| } | ||
| const tsconfig = readCompilerOptions(tsconfigPath); | ||
| const diagnosticHost: ts.FormatDiagnosticsHost = { | ||
| getCurrentDirectory: ts.sys.getCurrentDirectory, | ||
| getCanonicalFileName: (fileName) => fileName, | ||
| getNewLine: () => ts.sys.newLine | ||
| }; | ||
| if (tsconfig.errors) { | ||
| console.error(diagnosticFormatter(tsconfig.errors, diagnosticHost)); | ||
| return process.exit(1); | ||
| } | ||
| let files = tsconfig.fileNames; | ||
| if (args._.length) { | ||
| // Prefer the files passed as arguments, otherwise use the files in tsconfig.json | ||
| files = []; | ||
| for (let i = 0; i < args._.length; i++) { | ||
| const file = String(args._[i]); | ||
| if (!fileExists(file)) { | ||
| console.error( | ||
| (!simplified ? chalk.red : String)(`Could not find provided '${file}' file.`) | ||
| ); | ||
| return process.exit(1); | ||
| } | ||
| if (!file.match(/(t|j)sx$/)) { | ||
| console.warn( | ||
| (!simplified ? chalk.yellow : String)( | ||
| `Provided '${file}' file is not a TSX/JSX file.` | ||
| ) | ||
| ); | ||
| continue; | ||
| } | ||
| files.push(file); | ||
| } | ||
| } | ||
| if (!files.length) { | ||
| console.error((!simplified ? chalk.red : String)('No files were found to check.')); | ||
| return process.exit(1); | ||
| } | ||
| const program = ts.createProgram(files, tsconfig.options); | ||
| const typeChecker = program.getTypeChecker(); | ||
| const sources = program.getSourceFiles(); | ||
| const diagnostics: ts.Diagnostic[] = []; | ||
| for (const source of sources) { | ||
| const filename = source.fileName; | ||
| // Not a tsx file, so don't do anything | ||
| if (!filename.match(/(t|j)sx$/)) { | ||
| continue; | ||
| } | ||
| ts.forEachChild(source, function loopSourceNodes(node) { | ||
| recursiveDiagnoseJsxElements(ts, node, typeChecker, diagnostics); | ||
| }); | ||
| } | ||
| if (diagnostics.length) { | ||
| const hasError = diagnostics.some( | ||
| (diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error | ||
| ); | ||
| console.error(diagnosticFormatter(diagnostics, diagnosticHost)); | ||
| if (!simplified) { | ||
| prettyPrintErrorCount(diagnostics, root); | ||
| } | ||
| process.exit(hasError ? 1 : 2); | ||
| } | ||
| console.log(chalk.green(`No XSS vulnerabilities found in ${files.length} files!`)); | ||
| process.exit(0); | ||
| } |
| function createError(code: number, message: string) { | ||
| return { | ||
| code, | ||
| message: | ||
| process.env.INTERNAL_DISABLE_URL_DOCS !== 'true' | ||
| ? `${message}\nSee https://html.kitajs.org/TS${code}` | ||
| : message | ||
| }; | ||
| } | ||
| // 88600 is the base code for all errors in this plugin. | ||
| // KITA in ASCII | ||
| // 75 * 105 * 116 * 97 = 88609500 | ||
| // Simplify to 88600 | ||
| export const Xss = createError( | ||
| 88601, | ||
| `Content may introduce an XSS vulnerability and must be marked with the \`safe\` attribute.` | ||
| ); | ||
| export const DoubleEscape = createError( | ||
| 88602, | ||
| `The \`safe\` attribute causes this content to be escaped more than once.` | ||
| ); | ||
| export const ComponentXss = createError( | ||
| 88603, | ||
| `Content inside a Component must be escaped using escapeHtml().` | ||
| ); | ||
| export const UnusedSafe = createError( | ||
| 88604, | ||
| `The \`safe\` attribute is unused in this context.` | ||
| ); |
+43
| import type { default as TS, server } from 'typescript/lib/tsserverlibrary'; | ||
| import { proxyObject, recursiveDiagnoseJsxElements } from './util'; | ||
| export = function (modules: { typescript: typeof TS }) { | ||
| const ts = modules.typescript; | ||
| return { | ||
| create(info: Pick<server.PluginCreateInfo, 'languageService'>) { | ||
| const proxy = proxyObject(info.languageService); | ||
| proxy.getSemanticDiagnostics = function clonedSemanticDiagnostics(filename) { | ||
| const diagnostics = info.languageService.getSemanticDiagnostics(filename); | ||
| // Not a tsx file, so don't do anything | ||
| if (!filename.endsWith('.tsx') && !filename.endsWith('.jsx')) { | ||
| return diagnostics; | ||
| } | ||
| const program = info.languageService.getProgram(); | ||
| if (!program) { | ||
| return diagnostics; | ||
| } | ||
| const source = program.getSourceFile(filename); | ||
| if (!source) { | ||
| return diagnostics; | ||
| } | ||
| const typeChecker = program.getTypeChecker(); | ||
| ts.forEachChild(source, function loopSourceNodes(node) { | ||
| recursiveDiagnoseJsxElements(ts, node, typeChecker, diagnostics); | ||
| }); | ||
| return diagnostics; | ||
| }; | ||
| return proxy; | ||
| } | ||
| }; | ||
| }; |
+438
| import { | ||
| type JsxFragment, | ||
| type JsxSelfClosingElement, | ||
| type default as ts | ||
| } from 'typescript'; | ||
| import type { | ||
| BinaryOperatorToken, | ||
| Diagnostic, | ||
| JsxElement, | ||
| JsxOpeningElement, | ||
| Node, | ||
| default as TS, | ||
| Type, | ||
| TypeChecker | ||
| } from 'typescript/lib/tsserverlibrary'; | ||
| import * as Errors from './errors'; | ||
| const UPPERCASE = /[A-Z]/; | ||
| const ESCAPE_HTML_REGEX = /^(\w+\.)?(escapeHtml|e\s*`|escape)/i; | ||
| /** If the node is a JSX element or fragment */ | ||
| function isJsx( | ||
| ts: typeof TS, | ||
| node: TS.Node | ||
| ): node is JsxElement | JsxFragment | JsxSelfClosingElement { | ||
| return ( | ||
| ts.isJsxElement(node) || ts.isJsxFragment(node) || ts.isJsxSelfClosingElement(node) | ||
| ); | ||
| } | ||
| export function recursiveDiagnoseJsxElements( | ||
| ts: typeof TS, | ||
| node: Node, | ||
| typeChecker: TypeChecker, | ||
| original: Diagnostic[] | ||
| ) { | ||
| ts.forEachChild(node, function loopSourceNodes(node) { | ||
| // Recurse through children first | ||
| ts.forEachChild(node, loopSourceNodes); | ||
| // Adds children to the array | ||
| if (isJsx(ts, node)) { | ||
| // Diagnose the node | ||
| diagnoseJsxElement(ts, node, typeChecker, original); | ||
| } | ||
| }); | ||
| // Filter out duplicates | ||
| for (let i = 0; i < original.length; i++) { | ||
| for (let j = i + 1; j < original.length; j++) { | ||
| if ( | ||
| original[i]!.start === original[j]!.start && | ||
| original[i]!.length === original[j]!.length | ||
| ) { | ||
| original.splice(j--, 1); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| function diagnostic( | ||
| ts: typeof TS, | ||
| node: ts.Node, | ||
| error: keyof typeof Errors, | ||
| category: keyof typeof TS.DiagnosticCategory | ||
| ): ts.Diagnostic { | ||
| return { | ||
| category: ts.DiagnosticCategory[category], | ||
| messageText: Errors[error].message, | ||
| code: Errors[error].code, | ||
| file: node.getSourceFile(), | ||
| length: node.getWidth(), | ||
| start: node.getStart() | ||
| }; | ||
| } | ||
| export function diagnoseJsxElement( | ||
| ts: typeof TS, | ||
| node: JsxElement | JsxFragment | JsxSelfClosingElement, | ||
| typeChecker: TypeChecker, | ||
| diagnostics: Diagnostic[] | ||
| ): void { | ||
| // Validations that does not applies to fragments or serlf closing elements | ||
| if (ts.isJsxElement(node)) { | ||
| // Script tags should be ignored | ||
| if (node.openingElement.tagName.getText() === 'script') { | ||
| return; | ||
| } | ||
| const safeAttribute = getSafeAttribute(node.openingElement); | ||
| // Safe mode warnings | ||
| if (safeAttribute && node.children) { | ||
| if ( | ||
| // Empty element | ||
| node.children.length === 0 || | ||
| // Only text elements | ||
| (node.children.length === 1 && node.children[0]!.kind === ts.SyntaxKind.JsxText) | ||
| ) { | ||
| diagnostics.push(diagnostic(ts, safeAttribute, 'UnusedSafe', 'Warning')); | ||
| return; | ||
| } | ||
| for (const exp of node.children) { | ||
| if ( | ||
| // JSX Element inside safe (includes self-closing elements like <Component />) | ||
| isJsx(ts, exp) || | ||
| // Element is using safe with escapeHtml | ||
| (ts.isJsxExpression(exp) && exp.expression?.getText().match(ESCAPE_HTML_REGEX)) | ||
| ) { | ||
| diagnostics.push(diagnostic(ts, safeAttribute, 'DoubleEscape', 'Error')); | ||
| continue; | ||
| } | ||
| // Warn on unnecessary safe attributes | ||
| if ( | ||
| ts.isJsxExpression(exp) && | ||
| // has inner expression | ||
| exp.expression | ||
| ) { | ||
| // gets this expression or array of sub expressions | ||
| const expressions = getNodeExpressions(ts, exp.expression) || [exp.expression]; | ||
| // at least one jsx inside another jsx with safe (includes self-closing elements) | ||
| if (expressions.some((inner) => isJsx(ts, inner))) { | ||
| diagnostics.push(diagnostic(ts, safeAttribute, 'DoubleEscape', 'Error')); | ||
| continue; | ||
| } | ||
| // all of them must be safe | ||
| if ( | ||
| expressions.every((inner) => | ||
| isSafeAttribute( | ||
| ts, | ||
| typeChecker.getTypeAtLocation(inner), | ||
| typeChecker, | ||
| inner | ||
| ) | ||
| ) | ||
| ) { | ||
| diagnostics.push(diagnostic(ts, safeAttribute, 'UnusedSafe', 'Warning')); | ||
| } | ||
| } | ||
| } | ||
| return; | ||
| } | ||
| } | ||
| // If this expression does not have children, we can ignore it | ||
| // for example it could be a self closing element | ||
| if (ts.isJsxSelfClosingElement(node) || !node.children) { | ||
| return; | ||
| } | ||
| // Look for expressions | ||
| for (const exp of node.children) { | ||
| if (!ts.isJsxExpression(exp)) { | ||
| continue; | ||
| } | ||
| // Should always have an expression | ||
| if (!exp.expression) { | ||
| continue; | ||
| } | ||
| diagnoseExpression( | ||
| ts, | ||
| exp.expression, | ||
| typeChecker, | ||
| diagnostics, | ||
| ts.isJsxElement(node) && !!node.openingElement.tagName.getText().match(UPPERCASE) | ||
| ); | ||
| } | ||
| return; | ||
| } | ||
| function diagnoseExpression( | ||
| ts: typeof TS, | ||
| node: ts.Expression, | ||
| typeChecker: TypeChecker, | ||
| diagnostics: Diagnostic[], | ||
| isComponent: boolean | ||
| ): void { | ||
| // Unwrap parenthesis | ||
| if (ts.isParenthesizedExpression(node)) { | ||
| node = node.expression; | ||
| } | ||
| // Ignores JSX elements as they are already diagnosed by the loopChildNodes | ||
| if (isJsx(ts, node)) { | ||
| return; | ||
| } | ||
| const expressions = getNodeExpressions(ts, node); | ||
| // ternary or binary expressions should be evaluated on each side | ||
| if (expressions) { | ||
| for (const inner of expressions) { | ||
| diagnoseExpression(ts, inner, typeChecker, diagnostics, isComponent); | ||
| } | ||
| return; | ||
| } | ||
| const type = typeChecker.getTypeAtLocation(node); | ||
| // Safe can be ignored | ||
| if (isSafeAttribute(ts, type, typeChecker, node)) { | ||
| return; | ||
| } | ||
| // Anything other than a identifier should be diagnosed | ||
| if (!ts.isIdentifier(node)) { | ||
| let hadJsx = false; | ||
| for (const tag of node.getChildren()) { | ||
| if (!isJsx(ts, tag)) { | ||
| continue; | ||
| } | ||
| hadJsx = true; | ||
| diagnoseJsxElement(ts, tag, typeChecker, diagnostics); | ||
| } | ||
| // If root JSX element found inside array, diagnose it, | ||
| // otherwise let the diagnostic pass | ||
| if (hadJsx) { | ||
| return; | ||
| } | ||
| } | ||
| // Switch between component and element xss errors | ||
| if (isComponent || ts.isJsxFragment(node)) { | ||
| diagnostics.push(diagnostic(ts, node, 'ComponentXss', 'Error')); | ||
| } else { | ||
| diagnostics.push(diagnostic(ts, node, 'Xss', 'Error')); | ||
| } | ||
| } | ||
| export function isSafeAttribute( | ||
| ts: typeof TS, | ||
| type: Type | undefined, | ||
| checker: TypeChecker, | ||
| node: ts.Node | ||
| ): boolean { | ||
| // Nothing to do if type cannot be resolved | ||
| if (!type) { | ||
| return true; | ||
| } | ||
| // Check if this is a property access to .children (from PropsWithChildren) | ||
| // This must be checked BEFORE union recursion to avoid false positives | ||
| if (ts.isPropertyAccessExpression(node) && node.name.text === 'children') { | ||
| return true; | ||
| } | ||
| // Consolidated identifier checks - MUST be before union recursion | ||
| if (ts.isIdentifier(node)) { | ||
| // Destructured or direct `children` parameter (e.g., function Test({ children }: PropsWithChildren)) | ||
| if (node.text === 'children') { | ||
| return true; | ||
| } | ||
| // Check if variable is initialized with JSX (e.g., const element = <div />) | ||
| const symbol = checker.getSymbolAtLocation(node); | ||
| if (symbol) { | ||
| const declarations = symbol.getDeclarations(); | ||
| if (declarations) { | ||
| for (const decl of declarations) { | ||
| if ( | ||
| ts.isVariableDeclaration(decl) && | ||
| decl.initializer && | ||
| isJsx(ts, decl.initializer) | ||
| ) { | ||
| return true; | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| // Any type is never safe | ||
| if (type.flags & ts.TypeFlags.Any) { | ||
| return false; | ||
| } | ||
| // Check type aliases for JSX.Element and Html.Children | ||
| if (type.aliasSymbol) { | ||
| // Allows JSX.Element (when the alias is preserved) | ||
| if ( | ||
| node && | ||
| type.aliasSymbol.escapedName === 'Element' && | ||
| // @ts-expect-error - Fast way of checking | ||
| type.aliasSymbol.parent?.escapedName === 'JSX' && | ||
| // Only allows in .map(), other method calls or the expression itself | ||
| (ts.isCallExpression(node) || ts.isIdentifier(node)) | ||
| ) { | ||
| return true; | ||
| } | ||
| // Allows Html.Children | ||
| if ( | ||
| type.aliasSymbol.escapedName === 'Children' && | ||
| // @ts-expect-error - When using export namespace X {} and export default X, parent.escapedName | ||
| // ends up as the original namespace name, not the quoted export name. | ||
| (type.aliasSymbol.parent?.escapedName === 'Html' || | ||
| // @ts-expect-error - When using export as namespace X, parent.escapedName ends up | ||
| // as a complete (without resolving symlinks) quoted import path to its original file. | ||
| type.aliasSymbol.parent?.escapedName.endsWith('@kitajs/html/index"') || | ||
| // This is needed because of the resolved path of the parent if is installed with pnpm is a symlink | ||
| // that ts resolves to the original file path, so the path is not related to the node_modules but instead | ||
| // is absolute to the file system (this is only here because of the monorepo setup, it is not needed when used as a package) | ||
| (process.env.KITA_TS_HTML_PLUGIN_TESTING === 'true' && | ||
| // @ts-expect-error - When using export as namespace X, parent.escapedName ends up | ||
| type.aliasSymbol.parent?.escapedName.endsWith('packages/html/index"'))) | ||
| ) { | ||
| return true; | ||
| } | ||
| } | ||
| // Union types should be checked recursively | ||
| if (type.isUnionOrIntersection()) { | ||
| return type.types.every((innerType) => isSafeAttribute(ts, innerType, checker, node)); | ||
| } | ||
| // For Array or Promise, we check the type of the first generic | ||
| if (checker.isArrayType(type) || type.symbol?.escapedName === 'Promise') { | ||
| return isSafeAttribute(ts, (type as any).resolvedTypeArguments?.[0], checker, node); | ||
| } | ||
| const text = node.getText(); | ||
| // manual unsafe variables should not pass | ||
| if (text.startsWith('unsafe')) { | ||
| return false; | ||
| } | ||
| // We allow literal string types here, as if they have XSS content, | ||
| // the user has explicitly written it | ||
| if ( | ||
| // Non string types cannot have XSS values | ||
| !(type.flags & ts.TypeFlags.String) && | ||
| // Objects may have toString() overridden | ||
| !(type.flags & ts.TypeFlags.Object) | ||
| ) { | ||
| return true; | ||
| } | ||
| if ( | ||
| // Variables starting with safe are suppressed | ||
| text.startsWith('safe') || | ||
| // Starts with a call to a escapeHtml function name | ||
| text.match(ESCAPE_HTML_REGEX) | ||
| ) { | ||
| return true; | ||
| } | ||
| return false; | ||
| } | ||
| export function getSafeAttribute(element: JsxOpeningElement) { | ||
| for (const attribute of element.attributes.properties) { | ||
| if (attribute.getText() === 'safe') { | ||
| return attribute; | ||
| } | ||
| } | ||
| return undefined; | ||
| } | ||
| export function proxyObject<T extends object>(obj: T): T { | ||
| const proxy: T = Object.create(null); | ||
| for (const k of Object.keys(obj) as Array<keyof T>) { | ||
| const x = obj[k]!; | ||
| // @ts-expect-error - JS runtime trickery which is tricky to type tersely | ||
| proxy[k] = (...args: Array<{}>) => x.apply(obj, args); | ||
| } | ||
| return proxy; | ||
| } | ||
| /** | ||
| * Returns more than one node if the node is a binary expression or a conditional | ||
| * expression | ||
| */ | ||
| function getNodeExpressions( | ||
| ts: typeof TS, | ||
| node: TS.Expression | ||
| ): TS.Expression[] | undefined { | ||
| // Checks operators | ||
| if (ts.isBinaryExpression(node)) { | ||
| // Ignores operations which results in a boolean | ||
| if (isBooleanBinaryOperatorToken(ts, node.operatorToken)) { | ||
| return []; | ||
| } | ||
| // For && operator, the left side is only rendered when falsy | ||
| // (empty string, null, undefined, 0, false, NaN) - none of which are XSS risks | ||
| // So we only need to diagnose the right side | ||
| if (node.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) { | ||
| return [node.right]; | ||
| } | ||
| // For || and ?? operators, both sides can be rendered with potentially unsafe values | ||
| // So we diagnose both sides | ||
| return [node.left, node.right]; | ||
| } | ||
| // Checks the inner expression | ||
| if (ts.isConditionalExpression(node)) { | ||
| // ignore node.condition because its value will never be rendered | ||
| return [node.whenTrue, node.whenFalse]; | ||
| } | ||
| return undefined; | ||
| } | ||
| function isBooleanBinaryOperatorToken(ts: typeof TS, operator: BinaryOperatorToken) { | ||
| switch (operator.kind) { | ||
| case ts.SyntaxKind.EqualsEqualsEqualsToken: | ||
| case ts.SyntaxKind.EqualsEqualsToken: | ||
| case ts.SyntaxKind.ExclamationEqualsEqualsToken: | ||
| case ts.SyntaxKind.ExclamationEqualsToken: | ||
| case ts.SyntaxKind.GreaterThanToken: | ||
| case ts.SyntaxKind.GreaterThanEqualsToken: | ||
| case ts.SyntaxKind.LessThanEqualsToken: | ||
| case ts.SyntaxKind.LessThanToken: | ||
| case ts.SyntaxKind.InstanceOfKeyword: | ||
| case ts.SyntaxKind.InKeyword: | ||
| return true; | ||
| } | ||
| return false; | ||
| } |
+1
-2
@@ -1,3 +0,2 @@ | ||
| #!/usr/bin/env node | ||
| export {}; | ||
| export declare function main(): Promise<never>; | ||
| //# sourceMappingURL=cli.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""} | ||
| {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAuGA,wBAAsB,IAAI,mBA6HzB"} |
+9
-8
@@ -1,10 +0,12 @@ | ||
| #!/usr/bin/env node | ||
| "use strict"; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const tslib_1 = require("tslib"); | ||
| const chalk_1 = tslib_1.__importDefault(require("chalk")); | ||
| const node_fs_1 = tslib_1.__importDefault(require("node:fs")); | ||
| const node_path_1 = tslib_1.__importDefault(require("node:path")); | ||
| const typescript_1 = tslib_1.__importDefault(require("typescript")); | ||
| const yargs_1 = tslib_1.__importDefault(require("yargs")); | ||
| exports.main = main; | ||
| const chalk_1 = __importDefault(require("chalk")); | ||
| const node_fs_1 = __importDefault(require("node:fs")); | ||
| const node_path_1 = __importDefault(require("node:path")); | ||
| const typescript_1 = __importDefault(require("typescript")); | ||
| const yargs_1 = __importDefault(require("yargs")); | ||
| const helpers_1 = require("yargs/helpers"); | ||
@@ -170,3 +172,2 @@ const util_1 = require("./util"); | ||
| } | ||
| main().catch(console.error); | ||
| //# sourceMappingURL=cli.js.map |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"} |
+4
-4
| export declare const Xss: { | ||
| code: any; | ||
| code: number; | ||
| message: string; | ||
| }; | ||
| export declare const DoubleEscape: { | ||
| code: any; | ||
| code: number; | ||
| message: string; | ||
| }; | ||
| export declare const ComponentXss: { | ||
| code: any; | ||
| code: number; | ||
| message: string; | ||
| }; | ||
| export declare const UnusedSafe: { | ||
| code: any; | ||
| code: number; | ||
| message: string; | ||
| }; | ||
| //# sourceMappingURL=errors.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,GAAG;UACI,GAAG;;CAEtB,CAAC;AAEF,eAAO,MAAM,YAAY;UACL,GAAG;;CAEtB,CAAC;AAEF,eAAO,MAAM,YAAY;UACL,GAAG;;CAEtB,CAAC;AAEF,eAAO,MAAM,UAAU;UACH,GAAG;;CAEtB,CAAC"} | ||
| {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,GAAG;;;CAGf,CAAC;AAEF,eAAO,MAAM,YAAY;;;CAGxB,CAAC;AAEF,eAAO,MAAM,YAAY;;;CAGxB,CAAC;AAEF,eAAO,MAAM,UAAU;;;CAGtB,CAAC"} |
+15
-18
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.UnusedSafe = exports.ComponentXss = exports.DoubleEscape = exports.Xss = void 0; | ||
| function urlDocs(error) { | ||
| return `https://html.kitajs.org/packages/ts-html-plugin#${error}`; | ||
| function createError(code, message) { | ||
| return { | ||
| code, | ||
| message: process.env.INTERNAL_DISABLE_URL_DOCS !== 'true' | ||
| ? `${message}\nSee https://html.kitajs.org/TS${code}` | ||
| : message | ||
| }; | ||
| } | ||
| exports.Xss = { | ||
| code: '0 K601', | ||
| message: `Usage of xss-prone content without \`safe\` attribute. ${urlDocs('k601')}` | ||
| }; | ||
| exports.DoubleEscape = { | ||
| code: '0 K602', | ||
| message: `Double escaping detected. Please remove the \`safe\` attribute. ${urlDocs('k602')}` | ||
| }; | ||
| exports.ComponentXss = { | ||
| code: '0 K603', | ||
| message: `Xss-prone content inside a Component, wrap it into a Html.escapeHtml() call. ${urlDocs('k603')}` | ||
| }; | ||
| exports.UnusedSafe = { | ||
| code: '0 K604', | ||
| message: `Unused safe attribute. ${urlDocs('k604')}` | ||
| }; | ||
| // 88600 is the base code for all errors in this plugin. | ||
| // KITA in ASCII | ||
| // 75 * 105 * 116 * 97 = 88609500 | ||
| // Simplify to 88600 | ||
| exports.Xss = createError(88601, `Content may introduce an XSS vulnerability and must be marked with the \`safe\` attribute.`); | ||
| exports.DoubleEscape = createError(88602, `The \`safe\` attribute causes this content to be escaped more than once.`); | ||
| exports.ComponentXss = createError(88603, `Content inside a Component must be escaped using escapeHtml().`); | ||
| exports.UnusedSafe = createError(88604, `The \`safe\` attribute is unused in this context.`); | ||
| //# sourceMappingURL=errors.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,SAAS,OAAO,CAAC,KAAmB;IAClC,OAAO,mDAAmD,KAAK,EAAE,CAAC;AACpE,CAAC;AAEY,QAAA,GAAG,GAAG;IACjB,IAAI,EAAE,QAAe;IACrB,OAAO,EAAE,0DAA0D,OAAO,CAAC,MAAM,CAAC,EAAE;CACrF,CAAC;AAEW,QAAA,YAAY,GAAG;IAC1B,IAAI,EAAE,QAAe;IACrB,OAAO,EAAE,mEAAmE,OAAO,CAAC,MAAM,CAAC,EAAE;CAC9F,CAAC;AAEW,QAAA,YAAY,GAAG;IAC1B,IAAI,EAAE,QAAe;IACrB,OAAO,EAAE,gFAAgF,OAAO,CAAC,MAAM,CAAC,EAAE;CAC3G,CAAC;AAEW,QAAA,UAAU,GAAG;IACxB,IAAI,EAAE,QAAe;IACrB,OAAO,EAAE,0BAA0B,OAAO,CAAC,MAAM,CAAC,EAAE;CACrD,CAAC"} | ||
| {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,SAAS,WAAW,CAAC,IAAY,EAAE,OAAe,EAAE;IAClD,OAAO;QACL,IAAI;QACJ,OAAO,EACL,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,MAAM;YAC9C,CAAC,CAAC,GAAG,OAAO,mCAAmC,IAAI,EAAE;YACrD,CAAC,CAAC,OAAO;KACd,CAAC;AAAA,CACH;AAED,wDAAwD;AACxD,gBAAgB;AAChB,iCAAiC;AACjC,oBAAoB;AAEP,QAAA,GAAG,GAAG,WAAW,CAC5B,KAAK,EACL,4FAA4F,CAC7F,CAAC;AAEW,QAAA,YAAY,GAAG,WAAW,CACrC,KAAK,EACL,0EAA0E,CAC3E,CAAC;AAEW,QAAA,YAAY,GAAG,WAAW,CACrC,KAAK,EACL,gEAAgE,CACjE,CAAC;AAEW,QAAA,UAAU,GAAG,WAAW,CACnC,KAAK,EACL,mDAAmD,CACpD,CAAC"} |
+1
-1
@@ -5,5 +5,5 @@ import type { default as TS, server } from 'typescript/lib/tsserverlibrary'; | ||
| }) => { | ||
| create(info: server.PluginCreateInfo): TS.LanguageService; | ||
| create(info: Pick<server.PluginCreateInfo, "languageService">): TS.LanguageService; | ||
| }; | ||
| export = _default; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;yBAG3C,SAAS;IAAE,UAAU,EAAE,OAAO,EAAE,CAAA;CAAE;iBAIlD,MAAM,CAAC,gBAAgB;;AAJxC,kBAuCE"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;;;;;;AAG5E,kBAuCE"} |
+1
-1
| "use strict"; | ||
| const util_1 = require("./util"); | ||
| module.exports = function initHtmlPlugin(modules) { | ||
| module.exports = function (modules) { | ||
| const ts = modules.typescript; | ||
@@ -5,0 +5,0 @@ return { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,iCAAmE;AAEnE,iBAAS,SAAS,cAAc,CAAC,OAAkC;IACjE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAE9B,OAAO;QACL,MAAM,CAAC,IAA6B;YAClC,MAAM,KAAK,GAAG,IAAA,kBAAW,EAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAEhD,KAAK,CAAC,sBAAsB,GAAG,SAAS,yBAAyB,CAAC,QAAQ;gBACxE,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;gBAE1E,uCAAuC;gBACvC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7D,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;gBAElD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAE/C,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;gBAE7C,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,eAAe,CAAC,IAAI;oBACnD,IAAA,mCAA4B,EAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;gBACnE,CAAC,CAAC,CAAC;gBAEH,OAAO,WAAW,CAAC;YACrB,CAAC,CAAC;YAEF,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,iCAAmE;AAEnE,iBAAS,UAAU,OAAkC,EAAE;IACrD,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAE9B,OAAO;QACL,MAAM,CAAC,IAAsD,EAAE;YAC7D,MAAM,KAAK,GAAG,IAAA,kBAAW,EAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAEhD,KAAK,CAAC,sBAAsB,GAAG,SAAS,yBAAyB,CAAC,QAAQ,EAAE;gBAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;gBAE1E,uCAAuC;gBACvC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7D,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;gBAElD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAE/C,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;gBAE7C,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,eAAe,CAAC,IAAI,EAAE;oBACrD,IAAA,mCAA4B,EAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;gBAAA,CAClE,CAAC,CAAC;gBAEH,OAAO,WAAW,CAAC;YAAA,CACpB,CAAC;YAEF,OAAO,KAAK,CAAC;QAAA,CACd;KACF,CAAC;AAAA,CACH,CAAC"} |
+2
-4
@@ -1,7 +0,5 @@ | ||
| import ts, { type JsxFragment } from 'typescript'; | ||
| import { type JsxFragment, type JsxSelfClosingElement, type default as ts } from 'typescript'; | ||
| import type { Diagnostic, JsxElement, JsxOpeningElement, Node, default as TS, Type, TypeChecker } from 'typescript/lib/tsserverlibrary'; | ||
| /** If the node is a JSX element or fragment */ | ||
| export declare function isJsx(ts: typeof TS, node: TS.Node): node is JsxElement | JsxFragment; | ||
| export declare function recursiveDiagnoseJsxElements(ts: typeof TS, node: Node, typeChecker: TypeChecker, original: Diagnostic[]): void; | ||
| export declare function diagnoseJsxElement(ts: typeof TS, node: JsxElement | JsxFragment, typeChecker: TypeChecker, diagnostics: Diagnostic[]): void; | ||
| export declare function diagnoseJsxElement(ts: typeof TS, node: JsxElement | JsxFragment | JsxSelfClosingElement, typeChecker: TypeChecker, diagnostics: Diagnostic[]): void; | ||
| export declare function isSafeAttribute(ts: typeof TS, type: Type | undefined, checker: TypeChecker, node: ts.Node): boolean; | ||
@@ -8,0 +6,0 @@ export declare function getSafeAttribute(element: JsxOpeningElement): ts.JsxAttributeLike | undefined; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAEV,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,IAAI,EACJ,OAAO,IAAI,EAAE,EACb,IAAI,EACJ,WAAW,EACZ,MAAM,gCAAgC,CAAC;AAMxC,+CAA+C;AAC/C,wBAAgB,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,IAAI,UAAU,GAAG,WAAW,CAIpF;AAED,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,OAAO,EAAE,EACb,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,UAAU,EAAE,QAwBvB;AAiBD,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,OAAO,EAAE,EACb,IAAI,EAAE,UAAU,GAAG,WAAW,EAC9B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,UAAU,EAAE,GACxB,IAAI,CA+FN;AAkED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,OAAO,EAAE,EACb,IAAI,EAAE,IAAI,GAAG,SAAS,EACtB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,EAAE,CAAC,IAAI,GACZ,OAAO,CAkFT;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,mCAQ1D;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAUvD"} | ||
| {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,OAAO,IAAI,EAAE,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAEV,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,IAAI,EACJ,OAAO,IAAI,EAAE,EACb,IAAI,EACJ,WAAW,EACZ,MAAM,gCAAgC,CAAC;AAgBxC,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,OAAO,EAAE,EACb,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,UAAU,EAAE,QAwBvB;AAkBD,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,OAAO,EAAE,EACb,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,qBAAqB,EACtD,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,UAAU,EAAE,GACxB,IAAI,CA+FN;AAkED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,OAAO,EAAE,EACb,IAAI,EAAE,IAAI,GAAG,SAAS,EACtB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,EAAE,CAAC,IAAI,GACZ,OAAO,CAkHT;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,mCAQ1D;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAUvD"} |
+101
-38
| "use strict"; | ||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| var desc = Object.getOwnPropertyDescriptor(m, k); | ||
| if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
| desc = { enumerable: true, get: function() { return m[k]; } }; | ||
| } | ||
| Object.defineProperty(o, k2, desc); | ||
| }) : (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| o[k2] = m[k]; | ||
| })); | ||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
| Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
| }) : function(o, v) { | ||
| o["default"] = v; | ||
| }); | ||
| var __importStar = (this && this.__importStar) || (function () { | ||
| var ownKeys = function(o) { | ||
| ownKeys = Object.getOwnPropertyNames || function (o) { | ||
| var ar = []; | ||
| for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; | ||
| return ar; | ||
| }; | ||
| return ownKeys(o); | ||
| }; | ||
| return function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); | ||
| __setModuleDefault(result, mod); | ||
| return result; | ||
| }; | ||
| })(); | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.isJsx = isJsx; | ||
| exports.recursiveDiagnoseJsxElements = recursiveDiagnoseJsxElements; | ||
@@ -9,5 +41,3 @@ exports.diagnoseJsxElement = diagnoseJsxElement; | ||
| exports.proxyObject = proxyObject; | ||
| const tslib_1 = require("tslib"); | ||
| const typescript_1 = tslib_1.__importDefault(require("typescript")); | ||
| const Errors = tslib_1.__importStar(require("./errors")); | ||
| const Errors = __importStar(require("./errors")); | ||
| const UPPERCASE = /[A-Z]/; | ||
@@ -39,5 +69,5 @@ const ESCAPE_HTML_REGEX = /^(\w+\.)?(escapeHtml|e\s*`|escape)/i; | ||
| } | ||
| function diagnostic(node, error, category) { | ||
| function diagnostic(ts, node, error, category) { | ||
| return { | ||
| category: typescript_1.default.DiagnosticCategory[category], | ||
| category: ts.DiagnosticCategory[category], | ||
| messageText: Errors[error].message, | ||
@@ -65,3 +95,3 @@ code: Errors[error].code, | ||
| (node.children.length === 1 && node.children[0].kind === ts.SyntaxKind.JsxText)) { | ||
| diagnostics.push(diagnostic(safeAttribute, 'UnusedSafe', 'Warning')); | ||
| diagnostics.push(diagnostic(ts, safeAttribute, 'UnusedSafe', 'Warning')); | ||
| return; | ||
@@ -71,7 +101,7 @@ } | ||
| if ( | ||
| // JSX Element inside safe | ||
| ts.isJsxElement(exp) || | ||
| // JSX Element inside safe (includes self-closing elements like <Component />) | ||
| isJsx(ts, exp) || | ||
| // Element is using safe with escapeHtml | ||
| (ts.isJsxExpression(exp) && exp.expression?.getText().match(ESCAPE_HTML_REGEX))) { | ||
| diagnostics.push(diagnostic(safeAttribute, 'DoubleEscape', 'Error')); | ||
| diagnostics.push(diagnostic(ts, safeAttribute, 'DoubleEscape', 'Error')); | ||
| continue; | ||
@@ -84,6 +114,6 @@ } | ||
| // gets this expression or array of sub expressions | ||
| const expressions = getNodeExpressions(exp.expression) || [exp.expression]; | ||
| // at least one jsx inside another jsx with safe | ||
| if (expressions.some((inner) => ts.isJsxElement(inner))) { | ||
| diagnostics.push(diagnostic(safeAttribute, 'DoubleEscape', 'Error')); | ||
| const expressions = getNodeExpressions(ts, exp.expression) || [exp.expression]; | ||
| // at least one jsx inside another jsx with safe (includes self-closing elements) | ||
| if (expressions.some((inner) => isJsx(ts, inner))) { | ||
| diagnostics.push(diagnostic(ts, safeAttribute, 'DoubleEscape', 'Error')); | ||
| continue; | ||
@@ -93,3 +123,3 @@ } | ||
| if (expressions.every((inner) => isSafeAttribute(ts, typeChecker.getTypeAtLocation(inner), typeChecker, inner))) { | ||
| diagnostics.push(diagnostic(safeAttribute, 'UnusedSafe', 'Warning')); | ||
| diagnostics.push(diagnostic(ts, safeAttribute, 'UnusedSafe', 'Warning')); | ||
| } | ||
@@ -103,3 +133,3 @@ } | ||
| // for example it could be a self closing element | ||
| if (!node.children) { | ||
| if (ts.isJsxSelfClosingElement(node) || !node.children) { | ||
| return; | ||
@@ -129,3 +159,3 @@ } | ||
| } | ||
| const expressions = getNodeExpressions(node); | ||
| const expressions = getNodeExpressions(ts, node); | ||
| // ternary or binary expressions should be evaluated on each side | ||
@@ -161,6 +191,6 @@ if (expressions) { | ||
| if (isComponent || ts.isJsxFragment(node)) { | ||
| diagnostics.push(diagnostic(node, 'ComponentXss', 'Error')); | ||
| diagnostics.push(diagnostic(ts, node, 'ComponentXss', 'Error')); | ||
| } | ||
| else { | ||
| diagnostics.push(diagnostic(node, 'Xss', 'Error')); | ||
| diagnostics.push(diagnostic(ts, node, 'Xss', 'Error')); | ||
| } | ||
@@ -173,2 +203,28 @@ } | ||
| } | ||
| // Check if this is a property access to .children (from PropsWithChildren) | ||
| // This must be checked BEFORE union recursion to avoid false positives | ||
| if (ts.isPropertyAccessExpression(node) && node.name.text === 'children') { | ||
| return true; | ||
| } | ||
| // Consolidated identifier checks - MUST be before union recursion | ||
| if (ts.isIdentifier(node)) { | ||
| // Destructured or direct `children` parameter (e.g., function Test({ children }: PropsWithChildren)) | ||
| if (node.text === 'children') { | ||
| return true; | ||
| } | ||
| // Check if variable is initialized with JSX (e.g., const element = <div />) | ||
| const symbol = checker.getSymbolAtLocation(node); | ||
| if (symbol) { | ||
| const declarations = symbol.getDeclarations(); | ||
| if (declarations) { | ||
| for (const decl of declarations) { | ||
| if (ts.isVariableDeclaration(decl) && | ||
| decl.initializer && | ||
| isJsx(ts, decl.initializer)) { | ||
| return true; | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| // Any type is never safe | ||
@@ -178,4 +234,5 @@ if (type.flags & ts.TypeFlags.Any) { | ||
| } | ||
| // Check type aliases for JSX.Element and Html.Children | ||
| if (type.aliasSymbol) { | ||
| // Allows JSX.Element | ||
| // Allows JSX.Element (when the alias is preserved) | ||
| if (node && | ||
@@ -258,32 +315,38 @@ type.aliasSymbol.escapedName === 'Element' && | ||
| */ | ||
| function getNodeExpressions(node) { | ||
| function getNodeExpressions(ts, node) { | ||
| // Checks operators | ||
| if (typescript_1.default.isBinaryExpression(node)) { | ||
| if (ts.isBinaryExpression(node)) { | ||
| // Ignores operations which results in a boolean | ||
| if (isBooleanBinaryOperatorToken(node.operatorToken)) { | ||
| if (isBooleanBinaryOperatorToken(ts, node.operatorToken)) { | ||
| return []; | ||
| } | ||
| // Diagnose both sides since both sides can be executed, e.g: | ||
| // a empty string in the left side will execute the right side | ||
| // For && operator, the left side is only rendered when falsy | ||
| // (empty string, null, undefined, 0, false, NaN) - none of which are XSS risks | ||
| // So we only need to diagnose the right side | ||
| if (node.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) { | ||
| return [node.right]; | ||
| } | ||
| // For || and ?? operators, both sides can be rendered with potentially unsafe values | ||
| // So we diagnose both sides | ||
| return [node.left, node.right]; | ||
| } | ||
| // Checks the inner expression | ||
| if (typescript_1.default.isConditionalExpression(node)) { | ||
| if (ts.isConditionalExpression(node)) { | ||
| // ignore node.condition because its value will never be rendered | ||
| return [node.whenFalse, node.whenFalse]; | ||
| return [node.whenTrue, node.whenFalse]; | ||
| } | ||
| return undefined; | ||
| } | ||
| function isBooleanBinaryOperatorToken(operator) { | ||
| function isBooleanBinaryOperatorToken(ts, operator) { | ||
| switch (operator.kind) { | ||
| case typescript_1.default.SyntaxKind.EqualsEqualsEqualsToken: | ||
| case typescript_1.default.SyntaxKind.EqualsEqualsToken: | ||
| case typescript_1.default.SyntaxKind.ExclamationEqualsEqualsToken: | ||
| case typescript_1.default.SyntaxKind.ExclamationEqualsToken: | ||
| case typescript_1.default.SyntaxKind.GreaterThanToken: | ||
| case typescript_1.default.SyntaxKind.GreaterThanEqualsToken: | ||
| case typescript_1.default.SyntaxKind.LessThanEqualsToken: | ||
| case typescript_1.default.SyntaxKind.LessThanToken: | ||
| case typescript_1.default.SyntaxKind.InstanceOfKeyword: | ||
| case typescript_1.default.SyntaxKind.InKeyword: | ||
| case ts.SyntaxKind.EqualsEqualsEqualsToken: | ||
| case ts.SyntaxKind.EqualsEqualsToken: | ||
| case ts.SyntaxKind.ExclamationEqualsEqualsToken: | ||
| case ts.SyntaxKind.ExclamationEqualsToken: | ||
| case ts.SyntaxKind.GreaterThanToken: | ||
| case ts.SyntaxKind.GreaterThanEqualsToken: | ||
| case ts.SyntaxKind.LessThanEqualsToken: | ||
| case ts.SyntaxKind.LessThanToken: | ||
| case ts.SyntaxKind.InstanceOfKeyword: | ||
| case ts.SyntaxKind.InKeyword: | ||
| return true; | ||
@@ -290,0 +353,0 @@ } |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"} |
+22
-14
| { | ||
| "name": "@kitajs/ts-html-plugin", | ||
| "version": "4.1.4", | ||
| "version": "5.0.0-next.0", | ||
| "homepage": "https://github.com/kitajs/html/tree/master/packages/ts-html-plugin#readme", | ||
@@ -19,5 +19,10 @@ "bugs": "https://github.com/kitajs/html/issues", | ||
| "bin": { | ||
| "ts-html-plugin": "dist/cli.js", | ||
| "xss-scan": "dist/cli.js" | ||
| "ts-html-plugin": "bin/index.js", | ||
| "xss-scan": "bin/index.js" | ||
| }, | ||
| "files": [ | ||
| "dist", | ||
| "src", | ||
| "!dist/*.tsbuildinfo" | ||
| ], | ||
| "dependencies": { | ||
@@ -29,19 +34,22 @@ "chalk": "^5.6.2", | ||
| "devDependencies": { | ||
| "@swc-node/register": "^1.11.1", | ||
| "@swc/helpers": "^0.5.17", | ||
| "@types/node": "^24.5.0", | ||
| "@types/yargs": "^17.0.33", | ||
| "@types/node": "^24.10.13", | ||
| "@types/yargs": "^17.0.35", | ||
| "@typescript/native-preview": "^7.0.0-dev.20260122.2", | ||
| "@vitest/coverage-v8": "^4.0.18", | ||
| "fast-defer": "^1.1.9", | ||
| "self": "file:" | ||
| "self-ts-plugin": "link:", | ||
| "typescript": "^5.9.3", | ||
| "vitest": "^4.0.18", | ||
| "@kitajs/html": "^5.0.0-next.0" | ||
| }, | ||
| "peerDependencies": { | ||
| "@kitajs/html": "^4.2.10", | ||
| "typescript": "^5.9.3" | ||
| "typescript": "^5.9.3", | ||
| "@kitajs/html": "^5.0.0-next.0" | ||
| }, | ||
| "scripts": { | ||
| "build": "tsc -p tsconfig.build.json", | ||
| "dev": "tsc -p tsconfig.build.json --watch", | ||
| "test": "pnpm build && pnpm install && pnpm test-exec", | ||
| "test-exec": "node --require @swc-node/register --test test/**/*.test.ts" | ||
| "build": "tsgo -p tsconfig.build.json", | ||
| "pretest": "pnpm run build", | ||
| "test": "vitest --coverage --typecheck --run", | ||
| "test-types": "tsgo --noEmit" | ||
| } | ||
| } |
+44
-17
@@ -48,7 +48,8 @@ <p align="center"> | ||
| - [Vscode](#vscode) | ||
| - [tsgo Compatibility](#tsgo-compatibility) | ||
| - [Error codes](#error-codes) | ||
| - [K601](#k601) | ||
| - [K602](#k602) | ||
| - [K603](#k603) | ||
| - [K604](#k604) | ||
| - [TS88601](#ts88601) | ||
| - [TS88602](#ts88602) | ||
| - [TS88603](#ts88603) | ||
| - [TS88604](#ts88604) | ||
| - [JSX](#jsx) | ||
@@ -84,5 +85,4 @@ - [Special cases](#special-cases) | ||
| "compilerOptions": { | ||
| "jsx": "react", | ||
| "jsxFactory": "Html.createElement", | ||
| "jsxFragmentFactory": "Html.Fragment", | ||
| "jsx": "react-jsx", | ||
| "jsxImportSource": "@kitajs/html", | ||
| "plugins": [{ "name": "@kitajs/ts-html-plugin" }] | ||
@@ -99,3 +99,3 @@ } | ||
| You can also run this project as a CLI tool. Which is a great way to ensue project-wide | ||
| You can also run this project as a CLI tool. Which is a great way to ensure project-wide | ||
| security. Also it's a great way to integrate with your CI/CD pipeline. | ||
@@ -143,5 +143,5 @@ | ||
| 1. **Keep using use the `safe` Attribute:** Even if you are certain that the content is | ||
| free from XSS vulnerabilities, you can still use the `safe` attribute for added | ||
| assurance. After all, what's the problem of being safe twice? | ||
| 1. **Keep using the `safe` Attribute:** Even if you are certain that the content is free | ||
| from XSS vulnerabilities, you can still use the `safe` attribute for added assurance. | ||
| After all, what's the problem of being safe twice? | ||
@@ -185,6 +185,26 @@ ```tsx | ||
| ## tsgo Compatibility | ||
| [tsgo](https://github.com/microsoft/typescript-go) (the native TypeScript compiler | ||
| preview) does not currently implement support for Language Service Plugins. This means | ||
| that when using tsgo, your IDE will not show XSS warnings and errors from this plugin. | ||
| However, the `xss-scan` CLI tool will continue to work normally, as it uses the standard | ||
| TypeScript compiler APIs. You can still use `xss-scan` in your CI/CD pipeline to catch XSS | ||
| vulnerabilities even when developing with tsgo. | ||
| ```sh | ||
| # This works regardless of whether you use tsgo or tsc | ||
| xss-scan | ||
| ``` | ||
| <br /> | ||
| ## Error codes | ||
| ### K601 | ||
| ### TS88601 | ||
| **Content may introduce an XSS vulnerability and must be marked with the `safe` | ||
| attribute.** | ||
| Usage of JSX expression without safe attribute. This could lead to XSS vulnerabilities. | ||
@@ -211,4 +231,6 @@ Please use the safe attribute on the JSX element or prepend your variable with `safe`. | ||
| ### K602 | ||
| ### TS88602 | ||
| **The `safe` attribute causes this content to be escaped more than once.** | ||
| Usage of safe attribute on a JSX element whose children contains other JSX elements. It | ||
@@ -240,9 +262,12 @@ will lead to double escaping. If this is intended behavior, please extract the children | ||
| ### K603 | ||
| ### TS88603 | ||
| **Content inside a Component must be escaped using escapeHtml().** | ||
| You are using a xss-prone element as a children of a component. Please wrap it into a | ||
| Html.escapeHtml() call or prepend it as a variable starting with `safe`. | ||
| This error is similar to [K601](#k601), but instead of using `safe` native attribute, you | ||
| need to use `Html.escapeHtml()` function because its a component and not a native JSX. | ||
| This error is similar to [TS88601](#ts88601), but instead of using `safe` native | ||
| attribute, you need to use `Html.escapeHtml()` function because its a component and not a | ||
| native JSX. | ||
@@ -266,4 +291,6 @@ ```tsx | ||
| ### K604 | ||
| ### TS88604 | ||
| **The `safe` attribute is unused in this context.** | ||
| You are using the safe attribute on expressions that does not contain any XSS | ||
@@ -270,0 +297,0 @@ vulnerabilities. Please remove the safe attribute or prepend your variable with `unsafe`. |
Sorry, the diff of this file is not supported yet
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
24
20%1214
128.63%333
8.82%77134
-18.24%9
50%1
Infinity%7
250%