@kitajs/ts-html-plugin 4.1.3 → 5.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -17
- package/bin/index.js +8 -0
- package/dist/cli.d.ts +1 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -8
- package/dist/cli.js.map +1 -1
- package/dist/errors.d.ts +4 -4
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +15 -18
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/util.d.ts +2 -4
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +101 -38
- package/dist/util.js.map +1 -1
- package/package.json +22 -14
- package/src/cli.ts +229 -0
- package/src/errors.ts +34 -0
- package/src/index.ts +43 -0
- package/src/util.ts +438 -0
- package/dist/tsconfig.build.tsbuildinfo +0 -1
package/README.md
CHANGED
|
@@ -45,11 +45,12 @@
|
|
|
45
45
|
- [Running as CLI](#running-as-cli)
|
|
46
46
|
- [Handling Warnings](#handling-warnings)
|
|
47
47
|
- [Vscode](#vscode)
|
|
48
|
+
- [tsgo Compatibility](#tsgo-compatibility)
|
|
48
49
|
- [Error codes](#error-codes)
|
|
49
|
-
- [
|
|
50
|
-
- [
|
|
51
|
-
- [
|
|
52
|
-
- [
|
|
50
|
+
- [TS88601](#ts88601)
|
|
51
|
+
- [TS88602](#ts88602)
|
|
52
|
+
- [TS88603](#ts88603)
|
|
53
|
+
- [TS88604](#ts88604)
|
|
53
54
|
- [JSX](#jsx)
|
|
54
55
|
- [Special cases](#special-cases)
|
|
55
56
|
|
|
@@ -80,9 +81,8 @@ manager, and put this inside your `tsconfig.json`.
|
|
|
80
81
|
|
|
81
82
|
{
|
|
82
83
|
"compilerOptions": {
|
|
83
|
-
"jsx": "react",
|
|
84
|
-
"
|
|
85
|
-
"jsxFragmentFactory": "Html.Fragment",
|
|
84
|
+
"jsx": "react-jsx",
|
|
85
|
+
"jsxImportSource": "@kitajs/html",
|
|
86
86
|
"plugins": [{ "name": "@kitajs/ts-html-plugin" }]
|
|
87
87
|
}
|
|
88
88
|
}
|
|
@@ -94,7 +94,7 @@ manager, and put this inside your `tsconfig.json`.
|
|
|
94
94
|
|
|
95
95
|
## Running as CLI
|
|
96
96
|
|
|
97
|
-
You can also run this project as a CLI tool. Which is a great way to
|
|
97
|
+
You can also run this project as a CLI tool. Which is a great way to ensure project-wide
|
|
98
98
|
security. Also it's a great way to integrate with your CI/CD pipeline.
|
|
99
99
|
|
|
100
100
|
```sh
|
|
@@ -137,9 +137,9 @@ Sometimes, the plugin may not detect that a string or variable is safe for use a
|
|
|
137
137
|
emit warnings, even when you are confident there are no security issues. Here are ways to
|
|
138
138
|
address this:
|
|
139
139
|
|
|
140
|
-
1. **Keep using
|
|
141
|
-
|
|
142
|
-
|
|
140
|
+
1. **Keep using the `safe` Attribute:** Even if you are certain that the content is free
|
|
141
|
+
from XSS vulnerabilities, you can still use the `safe` attribute for added assurance.
|
|
142
|
+
After all, what's the problem of being safe twice?
|
|
143
143
|
|
|
144
144
|
```tsx
|
|
145
145
|
const html = <div safe>{content}</div>;
|
|
@@ -178,9 +178,29 @@ current project's typescript version.
|
|
|
178
178
|
|
|
179
179
|
<br />
|
|
180
180
|
|
|
181
|
+
## tsgo Compatibility
|
|
182
|
+
|
|
183
|
+
[tsgo](https://github.com/microsoft/typescript-go) (the native TypeScript compiler
|
|
184
|
+
preview) does not currently implement support for Language Service Plugins. This means
|
|
185
|
+
that when using tsgo, your IDE will not show XSS warnings and errors from this plugin.
|
|
186
|
+
|
|
187
|
+
However, the `xss-scan` CLI tool will continue to work normally, as it uses the standard
|
|
188
|
+
TypeScript compiler APIs. You can still use `xss-scan` in your CI/CD pipeline to catch XSS
|
|
189
|
+
vulnerabilities even when developing with tsgo.
|
|
190
|
+
|
|
191
|
+
```sh
|
|
192
|
+
# This works regardless of whether you use tsgo or tsc
|
|
193
|
+
xss-scan
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
<br />
|
|
197
|
+
|
|
181
198
|
## Error codes
|
|
182
199
|
|
|
183
|
-
###
|
|
200
|
+
### TS88601
|
|
201
|
+
|
|
202
|
+
**Content may introduce an XSS vulnerability and must be marked with the `safe`
|
|
203
|
+
attribute.**
|
|
184
204
|
|
|
185
205
|
Usage of JSX expression without safe attribute. This could lead to XSS vulnerabilities.
|
|
186
206
|
Please use the safe attribute on the JSX element or prepend your variable with `safe`.
|
|
@@ -203,7 +223,9 @@ const html = <div>{safeContent}</div>;
|
|
|
203
223
|
|
|
204
224
|
<br />
|
|
205
225
|
|
|
206
|
-
###
|
|
226
|
+
### TS88602
|
|
227
|
+
|
|
228
|
+
**The `safe` attribute causes this content to be escaped more than once.**
|
|
207
229
|
|
|
208
230
|
Usage of safe attribute on a JSX element whose children contains other JSX elements. It
|
|
209
231
|
will lead to double escaping. If this is intended behavior, please extract the children
|
|
@@ -231,13 +253,16 @@ const html = (
|
|
|
231
253
|
|
|
232
254
|
<br />
|
|
233
255
|
|
|
234
|
-
###
|
|
256
|
+
### TS88603
|
|
257
|
+
|
|
258
|
+
**Content inside a Component must be escaped using escapeHtml().**
|
|
235
259
|
|
|
236
260
|
You are using a xss-prone element as a children of a component. Please wrap it into a
|
|
237
261
|
Html.escapeHtml() call or prepend it as a variable starting with `safe`.
|
|
238
262
|
|
|
239
|
-
This error is similar to [
|
|
240
|
-
need to use `Html.escapeHtml()` function because its a component and not a
|
|
263
|
+
This error is similar to [TS88601](#ts88601), but instead of using `safe` native
|
|
264
|
+
attribute, you need to use `Html.escapeHtml()` function because its a component and not a
|
|
265
|
+
native JSX.
|
|
241
266
|
|
|
242
267
|
```tsx
|
|
243
268
|
// ❌ Content variable may have a value of `<script>alert('xss')</script>`
|
|
@@ -256,7 +281,9 @@ const html = <Component>{safeContent}</Component>;
|
|
|
256
281
|
|
|
257
282
|
<br />
|
|
258
283
|
|
|
259
|
-
###
|
|
284
|
+
### TS88604
|
|
285
|
+
|
|
286
|
+
**The `safe` attribute is unused in this context.**
|
|
260
287
|
|
|
261
288
|
You are using the safe attribute on expressions that does not contain any XSS
|
|
262
289
|
vulnerabilities. Please remove the safe attribute or prepend your variable with `unsafe`.
|
package/bin/index.js
ADDED
package/dist/cli.d.ts
CHANGED
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAuGA,wBAAsB,IAAI,mBA6HzB"}
|
package/dist/cli.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
3
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
|
|
5
|
-
const chalk_1 =
|
|
6
|
-
const node_fs_1 =
|
|
7
|
-
const node_path_1 =
|
|
8
|
-
const typescript_1 =
|
|
9
|
-
const yargs_1 =
|
|
6
|
+
exports.main = main;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
11
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
10
12
|
const helpers_1 = require("yargs/helpers");
|
|
11
13
|
const util_1 = require("./util");
|
|
12
14
|
const { version } = require('../package.json');
|
|
@@ -167,5 +169,4 @@ async function main() {
|
|
|
167
169
|
console.log(chalk_1.default.green(`No XSS vulnerabilities found in ${files.length} files!`));
|
|
168
170
|
process.exit(0);
|
|
169
171
|
}
|
|
170
|
-
main().catch(console.error);
|
|
171
172
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
export declare const Xss: {
|
|
2
|
-
code:
|
|
2
|
+
code: number;
|
|
3
3
|
message: string;
|
|
4
4
|
};
|
|
5
5
|
export declare const DoubleEscape: {
|
|
6
|
-
code:
|
|
6
|
+
code: number;
|
|
7
7
|
message: string;
|
|
8
8
|
};
|
|
9
9
|
export declare const ComponentXss: {
|
|
10
|
-
code:
|
|
10
|
+
code: number;
|
|
11
11
|
message: string;
|
|
12
12
|
};
|
|
13
13
|
export declare const UnusedSafe: {
|
|
14
|
-
code:
|
|
14
|
+
code: number;
|
|
15
15
|
message: string;
|
|
16
16
|
};
|
|
17
17
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"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"}
|
package/dist/errors.js
CHANGED
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UnusedSafe = exports.ComponentXss = exports.DoubleEscape = exports.Xss = void 0;
|
|
4
|
-
function
|
|
5
|
-
return
|
|
4
|
+
function createError(code, message) {
|
|
5
|
+
return {
|
|
6
|
+
code,
|
|
7
|
+
message: process.env.INTERNAL_DISABLE_URL_DOCS !== 'true'
|
|
8
|
+
? `${message}\nSee https://html.kitajs.org/TS${code}`
|
|
9
|
+
: message
|
|
10
|
+
};
|
|
6
11
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
exports.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
exports.ComponentXss = {
|
|
16
|
-
code: '0 K603',
|
|
17
|
-
message: `Xss-prone content inside a Component, wrap it into a Html.escapeHtml() call. ${urlDocs('k603')}`
|
|
18
|
-
};
|
|
19
|
-
exports.UnusedSafe = {
|
|
20
|
-
code: '0 K604',
|
|
21
|
-
message: `Unused safe attribute. ${urlDocs('k604')}`
|
|
22
|
-
};
|
|
12
|
+
// 88600 is the base code for all errors in this plugin.
|
|
13
|
+
// KITA in ASCII
|
|
14
|
+
// 75 * 105 * 116 * 97 = 88609500
|
|
15
|
+
// Simplify to 88600
|
|
16
|
+
exports.Xss = createError(88601, `Content may introduce an XSS vulnerability and must be marked with the \`safe\` attribute.`);
|
|
17
|
+
exports.DoubleEscape = createError(88602, `The \`safe\` attribute causes this content to be escaped more than once.`);
|
|
18
|
+
exports.ComponentXss = createError(88603, `Content inside a Component must be escaped using escapeHtml().`);
|
|
19
|
+
exports.UnusedSafe = createError(88604, `The \`safe\` attribute is unused in this context.`);
|
|
23
20
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,SAAS,
|
|
1
|
+
{"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { default as TS, server } from 'typescript/lib/tsserverlibrary';
|
|
|
2
2
|
declare const _default: (modules: {
|
|
3
3
|
typescript: typeof TS;
|
|
4
4
|
}) => {
|
|
5
|
-
create(info: server.PluginCreateInfo): TS.LanguageService;
|
|
5
|
+
create(info: Pick<server.PluginCreateInfo, "languageService">): TS.LanguageService;
|
|
6
6
|
};
|
|
7
7
|
export = _default;
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
|
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;;;;;;AAG5E,kBAuCE"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,iCAAmE;AAEnE,iBAAS,
|
|
1
|
+
{"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"}
|
package/dist/util.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type JsxFragment, type JsxSelfClosingElement, type default as ts } from 'typescript';
|
|
2
2
|
import type { Diagnostic, JsxElement, JsxOpeningElement, Node, default as TS, Type, TypeChecker } from 'typescript/lib/tsserverlibrary';
|
|
3
|
-
/** If the node is a JSX element or fragment */
|
|
4
|
-
export declare function isJsx(ts: typeof TS, node: TS.Node): node is JsxElement | JsxFragment;
|
|
5
3
|
export declare function recursiveDiagnoseJsxElements(ts: typeof TS, node: Node, typeChecker: TypeChecker, original: Diagnostic[]): void;
|
|
6
|
-
export declare function diagnoseJsxElement(ts: typeof TS, node: JsxElement | JsxFragment, typeChecker: TypeChecker, diagnostics: Diagnostic[]): void;
|
|
4
|
+
export declare function diagnoseJsxElement(ts: typeof TS, node: JsxElement | JsxFragment | JsxSelfClosingElement, typeChecker: TypeChecker, diagnostics: Diagnostic[]): void;
|
|
7
5
|
export declare function isSafeAttribute(ts: typeof TS, type: Type | undefined, checker: TypeChecker, node: ts.Node): boolean;
|
|
8
6
|
export declare function getSafeAttribute(element: JsxOpeningElement): ts.JsxAttributeLike | undefined;
|
|
9
7
|
export declare function proxyObject<T extends object>(obj: T): T;
|
package/dist/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"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"}
|
package/dist/util.js
CHANGED
|
@@ -1,14 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isJsx = isJsx;
|
|
4
36
|
exports.recursiveDiagnoseJsxElements = recursiveDiagnoseJsxElements;
|
|
5
37
|
exports.diagnoseJsxElement = diagnoseJsxElement;
|
|
6
38
|
exports.isSafeAttribute = isSafeAttribute;
|
|
7
39
|
exports.getSafeAttribute = getSafeAttribute;
|
|
8
40
|
exports.proxyObject = proxyObject;
|
|
9
|
-
const
|
|
10
|
-
const typescript_1 = tslib_1.__importDefault(require("typescript"));
|
|
11
|
-
const Errors = tslib_1.__importStar(require("./errors"));
|
|
41
|
+
const Errors = __importStar(require("./errors"));
|
|
12
42
|
const UPPERCASE = /[A-Z]/;
|
|
13
43
|
const ESCAPE_HTML_REGEX = /^(\w+\.)?(escapeHtml|e\s*`|escape)/i;
|
|
14
44
|
/** If the node is a JSX element or fragment */
|
|
@@ -35,9 +65,9 @@ function recursiveDiagnoseJsxElements(ts, node, typeChecker, original) {
|
|
|
35
65
|
}
|
|
36
66
|
}
|
|
37
67
|
}
|
|
38
|
-
function diagnostic(node, error, category) {
|
|
68
|
+
function diagnostic(ts, node, error, category) {
|
|
39
69
|
return {
|
|
40
|
-
category:
|
|
70
|
+
category: ts.DiagnosticCategory[category],
|
|
41
71
|
messageText: Errors[error].message,
|
|
42
72
|
code: Errors[error].code,
|
|
43
73
|
file: node.getSourceFile(),
|
|
@@ -60,16 +90,16 @@ function diagnoseJsxElement(ts, node, typeChecker, diagnostics) {
|
|
|
60
90
|
node.children.length === 0 ||
|
|
61
91
|
// Only text elements
|
|
62
92
|
(node.children.length === 1 && node.children[0].kind === ts.SyntaxKind.JsxText)) {
|
|
63
|
-
diagnostics.push(diagnostic(safeAttribute, 'UnusedSafe', 'Warning'));
|
|
93
|
+
diagnostics.push(diagnostic(ts, safeAttribute, 'UnusedSafe', 'Warning'));
|
|
64
94
|
return;
|
|
65
95
|
}
|
|
66
96
|
for (const exp of node.children) {
|
|
67
97
|
if (
|
|
68
|
-
// JSX Element inside safe
|
|
69
|
-
ts
|
|
98
|
+
// JSX Element inside safe (includes self-closing elements like <Component />)
|
|
99
|
+
isJsx(ts, exp) ||
|
|
70
100
|
// Element is using safe with escapeHtml
|
|
71
101
|
(ts.isJsxExpression(exp) && exp.expression?.getText().match(ESCAPE_HTML_REGEX))) {
|
|
72
|
-
diagnostics.push(diagnostic(safeAttribute, 'DoubleEscape', 'Error'));
|
|
102
|
+
diagnostics.push(diagnostic(ts, safeAttribute, 'DoubleEscape', 'Error'));
|
|
73
103
|
continue;
|
|
74
104
|
}
|
|
75
105
|
// Warn on unnecessary safe attributes
|
|
@@ -77,15 +107,15 @@ function diagnoseJsxElement(ts, node, typeChecker, diagnostics) {
|
|
|
77
107
|
// has inner expression
|
|
78
108
|
exp.expression) {
|
|
79
109
|
// gets this expression or array of sub expressions
|
|
80
|
-
const expressions = getNodeExpressions(exp.expression) || [exp.expression];
|
|
81
|
-
// at least one jsx inside another jsx with safe
|
|
82
|
-
if (expressions.some((inner) => ts
|
|
83
|
-
diagnostics.push(diagnostic(safeAttribute, 'DoubleEscape', 'Error'));
|
|
110
|
+
const expressions = getNodeExpressions(ts, exp.expression) || [exp.expression];
|
|
111
|
+
// at least one jsx inside another jsx with safe (includes self-closing elements)
|
|
112
|
+
if (expressions.some((inner) => isJsx(ts, inner))) {
|
|
113
|
+
diagnostics.push(diagnostic(ts, safeAttribute, 'DoubleEscape', 'Error'));
|
|
84
114
|
continue;
|
|
85
115
|
}
|
|
86
116
|
// all of them must be safe
|
|
87
117
|
if (expressions.every((inner) => isSafeAttribute(ts, typeChecker.getTypeAtLocation(inner), typeChecker, inner))) {
|
|
88
|
-
diagnostics.push(diagnostic(safeAttribute, 'UnusedSafe', 'Warning'));
|
|
118
|
+
diagnostics.push(diagnostic(ts, safeAttribute, 'UnusedSafe', 'Warning'));
|
|
89
119
|
}
|
|
90
120
|
}
|
|
91
121
|
}
|
|
@@ -94,7 +124,7 @@ function diagnoseJsxElement(ts, node, typeChecker, diagnostics) {
|
|
|
94
124
|
}
|
|
95
125
|
// If this expression does not have children, we can ignore it
|
|
96
126
|
// for example it could be a self closing element
|
|
97
|
-
if (!node.children) {
|
|
127
|
+
if (ts.isJsxSelfClosingElement(node) || !node.children) {
|
|
98
128
|
return;
|
|
99
129
|
}
|
|
100
130
|
// Look for expressions
|
|
@@ -119,7 +149,7 @@ function diagnoseExpression(ts, node, typeChecker, diagnostics, isComponent) {
|
|
|
119
149
|
if (isJsx(ts, node)) {
|
|
120
150
|
return;
|
|
121
151
|
}
|
|
122
|
-
const expressions = getNodeExpressions(node);
|
|
152
|
+
const expressions = getNodeExpressions(ts, node);
|
|
123
153
|
// ternary or binary expressions should be evaluated on each side
|
|
124
154
|
if (expressions) {
|
|
125
155
|
for (const inner of expressions) {
|
|
@@ -150,10 +180,10 @@ function diagnoseExpression(ts, node, typeChecker, diagnostics, isComponent) {
|
|
|
150
180
|
}
|
|
151
181
|
// Switch between component and element xss errors
|
|
152
182
|
if (isComponent || ts.isJsxFragment(node)) {
|
|
153
|
-
diagnostics.push(diagnostic(node, 'ComponentXss', 'Error'));
|
|
183
|
+
diagnostics.push(diagnostic(ts, node, 'ComponentXss', 'Error'));
|
|
154
184
|
}
|
|
155
185
|
else {
|
|
156
|
-
diagnostics.push(diagnostic(node, 'Xss', 'Error'));
|
|
186
|
+
diagnostics.push(diagnostic(ts, node, 'Xss', 'Error'));
|
|
157
187
|
}
|
|
158
188
|
}
|
|
159
189
|
function isSafeAttribute(ts, type, checker, node) {
|
|
@@ -161,12 +191,39 @@ function isSafeAttribute(ts, type, checker, node) {
|
|
|
161
191
|
if (!type) {
|
|
162
192
|
return true;
|
|
163
193
|
}
|
|
194
|
+
// Check if this is a property access to .children (from PropsWithChildren)
|
|
195
|
+
// This must be checked BEFORE union recursion to avoid false positives
|
|
196
|
+
if (ts.isPropertyAccessExpression(node) && node.name.text === 'children') {
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
// Consolidated identifier checks - MUST be before union recursion
|
|
200
|
+
if (ts.isIdentifier(node)) {
|
|
201
|
+
// Destructured or direct `children` parameter (e.g., function Test({ children }: PropsWithChildren))
|
|
202
|
+
if (node.text === 'children') {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
// Check if variable is initialized with JSX (e.g., const element = <div />)
|
|
206
|
+
const symbol = checker.getSymbolAtLocation(node);
|
|
207
|
+
if (symbol) {
|
|
208
|
+
const declarations = symbol.getDeclarations();
|
|
209
|
+
if (declarations) {
|
|
210
|
+
for (const decl of declarations) {
|
|
211
|
+
if (ts.isVariableDeclaration(decl) &&
|
|
212
|
+
decl.initializer &&
|
|
213
|
+
isJsx(ts, decl.initializer)) {
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
164
220
|
// Any type is never safe
|
|
165
221
|
if (type.flags & ts.TypeFlags.Any) {
|
|
166
222
|
return false;
|
|
167
223
|
}
|
|
224
|
+
// Check type aliases for JSX.Element and Html.Children
|
|
168
225
|
if (type.aliasSymbol) {
|
|
169
|
-
// Allows JSX.Element
|
|
226
|
+
// Allows JSX.Element (when the alias is preserved)
|
|
170
227
|
if (node &&
|
|
171
228
|
type.aliasSymbol.escapedName === 'Element' &&
|
|
172
229
|
// @ts-expect-error - Fast way of checking
|
|
@@ -244,36 +301,42 @@ function proxyObject(obj) {
|
|
|
244
301
|
* Returns more than one node if the node is a binary expression or a conditional
|
|
245
302
|
* expression
|
|
246
303
|
*/
|
|
247
|
-
function getNodeExpressions(node) {
|
|
304
|
+
function getNodeExpressions(ts, node) {
|
|
248
305
|
// Checks operators
|
|
249
|
-
if (
|
|
306
|
+
if (ts.isBinaryExpression(node)) {
|
|
250
307
|
// Ignores operations which results in a boolean
|
|
251
|
-
if (isBooleanBinaryOperatorToken(node.operatorToken)) {
|
|
308
|
+
if (isBooleanBinaryOperatorToken(ts, node.operatorToken)) {
|
|
252
309
|
return [];
|
|
253
310
|
}
|
|
254
|
-
//
|
|
255
|
-
//
|
|
311
|
+
// For && operator, the left side is only rendered when falsy
|
|
312
|
+
// (empty string, null, undefined, 0, false, NaN) - none of which are XSS risks
|
|
313
|
+
// So we only need to diagnose the right side
|
|
314
|
+
if (node.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {
|
|
315
|
+
return [node.right];
|
|
316
|
+
}
|
|
317
|
+
// For || and ?? operators, both sides can be rendered with potentially unsafe values
|
|
318
|
+
// So we diagnose both sides
|
|
256
319
|
return [node.left, node.right];
|
|
257
320
|
}
|
|
258
321
|
// Checks the inner expression
|
|
259
|
-
if (
|
|
322
|
+
if (ts.isConditionalExpression(node)) {
|
|
260
323
|
// ignore node.condition because its value will never be rendered
|
|
261
|
-
return [node.
|
|
324
|
+
return [node.whenTrue, node.whenFalse];
|
|
262
325
|
}
|
|
263
326
|
return undefined;
|
|
264
327
|
}
|
|
265
|
-
function isBooleanBinaryOperatorToken(operator) {
|
|
328
|
+
function isBooleanBinaryOperatorToken(ts, operator) {
|
|
266
329
|
switch (operator.kind) {
|
|
267
|
-
case
|
|
268
|
-
case
|
|
269
|
-
case
|
|
270
|
-
case
|
|
271
|
-
case
|
|
272
|
-
case
|
|
273
|
-
case
|
|
274
|
-
case
|
|
275
|
-
case
|
|
276
|
-
case
|
|
330
|
+
case ts.SyntaxKind.EqualsEqualsEqualsToken:
|
|
331
|
+
case ts.SyntaxKind.EqualsEqualsToken:
|
|
332
|
+
case ts.SyntaxKind.ExclamationEqualsEqualsToken:
|
|
333
|
+
case ts.SyntaxKind.ExclamationEqualsToken:
|
|
334
|
+
case ts.SyntaxKind.GreaterThanToken:
|
|
335
|
+
case ts.SyntaxKind.GreaterThanEqualsToken:
|
|
336
|
+
case ts.SyntaxKind.LessThanEqualsToken:
|
|
337
|
+
case ts.SyntaxKind.LessThanToken:
|
|
338
|
+
case ts.SyntaxKind.InstanceOfKeyword:
|
|
339
|
+
case ts.SyntaxKind.InKeyword:
|
|
277
340
|
return true;
|
|
278
341
|
}
|
|
279
342
|
return false;
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|