Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@kitajs/ts-html-plugin

Package Overview
Dependencies
Maintainers
1
Versions
26
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@kitajs/ts-html-plugin - npm Package Compare versions

Comparing version
4.1.4
to
5.0.0-next.0
+8
bin/index.js
#!/usr/bin/env node
const { main } = require('../dist/cli.js');
void main().catch((error) => {
console.error(error);
process.exit(1);
});
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.`
);
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;
}
};
};
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"}

@@ -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 +0,1 @@

{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;AAEA,0DAA0B;AAC1B,8DAAyB;AACzB,kEAA6B;AAC7B,oEAA4B;AAC5B,0DAA0B;AAC1B,2CAAwC;AACxC,iCAAsD;AAEtD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,IAAI,GAAG;;0BAEa,OAAO;;;;;;;;;;;;;;;;;;;;;;;;CAwBhC,CAAC,IAAI,EAAE,CAAC;AAET,SAAS,mBAAmB,CAAC,YAAoB;IAC/C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,oBAAE,CAAC,cAAc,CAAC,YAAY,EAAE,oBAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE3E,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,oBAAE,CAAC,0BAA0B,CAClE,MAAM,EACN,oBAAE,CAAC,GAAG,EACN,mBAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAC1B,SAAS,EACT,YAAY,CACb,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,qBAAqB,CAAC,WAA4B,EAAE,IAAY;IACvE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,uCAAuC;IACvC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,MAAM,cAAc,KAAK,CAAC,IAAI,UAAU,CAAC,CACpF,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CACP,SAAS,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,mBAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAClF,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC;QACH,iBAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,MAAM,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IAElF,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,4BAA4B;IAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,KAAK,CAAC;YACX,KAAK,SAAS,CAAC;YACf,KAAK,GAAG,CAAC;YACT,KAAK,GAAG,CAAC;YACT,KAAK,YAAY;gBACf,SAAS;YACX;gBACE,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,oCAAoC,CAAC,CAAC;gBAC5E,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjD,MAAM,mBAAmB,GACvB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU;QACjC,CAAC,CAAC,oBAAE,CAAC,iBAAiB;QACtB,CAAC,CAAC,oBAAE,CAAC,oCAAoC,CAAC;IAE9C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,YAAY,EAAE,CAAC,CAAC,CAAC;QACpF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAEnD,MAAM,cAAc,GAA6B;QAC/C,mBAAmB,EAAE,oBAAE,CAAC,GAAG,CAAC,mBAAmB;QAC/C,oBAAoB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ;QAC5C,UAAU,EAAE,GAAG,EAAE,CAAC,oBAAE,CAAC,GAAG,CAAC,OAAO;KACjC,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;QACpE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;IAE/B,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAClB,iFAAiF;QACjF,KAAK,GAAG,EAAE,CAAC;QAEX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CACX,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,4BAA4B,IAAI,SAAS,CAAC,CAC9E,CAAC;gBACF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,IAAI,CACV,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CACnC,aAAa,IAAI,+BAA+B,CACjD,CACF,CAAC;gBACF,SAAS;YACX,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACnF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,oBAAE,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAEzC,MAAM,WAAW,GAAoB,EAAE,CAAC;IAExC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEjC,uCAAuC;QACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,oBAAE,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,eAAe,CAAC,IAAI;YACnD,IAAA,mCAA4B,EAAC,oBAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAC/B,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,oBAAE,CAAC,kBAAkB,CAAC,KAAK,CACpE,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;QAEhE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,qBAAqB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,mCAAmC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
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"}
"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"}

@@ -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"}
"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"}

@@ -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"}
"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 +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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"}
{
"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