Skip to content

Commit d4b6259

Browse files
authored
Merge pull request #2302 from github/koesie10/kind-dropdown
Change kind input to a dropdown
2 parents 0ad3ffa + 0242498 commit d4b6259

File tree

5 files changed

+205
-129
lines changed

5 files changed

+205
-129
lines changed

extensions/ql-vscode/src/data-extensions-editor/generate-flow-model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { join } from "path";
44
import { QueryRunner } from "../queryRunner";
55
import { CodeQLCliServer } from "../cli";
66
import { TeeLogger } from "../common";
7-
import { extensiblePredicateDefinitions } from "./yaml";
7+
import { extensiblePredicateDefinitions } from "./predicates";
88
import { ProgressCallback } from "../progress";
99
import {
1010
getOnDiskWorkspaceFolders,
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
import { ExternalApiUsage } from "./external-api-usage";
2+
import {
3+
ModeledMethod,
4+
ModeledMethodType,
5+
ModeledMethodWithSignature,
6+
} from "./modeled-method";
7+
8+
export type ExternalApiUsageByType = {
9+
externalApiUsage: ExternalApiUsage;
10+
modeledMethod: ModeledMethod;
11+
};
12+
13+
export type ExtensiblePredicateDefinition = {
14+
extensiblePredicate: string;
15+
generateMethodDefinition: (method: ExternalApiUsageByType) => Tuple[];
16+
readModeledMethod: (row: Tuple[]) => ModeledMethodWithSignature;
17+
18+
supportedKinds?: string[];
19+
};
20+
21+
type Tuple = boolean | number | string;
22+
23+
function readRowToMethod(row: Tuple[]): string {
24+
return `${row[0]}.${row[1]}#${row[3]}${row[4]}`;
25+
}
26+
27+
export const extensiblePredicateDefinitions: Record<
28+
Exclude<ModeledMethodType, "none">,
29+
ExtensiblePredicateDefinition
30+
> = {
31+
source: {
32+
extensiblePredicate: "sourceModel",
33+
// extensible predicate sourceModel(
34+
// string package, string type, boolean subtypes, string name, string signature, string ext,
35+
// string output, string kind, string provenance
36+
// );
37+
generateMethodDefinition: (method) => [
38+
method.externalApiUsage.packageName,
39+
method.externalApiUsage.typeName,
40+
true,
41+
method.externalApiUsage.methodName,
42+
method.externalApiUsage.methodParameters,
43+
"",
44+
method.modeledMethod.output,
45+
method.modeledMethod.kind,
46+
"manual",
47+
],
48+
readModeledMethod: (row) => ({
49+
signature: readRowToMethod(row),
50+
modeledMethod: {
51+
type: "source",
52+
input: "",
53+
output: row[6] as string,
54+
kind: row[7] as string,
55+
},
56+
}),
57+
supportedKinds: ["remote"],
58+
},
59+
sink: {
60+
extensiblePredicate: "sinkModel",
61+
// extensible predicate sinkModel(
62+
// string package, string type, boolean subtypes, string name, string signature, string ext,
63+
// string input, string kind, string provenance
64+
// );
65+
generateMethodDefinition: (method) => [
66+
method.externalApiUsage.packageName,
67+
method.externalApiUsage.typeName,
68+
true,
69+
method.externalApiUsage.methodName,
70+
method.externalApiUsage.methodParameters,
71+
"",
72+
method.modeledMethod.input,
73+
method.modeledMethod.kind,
74+
"manual",
75+
],
76+
readModeledMethod: (row) => ({
77+
signature: readRowToMethod(row),
78+
modeledMethod: {
79+
type: "sink",
80+
input: row[6] as string,
81+
output: "",
82+
kind: row[7] as string,
83+
},
84+
}),
85+
supportedKinds: ["sql", "xss", "logging"],
86+
},
87+
summary: {
88+
extensiblePredicate: "summaryModel",
89+
// extensible predicate summaryModel(
90+
// string package, string type, boolean subtypes, string name, string signature, string ext,
91+
// string input, string output, string kind, string provenance
92+
// );
93+
generateMethodDefinition: (method) => [
94+
method.externalApiUsage.packageName,
95+
method.externalApiUsage.typeName,
96+
true,
97+
method.externalApiUsage.methodName,
98+
method.externalApiUsage.methodParameters,
99+
"",
100+
method.modeledMethod.input,
101+
method.modeledMethod.output,
102+
method.modeledMethod.kind,
103+
"manual",
104+
],
105+
readModeledMethod: (row) => ({
106+
signature: readRowToMethod(row),
107+
modeledMethod: {
108+
type: "summary",
109+
input: row[6] as string,
110+
output: row[7] as string,
111+
kind: row[8] as string,
112+
},
113+
}),
114+
supportedKinds: ["taint", "value"],
115+
},
116+
neutral: {
117+
extensiblePredicate: "neutralModel",
118+
// extensible predicate neutralModel(
119+
// string package, string type, string name, string signature, string provenance
120+
// );
121+
generateMethodDefinition: (method) => [
122+
method.externalApiUsage.packageName,
123+
method.externalApiUsage.typeName,
124+
method.externalApiUsage.methodName,
125+
method.externalApiUsage.methodParameters,
126+
"manual",
127+
],
128+
readModeledMethod: (row) => ({
129+
signature: `${row[0]}.${row[1]}#${row[2]}${row[3]}`,
130+
modeledMethod: {
131+
type: "neutral",
132+
input: "",
133+
output: "",
134+
kind: "",
135+
},
136+
}),
137+
},
138+
};

extensions/ql-vscode/src/data-extensions-editor/yaml.ts

Lines changed: 1 addition & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
ModeledMethodType,
77
ModeledMethodWithSignature,
88
} from "./modeled-method";
9+
import { extensiblePredicateDefinitions } from "./predicates";
910

1011
import * as dataSchemaJson from "./data-schema.json";
1112

@@ -23,120 +24,6 @@ type ExtensiblePredicateDefinition = {
2324
readModeledMethod: (row: any[]) => ModeledMethodWithSignature;
2425
};
2526

26-
function readRowToMethod(row: any[]): string {
27-
return `${row[0]}.${row[1]}#${row[3]}${row[4]}`;
28-
}
29-
30-
export const extensiblePredicateDefinitions: Record<
31-
Exclude<ModeledMethodType, "none">,
32-
ExtensiblePredicateDefinition
33-
> = {
34-
source: {
35-
extensiblePredicate: "sourceModel",
36-
// extensible predicate sourceModel(
37-
// string package, string type, boolean subtypes, string name, string signature, string ext,
38-
// string output, string kind, string provenance
39-
// );
40-
generateMethodDefinition: (method) => [
41-
method.externalApiUsage.packageName,
42-
method.externalApiUsage.typeName,
43-
true,
44-
method.externalApiUsage.methodName,
45-
method.externalApiUsage.methodParameters,
46-
"",
47-
method.modeledMethod.output,
48-
method.modeledMethod.kind,
49-
"manual",
50-
],
51-
readModeledMethod: (row) => ({
52-
signature: readRowToMethod(row),
53-
modeledMethod: {
54-
type: "source",
55-
input: "",
56-
output: row[6],
57-
kind: row[7],
58-
},
59-
}),
60-
},
61-
sink: {
62-
extensiblePredicate: "sinkModel",
63-
// extensible predicate sinkModel(
64-
// string package, string type, boolean subtypes, string name, string signature, string ext,
65-
// string input, string kind, string provenance
66-
// );
67-
generateMethodDefinition: (method) => [
68-
method.externalApiUsage.packageName,
69-
method.externalApiUsage.typeName,
70-
true,
71-
method.externalApiUsage.methodName,
72-
method.externalApiUsage.methodParameters,
73-
"",
74-
method.modeledMethod.input,
75-
method.modeledMethod.kind,
76-
"manual",
77-
],
78-
readModeledMethod: (row) => ({
79-
signature: readRowToMethod(row),
80-
modeledMethod: {
81-
type: "sink",
82-
input: row[6],
83-
output: "",
84-
kind: row[7],
85-
},
86-
}),
87-
},
88-
summary: {
89-
extensiblePredicate: "summaryModel",
90-
// extensible predicate summaryModel(
91-
// string package, string type, boolean subtypes, string name, string signature, string ext,
92-
// string input, string output, string kind, string provenance
93-
// );
94-
generateMethodDefinition: (method) => [
95-
method.externalApiUsage.packageName,
96-
method.externalApiUsage.typeName,
97-
true,
98-
method.externalApiUsage.methodName,
99-
method.externalApiUsage.methodParameters,
100-
"",
101-
method.modeledMethod.input,
102-
method.modeledMethod.output,
103-
method.modeledMethod.kind,
104-
"manual",
105-
],
106-
readModeledMethod: (row) => ({
107-
signature: readRowToMethod(row),
108-
modeledMethod: {
109-
type: "summary",
110-
input: row[6],
111-
output: row[7],
112-
kind: row[8],
113-
},
114-
}),
115-
},
116-
neutral: {
117-
extensiblePredicate: "neutralModel",
118-
// extensible predicate neutralModel(
119-
// string package, string type, string name, string signature, string provenance
120-
// );
121-
generateMethodDefinition: (method) => [
122-
method.externalApiUsage.packageName,
123-
method.externalApiUsage.typeName,
124-
method.externalApiUsage.methodName,
125-
method.externalApiUsage.methodParameters,
126-
"manual",
127-
],
128-
readModeledMethod: (row) => ({
129-
signature: `${row[0]}.${row[1]}#${row[2]}${row[3]}`,
130-
modeledMethod: {
131-
type: "neutral",
132-
input: "",
133-
output: "",
134-
kind: "",
135-
},
136-
}),
137-
},
138-
};
139-
14027
function createDataProperty(
14128
methods: ExternalApiUsageByType[],
14229
definition: ExtensiblePredicateDefinition,
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import * as React from "react";
2+
import { useCallback, useEffect } from "react";
3+
import styled from "styled-components";
4+
import { VSCodeDropdown, VSCodeOption } from "@vscode/webview-ui-toolkit/react";
5+
6+
import type { ModeledMethod } from "../../data-extensions-editor/modeled-method";
7+
8+
const Dropdown = styled(VSCodeDropdown)`
9+
width: 100%;
10+
`;
11+
12+
type Props = {
13+
kinds: Array<ModeledMethod["kind"]>;
14+
15+
value: ModeledMethod["kind"] | undefined;
16+
onChange: (value: ModeledMethod["kind"]) => void;
17+
};
18+
19+
export const KindInput = ({ kinds, value, onChange }: Props) => {
20+
const handleInput = useCallback(
21+
(e: InputEvent) => {
22+
const target = e.target as HTMLSelectElement;
23+
24+
onChange(target.value as ModeledMethod["kind"]);
25+
},
26+
[onChange],
27+
);
28+
29+
useEffect(() => {
30+
if (value === undefined && kinds.length > 0) {
31+
onChange(kinds[0]);
32+
}
33+
34+
if (value !== undefined && !kinds.includes(value)) {
35+
onChange(kinds[0]);
36+
}
37+
}, [value, kinds, onChange]);
38+
39+
return (
40+
<Dropdown value={value} onInput={handleInput}>
41+
{kinds.map((kind) => (
42+
<VSCodeOption key={kind} value={kind}>
43+
{kind}
44+
</VSCodeOption>
45+
))}
46+
</Dropdown>
47+
);
48+
};

0 commit comments

Comments
 (0)