Merge remote-tracking branch 'origin/main' into koesie10/data-extension-editor-generate-flow-model

This commit is contained in:
Koen Vlaswinkel
2023-04-06 11:21:04 +02:00
13 changed files with 114 additions and 94 deletions

View File

@@ -100,6 +100,11 @@ jobs:
run: |
npm run lint
- name: Lint Markdown
working-directory: extensions/ql-vscode
run: |
npm run lint:markdown
- name: Lint scenarios
working-directory: extensions/ql-vscode
run: |

View File

@@ -42593,15 +42593,15 @@
}
},
"node_modules/ts-jest": {
"version": "29.0.1",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.1.tgz",
"integrity": "sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==",
"version": "29.1.0",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz",
"integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==",
"dev": true,
"dependencies": {
"bs-logger": "0.x",
"fast-json-stable-stringify": "2.x",
"jest-util": "^29.0.0",
"json5": "^2.2.1",
"json5": "^2.2.3",
"lodash.memoize": "4.x",
"make-error": "1.x",
"semver": "7.x",
@@ -42618,7 +42618,7 @@
"@jest/types": "^29.0.0",
"babel-jest": "^29.0.0",
"jest": "^29.0.0",
"typescript": ">=4.3"
"typescript": ">=4.3 <6"
},
"peerDependenciesMeta": {
"@babel/core": {
@@ -77796,15 +77796,15 @@
"dev": true
},
"ts-jest": {
"version": "29.0.1",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.1.tgz",
"integrity": "sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==",
"version": "29.1.0",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz",
"integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==",
"dev": true,
"requires": {
"bs-logger": "0.x",
"fast-json-stable-stringify": "2.x",
"jest-util": "^29.0.0",
"json5": "^2.2.1",
"json5": "^2.2.3",
"lodash.memoize": "4.x",
"make-error": "1.x",
"semver": "7.x",

View File

@@ -16,10 +16,11 @@ import { CoreCompletedQuery, QueryRunner } from "../queryRunner";
import { qlpackOfDatabase } from "../contextual/queryResolver";
import { file } from "tmp-promise";
import { readFile, writeFile } from "fs-extra";
import { dump, load } from "js-yaml";
import { dump as dumpYaml, load as loadYaml } from "js-yaml";
import {
getOnDiskWorkspaceFolders,
showAndLogExceptionWithTelemetry,
showAndLogWarningMessage,
} from "../helpers";
import { DatabaseItem, DatabaseManager } from "../local-databases";
import { CodeQLCliServer } from "../cli";
@@ -29,6 +30,8 @@ import { promptImportGithubDatabase } from "../databaseFetcher";
import { App } from "../common/app";
import { decodeBqrsToExternalApiUsages } from "./bqrs";
import { redactableError } from "../pure/errors";
import { createDataExtensionYaml, loadDataExtensionYaml } from "./yaml";
import { ExternalApiUsage } from "./external-api-usage";
import { ModeledMethod } from "./modeled-method";
export class DataExtensionsEditorView extends AbstractWebview<
@@ -76,8 +79,11 @@ export class DataExtensionsEditorView extends AbstractWebview<
await this.onWebViewLoaded();
break;
case "applyDataExtensionYaml":
await this.saveYaml(msg.yaml);
case "saveModeledMethods":
await this.saveModeledMethods(
msg.externalApiUsages,
msg.modeledMethods,
);
await this.loadExternalApiUsages();
break;
@@ -93,22 +99,30 @@ export class DataExtensionsEditorView extends AbstractWebview<
protected async onWebViewLoaded() {
super.onWebViewLoaded();
await Promise.all([this.loadExternalApiUsages(), this.readExistingYaml()]);
await Promise.all([
this.loadExternalApiUsages(),
this.loadExistingModeledMethods(),
]);
}
protected async saveYaml(yaml: string): Promise<void> {
const modelFilename = this.modelFileName;
protected async saveModeledMethods(
externalApiUsages: ExternalApiUsage[],
modeledMethods: Record<string, ModeledMethod>,
): Promise<void> {
const modelFilename = this.calculateModelFilename();
if (!modelFilename) {
return;
}
const yaml = createDataExtensionYaml(externalApiUsages, modeledMethods);
await writeFile(modelFilename, yaml);
void extLogger.log(`Saved data extension YAML to ${modelFilename}`);
}
protected async readExistingYaml(): Promise<void> {
const modelFilename = this.modelFileName;
protected async loadExistingModeledMethods(): Promise<void> {
const modelFilename = this.calculateModelFilename();
if (!modelFilename) {
return;
}
@@ -116,13 +130,20 @@ export class DataExtensionsEditorView extends AbstractWebview<
try {
const yaml = await readFile(modelFilename, "utf8");
const data = load(yaml, {
const data = loadYaml(yaml, {
filename: modelFilename,
});
const existingModeledMethods = loadDataExtensionYaml(data);
if (!existingModeledMethods) {
void showAndLogWarningMessage("Failed to parse data extension YAML.");
return;
}
await this.postMessage({
t: "setExistingYamlData",
data,
t: "setExistingModeledMethods",
existingModeledMethods,
});
} catch (e: unknown) {
void extLogger.log(`Unable to read data extension YAML: ${e}`);
@@ -275,7 +296,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
},
});
}
await writeFile(suiteFile, dump(suiteYaml), "utf8");
await writeFile(suiteFile, dumpYaml(suiteYaml), "utf8");
const queries = await this.cliServer.resolveQueriesInSuite(
suiteFile,
@@ -354,7 +375,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
});
}
private get modelFileName(): string | undefined {
private calculateModelFilename(): string | undefined {
const workspaceFolder = workspace.workspaceFolders?.find(
(folder) => folder.name === "ql",
);

View File

@@ -493,9 +493,9 @@ export interface ShowProgressMessage {
message: string;
}
export interface SetExistingYamlDataMessage {
t: "setExistingYamlData";
data: any;
export interface SetExistingModeledMethods {
t: "setExistingModeledMethods";
existingModeledMethods: Record<string, ModeledMethod>;
}
export interface AddModeledMethodsMessage {
@@ -503,9 +503,10 @@ export interface AddModeledMethodsMessage {
modeledMethods: Record<string, ModeledMethod>;
}
export interface ApplyDataExtensionYamlMessage {
t: "applyDataExtensionYaml";
yaml: string;
export interface SaveModeledMethods {
t: "saveModeledMethods";
externalApiUsages: ExternalApiUsage[];
modeledMethods: Record<string, ModeledMethod>;
}
export interface GenerateExternalApiMessage {
@@ -515,10 +516,10 @@ export interface GenerateExternalApiMessage {
export type ToDataExtensionsEditorMessage =
| SetExternalApiUsagesMessage
| ShowProgressMessage
| SetExistingYamlDataMessage
| SetExistingModeledMethods
| AddModeledMethodsMessage;
export type FromDataExtensionsEditorMessage =
| ViewLoadedMsg
| ApplyDataExtensionYamlMessage
| SaveModeledMethods
| GenerateExternalApiMessage;

View File

@@ -112,7 +112,7 @@ export function generateVariantAnalysisMarkdownSummary(
lines.push(`### Results for "${query.name}"`, "");
// Expandable section containing query text
const queryCodeBlock = ["```ql", ...query.text.split("\n"), "```"];
const queryCodeBlock = ["```ql", ...query.text.split("\n"), "```", ""];
lines.push(...buildExpandableMarkdownSection("Query", queryCodeBlock));
// Padding between sections
@@ -128,6 +128,9 @@ export function generateVariantAnalysisMarkdownSummary(
lines.push(`| ${fullName} | [${summary.resultCount} result(s)](${link}) |`);
}
// Add a trailing newline
lines.push("");
return {
fileName: "_summary",
content: lines,
@@ -279,8 +282,8 @@ function generateMarkdownForPathResults(
);
// Indent the snippet to fit with the numbered list.
// The indentation is "n + 2" where the list number is an n-digit number.
const codeSnippetIndented = codeSnippet.map(
(line) => " ".repeat(listNumber.toString().length + 2) + line,
const codeSnippetIndented = codeSnippet.map((line) =>
(" ".repeat(listNumber.toString().length + 2) + line).trimEnd(),
);
pathLines.push(`${listNumber}. ${link}`, ...codeSnippetIndented);
}
@@ -382,7 +385,6 @@ function buildExpandableMarkdownSection(
`<summary>${title}</summary>`,
"",
...contents,
"",
"</details>",
"",
);

View File

@@ -16,10 +16,6 @@ import { ModeledMethod } from "../../data-extensions-editor/modeled-method";
import { MethodRow } from "./MethodRow";
import { assertNever } from "../../pure/helpers-pure";
import { vscode } from "../vscode-api";
import {
createDataExtensionYaml,
loadDataExtensionYaml,
} from "../../data-extensions-editor/yaml";
import { calculateSupportedPercentage } from "./supported";
export const DataExtensionsEditorContainer = styled.div`
@@ -61,12 +57,10 @@ export function DataExtensionsEditor(): JSX.Element {
case "showProgress":
setProgress(msg);
break;
case "setExistingYamlData":
case "setExistingModeledMethods":
setModeledMethods((oldModeledMethods) => {
const existingModeledMethods = loadDataExtensionYaml(msg.data);
return {
...existingModeledMethods,
...msg.existingModeledMethods,
...oldModeledMethods,
};
});
@@ -120,14 +114,10 @@ export function DataExtensionsEditor(): JSX.Element {
);
const onApplyClick = useCallback(() => {
const yamlString = createDataExtensionYaml(
vscode.postMessage({
t: "saveModeledMethods",
externalApiUsages,
modeledMethods,
);
vscode.postMessage({
t: "applyDataExtensionYaml",
yaml: yamlString,
});
}, [externalApiUsages, modeledMethods]);

View File

@@ -0,0 +1,7 @@
{
"extends": "../../../../../../.markdownlint.json",
"MD010": false, // Hard tabs are from the original snippet in the SARIF file
"MD024": false, // Duplicate headings
"MD033": false, // Inline HTML for <details> and <summary>
"MD051": false // Link fragments are used in Gist to link to other files
}

View File

@@ -22,7 +22,7 @@
cp.execSync(cmd); // BAD
}
</code></pre>
2. [javascript/ql/src/Security/CWE-078/examples/shell-command-injection-from-environment.js](https://github.com/github/codeql/blob/48015e5a2e6202131f2d1062cc066dc33ed69a9b/javascript/ql/src/Security/CWE-078/examples/shell-command-injection-from-environment.js#L4-L4)
<pre><code class="javascript"> path = require("path");
function cleanupTemp() {
@@ -30,7 +30,7 @@
cp.execSync(cmd); // BAD
}
</code></pre>
3. [javascript/ql/src/Security/CWE-078/examples/shell-command-injection-from-environment.js](https://github.com/github/codeql/blob/48015e5a2e6202131f2d1062cc066dc33ed69a9b/javascript/ql/src/Security/CWE-078/examples/shell-command-injection-from-environment.js#L4-L4)
<pre><code class="javascript"> path = require("path");
function cleanupTemp() {
@@ -38,7 +38,7 @@
cp.execSync(cmd); // BAD
}
</code></pre>
4. [javascript/ql/src/Security/CWE-078/examples/shell-command-injection-from-environment.js](https://github.com/github/codeql/blob/48015e5a2e6202131f2d1062cc066dc33ed69a9b/javascript/ql/src/Security/CWE-078/examples/shell-command-injection-from-environment.js#L4-L4)
<pre><code class="javascript"> path = require("path");
function cleanupTemp() {
@@ -46,14 +46,13 @@
cp.execSync(cmd); // BAD
}
</code></pre>
5. [javascript/ql/src/Security/CWE-078/examples/shell-command-injection-from-environment.js](https://github.com/github/codeql/blob/48015e5a2e6202131f2d1062cc066dc33ed69a9b/javascript/ql/src/Security/CWE-078/examples/shell-command-injection-from-environment.js#L5-L5)
<pre><code class="javascript">function cleanupTemp() {
let cmd = "rm -rf " + path.join(__dirname, "temp");
cp.execSync(<strong>cmd</strong>); // BAD
}
</code></pre>
</details>
@@ -79,26 +78,25 @@
<pre><code class="javascript">(function() {
cp.execFileSync('rm', ['-rf', path.join(__dirname, "temp")]); // GOOD
cp.execSync('rm -rf ' + path.join(<strong>__dirname</strong>, "temp")); // BAD
execa.shell('rm -rf ' + path.join(__dirname, "temp")); // NOT OK
</code></pre>
2. [javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js](https://github.com/github/codeql/blob/48015e5a2e6202131f2d1062cc066dc33ed69a9b/javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js#L6-L6)
<pre><code class="javascript">(function() {
cp.execFileSync('rm', ['-rf', path.join(__dirname, "temp")]); // GOOD
cp.execSync('rm -rf ' + <strong>path.join(__dirname, "temp")</strong>); // BAD
execa.shell('rm -rf ' + path.join(__dirname, "temp")); // NOT OK
</code></pre>
3. [javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js](https://github.com/github/codeql/blob/48015e5a2e6202131f2d1062cc066dc33ed69a9b/javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js#L6-L6)
<pre><code class="javascript">(function() {
cp.execFileSync('rm', ['-rf', path.join(__dirname, "temp")]); // GOOD
cp.execSync(<strong>'rm -rf ' + path.join(__dirname, "temp")</strong>); // BAD
execa.shell('rm -rf ' + path.join(__dirname, "temp")); // NOT OK
</code></pre>
</details>
@@ -122,28 +120,27 @@
1. [javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js](https://github.com/github/codeql/blob/48015e5a2e6202131f2d1062cc066dc33ed69a9b/javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js#L8-L8)
<pre><code class="javascript"> cp.execSync('rm -rf ' + path.join(__dirname, "temp")); // BAD
execa.shell('rm -rf ' + path.join(<strong>__dirname</strong>, "temp")); // NOT OK
execa.shellSync('rm -rf ' + path.join(__dirname, "temp")); // NOT OK
</code></pre>
2. [javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js](https://github.com/github/codeql/blob/48015e5a2e6202131f2d1062cc066dc33ed69a9b/javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js#L8-L8)
<pre><code class="javascript"> cp.execSync('rm -rf ' + path.join(__dirname, "temp")); // BAD
execa.shell('rm -rf ' + <strong>path.join(__dirname, "temp")</strong>); // NOT OK
execa.shellSync('rm -rf ' + path.join(__dirname, "temp")); // NOT OK
</code></pre>
3. [javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js](https://github.com/github/codeql/blob/48015e5a2e6202131f2d1062cc066dc33ed69a9b/javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js#L8-L8)
<pre><code class="javascript"> cp.execSync('rm -rf ' + path.join(__dirname, "temp")); // BAD
execa.shell(<strong>'rm -rf ' + path.join(__dirname, "temp")</strong>); // NOT OK
execa.shellSync('rm -rf ' + path.join(__dirname, "temp")); // NOT OK
</code></pre>
</details>
@@ -169,26 +166,25 @@
<pre><code class="javascript">
execa.shell('rm -rf ' + path.join(__dirname, "temp")); // NOT OK
execa.shellSync('rm -rf ' + path.join(<strong>__dirname</strong>, "temp")); // NOT OK
const safe = "\"" + path.join(__dirname, "temp") + "\"";
</code></pre>
2. [javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js](https://github.com/github/codeql/blob/48015e5a2e6202131f2d1062cc066dc33ed69a9b/javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js#L9-L9)
<pre><code class="javascript">
execa.shell('rm -rf ' + path.join(__dirname, "temp")); // NOT OK
execa.shellSync('rm -rf ' + <strong>path.join(__dirname, "temp")</strong>); // NOT OK
const safe = "\"" + path.join(__dirname, "temp") + "\"";
</code></pre>
3. [javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js](https://github.com/github/codeql/blob/48015e5a2e6202131f2d1062cc066dc33ed69a9b/javascript/ql/test/query-tests/Security/CWE-078/tst_shell-command-injection-from-environment.js#L9-L9)
<pre><code class="javascript">
execa.shell('rm -rf ' + path.join(__dirname, "temp")); // NOT OK
execa.shellSync(<strong>'rm -rf ' + path.join(__dirname, "temp")</strong>); // NOT OK
const safe = "\"" + path.join(__dirname, "temp") + "\"";
</code></pre>
</details>

View File

@@ -20,18 +20,18 @@
<pre><code class="javascript">
const meteorLocalFolder = '.meteor';
const meteorPath = <strong>path.resolve(rootPath, meteorLocalFolder)</strong>;
module.exports = {
</code></pre>
2. [npm-packages/meteor-installer/config.js](https://github.com/meteor/meteor/blob/73b538fe201cbfe89dd0c709689023f9b3eab1ec/npm-packages/meteor-installer/config.js#L39-L39)
<pre><code class="javascript">
const meteorLocalFolder = '.meteor';
const <strong>meteorPath = path.resolve(rootPath, meteorLocalFolder)</strong>;
module.exports = {
</code></pre>
3. [npm-packages/meteor-installer/config.js](https://github.com/meteor/meteor/blob/73b538fe201cbfe89dd0c709689023f9b3eab1ec/npm-packages/meteor-installer/config.js#L44-L44)
<pre><code class="javascript"> METEOR_LATEST_VERSION,
extractPath: rootPath,
@@ -39,7 +39,7 @@
release: process.env.INSTALL_METEOR_VERSION || METEOR_LATEST_VERSION,
rootPath,
</code></pre>
4. [npm-packages/meteor-installer/install.js](https://github.com/meteor/meteor/blob/73b538fe201cbfe89dd0c709689023f9b3eab1ec/npm-packages/meteor-installer/install.js#L12-L12)
<pre><code class="javascript">const os = require('os');
const {
@@ -47,7 +47,7 @@
release,
startedPath,
</code></pre>
5. [npm-packages/meteor-installer/install.js](https://github.com/meteor/meteor/blob/73b538fe201cbfe89dd0c709689023f9b3eab1ec/npm-packages/meteor-installer/install.js#L11-L23)
<pre><code class="javascript">const tmp = require('tmp');
const os = require('os');
@@ -67,7 +67,7 @@
const { uninstall } = require('./uninstall');
const {
</code></pre>
6. [npm-packages/meteor-installer/install.js](https://github.com/meteor/meteor/blob/73b538fe201cbfe89dd0c709689023f9b3eab1ec/npm-packages/meteor-installer/install.js#L259-L259)
<pre><code class="javascript"> if (isWindows()) {
//set for the current session and beyond
@@ -75,7 +75,7 @@
return;
}
</code></pre>
7. [npm-packages/meteor-installer/install.js](https://github.com/meteor/meteor/blob/73b538fe201cbfe89dd0c709689023f9b3eab1ec/npm-packages/meteor-installer/install.js#L259-L259)
<pre><code class="javascript"> if (isWindows()) {
//set for the current session and beyond
@@ -83,7 +83,7 @@
return;
}
</code></pre>
8. [npm-packages/meteor-installer/install.js](https://github.com/meteor/meteor/blob/73b538fe201cbfe89dd0c709689023f9b3eab1ec/npm-packages/meteor-installer/install.js#L259-L259)
<pre><code class="javascript"> if (isWindows()) {
//set for the current session and beyond
@@ -91,7 +91,7 @@
return;
}
</code></pre>
9. [npm-packages/meteor-installer/install.js](https://github.com/meteor/meteor/blob/73b538fe201cbfe89dd0c709689023f9b3eab1ec/npm-packages/meteor-installer/install.js#L259-L259)
<pre><code class="javascript"> if (isWindows()) {
//set for the current session and beyond
@@ -99,7 +99,7 @@
return;
}
</code></pre>
10. [npm-packages/meteor-installer/install.js](https://github.com/meteor/meteor/blob/73b538fe201cbfe89dd0c709689023f9b3eab1ec/npm-packages/meteor-installer/install.js#L259-L259)
<pre><code class="javascript"> if (isWindows()) {
//set for the current session and beyond
@@ -107,7 +107,7 @@
return;
}
</code></pre>
11. [npm-packages/meteor-installer/install.js](https://github.com/meteor/meteor/blob/73b538fe201cbfe89dd0c709689023f9b3eab1ec/npm-packages/meteor-installer/install.js#L259-L259)
<pre><code class="javascript"> if (isWindows()) {
//set for the current session and beyond
@@ -115,7 +115,6 @@
return;
}
</code></pre>
</details>
@@ -126,10 +125,10 @@
<pre><code class="javascript">
const meteorLocalFolder = '.meteor';
const meteorPath = <strong>path.resolve(rootPath, meteorLocalFolder)</strong>;
module.exports = {
</code></pre>
2. [npm-packages/meteor-installer/install.js](https://github.com/meteor/meteor/blob/73b538fe201cbfe89dd0c709689023f9b3eab1ec/npm-packages/meteor-installer/install.js#L259-L259)
<pre><code class="javascript"> if (isWindows()) {
//set for the current session and beyond
@@ -137,7 +136,6 @@
return;
}
</code></pre>
</details>

View File

@@ -41,4 +41,4 @@ select t,
| Repository | Results |
| --- | --- |
| github/codeql | [1 result(s)](#file-result-1-github-codeql-md) |
| meteor/meteor | [5 result(s)](#file-result-2-meteor-meteor-md) |
| meteor/meteor | [5 result(s)](#file-result-2-meteor-meteor-md) |

View File

@@ -38,4 +38,4 @@ select c, c.getNumLines()
| Repository | Results |
| --- | --- |
| github/codeql | [22 result(s)](#file-result-1-github-codeql-md) |
| meteor/meteor | [2 result(s)](#file-result-2-meteor-meteor-md) |
| meteor/meteor | [2 result(s)](#file-result-2-meteor-meteor-md) |

View File

@@ -23,4 +23,4 @@
| [`functio ... true\n}`](https://github.com/github/codeql/blob/cbdd4927cee593b715d8469240ce1d31edaaef9b/javascript/ql/test/query-tests/Statements/UselessComparisonTest/constant.js#L1-L4) | `4` |
| [`functio ... n -1;\n}`](https://github.com/github/codeql/blob/cbdd4927cee593b715d8469240ce1d31edaaef9b/javascript/ql/test/query-tests/Statements/UselessComparisonTest/example.js#L1-L12) | `12` |
| [`functio ... turn; }`](https://github.com/github/codeql/blob/cbdd4927cee593b715d8469240ce1d31edaaef9b/javascript/ql/test/query-tests/Statements/UselessComparisonTest/tst.js#L8-L8) | `1` |
| [`\| functio ... i+1); \|}`](https://github.com/github/codeql/blob/cbdd4927cee593b715d8469240ce1d31edaaef9b/javascript/ql/test/query-tests/Statements/UselessComparisonTest/tst.js#L9-L9) | `1` |
| [`\| functio ... i+1); \|}`](https://github.com/github/codeql/blob/cbdd4927cee593b715d8469240ce1d31edaaef9b/javascript/ql/test/query-tests/Statements/UselessComparisonTest/tst.js#L9-L9) | `1` |

View File

@@ -3,4 +3,4 @@
| c | |
| --- | --- |
| [`functio ... rn H\|0}`](https://github.com/meteor/meteor/blob/53f3c4442d3542d3d2a012a854472a0d1bef9d12/packages/logic-solver/minisat.js#L7-L7) | `1` |
| [`functio ... ext;\n\t}`](https://github.com/meteor/meteor/blob/53f3c4442d3542d3d2a012a854472a0d1bef9d12/packages/sha/sha256.js#L94-L124) | `31` |
| [`functio ... ext;\n\t}`](https://github.com/meteor/meteor/blob/53f3c4442d3542d3d2a012a854472a0d1bef9d12/packages/sha/sha256.js#L94-L124) | `31` |